From 1f6897b930154c11d286badfdb6ac550ec06e7e5 Mon Sep 17 00:00:00 2001 From: Vincent Fiduccia Date: Tue, 7 Jul 2015 18:23:24 -0700 Subject: [PATCH] Ember 1.13: Service edit --- app/applications-tab/index/route.js | 2 +- app/authenticated/controller.js | 1 - app/authenticated/index/route.js | 2 +- app/components/edit-container/component.js | 2 +- app/components/edit-service/component.js | 72 ++++++++++++++++++++++ app/components/edit-service/template.hbs | 47 ++++++++++++++ app/components/host-pod/component.js | 2 +- app/components/page-header/component.js | 6 +- app/components/page-header/template.hbs | 4 +- app/components/service-pod/template.hbs | 22 +++---- app/components/stack-section/template.hbs | 4 +- app/environment/controller.js | 8 +-- app/host/model.js | 1 - app/mixins/edit-service.js | 46 +++++--------- app/mixins/sortable.js | 2 +- app/router.js | 2 +- app/service/controller.js | 7 ++- app/service/edit/controller.js | 32 ---------- app/service/edit/route.js | 39 ------------ app/service/edit/template.hbs | 39 ------------ app/service/edit/view.js | 17 ----- app/service/model.js | 4 +- app/services/endpoint.js | 1 + app/templates/container/edit-links.hbs | 6 +- app/templates/container/edit-services.hbs | 2 +- app/utils/add-view-action.js | 2 +- 26 files changed, 174 insertions(+), 198 deletions(-) create mode 100644 app/components/edit-service/component.js create mode 100644 app/components/edit-service/template.hbs delete mode 100644 app/service/edit/controller.js delete mode 100644 app/service/edit/route.js delete mode 100644 app/service/edit/template.hbs delete mode 100644 app/service/edit/view.js diff --git a/app/applications-tab/index/route.js b/app/applications-tab/index/route.js index 6dd41399e..cfd9ad55d 100644 --- a/app/applications-tab/index/route.js +++ b/app/applications-tab/index/route.js @@ -2,7 +2,7 @@ import Ember from 'ember'; export default Ember.Route.extend({ beforeModel: function() { - var main = this.modelFor('stacks-tab'); + var main = this.modelFor('applications-tab'); if ( main.get('services.length') ) { this.transitionTo('environments'); diff --git a/app/authenticated/controller.js b/app/authenticated/controller.js index efe013ae5..ff47e8af3 100644 --- a/app/authenticated/controller.js +++ b/app/authenticated/controller.js @@ -1,5 +1,4 @@ import Ember from 'ember'; -import C from 'ui/utils/constants'; export default Ember.Controller.extend({ needs: ['application'], diff --git a/app/authenticated/index/route.js b/app/authenticated/index/route.js index f7e7ce0b0..eaa20e02b 100644 --- a/app/authenticated/index/route.js +++ b/app/authenticated/index/route.js @@ -2,6 +2,6 @@ import Ember from 'ember'; export default Ember.Route.extend({ beforeModel: function() { - this.replaceWith('stacks-tab'); + this.replaceWith('applications-tab'); } }); diff --git a/app/components/edit-container/component.js b/app/components/edit-container/component.js index 18f282a77..e3f460aab 100644 --- a/app/components/edit-container/component.js +++ b/app/components/edit-container/component.js @@ -31,7 +31,7 @@ export default Ember.Component.extend(EditContainer, { this.get('store').findAll('host'), // Need inactive ones in case a link points to an inactive host ]).then((results) => { var model = Ember.Object.create({ - instance: instance, + instance: instance.clone(), ports: results[0], instanceLinks: results[1], allHosts: results[2], diff --git a/app/components/edit-service/component.js b/app/components/edit-service/component.js new file mode 100644 index 000000000..b325ba6d6 --- /dev/null +++ b/app/components/edit-service/component.js @@ -0,0 +1,72 @@ +import Ember from 'ember'; +import NewOrEdit from 'ui/mixins/new-or-edit'; +import EditService from 'ui/mixins/edit-service'; +import EditTargetIp from 'ui/mixins/edit-targetip'; +import C from 'ui/utils/constants'; +import { addAction } from 'ui/utils/add-view-action'; + +export default Ember.Component.extend(NewOrEdit, EditService, EditTargetIp, { + editing: true, + loading: true, + + actions: { + addServiceLink: addAction('addServiceLink', '.service-link'), + addTargetIp: addAction('addTargetIp', '.target-ip'), + + outsideClick: function() {}, + + cancel: function() { + this.sendAction('dismiss'); + } + }, + + didInsertElement: function() { + Ember.run.next(this, 'loadDependencies'); + }, + + loadDependencies: function() { + var service = this.get('originalModel'); + + this.get('store').find('environment', service.get('environmentId')).then((env) => { + env.importLink('services').then(() => { + var model = Ember.Object.create({ + service: service.clone(), + selectedEnvironment: env + }); + + this.setProperties({ + originalModel: service, + model: model, + service: model.service, + environment: model.selectedEnvironment, + }); + + this.initFields(); + this.set('loading', false); + }); + }); + }, + + canScale: function() { + if ( ['service','loadbalancerservice'].indexOf(this.get('service.type').toLowerCase()) >= 0 ) + { + return !this.getLabel(C.LABEL.SCHED_GLOBAL); + } + else + { + return false; + } + }.property('service.type'), + + hasServiceLinks: function() { + return this.get('service.type').toLowerCase() !== 'externalservice'; + }.property('service.type'), + + hasTargetIp: function() { + return this.get('service.type').toLowerCase() === 'externalservice'; + }.property('service.type'), + + doneSaving: function() { + this.sendAction('dismiss'); + } +}); diff --git a/app/components/edit-service/template.hbs b/app/components/edit-service/template.hbs new file mode 100644 index 000000000..1fe628c4b --- /dev/null +++ b/app/components/edit-service/template.hbs @@ -0,0 +1,47 @@ +{{#liquid-if loading}} +
+

+ Loading... +

+
+{{else}} +
+

{{#if editing}}Edit{{else}}Add{{/if}} Service

+ {{top-errors errors=errors}} + + {{partial "container/edit-name"}} + + {{#if canScale}} + {{partial "form-divider"}} + +
+
+ +
+ {{#if isGlobal}} +
+ Always run one instance of this container on every host +
+ {{else}} +
+ {{service.scale}} +
+
+ {{input-slider value=service.scale valueMin=1 valueMax=11 scaleMin=0 scaleMax=12}} +
+ {{/if}} +
+ {{/if}} + + {{partial "form-divider"}} + + {{#if hasServiceLinks}} + {{partial "container/edit-services"}} + {{/if}} + {{#if hasTargetIp}} + {{partial "container/edit-targetip"}} + {{/if}} +
+ + {{partial "save-cancel"}} +{{/liquid-if}} diff --git a/app/components/host-pod/component.js b/app/components/host-pod/component.js index 4462d88b4..2acc7d09c 100644 --- a/app/components/host-pod/component.js +++ b/app/components/host-pod/component.js @@ -9,7 +9,7 @@ export default Ember.Component.extend(ReadLabels,{ actions: { newContainer: function() { - this.sendAction('newContainer', this.get('model.id')) + this.sendAction('newContainer', this.get('model.id')); }, }, diff --git a/app/components/page-header/component.js b/app/components/page-header/component.js index 30c661690..dd931fb0a 100644 --- a/app/components/page-header/component.js +++ b/app/components/page-header/component.js @@ -28,11 +28,11 @@ export default Ember.Component.extend({ }.property('project.id','projectChoices.@each.id'), isInfrastructure: function() { - return this.get('currentPath').indexOf('authenticated.infrastructure') === 0; + return this.get('currentPath').indexOf('authenticated.infrastructure-tab') === 0; }.property('currentPath'), - isStacks: function() { - return this.get('currentPath').indexOf('authenticated.stacks') === 0; + isApplications: function() { + return this.get('currentPath').indexOf('authenticated.applications-tab') === 0; }.property('currentPath'), actions: { diff --git a/app/components/page-header/template.hbs b/app/components/page-header/template.hbs index dca2d74c3..32b9494b3 100644 --- a/app/components/page-header/template.hbs +++ b/app/components/page-header/template.hbs @@ -2,7 +2,7 @@ @@ -129,7 +129,7 @@ {{#link-to "hosts"}} Hosts{{/link-to}} {{#link-to "containers"}} Containers{{/link-to}} {{/if}} - {{#if isStacks}} + {{#if isApplications}} {{#link-to "environments"}} Stacks{{/link-to}}
diff --git a/app/components/service-pod/template.hbs b/app/components/service-pod/template.hbs index 70fff512e..0aebf272d 100644 --- a/app/components/service-pod/template.hbs +++ b/app/components/service-pod/template.hbs @@ -19,18 +19,16 @@
{{#each model.consumedServicesWithNames as |map|}} - {{#with map.service controller="service" as |service|}} -
- {{#link-to "service" service.environmentId service.id}} - - {{#if (eq map.name service.displayName)}} - {{map.name}} - {{else}} - {{service.displayName}}{{#if map.name}} (as {{map.name}}){{/if}} - {{/if}} - {{/link-to}} -
- {{/with}} +
+ {{#link-to "service" map.service.environmentId map.service.id}} + + {{#if (eq map.name map.service.displayName)}} + {{map.name}} + {{else}} + {{map.service.displayName}}{{#if map.name}} (as {{map.name}}){{/if}} + {{/if}} + {{/link-to}} +
{{/each}}
{{#if model.externalIpAddresses.length}} diff --git a/app/components/stack-section/template.hbs b/app/components/stack-section/template.hbs index 79fc3807b..92b92a0dd 100644 --- a/app/components/stack-section/template.hbs +++ b/app/components/stack-section/template.hbs @@ -1,7 +1,9 @@
{{model.displayState}}
- {{resource-actions-menu model=model choices=model.availableActions}} + {{#with model controller="environment" as |ctrl|}} + {{resource-actions-menu model=ctrl choices=ctrl.availableActions parentController=this}} + {{/with}}  
diff --git a/app/environment/controller.js b/app/environment/controller.js index 88d7478ab..36fd2e2d8 100644 --- a/app/environment/controller.js +++ b/app/environment/controller.js @@ -16,7 +16,7 @@ export default Ember.Controller.extend(CattleTransitioningController, { }, addService: function() { - this.transitionToRoute('service.new', { + this.get('controllers.application').transitionToRoute('service.new', { queryParams: { environmentId: this.get('model.id'), }, @@ -24,7 +24,7 @@ export default Ember.Controller.extend(CattleTransitioningController, { }, addBalancer: function() { - this.transitionToRoute('service.new-balancer', { + this.get('controllers.application').transitionToRoute('service.new-balancer', { queryParams: { environmentId: this.get('model.id'), }, @@ -44,11 +44,11 @@ export default Ember.Controller.extend(CattleTransitioningController, { }, viewCode: function() { - this.transitionToRoute('environment.code', this.get('model.id')); + this.get('controllers.application').transitionToRoute('environment.code', this.get('model.id')); }, viewGraph: function() { - this.transitionToRoute('environment.graph', this.get('model.id')); + this.get('controllers.application').transitionToRoute('environment.graph', this.get('model.id')); }, delete: function() { diff --git a/app/host/model.js b/app/host/model.js index 00acc20f4..f2218238a 100644 --- a/app/host/model.js +++ b/app/host/model.js @@ -1,4 +1,3 @@ -import Ember from 'ember'; import Resource from 'ember-api-store/models/resource'; var Host = Resource.extend({ diff --git a/app/mixins/edit-service.js b/app/mixins/edit-service.js index 0fe4025ed..966acdf32 100644 --- a/app/mixins/edit-service.js +++ b/app/mixins/edit-service.js @@ -8,7 +8,7 @@ export default Ember.Mixin.create(EditLabels, { actions: { addServiceLink: function() { - this.get('serviceLinksArray').pushObject(Ember.Object.create({serviceId: null, linkName: null})); + this.get('serviceLinksArray').pushObject(Ember.Object.create({name: '', serviceId: null})); }, removeServiceLink: function(obj) { this.get('serviceLinksArray').removeObject(obj); @@ -25,7 +25,7 @@ export default Ember.Mixin.create(EditLabels, { // Services // ---------------------------------- serviceChoices: function() { - var env = this.get('selectedEnvironment'); + var env = this.get('model.selectedEnvironment'); var group = 'Stack: ' + (env.get('name') || '('+env.get('id')+')'); var list = (env.get('services')||[]).map((service) => { @@ -47,7 +47,6 @@ export default Ember.Mixin.create(EditLabels, { }.property('environment.services.@each.{id,name,state}'), serviceLinksArray: null, - serviceLinksAsMap: null, initServiceLinks: function() { var out = []; var links; @@ -63,11 +62,11 @@ export default Ember.Mixin.create(EditLabels, { } links.forEach(function(obj) { - var linkName = obj.get('name'); + var name = obj.get('name'); var service = obj.get('service'); out.push(Ember.Object.create({ - linkName: (linkName === service.get('name') ? '' : linkName), + name: (name === service.get('name') ? '' : name), obj: service, serviceId: service.get('id'), })); @@ -77,31 +76,7 @@ export default Ember.Mixin.create(EditLabels, { }, serviceLinksDidChange: function() { - // Sync with the actual environment - var out = {}; - this.get('serviceLinksArray').forEach((row) => { - if ( row.serviceId ) - { - var name = row.linkName; - if ( !name ) - { - // If no name is given, use the name of the service - var service = this.get('serviceChoices').filterProperty('id', row.serviceId)[0]; - if ( service ) - { - name = service.get('obj.name'); - } - } - - if ( name ) - { - out[name] = row.serviceId; - } - } - }); - - this.set('serviceLinksAsMap', out); - }.observes('serviceLinksArray.@each.{linkName,serviceId}'), + }.observes('serviceLinksArray.@each.{name,serviceId}'), // ---------------------------------- // Scheduling @@ -144,7 +119,15 @@ export default Ember.Mixin.create(EditLabels, { var type = service.get('type').toLowerCase(); if ( type === 'service' ) { - return service.doAction('setservicelinks', {serviceLinks: this.get('serviceLinksAsMap')}); + var ary = [] + this.get('serviceLinksArray').forEach((row) => { + if ( row.serviceId ) + { + ary.push({name: row.name, serviceId: row.serviceId}); + } + }); + + return service.doAction('setservicelinks', {serviceLinks: ary}); } else if ( ['dnsservice','loadbalancerservice'].indexOf(type) >= 0 ) { @@ -152,5 +135,4 @@ export default Ember.Mixin.create(EditLabels, { return service.doAction('setservicelinks', {serviceIds: ids}); } }, - }); diff --git a/app/mixins/sortable.js b/app/mixins/sortable.js index 4fa328dd0..eed7aae94 100644 --- a/app/mixins/sortable.js +++ b/app/mixins/sortable.js @@ -35,7 +35,7 @@ export default Ember.Mixin.create({ }.property('sortBy','sorts.@each.{name}'), arranged: function(){ - var content = this.get('sortableContent'); + var content = this.get('sortableContent')||[]; var currentSort = this.get('currentSort'); var out; if ( currentSort ) diff --git a/app/router.js b/app/router.js index ab2f73f09..04fcd305e 100644 --- a/app/router.js +++ b/app/router.js @@ -85,7 +85,7 @@ Router.map(function() { }); // Applications - this.resource('stacks-tab', {path: '/stacks'}, function() { + this.resource('applications-tab', {path: '/apps'}, function() { this.resource('splash', {path: '/welcome'}); this.resource('service.new', {path: '/add-service'}); this.resource('service.new-balancer', {path: '/add-balancer'}); diff --git a/app/service/controller.js b/app/service/controller.js index d7e56bb1a..d88b07d74 100644 --- a/app/service/controller.js +++ b/app/service/controller.js @@ -2,7 +2,7 @@ import Ember from 'ember'; import CattleTransitioningController from 'ui/mixins/cattle-transitioning-controller'; var ServiceController = Ember.Controller.extend(CattleTransitioningController, { - needs: ['environment'], + needs: ['environment','application'], environment: Ember.computed.alias('controllers.environment.model'), actions: { @@ -15,7 +15,10 @@ var ServiceController = Ember.Controller.extend(CattleTransitioningController, { }, edit: function() { - this.transitionToRoute('service.edit', this.get('environmentId'), this.get('model.id')); + this.get('controllers.application').setProperties({ + editService: true, + originalModel: this.get('model'), + }); }, scaleUp: function() { diff --git a/app/service/edit/controller.js b/app/service/edit/controller.js deleted file mode 100644 index ed7f7590c..000000000 --- a/app/service/edit/controller.js +++ /dev/null @@ -1,32 +0,0 @@ -import Ember from 'ember'; -import Cattle from 'ui/utils/cattle'; -import EditService from 'ui/mixins/edit-service'; -import EditTargetIp from 'ui/mixins/edit-targetip'; -import C from 'ui/utils/constants'; - -export default Ember.ObjectController.extend(Cattle.LegacyNewOrEditMixin, EditService, EditTargetIp, { - editing: true, - - canScale: function() { - if ( ['service','loadbalancerservice'].indexOf(this.get('service.type').toLowerCase()) >= 0 ) - { - return !this.getLabel(C.LABEL.SCHED_GLOBAL); - } - else - { - return false; - } - }.property('service.type'), - - hasServiceLinks: function() { - return this.get('service.type').toLowerCase() !== 'externalservice'; - }.property('service.type'), - - hasTargetIp: function() { - return this.get('service.type').toLowerCase() === 'externalservice'; - }.property('service.type'), - - doneSaving: function() { - this.send('goToPrevious'); - } -}); diff --git a/app/service/edit/route.js b/app/service/edit/route.js deleted file mode 100644 index a2e67d26e..000000000 --- a/app/service/edit/route.js +++ /dev/null @@ -1,39 +0,0 @@ -import Ember from 'ember'; - -export default Ember.Route.extend({ - model: function(/*params, transition*/) { - var store = this.get('store'); - var service = this.modelFor('service'); - - var dependencies = [ - store.find('environment', service.get('environmentId')).then(function(env) { - return env.importLink('services'); - }) - ]; - - return Ember.RSVP.all(dependencies, 'Load service dependencies').then((results) => { - return Ember.Object.create({ - service: service, - selectedEnvironment: results[0], - }); - }); - }, - - setupController: function(controller, model) { - var service = model.get('service'); - model.set('service', service.clone()); - controller.set('originalModel', service); - controller.set('model', model); - controller.initFields(); - }, - - renderTemplate: function() { - this.render('service/edit', {into: 'application', outlet: 'overlay'}); - }, - - actions: { - cancel: function() { - this.goToPrevious(); - }, - } -}); diff --git a/app/service/edit/template.hbs b/app/service/edit/template.hbs deleted file mode 100644 index c6ee8bcd2..000000000 --- a/app/service/edit/template.hbs +++ /dev/null @@ -1,39 +0,0 @@ -
-

{{#if editing}}Edit{{else}}Add{{/if}} Service

- {{top-errors errors=errors}} - - {{partial "container/edit-name"}} - - {{#if canScale}} - {{partial "form-divider"}} - -
-
- -
- {{#if isGlobal}} -
- Always run one instance of this container on every host -
- {{else}} -
- {{service.scale}} -
-
- {{input-slider value=service.scale valueMin=1 valueMax=11 scaleMin=0 scaleMax=12}} -
- {{/if}} -
- {{/if}} - - {{partial "form-divider"}} - - {{#if hasServiceLinks}} - {{partial "container/edit-services"}} - {{/if}} - {{#if hasTargetIp}} - {{partial "container/edit-targetip"}} - {{/if}} -
- -{{partial "save-cancel"}} diff --git a/app/service/edit/view.js b/app/service/edit/view.js deleted file mode 100644 index 1e62fcc00..000000000 --- a/app/service/edit/view.js +++ /dev/null @@ -1,17 +0,0 @@ -import Overlay from "ui/overlay/view"; -import { addAction } from 'ui/utils/add-view-action'; - -export default Overlay.extend({ - actions: { - addServiceLink: addAction('addServiceLink', '.service-link'), - addTargetIp: addAction('addTargetIp', '.target-ip'), - - overlayClose: function() { - this.get('controller').send('cancel'); - }, - - overlayEnter: function() { - this.get('controller').send('save'); - }, - } -}); diff --git a/app/service/model.js b/app/service/model.js index 28cc951c7..3445bc598 100644 --- a/app/service/model.js +++ b/app/service/model.js @@ -16,7 +16,7 @@ var Service = Resource.extend(ReadLabels, { consumedServicesUpdated: 0, serviceLinks: null, // Used for clone reservedKeys: ['_allMaps','consumedServicesUpdated','serviceLinks'], - labelResource: Ember.computed.alias('model.launchConfig'), + labelResource: Ember.computed.alias('launchConfig'), init: function() { this._super(); @@ -163,7 +163,7 @@ var Service = Resource.extend(ReadLabels, { }.property('type'), activeIcon: function() { - return activeIcon(this.get('model')); + return activeIcon(this); }.property('type'), }); diff --git a/app/services/endpoint.js b/app/services/endpoint.js index 4528bb27d..e59b420b2 100644 --- a/app/services/endpoint.js +++ b/app/services/endpoint.js @@ -1,5 +1,6 @@ import Ember from 'ember'; import Util from 'ui/utils/util'; +import C from 'ui/utils/constants'; export default Ember.Service.extend({ cookies: Ember.inject.service(), diff --git a/app/templates/container/edit-links.hbs b/app/templates/container/edit-links.hbs index c92b57c17..a4f042218 100644 --- a/app/templates/container/edit-links.hbs +++ b/app/templates/container/edit-links.hbs @@ -7,7 +7,7 @@ {{#unless editing}}
{{#if containersOnRequestedHostIfUnmanaged.length}} - + {{else}} There are no other containers to link to. {{/if}} @@ -39,9 +39,9 @@ {{#if link.existing}} -

{{link.linkName}}

+

{{link.name}}

{{else}} - {{input class="form-control input-sm" type="text" value=link.linkName placeholder="e.g. database"}} + {{input class="form-control input-sm" type="text" value=link.name placeholder="e.g. database"}} {{/if}} diff --git a/app/templates/container/edit-services.hbs b/app/templates/container/edit-services.hbs index 694f69677..8b8078bee 100644 --- a/app/templates/container/edit-services.hbs +++ b/app/templates/container/edit-services.hbs @@ -39,7 +39,7 @@

- {{input class="form-control input-sm" type="text" value=link.linkName placeholder="e.g. database"}} + {{input class="form-control input-sm" type="text" value=link.name placeholder="e.g. database"}} {{/if}} diff --git a/app/utils/add-view-action.js b/app/utils/add-view-action.js index fc84f2c16..1e137fc9a 100644 --- a/app/utils/add-view-action.js +++ b/app/utils/add-view-action.js @@ -2,7 +2,7 @@ import Ember from 'ember'; export function addAction(action, selector) { return function() { - this.get('controller').send(action); + this._super(); Ember.run.next(this, function() { this.$(selector).last().focus(); });