diff --git a/xos/core/xoslib/dashboards/xosTenant.html b/xos/core/xoslib/dashboards/xosTenant.html
index 8881bb8..1283a67 100644
--- a/xos/core/xoslib/dashboards/xosTenant.html
+++ b/xos/core/xoslib/dashboards/xosTenant.html
@@ -1,122 +1,21 @@
-<script src="{{ STATIC_URL }}/js/vendor/underscore-min.js"></script>
-<script src="{{ STATIC_URL }}/js/vendor/backbone.js"></script>
-<script src="{{ STATIC_URL }}/js/vendor/backbone.syphon.js"></script>
-<script src="{{ STATIC_URL }}/js/vendor/backbone.wreqr.js"></script>
-<script src="{{ STATIC_URL }}/js/vendor/backbone.babysitter.js"></script>
-<script src="{{ STATIC_URL }}/js/vendor/backbone.marionette.js"></script>
+<!-- browserSync -->
 
-<link rel="stylesheet" type="text/css" href="{% static 'css/xosTenantDashboard.css' %}" media="all" >
-<link rel="stylesheet" type="text/css" href="{% static 'css/xosAdminSite.css' %}" media="all" >
+<!-- endcss -->
+<!-- inject:css -->
+<link rel="stylesheet" href="/static/css/xosTenant.css">
+<!-- endinject -->
+<p>
+  hello
+</p>
 
-<script src="{{ STATIC_URL }}/js/xoslib/xos-util.js"></script>
-<script src="{{ STATIC_URL }}/js/xoslib/xos-defaults.js"></script>
-<script src="{{ STATIC_URL }}/js/xoslib/xos-validators.js"></script>
-<script src="{{ STATIC_URL }}/js/xoslib/xos-backbone.js"></script>
-<script src="{{ STATIC_URL }}/js/xoslib/xosHelper.js"></script>
-<script src="{{ STATIC_URL }}/js/picker.js"></script>
-<script src="{{ STATIC_URL }}/js/xosTenant.js"></script>
-
-<script type="text/template" id="xos-tenant-buttons-template">
-  <div class="box save-box">
-    <button class="btn btn-high btn-success btn-tenant-create">Create New Slice</button>
-    <button class="btn btn-high btn-danger btn-tenant-delete">Delete Slice</button>
-    <button class="btn btn-high btn-primary btn-tenant-add-user">Edit Users</button>
-    <button class="btn btn-high btn-primary btn-tenant-download-ssh">SSH Commands</button>
-    <button class="btn btn-high btn-success btn-tenant-save">Save</button>
-  </div>
-</script>
-
-<script type="text/template" id="xos-tenant-buttons-noslice-template">
-  <div class="box save-box">
-    <button class="btn btn-high btn-tenant-create">Create New Slice</button>
-  </div>
-</script>
-
-<script type="text/template" id="xos-log-template">
-  <tr id="<%= logMessageId %>" class="xos-log xos-<%= statusclass %>">
-     <td><%= what %><br>
-         <%= status %> <%= statusText %>
-     </td>
-  </tr>
-</script>
-
-<script type="text/template" id="tenant-sanity-check">
-    Tenant view sanity check failed:
-       <ul>
-       <% for (index in errors) { %>
-           <li><%= errors[index] %></li>
-       <% } %>
-       </ul>
-       Steps to correct issues in the tenant view:
-       <ol>
-       <li>Make sure that the tenant view is linked to at least one deployment. You
-           may find the list of dashboard views at <a href="/admin/core/dashboardview/">here</a>.
-           Deployments currently attached to the tenant view are: <%= blessed_deployment_names.join(",") %>
-           </li>
-       <li>Make sure that at least one Image and one Flavor is attached to a tenant view deployment.</li>
-       <li>Make sure at least one Site is attached to a tenant view deployment.</li>
-       <li>Make sure at least one of the Sites has one or more nodes attached to it.</li>
-       </ol>
-</script>
-
-<script type="text/template" id="tenant-edit-users">
-    <%= xosPickerTemplate({pickedItems: model.usersBuffer,
-                          unpickedItems: array_subtract(xos.tenant().current_user_site_users, model.usersBuffer),
-                          id: "users",
-                          fieldName: "users",
-                          detailView: detailView,
-                          lookupFunc: function(x) { return array_pair_lookup(x,
-                                                     $.merge($.merge([], xos.tenant().current_user_site_user_names), model.user_namesOrig),
-                                                     $.merge($.merge([], xos.tenant().current_user_site_users), model.usersOrig)); },
-                          } ) %>
-</script>
-
-<div id="xos-confirm-dialog" title="Confirmation Required">
-  Are you sure about this?
+<div ng-app="xos.tenant" id="xosTenant" class="container-fluid">
+  <div ui-sref="createslice"></div>
+  <div ui-view></div>
+  <div></div>
 </div>
 
-<div id="tenant-addslice-dialog" title="Create New Slice">
-<div id="tenant-addslice-interior"></div>
-</div>
 
-<div id="tenant-edit-users-dialog" title="Edit Users">
-<div id="tenant-edit-users-interior"></div>
-</div>
-
-<div id="tenant-ssh-commands-dialog" title="SSH Commands">
-<div id="tenant-ssh-commands-interior"></div>
-</div>
-
-<div id="xos-error-dialog" title="Error Message">
-</div>
-
-<div id="xos-tenant-view-panel"> <!-- contentPanel"> -->
-<div id="contentTitle">
-</div>
-<div id="contentButtonPanel">
-
-<div id="rightButtonPanel"></div>
-
-<div class="box" id="logPanel">
-<table id="logTable">
-<tbody>
-</tbody>
-</table> <!-- end logTable -->
-</div> <!-- end logPanel -->
-</div> <!-- end contentButtonPanel -->
-
-<div id="contentInner">
-
-<div id="tenantSliceSelector">
-</div>
-<div id="tenantSummary">
-</div>
-<div id="tenantSiteList">
-</div>
-<div id="tenantButtons">
-</div>
-
-</div> <!-- end contentInner -->
-</div> <!-- end contentPanel -->
-
-{% include 'xosAdmin.html' %}
+<!-- endjs -->
+<!-- inject:js -->
+<script src="/static/js/xosTenant.js"></script>
+<!-- endinject -->
\ No newline at end of file
diff --git a/xos/core/xoslib/static/css/xosTenant.css b/xos/core/xoslib/static/css/xosTenant.css
new file mode 100644
index 0000000..1675325
--- /dev/null
+++ b/xos/core/xoslib/static/css/xosTenant.css
@@ -0,0 +1 @@
+#xosTenant a{margin-bottom:15px}
\ No newline at end of file
diff --git a/xos/core/xoslib/static/js/xosTenant.js b/xos/core/xoslib/static/js/xosTenant.js
index 0bd3604..919e6f8 100644
--- a/xos/core/xoslib/static/js/xosTenant.js
+++ b/xos/core/xoslib/static/js/xosTenant.js
@@ -1,524 +1 @@
-
-/* globals XOSModel, XOSCollection */
-/* eslint-disable no-undef, guard-for-in, new-cap, space-before-blocks, no-unused-vars, no-alert, eqeqeq */
-
-XOSTenantSite = XOSModel.extend({
-  listFields: ['name', 'allocated'],
-  modelName: 'tenantSite',
-  collectionName: 'tenantSites'
-});
-
-XOSTenantSiteCollection = XOSCollection.extend({
-  listFields: ['name', 'allocated', 'ready'],
-  modelName: 'tenantSite',
-  collectionName: 'tenantSites',
-
-  getFromSlice: function(slice) {
-    var tenantSites = [];
-    var id = 0;
-    var that = this;
-
-    for (siteName in slice.attributes.site_allocation) {
-      allocated = slice.attributes.site_allocation[siteName];
-      ready = slice.attributes.site_ready[siteName] || 0;
-      tenantSites.push(new XOSTenantSite({name: siteName, allocated: allocated, ready: ready, id: id}));
-      id = id + 1;
-    }
-
-    for (index in xos.tenantview.models[0].attributes.blessed_site_names) {
-      siteName = xos.tenantview.models[0].attributes.blessed_site_names[index];
-      if (! (siteName in slice.attributes.site_allocation)) {
-        tenantSites.push(new XOSTenantSite({name: siteName, allocated: 0, ready: 0, id: id}));
-        id = id + 1;
-      }
-    }
-    this.set(tenantSites);
-
-    this.listenTo(slice, 'change', function() {
-      that.getReadyFromSlice(slice);
-    });
-  },
-
-  getReadyFromSlice: function(slice) {
-    for (siteName in slice.attributes.site_ready) {
-      ready = slice.attributes.site_ready[siteName];
-      for (index in this.models) {
-        tenantSite = this.models[index];
-        if (tenantSite.attributes.name == siteName) {
-          tenantSite.set('ready', ready);
-        }
-      }
-    }
-  },
-
-  putToSlice: function(slice) {
-    slice.attributes.site_allocation = {};
-    for (index in this.models) {
-      var model = this.models[index];
-
-      slice.attributes.site_allocation[ model.attributes.name ] = model.attributes.allocated;
-    }
-  },
-});
-
-XOSEditUsersView = Marionette.ItemView.extend({
-  template: '#tenant-edit-users',
-  viewInitializers: [],
-
-  onShow: function() {
-    _.each(this.viewInitializers, function(initializer) {
-      initializer();
-    });
-  },
-
-  templateHelpers: function() {
-    return {detailView: this, model: this.model};
-  }
-
-});
-
-XOSTenantSummaryView = XOSDetailView.extend({
-  events: {'change': 'onChange'},
-
-  onChange: function(e) {
-    XOSTenantApp.setDirty(true);
-  },
-
-  saveSuccess: function() {
-    XOSTenantApp.setDirty(false);
-  },
-
-});
-
-
-XOSTenantButtonView = Marionette.ItemView.extend({
-  template: '#xos-tenant-buttons-template',
-
-  events: {'click button.btn-tenant-create': 'createClicked',
-           'click button.btn-tenant-delete': 'deleteClicked',
-           'click button.btn-tenant-add-user': 'addUserClicked',
-           'click button.btn-tenant-save': 'saveClicked',
-           'click button.btn-tenant-download-ssh': 'downloadClicked',
-           },
-
-  createClicked: function() {
-    XOSTenantApp.addSlice();
-  },
-
-  deleteClicked: function() {
-    XOSTenantApp.deleteSlice(this.options.linkedView.model);
-  },
-
-  addUserClicked: function() {
-    XOSTenantApp.editUsers(this.options.linkedView.model);
-  },
-
-  downloadClicked: function() {
-    XOSTenantApp.downloadSSH(this.options.linkedView.model);
-  },
-
-  saveClicked: function(e) {
-    var model = this.options.linkedView.model;
-
-    model.tenantSiteCollection.putToSlice(model);
-    model.attributes.users = model.usersBuffer;
-
-    e.preventDefault();
-    this.options.linkedView.save();
-    //this.options.linkedView.submitContinueClicked.call(this.options.linkedView, e);
-    //XOSTenantApp.setDirty(false);
-  }
-});
-
-XOSTenantApp = new XOSApplication({
-  logTableId: '#logTable',
-  statusMsgId: '#statusMsg',
-  hideTabsByDefault: true,
-  dirty: false,
-  varName: 'XOSTenantApp',
-});
-
-XOSTenantApp.addRegions({
-  tenantSliceSelector: '#tenantSliceSelector',
-  tenantSummary: '#tenantSummary',
-  tenantSiteList: '#tenantSiteList',
-  tenantButtons: '#tenantButtons',
-  tenantAddSliceInterior: '#tenant-addslice-interior',
-  tenantEditUsersInterior: '#tenant-edit-users-interior',
-  tenantSSHCommandsInterior: '#tenant-ssh-commands-interior',
-});
-
-XOSTenantApp.setDirty = function(dirty) {
-  XOSTenantApp.dirty = dirty;
-  if (dirty) {
-    $('button.btn-tenant-save').addClass('btn-success');
-  }
-  else {
-    $('button.btn-tenant-save').removeClass('btn-success');
-  }
-};
-
-XOSTenantApp.buildViews = function() {
-  XOSTenantApp.tenantSites = new XOSTenantSiteCollection();
-
-  tenantSummaryClass = XOSTenantSummaryView.extend({
-    template: '#xos-detail-template',
-    app: XOSTenantApp,
-    detailFields: ['serviceClass', 'default_image', 'default_flavor', 'network_ports'],
-    fieldDisplayNames: {
-      serviceClass: 'Service Level',
-      default_flavor: 'Flavor',
-      default_image: 'Image',
-      mount_data_sets: 'Data Sets'
-    },
-    helpText: {
-      'serviceClass': 'Existing instances will be re-instantiated if changed',
-      'default_image': 'Existing instances will be re-instantiated if changed',
-      'default_flavor': 'Existing instances will be re-instantiated if changed'
-    },
-    onShow: function() {
-      // the slice selector is in a different table, so make every label cell the maximal width
-      make_same_width('#xos-tenant-view-panel', '.xos-label-cell');
-    },
-  });
-
-  XOSTenantApp.tenantSummaryView = tenantSummaryClass;
-
-  tenantAddClass = XOSDetailView.extend({
-    template: '#xos-detail-template',
-    app: XOSTenantApp,
-    detailFields: ['name', 'description']
-  });
-
-  XOSTenantApp.tenantAddView = tenantAddClass;
-
-  tenantSiteItemClass = XOSItemView.extend({
-    template: '#xos-listitem-template',
-    app: XOSTenantApp
-  });
-
-  XOSTenantApp.tenantSiteItemView = tenantSiteItemClass;
-
-  tenantSiteListClass = XOSDataTableView.extend({
-    template: '#xos-list-template',
-    app: XOSTenantApp,
-    childView: tenantSiteItemClass,
-    collection: XOSTenantApp.tenantSites,
-    title: 'sites',
-    inputType: {allocated: 'spinner'},
-    noDeleteColumn: true,
-    disablePaginate: true,
-    disableFilter: true,
-    fieldDisplayNames: {name: 'Site'},
-  });
-
-  XOSTenantApp.tenantSiteListView = tenantSiteListClass;
-
-  XOSTenantApp.tenantSliceSelectorView = SliceSelectorView.extend({
-    sliceChanged: function(id) {
-      XOSTenantApp.navToSlice(id);
-    },
-    filter: function(slice) {
-      return slice.attributes.current_user_can_see;
-    },
-  });
-
-  xos.sites.fetch();
-  xos.slicesPlus.fetch();
-  xos.tenantview.fetch();
-};
-
-make_choices = function(list_of_names, list_of_values) {
-  var result = [];
-  var displayName;
-
-  if (!list_of_values) {
-    for (var index in list_of_names) {
-      displayName = list_of_names[index];
-      result.push([displayName, displayName]);
-    }
-  }
-  else {
-    for (var index in list_of_names) {
-      displayName = list_of_names[index];
-      id = list_of_values[index];
-      result.push([displayName, id]);
-    }
-  }
-  return result;
-};
-
-XOSTenantApp.navToSlice = function(id) {
-  XOSTenantApp.viewSlice(xos.slicesPlus.get(id));
-};
-
-XOSTenantApp.adjustCollectionField = function(collectionName, id, fieldName, amount) {
-  model = XOSTenantApp[collectionName].get(id);
-  model.set(fieldName, Math.max(model.get(fieldName) + amount, 0));
-  XOSTenantApp.setDirty(true);
-};
-
-XOSTenantApp.addSlice = function() {
-  var app = this;
-
-  if (!xos.tenant().current_user_can_create_slice) {
-    window.alert('You do not have sufficient rights to create a slice on your site');
-    return;
-  }
-
-  model = new xos.slicesPlus.model({
-    site: xos.tenant().current_user_site_id,
-    name: xos.tenant().current_user_login_base + '_',
-    creator: xos.tenant().current_user_id
-  });
-
-  var detailView = new XOSTenantApp.tenantAddView({
-    model: model,
-    collection: xos.slicesPlus,
-    noSubmitButton: true,
-  });
-
-  detailView.dialog = $('#tenant-addslice-dialog');
-  app.tenantAddSliceInterior.show(detailView);
-
-  $('#tenant-addslice-dialog').dialog({
-    autoOpen: false,
-    modal: true,
-    width: 640,
-    buttons: {
-      'Create Slice': function() {
-        var addDialog = this;
-
-        detailView.synchronous = true;
-        detailView.afterSave = function() {
-          $(addDialog).dialog('close');
-          XOSTenantApp.navToSlice(detailView.model.id);
-        };
-        detailView.save();
-      },
-      'Cancel': function() {
-        $(this).dialog('close');
-      }
-    }
-  });
-  $('#tenant-addslice-dialog').dialog('open');
-};
-
-XOSTenantApp.editUsers = function(model) {
-  var app = this;
-  var detailView = new XOSEditUsersView({model: model, collection: xos.slicesPlus});
-
-  detailView.dialog = $('#tenant-edit-users-dialog');
-  app.tenantEditUsersInterior.show(detailView);
-
-  $('#tenant-edit-users-dialog').dialog({
-    autoOpen: false,
-    modal: true,
-    width: 640,
-    buttons: {
-      'Ok': function() {
-        var editDialog = this;
-        var user_ids = all_options($('#tenant-edit-users-dialog').find('.select-picker-to'));
-
-        user_ids = user_ids.map(function(x) {
-          return parseInt(x,10);
-        });
-
-        if (!array_same_elements(user_ids, model.usersBuffer)) {
-          XOSTenantApp.setDirty(true);
-        }
-        model.usersBuffer = user_ids;
-        $(editDialog).dialog('close');
-      },
-      'Cancel': function() {
-        $(this).dialog('close');
-      }
-    }
-  });
-  $('#tenant-edit-users-dialog').dialog('open');
-};
-
-XOSTenantApp.downloadSSH = function(model) {
-  var sshCommands = '';
-
-  for (index in model.attributes.sliceInfo.sshCommands) {
-    sshCommand = model.attributes.sliceInfo.sshCommands[index];
-    sshCommands = sshCommands + sshCommand + '\n';
-  }
-
-  if (sshCommands.length == 0) {
-    alert('this slice has no instantiated instances yet');
-    return;
-  }
-
-  var htmlView = new HTMLView({
-    html: '<pre style="overflow: auto; word-wrap: normal; white-space: pre; word-wrap: normal;">' +
-      sshCommands + '</pre>'
-  });
-
-  XOSTenantApp.tenantSSHCommandsInterior.show(htmlView);
-
-  $('#tenant-ssh-commands-dialog').dialog({
-    autoOpen: false,
-    modal: true,
-    width: 640,
-    buttons: {
-      'Download': function() {
-        var dlLink = document.createElement('a');
-
-        dlLink.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(sshCommands));
-        dlLink.setAttribute('download', 'sshcommands.txt');
-        dlLink.click();
-
-        //window.open('data:text/text,' + encodeURIComponent(sshCommands));
-      },
-      'Close': function() {
-        $(this).dialog('close');
-      },
-    }
-  });
-  $('#tenant-ssh-commands-dialog').dialog('open');
-};
-
-XOSTenantApp.deleteSlice = function(model) {
-  var app = this;
-
-  app.deleteDialog(model, function() {
-    app.viewSlice(undefined);
-  });
-};
-
-XOSTenantApp.viewSlice = function(model) {
-  if (XOSTenantApp.dirty) {
-    if (!confirm('The current instance has unsaved data -- view new instance anyway ?')) {
-      $('#tenantSliceSelector select').val(XOSTenantApp.currentSlice.id);
-      return;
-    }
-  }
-
-  XOSTenantApp.setDirty(false);
-
-  if (!model && xos.slicesPlus.models.length > 0) {
-    model = xos.slicesPlus.models[0];
-  }
-
-  if (model) {
-    sliceSelector = new XOSTenantApp.tenantSliceSelectorView({
-      collection: xos.slicesPlus,
-      selectedID: model ? model.id : null,
-    });
-
-    XOSTenantApp.sliceSelector = sliceSelector;
-    XOSTenantApp.tenantSliceSelector.show(sliceSelector);
-
-    tenantSummary = new XOSTenantApp.tenantSummaryView({
-      model: model,
-      choices: {
-        mount_data_sets: make_choices(xos.tenant().public_volume_names, null),
-        serviceClass: make_choices(xos.tenant().blessed_service_class_names, xos.tenant().blessed_service_classes),
-        default_image: make_choices(xos.tenant().blessed_image_names, xos.tenant().blessed_images),
-        default_flavor: make_choices(xos.tenant().blessed_flavor_names, xos.tenant().blessed_flavors)
-      },
-    });
-
-    XOSTenantApp.tenantSummary.show(tenantSummary);
-
-    tenantSites = new XOSTenantSiteCollection();
-    tenantSites.getFromSlice(model);
-    model.usersBuffer = model.attributes.users; /* save a copy of 'users' that we can edit. This prevents another view (developer) from overwriting our copy with a fetch from the server */
-    model.usersOrig = model.attributes.users;   /* save an immutable copy that we'll use for username lookups */
-    model.user_namesOrig = model.attributes.user_names;
-    model.tenantSiteCollection = tenantSites;
-    XOSTenantApp.tenantSites = tenantSites;
-
-    tenantSiteList = new XOSTenantApp.tenantSiteListView({collection: tenantSites});
-    XOSTenantApp.tenantSiteList.show(tenantSiteList);
-    // on xos.slicePlus.sort, need to update xostenantapp.tenantSites
-
-    XOSTenantApp.tenantButtons.show(
-      new XOSTenantButtonView({
-        app: XOSTenantApp,
-        linkedView: tenantSummary
-      })
-    );
-
-    XOSTenantApp.currentSlice = model;
-  }
-  else {
-    XOSTenantApp.tenantSliceSelector.show(new HTMLView({html: ''}));
-    XOSTenantApp.tenantSummary.show(new HTMLView({html: 'You have no slices'}));
-    XOSTenantApp.tenantSiteList.show(new HTMLView({html: ''}));
-    XOSTenantApp.tenantButtons.show(
-      new XOSTenantButtonView({
-        template: '#xos-tenant-buttons-noslice-template',
-        app: XOSTenantApp,
-        linkedView: tenantSummary
-      })
-    );
-  }
-};
-
-XOSTenantApp.sanityCheck = function() {
-  errors = [];
-  if (xos.tenant().blessed_deployments && xos.tenant().blessed_deployments.length == 0) {
-    errors.push('no blessed deployments');
-  }
-  if (xos.tenant().blessed_service_classes.length == 0) {
-    errors.push('no blessed service classes');
-  }
-  if (xos.tenant().blessed_flavors.length == 0) {
-    errors.push('no blessed flavors');
-  }
-  if (xos.tenant().blessed_images.length == 0) {
-    errors.push('no blessed images');
-  }
-  if (xos.tenant().blessed_sites.length == 0) {
-    errors.push('no blessed sites');
-  }
-  if (xos.tenant().current_user_site_id == null) {
-    errors.push('current user does not have a site');
-  }
-
-  if (errors.length > 0) {
-    t = templateFromId('#tenant-sanity-check');
-    $('#tenantSummary').html(t({
-      errors: errors,
-      blessed_deployment_names:
-      xos.tenant().blessed_deployment_names
-    }));
-    return false;
-  }
-
-  return true;
-};
-
-XOSTenantApp.collectionLoadChange = function() {
-  stats = xos.getCollectionStatus();
-
-  if (!XOSTenantApp.navigationStarted) {
-    if (stats['isLoaded'] + stats['failedLoad'] >= stats['startedLoad']) {
-      if (XOSTenantApp.sanityCheck()) {
-        XOSTenantApp.viewSlice(undefined);
-      }
-    }
-    else {
-      $('#tenantSummary').html('<h3>Loading...</h3><div id="xos-startup-progress"></div>');
-      $('#xos-startup-progress').progressbar({value: stats['completedLoad'], max: stats['startedLoad']});
-    }
-  }
-};
-
-XOSTenantApp.on('start', function() {
-  XOSTenantApp.buildViews();
-
-  // fire it once to initially show the progress bar
-  XOSTenantApp.collectionLoadChange();
-
-  // fire it each time the collection load status is updated
-  Backbone.on('xoslib:collectionLoadChange', XOSTenantApp.collectionLoadChange);
-});
-
-$(document).ready(function() {
-  XOSTenantApp.start();
-});
-/* eslint-enable */
+"use strict";angular.module("xos.tenant",["ngResource","ngCookies","ui.router","xos.helpers"]).config(["$stateProvider",function(e){e.state("user-list",{url:"/",template:"<users-list></users-list>"}).state("site",{url:"/site/:id",template:"<site-detail></site-detail>"}).state("createslice",{url:"/site/:site/slice/:id?",template:"<create-slice></create-slice>"})}]).config(["$httpProvider",function(e){e.interceptors.push("NoHyperlinks")}]).directive("usersList",function(){return{restrict:"E",scope:{},bindToController:!0,controllerAs:"vm",templateUrl:"templates/users-list.tpl.html",controller:["Sites","SlicesPlus",function(e,t){var i=this;this.tableConfig={columns:[{label:"Site1",prop:"name",link:function(e){return"/#/site/"+e.id}},{label:"Allocated",prop:"instance_total"},{label:"Ready",prop:"instance_total_ready"}]},e.query().$promise.then(function(e){return i.sites=e,t.query().$promise}).then(function(e){i.slices=e,i.site_list=i.returnData(i.sites,i.slices)})["catch"](function(e){throw new Error(e)}),this.returnData=function(e,t){var i,s=0,l=[];for(i=0;i<e.length;i++){var n=0,a=0;for(s=0;s<t.length;s++)null!=e[i].id&&null!=t[s].site&&e[i].id===t[s].site&&(n+=t[s].instance_total,a+=t[s].instance_total_ready);var r={id:e[i].id,name:e[i].name,instance_total:n,instance_total_ready:a};l.push(r)}return l}}]}}).directive("siteDetail",function(){return{restrict:"E",scope:{},bindToController:!0,controllerAs:"sl",templateUrl:"templates/slicelist.html",controller:["SlicesPlus","$stateParams",function(e,t){var i=this;this.siteId=t.id,this.tableConfig={columns:[{label:"Slice List",prop:"name",link:function(e){return"/#/site/"+e.site+"/slice/"+e.id}},{label:"Allocated",prop:"instance_total"},{label:"Ready",prop:"instance_total_ready"}]},e.query({site:t.id}).$promise.then(function(e){i.sliceList=e})["catch"](function(e){throw new Error(e)})}]}}).directive("createSlice",function(){return{restrict:"E",scope:{},bindToController:!0,controllerAs:"cs",templateUrl:"templates/createslice.html",controller:["Slices","SlicesPlus","Sites","Images","$stateParams","$http","$state","$q",function(e,t,i,s,l,n,a,r){var o=this;this.config={exclude:["site","password","last_login","mount_data_sets","default_flavor","creator","exposed_ports","networks","omf_friendly","omf_friendly","no_sync","no_policy","lazy_blocked","write_protect","deleted","backend_status","backend_register","policed","enacted","updated","created","validators","humanReadableName"],formName:"SliceDetails",feedback:{show:!1,message:"Form submitted successfully !!!",type:"success"},actions:[{label:"Save",icon:"ok",cb:function(e,t){d(e,t).then(function(){a.go("site",{id:o.model.site})})},"class":"success"},{label:"Save and continue editing",icon:"ok",cb:function(e,t){d(e,t)},"class":"primary"},{label:"Save and add another",icon:"ok",cb:function(e,t){d(e,t).then(function(){a.go("createslice",{site:o.model.site,id:""})})},"class":"primary"}],fields:{site:{label:"Site",type:"select",validators:{required:!0},hint:"The Site this Slice belongs to",options:[]},name:{label:"Name",type:"string",hint:"The Name of the Slice",validators:{required:!0}},serviceClass:{label:"ServiceClass",type:"select",validators:{required:!0},hint:"The Site this Slice belongs to",options:[{id:1,label:"Best effort"}]},enabled:{label:"Enabled",type:"boolean",hint:"Status for this Slice"},description:{label:"Description",type:"string",hint:"High level description of the slice and expected activities",validators:{required:!1,minlength:10}},service:{label:"Service",type:"select",validators:{required:!1},options:[{id:0,label:"--------"}]},slice_url:{label:"Slice url",type:"string",validators:{required:!1,minlength:10}},max_instances:{label:"Max Instances",type:"number",validators:{required:!1,min:0}},default_isolation:{label:"Default Isolation",type:"select",validators:{required:!1},options:[{id:"vm",label:"Virtual Machine"},{id:"container",label:"Container"},{id:"container_vm",label:"Container in VM"}]},default_image:{label:"Default image",type:"select",validators:{required:!1},options:[]},network:{label:"Network",type:"select",validators:{required:!1},options:[{id:"default",label:"Default"},{id:"host",label:"Host"},{id:"bridged",label:"Bridged"},{id:"noauto",label:"No Automatic Networks"}]}}};var c;s.query().$promise.then(function(e){o.users=e,c=o.users,o.optionValImg=o.setData(c,{field1:"id",field2:"name"}),o.config.fields.default_image.options=o.optionValImg})["catch"](function(e){throw new Error(e)}),this.setData=function(e,t){var i,s=[];for(i=0;i<e.length;i++){var l={id:e[i][t.field1],label:e[i][t.field2]};s.push(l)}return s},l.id?(delete this.config.fields.site,this.config.exclude.push("site"),e.get({id:l.id}).$promise.then(function(e){o.users=e,c=e,o.model=c})["catch"](function(e){throw new Error(e)})):(this.model={},n.get("/xoslib/tenantview/").success(function(e){o.userList=e,console.log(o.userList),o.model.creator=o.userList.current_user_id}),i.query().$promise.then(function(e){o.users_site=e,o.optionVal=o.setData(o.users_site,{field1:"id",field2:"name"}),o.config.fields.site.options=o.optionVal})["catch"](function(e){throw new Error(e)}));var d=function(t,i){var s=r.defer();if(delete t.networks,i.$valid){if(t.id)var l=e.update(t).$promise;else var l=e.save(t).$promise;l.then(function(e){o.model=e,o.config.feedback.show=!0,s.resolve(o.model)})["catch"](function(e){o.config.feedback.show=!0,o.config.feedback.type="danger",e.data&&e.data.detail?o.config.feedback.message=e.data.detail:o.config.feedback.message=e.statusText,s.reject(e)})}return s.promise}}]}}),angular.module("xos.tenant").run(["$templateCache",function(e){e.put("templates/createslice.html",'<!--<xos-table config="cs.tableConfig" data="cs.sites"></xos-table>-->\r\n<h2>Slice Details</h2>\r\n<hr></hr>\r\n<xos-form ng-model="cs.model" config="cs.config" ></xos-form>\r\n\r\n<!--<pre>-->\r\n<!--&lt;!&ndash;{{cs.users | json}}&ndash;&gt;-->\r\n\r\n<!--{{cs.users.name | json}}-->\r\n\r\n<!--</pre>-->'),e.put("templates/slicelist.html",'<!--<span ng-bind="siteNameSe"></span>-->\r\n<!--<xos-field></xos-field>-->\r\n<a class="addlink btn btn-info" ui-sref="createslice({site: sl.siteId})"><i class="glyphicon glyphicon-plus-sign"></i> Create Slice</a>\r\n<xos-table config="sl.tableConfig" data="sl.sliceList"></xos-table>\r\n<!--<div ui-view="sliceDetails"></div>-->\r\n<!--<pre>{{sl.users[0].site}}</pre>-->\r\n'),e.put("templates/users-list.tpl.html",'<xos-table config="vm.tableConfig" data="vm.site_list"></xos-table>')}]),angular.module("xos.tenant").run(["$location",function(e){e.path("/")}]);
\ No newline at end of file
