diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/api/client.py b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/api/client.py index 7392230..53657f6 100644 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/api/client.py +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/api/client.py @@ -26,7 +26,8 @@ import uuid LOG = logging.getLogger(__name__) -CREATE_ATTRS = ['name'] +ATTRIBUTES = ['name', 'description', 'enabled', 'size', 'temperature', + 'base', 'flavor', 'topping'] STUB_DATA = {} @@ -68,18 +69,11 @@ def apiclient(request): def {{cookiecutter.panel}}_create(request, **kwargs): args = {} for (key, value) in kwargs.items(): - if key in CREATE_ATTRS: - args[str(key)] = str(value) + if key in ATTRIBUTES: + args[str(key)] = value else: raise exceptions.BadRequest( - "Key must be in %s" % ",".join(CREATE_ATTRS)) - if key == "labels": - labels = {} - vals = value.split(",") - for v in vals: - kv = v.split("=", 1) - labels[kv[0]] = kv[1] - args["labels"] = labels + "Key must be in %s" % ",".join(ATTRIBUTES)) #created = apiclient(request).{{cookiecutter.panel}}s.create(**args) # create dummy response @@ -92,6 +86,26 @@ def {{cookiecutter.panel}}_create(request, **kwargs): return created +def {{cookiecutter.panel}}_update(request, id, **kwargs): + args = {} + for (key, value) in kwargs.items(): + if key in ATTRIBUTES: + args[str(key)] = value + else: + raise exceptions.BadRequest( + "Key must be in %s" % ",".join(ATTRIBUTES)) + #updated = apiclient(request).{{cookiecutter.panel}}.update(id, **args) + + # update dummy response + args["uuid"] = id + updated = StubResponse(args) + for k in args: + setattr(updated, k, args[k]) + STUB_DATA[updated.uuid] = updated + + return updated + + def {{cookiecutter.panel}}_delete(request, id): #deleted = apiclient(request).{{cookiecutter.panel}}s.delete(id) deleted = STUB_DATA.pop(id) diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/api/rest_api.py b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/api/rest_api.py index 4ef4ccb..1a63201 100644 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/api/rest_api.py +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/api/rest_api.py @@ -38,6 +38,17 @@ class {{cookiecutter.panel_func}}(generic.View): """Get a specific {{cookiecutter.panel}}""" return change_to_id(client.{{cookiecutter.panel}}_show(request, id).to_dict()) + @rest_utils.ajax(data_required=True) + def post(self, request, id): + """Update a {{cookiecutter.panel_func}}. + + Returns the updated {{cookiecutter.panel_func}} object on success. + """ + {{cookiecutter.panel}} = client.{{cookiecutter.panel}}_update(request, id, **request.DATA) + return rest_utils.CreatedResponse( + '/api/{{cookiecutter.api_module}}/{{cookiecutter.panel}}/%s' % {{cookiecutter.panel}}.uuid, + {{cookiecutter.panel}}.to_dict()) + @urls.register class {{cookiecutter.panel_func}}s(generic.View): @@ -64,12 +75,12 @@ class {{cookiecutter.panel_func}}s(generic.View): client.{{cookiecutter.panel}}_delete(request, id) @rest_utils.ajax(data_required=True) - def post(self, request): + def put(self, request): """Create a new {{cookiecutter.panel_func}}. Returns the new {{cookiecutter.panel_func}} object on success. """ - new_resource = client.{{cookiecutter.panel}}_create(request, **request.DATA) + {{cookiecutter.panel}} = client.{{cookiecutter.panel}}_create(request, **request.DATA) return rest_utils.CreatedResponse( - '/api/{{cookiecutter.api_module}}/{{cookiecutter.panel}}/%s' % new_resource.uuid, - new_resource.to_dict()) + '/api/{{cookiecutter.api_module}}/{{cookiecutter.panel}}/%s' % {{cookiecutter.panel}}.uuid, + {{cookiecutter.panel}}.to_dict()) diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.api_module}}.service.js b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.api_module}}.service.js index 111f6a0..c3295ce 100644 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.api_module}}.service.js +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.api_module}}.service.js @@ -26,9 +26,10 @@ function API(apiService, toastService, gettext) { var service = { - create{{cookiecutter.panel_func}}: create{{cookiecutter.panel_func}}, get{{cookiecutter.panel_func}}: get{{cookiecutter.panel_func}}, get{{cookiecutter.panel_func}}s: get{{cookiecutter.panel_func}}s, + create{{cookiecutter.panel_func}}: create{{cookiecutter.panel_func}}, + update{{cookiecutter.panel_func}}: update{{cookiecutter.panel_func}}, delete{{cookiecutter.panel_func}}: delete{{cookiecutter.panel_func}}, }; @@ -38,14 +39,6 @@ // {{cookiecutter.panel_func}}s // /////////////// - function create{{cookiecutter.panel_func}}(params) { - return apiService.post('/api/{{cookiecutter.api_module}}/{{cookiecutter.panel}}s/', params) - .error(function() { - var msg = gettext('Unable to create the {{cookiecutter.panel_func}} with name: %(name)s'); - toastService.add('error', interpolate(msg, { name: params.name }, true)); - }); - } - function get{{cookiecutter.panel_func}}(id) { return apiService.get('/api/{{cookiecutter.api_module}}/{{cookiecutter.panel}}s/' + id) .error(function() { @@ -61,6 +54,22 @@ }); } + function create{{cookiecutter.panel_func}}(params) { + return apiService.put('/api/{{cookiecutter.api_module}}/{{cookiecutter.panel}}s/', params) + .error(function() { + var msg = gettext('Unable to create the {{cookiecutter.panel_func}} with name: %(name)s'); + toastService.add('error', interpolate(msg, { name: params.name }, true)); + }); + } + + function update{{cookiecutter.panel_func}}(id, params) { + return apiService.post('/api/{{cookiecutter.api_module}}/{{cookiecutter.panel}}s/' + id, params) + .error(function() { + var msg = gettext('Unable to update the {{cookiecutter.panel_func}} with id: %(id)s'); + toastService.add('error', interpolate(msg, { id: params.id }, true)); + }); + } + function delete{{cookiecutter.panel_func}}(id, suppressError) { var promise = apiService.delete('/api/{{cookiecutter.api_module}}/{{cookiecutter.panel}}s/', [id]); return suppressError ? promise : promise.error(function() { diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/actions.module.js b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/actions/actions.module.js similarity index 77% rename from {{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/actions.module.js rename to {{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/actions/actions.module.js index fd5bffe..3f274ea 100644 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/actions.module.js +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/actions/actions.module.js @@ -22,13 +22,18 @@ * @description * Provides all of the actions for {{cookiecutter.panel_func}}s. */ - angular.module('horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.actions', ['horizon.framework', 'horizon.dashboard.{{cookiecutter.panel_group}}']) - .run(register{{cookiecutter.panel_func}}Actions); + angular + .module('horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.actions', [ + 'horizon.framework', + 'horizon.dashboard.{{cookiecutter.panel_group}}' + ]) + .run(register{{cookiecutter.panel_func}}Actions); register{{cookiecutter.panel_func}}Actions.$inject = [ 'horizon.framework.conf.resource-type-registry.service', 'horizon.framework.util.i18n.gettext', 'horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.create.service', + 'horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.update.service', 'horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.delete.service', 'horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.resourceType', ]; @@ -37,21 +42,12 @@ registry, gettext, create{{cookiecutter.panel_func}}Service, + update{{cookiecutter.panel_func}}Service, delete{{cookiecutter.panel_func}}Service, resourceType) { var {{cookiecutter.panel}}sResourceType = registry.getResourceType(resourceType); - {{cookiecutter.panel}}sResourceType.itemActions - .append({ - id: 'delete{{cookiecutter.panel_func}}Action', - service: delete{{cookiecutter.panel_func}}Service, - template: { - type: 'delete', - text: gettext('Delete {{cookiecutter.panel_func}}') - } - }); - - {{cookiecutter.panel}}sResourceType.batchActions + {{cookiecutter.panel}}sResourceType.globalActions .append({ id: 'create{{cookiecutter.panel_func}}Action', service: create{{cookiecutter.panel_func}}Service, @@ -60,6 +56,8 @@ text: gettext('Create {{cookiecutter.panel_func}}') } }) + + {{cookiecutter.panel}}sResourceType.batchActions .append({ id: 'batchDelete{{cookiecutter.panel_func}}Action', service: delete{{cookiecutter.panel_func}}Service, @@ -68,6 +66,23 @@ text: gettext('Delete {{cookiecutter.panel_func}}s') } }); - } + {{cookiecutter.panel}}sResourceType.itemActions + .append({ + id: 'update{{cookiecutter.panel_func}}Action', + service: update{{cookiecutter.panel_func}}Service, + template: { + type: 'item', + text: gettext('Update {{cookiecutter.panel_func}}') + } + }) + .append({ + id: 'delete{{cookiecutter.panel_func}}Action', + service: delete{{cookiecutter.panel_func}}Service, + template: { + type: 'delete', + text: gettext('Delete {{cookiecutter.panel_func}}') + } + }); + } })(); diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/create/create.service.js b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/actions/create.service.js similarity index 90% rename from {{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/create/create.service.js rename to {{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/actions/create.service.js index e0f769e..bd54e8d 100644 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/create/create.service.js +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/actions/create.service.js @@ -32,14 +32,14 @@ 'horizon.framework.util.q.extensions', 'horizon.framework.widgets.modal.wizard-modal.service', 'horizon.framework.widgets.toast.service', - 'horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.{{cookiecutter.panel}}Model', 'horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.events', 'horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.resourceType', 'horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.workflow' ]; function createService( - $location, policy, actionResult, gettext, $qExtensions, wizardModalService, toast, model, events, resourceType, workflow + $location, policy, actionResult, gettext, $qExtensions, wizardModalService, + toast, events, resourceType, workflow ) { var scope; @@ -60,18 +60,16 @@ function initScope($scope) { scope = $scope; scope.workflow = workflow; - scope.model = model; scope.$on('$destroy', function() { }); } function perform(selected) { - scope.model.init(); // for creation according to selected item scope.selected = selected; return wizardModalService.modal({ scope: scope, - workflow: workflow, + workflow: workflow.init('create'), submit: submit }).result; } @@ -82,7 +80,7 @@ } function submit(){ - return model.create{{cookiecutter.panel_func}}().then(success); + return workflow.save().then(success); } function success(response) { diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/delete/delete.service.js b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/actions/delete.service.js similarity index 100% rename from {{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/delete/delete.service.js rename to {{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/actions/delete.service.js diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/actions/update.service.js b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/actions/update.service.js new file mode 100644 index 0000000..6ba69c7 --- /dev/null +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/actions/update.service.js @@ -0,0 +1,98 @@ +/** + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +(function() { + 'use strict'; + + /** + * @ngdoc overview + * @name horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.update.service + * @description Service for the {{cookiecutter.panel}} update modal + */ + angular + .module('horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s') + .factory('horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.update.service', updateService); + + updateService.$inject = [ + '$location', + 'horizon.app.core.openstack-service-api.policy', + 'horizon.framework.util.actions.action-result.service', + 'horizon.framework.util.i18n.gettext', + 'horizon.framework.util.q.extensions', + 'horizon.framework.widgets.modal.wizard-modal.service', + 'horizon.framework.widgets.toast.service', + 'horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.events', + 'horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.resourceType', + 'horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.workflow' + ]; + + function updateService( + $location, policy, actionResult, gettext, $qExtensions, wizardModalService, + toast, events, resourceType, workflow + ) { + + var scope; + var message = { + success: gettext('{{cookiecutter.panel_func}} %s was successfully updated.') + }; + + var service = { + initScope: initScope, + perform: perform, + allowed: allowed + }; + + return service; + + ////////////// + + function initScope($scope) { + scope = $scope; + scope.workflow = workflow; + scope.$on('$destroy', function() { + }); + } + + function perform(selected) { + // to use selected item for step controllers + scope.selected = selected; + return wizardModalService.modal({ + scope: scope, + workflow: workflow.init('update', selected.id), + submit: submit + }).result; + } + + function allowed() { + return $qExtensions.booleanAsPromise(true); + //return policy.ifAllowed({ rules: [['{{cookiecutter.panel}}', 'add_{{cookiecutter.panel}}']] }); + } + + function submit(){ + return workflow.save().then(success); + } + + function success(response) { + response.data.id = response.data.uuid; + toast.add('success', interpolate(message.success, [response.data.id])); + var result = actionResult.getActionResult() + .updated(resourceType, response.data.id); + if(result.result.failed.length == 0 && result.result.updated.length > 0){ + $location.path('/{{cookiecutter.dashboard}}/{{cookiecutter.panel}}s'); + }else{ + return result.result; + } + } + } +})(); diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/create/create-workflow.service.js b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/create/create-workflow.service.js deleted file mode 100644 index 52ba673..0000000 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/create/create-workflow.service.js +++ /dev/null @@ -1,50 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -(function() { - 'use strict'; - - angular - .module('horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s') - .factory('horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.workflow', {{cookiecutter.panel}}Workflow); - - {{cookiecutter.panel}}Workflow.$inject = [ - 'horizon.dashboard.{{cookiecutter.panel_group}}.basePath', - 'horizon.app.core.workflow.factory', - 'horizon.framework.util.i18n.gettext' - ]; - - function {{cookiecutter.panel}}Workflow(basePath, dashboardWorkflow, gettext) { - return dashboardWorkflow({ - title: gettext('Create {{cookiecutter.panel_func}}'), - - steps: [ - { - title: gettext('Info'), - templateUrl: basePath + '{{cookiecutter.panel}}s/create/info/info.html', - helpUrl: basePath + '{{cookiecutter.panel}}s/create/info/info.help.html', - formName: '{{cookiecutter.panel}}InfoForm' - } - ], - - btnText: { - finish: gettext('Create') - }, - - btnIcon: { - finish: 'fa fa-check' - } - }); - } -})(); diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/create/info/info.html b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/create/info/info.html deleted file mode 100644 index f8f847d..0000000 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/create/info/info.html +++ /dev/null @@ -1,8 +0,0 @@ -
-
-
-
- diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/create/info/{{cookiecutter.panel}}.info.controller.js b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/create/info/{{cookiecutter.panel}}.info.controller.js deleted file mode 100644 index ff46861..0000000 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/create/info/{{cookiecutter.panel}}.info.controller.js +++ /dev/null @@ -1,146 +0,0 @@ -/** - * Licensed under the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. You may obtain - * a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - */ - -(function() { - 'use strict'; - - /** - * @ngdoc controller - * @name create{{cookiecutter.panel_func}}InfoController - * @ngController - * @description - * Controller for the {{cookiecutter.panel}} info step in create workflow - */ - angular - .module('horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s') - .controller('create{{cookiecutter.panel_func}}InfoController', create{{cookiecutter.panel_func}}InfoController); - - create{{cookiecutter.panel_func}}InfoController.$inject = [ - '$q', - '$scope', - 'horizon.dashboard.{{cookiecutter.panel_group}}.basePath', - 'horizon.app.core.openstack-service-api.{{cookiecutter.api_module}}', - 'horizon.framework.util.i18n.gettext' - ]; - - function create{{cookiecutter.panel_func}}InfoController($q, $scope, basePath, api, gettext) { - var ctrl = this; - - var createInfoSchema = { - type: 'object', - properties: { - name: { - title: gettext('Name'), - type: 'string' - }, - description: { - title: gettext('Description'), - type: 'string' - }, - enabled: { - title: gettext('Enabled'), - type: 'boolean', - default: true - }, - size: { - title: gettext('Size'), - type: 'string', - default: 'M' - }, - base: { - title: gettext('Base'), - type: 'string' - }, - flavor: { - title: gettext('Flavor'), - type: 'string' - }, - topping: { - title: gettext('Topping'), - type: 'string' - } - - }, - required: ['name', 'base'] - }; - - var createInfoForm = [ - { - type: 'section', - htmlClass: 'row', - items: [ - { - type: 'section', - htmlClass: 'col-sm-12', - items: [ - // info tab - { - key: 'name', - placeholder: gettext('Name of the {{cookiecutter.panel}} to create.') - }, - { - key: 'description', - type: 'textarea' - }, - { - key: 'enabled', - type: 'checkboxes', - titleMap: [ - {value: true, name: ''}, - ] - }, - // spec tab - { - key: 'size', - type: 'radiobuttons' - titleMap: [ - // get options from API - {value: 'S', name: gettext('Small')}, - {value: 'M', name: gettext('Medium')}, - {value: 'L', name: gettext('Large')}, - {value: 'XL', name: gettext('Extra Large')} - ] - }, - { - key: 'base', - type: 'select' - titleMap: [ - // get options from API - ] - }, - { - key: 'flavor', - type: 'select' - titleMap: [ - // get options from API - ] - }, - { - key: 'topping', - type: 'checkboxes' - titleMap: [ - // get options from API - ] - } - ] - } - ] - } - ]; - - ctrl.schema = createInfoSchema; - ctrl.form = createInfoForm; - ctrl.model = model.spec; - } -})(); diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/details/details.module.js b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/details/details.module.js index 7972354..c447883 100644 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/details/details.module.js +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/details/details.module.js @@ -22,21 +22,24 @@ * @description * Provides details features for {{cookiecutter.panel_func}}. */ - angular.module('horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.details', - ['horizon.framework.conf', 'horizon.app.core']) - .run(registerDetails); + angular + .module('horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.details', [ + 'horizon.app.core', + 'horizon.framework.conf' + ]) + .run(registerDetails); registerDetails.$inject = [ + 'horizon.app.core.openstack-service-api.{{cookiecutter.api_module}}', 'horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.basePath', 'horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.resourceType', - 'horizon.app.core.openstack-service-api.{{cookiecutter.api_module}}', 'horizon.framework.conf.resource-type-registry.service' ]; function registerDetails( + api, basePath, resourceType, - api, registry ) { registry.getResourceType(resourceType) @@ -51,5 +54,4 @@ return api.get{{cookiecutter.panel_func}}(identifier); } } - })(); diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/details/drawer.html b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/details/drawer.html index 6383613..6326326 100644 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/details/drawer.html +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/details/drawer.html @@ -5,6 +5,10 @@
+
+
Topping
+
{$ item.topping | noValue $}
+
Created
{$ item.created_at | date:'short' | noValue $}
diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/details/overview.html b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/details/overview.html index 21e8894..c269656 100644 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/details/overview.html +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/details/overview.html @@ -7,7 +7,8 @@ resource-type-name="OS::{{cookiecutter.api_name}}::{{cookiecutter.panel_func}}" cls="dl-horizontal" item="ctrl.{{cookiecutter.panel}}" - property-groups="[['name'], + property-groups="[['name', 'description', 'enabled'], + ['size', 'temperature', 'base', 'flavor', 'topping'], ['id', 'created_at', 'updated_at']]">
diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/create/info/info.help.html b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/workflow/info/info.help.html similarity index 100% rename from {{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/create/info/info.help.html rename to {{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/workflow/info/info.help.html diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/workflow/info/info.html b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/workflow/info/info.html new file mode 100644 index 0000000..75568da --- /dev/null +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/workflow/info/info.html @@ -0,0 +1,7 @@ +
+
+
+
diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/workflow/info/{{cookiecutter.panel}}.info.controller.js b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/workflow/info/{{cookiecutter.panel}}.info.controller.js new file mode 100644 index 0000000..fbdafca --- /dev/null +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/workflow/info/{{cookiecutter.panel}}.info.controller.js @@ -0,0 +1,104 @@ +/** + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +(function() { + 'use strict'; + + /** + * @ngdoc controller + * @name {{cookiecutter.panel}}InfoController + * @ngController + * @description + * Controller for the {{cookiecutter.panel}} info step in create/update workflow + */ + angular + .module('horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s') + .controller( + 'horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.workflow.{{cookiecutter.panel}}InfoController', + {{cookiecutter.panel}}InfoController); + + {{cookiecutter.panel}}InfoController.$inject = [ + '$q', + 'horizon.app.core.openstack-service-api.{{cookiecutter.api_module}}', + 'horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.model', + 'horizon.framework.util.i18n.gettext' + ]; + + function {{cookiecutter.panel}}InfoController($q, api, model, gettext) { + var ctrl = this; + + ctrl.schema = { + type: 'object', + properties: { + name: { + title: gettext('Name'), + type: 'string' + }, + description: { + title: gettext('Description'), + type: 'string' + }, + enabled: { + title: gettext('Enabled'), + type: 'boolean', + default: true + } + }, + required: ['name'] + }; + + ctrl.form = [ + { + type: 'section', + htmlClass: 'row', + items: [ + { + type: 'section', + htmlClass: 'col-sm-12', + items: [ + { + key: 'name', + placeholder: gettext('Name of the {{cookiecutter.panel}} to create.') + }, + { + key: 'description', + type: 'textarea' + }, + { + key: 'enabled', + type: 'checkbox', + titleMap: [ + {value: true, name: ''} + ] + } + ] + } + ] + } + ]; + + ctrl.model = model.spec; + + if (model.type === 'update') { + var deferred = api.get{{cookiecutter.panel_func}}(model.spec.id); + deferred.then(onLoad); + + function onLoad(response) { + ctrl.model.name = model.spec.name = response.data.name; + ctrl.model.description = model.spec.description = response.data.description; + ctrl.model.enabled = model.spec.enabled = response.data.enabled; + } + } + } +})(); diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/workflow/recipe/recipe.help.html b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/workflow/recipe/recipe.help.html new file mode 100644 index 0000000..7f7cd85 --- /dev/null +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/workflow/recipe/recipe.help.html @@ -0,0 +1,7 @@ +
+
Base
+
Choose base drink.
+
Other options
+
Choose favorite options.
+
+ diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/workflow/recipe/recipe.html b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/workflow/recipe/recipe.html new file mode 100644 index 0000000..6c841eb --- /dev/null +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/workflow/recipe/recipe.html @@ -0,0 +1,7 @@ +
+
+
+
diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/workflow/recipe/{{cookiecutter.panel}}.recipe.controller.js b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/workflow/recipe/{{cookiecutter.panel}}.recipe.controller.js new file mode 100644 index 0000000..99173ed --- /dev/null +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/workflow/recipe/{{cookiecutter.panel}}.recipe.controller.js @@ -0,0 +1,156 @@ +/** + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +(function() { + 'use strict'; + + /** + * @ngdoc controller + * @name {{cookiecutter.panel}}RecipeController + * @ngController + * @description + * Controller for the {{cookiecutter.panel}} recipe step in create/update workflow + */ + angular + .module('horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s') + .controller( + 'horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.workflow.{{cookiecutter.panel}}RecipeController', + {{cookiecutter.panel}}RecipeController); + + {{cookiecutter.panel}}RecipeController.$inject = [ + '$q', + 'horizon.app.core.openstack-service-api.{{cookiecutter.api_module}}', + 'horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.model', + 'horizon.framework.util.i18n.gettext' + ]; + + function {{cookiecutter.panel}}RecipeController($q, api, model, gettext) { + var ctrl = this; + + ctrl.schema = { + type: 'object', + properties: { + size: { + title: gettext('Size'), + type: 'string', + default: 'M' + }, + temperature: { + title: gettext('Temperature'), + type: 'string', + default: 'H' + }, + base: { + title: gettext('Base'), + type: 'string' + }, + flavor: { + title: gettext('Flavor'), + type: 'string' + }, + topping: { + title: gettext('Topping'), + type: 'string' + } + }, + required: ['base'] + }; + + ctrl.form = [ + { + type: 'section', + htmlClass: 'row', + items: [ + { + type: 'section', + htmlClass: 'col-sm-12', + items: [ + { + key: 'size', + type: 'radiobuttons', + titleMap: [ + // if get options from API, call $scope.$broadcast('schemaFormRedraw') + {value: 'S', name: gettext('Small')}, + {value: 'M', name: gettext('Medium')}, + {value: 'L', name: gettext('Large')}, + {value: 'XL', name: gettext('Extra Large')} + ] + }, + { + key: 'temperature', + type: 'radiobuttons', + titleMap: [ + // if get options from API, call $scope.$broadcast('schemaFormRedraw') + {value: 'H', name: gettext('Hot')}, + {value: 'I', name: gettext('Ice')} + ] + }, + { + key: 'base', + type: 'select', + titleMap: [ + // if get options from API, call $scope.$broadcast('schemaFormRedraw') + {value: 'blend', name: gettext('House Blend'), group: gettext('Coffee')}, + {value: 'mandheling', name: gettext('Mandheling'), group: gettext('Coffee')}, + {value: 'colombia', name: gettext('Colombia'), group: gettext('Coffee')}, + {value: 'espresso', name: gettext('Espresso'), group: gettext('Coffee')}, + {value: 'earl_gray', name: gettext('Earl Gray'), group: gettext('Tea')}, + {value: 'darjeeling', name: gettext('Darjeeling'), group: gettext('Tea')}, + {value: 'orange_pekoe', name: gettext('Orange Pekoe'), group: gettext('Tea')} + ] + }, + { + key: 'flavor', + type: 'select', + titleMap: [ + // if get options from API, call $scope.$broadcast('schemaFormRedraw') + {value: 'chocolate', name: gettext('Chocolate')}, + {value: 'mocha', name: gettext('Mocha')}, + {value: 'strawberry', name: gettext('Strawberry')}, + {value: 'blueberry', name: gettext('Blueberry')}, + {value: 'raspberry', name: gettext('Raspberry')} + ] + }, + { + key: 'topping', + type: 'checkboxes', + titleMap: [ + // if get options from API, call $scope.$broadcast('schemaFormRedraw') + {value: 'clushed_nuts', name: gettext('Clushed Nuts')}, + {value: 'whip_cream', name: gettext('Whip Cream')}, + {value: 'mixed_serial', name: gettext('Mixed Serial')} + ] + } + ] + } + ] + } + ]; + + ctrl.model = model.spec; + + if (model.type === 'update') { + var deferred = api.get{{cookiecutter.panel_func}}(model.spec.id); + deferred.then(onLoad); + + function onLoad(response) { + ctrl.model.size = model.spec.size = response.data.size; + ctrl.model.temperature = model.spec.temperature = response.data.temperature; + ctrl.model.base = model.spec.base = response.data.base; + ctrl.model.flavor = model.spec.flavor = response.data.flavor; + ctrl.model.topping = model.spec.topping = response.data.topping; + } + } + } +})(); diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/workflow/workflow.service.js b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/workflow/workflow.service.js new file mode 100644 index 0000000..366353b --- /dev/null +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/workflow/workflow.service.js @@ -0,0 +1,88 @@ +/** + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. You may obtain + * a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +(function() { + 'use strict'; + + /** + * @ngdoc workflow + * @name horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.workflow + * @description Service for the create/update workflow + */ + angular + .module('horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s') + .factory('horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.workflow', workflow); + + workflow.$inject = [ + 'horizon.app.core.workflow.factory', + 'horizon.dashboard.{{cookiecutter.panel_group}}.basePath', + 'horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.model', + 'horizon.framework.util.i18n.gettext' + ]; + + function workflow(workflowFactory, basePath, model, gettext) { + var workflow = { + // params + type: '', + + // methods + init: init, + save: save + }; + + function init(type, id) { + var title, btnText; + workflow.type = type; + if (type === 'create') { + title = gettext('Create {{cookiecutter.panel_func}}'); + btnText = gettext('Create'); + model.init('create'); + } else if (type === 'update') { + title = gettext('Update {{cookiecutter.panel_func}}'); + btnText = gettext('Update'); + model.init('update', id); + } + + return workflowFactory({ + title: title, + steps: [ + { + title: gettext('Info'), + templateUrl: basePath + '{{cookiecutter.panel}}s/workflow/info/info.html', + helpUrl: basePath + '{{cookiecutter.panel}}s/workflow/info/info.help.html', + formName: '{{cookiecutter.panel}}InfoForm' + }, + { + title: gettext('Recipe'), + templateUrl: basePath + '{{cookiecutter.panel}}s/workflow/recipe/recipe.html', + helpUrl: basePath + '{{cookiecutter.panel}}s/workflow/recipe/recipe.help.html', + formName: '{{cookiecutter.panel}}RecipeForm' + } + ], + btnText: { + finish: btnText + }, + btnIcon: { + finish: 'fa fa-check' + } + }); + } + + function save(){ + return model.save(); + } + + return workflow; + } +})(); diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/create/{{cookiecutter.panel}}-model.js b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/workflow/{{cookiecutter.panel}}-model.js similarity index 61% rename from {{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/create/{{cookiecutter.panel}}-model.js rename to {{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/workflow/{{cookiecutter.panel}}-model.js index 3fad214..8fbfaa4 100644 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/create/{{cookiecutter.panel}}-model.js +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/workflow/{{cookiecutter.panel}}-model.js @@ -15,54 +15,64 @@ (function() { 'use strict'; + /** + * @ngdoc model + * @name horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.model + * @description Service for the {{cookiecutter.panel}} model + */ angular .module('horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s') - .factory('horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.{{cookiecutter.panel}}Model', {{cookiecutter.panel}}Model); + .factory('horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s.model', model); - {{cookiecutter.panel}}Model.$inject = [ + model.$inject = [ 'horizon.app.core.openstack-service-api.{{cookiecutter.api_module}}' ]; - function {{cookiecutter.panel}}Model(api) { + function model(api) { var model = { + // params spec: {}, + type: '', - // API methods + // methods init: init, - create{{cookiecutter.panel_func}}: create{{cookiecutter.panel_func}} + save: save }; - function initSpec() { + function init(type, id) { + model.type = type; + // Reset model model.spec = { + id: id, name: null, // text required description: null, // textarea enabled: true, // checkbox - size: null, // radio - base: "", // select required - flavor: "", // select - topping: null, // checkboxes + size: 'M', // radio + temperature: 'H', // radio + base: null, // select required + flavor: null, // select + topping: null // checkboxes }; } - function init() { - // Reset the new {{cookiecutter.panel_func}} spec - initSpec(); - } - - function create{{cookiecutter.panel_func}}() { + function save() { var finalSpec = angular.copy(model.spec); - cleanNullProperties(finalSpec); - return api.create{{cookiecutter.panel_func}}(finalSpec); + var id = finalSpec.id; + delete finalSpec.id; + if (model.type === 'create') { + delete finalSpec.id; + return api.create{{cookiecutter.panel_func}}(finalSpec); + } else { + return api.update{{cookiecutter.panel_func}}(id, finalSpec); + } } function cleanNullProperties(finalSpec) { // Initially clean fields that don't have any value. - // Not only "null", blank too. for (var key in finalSpec) { - if (finalSpec.hasOwnProperty(key) && finalSpec[key] === null - || finalSpec[key] === "") { + if (finalSpec.hasOwnProperty(key) && finalSpec[key] === null) { delete finalSpec[key]; } } diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/{{cookiecutter.panel}}s.module.js b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/{{cookiecutter.panel}}s.module.js index 458346a..ad808fe 100644 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/{{cookiecutter.panel}}s.module.js +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/{{cookiecutter.panel}}s.module.js @@ -69,6 +69,31 @@ filters: ['noName'], urlFunction: service.urlFunction }) + .append({ + id: 'size', + priority: 1, + filters: ['noValue'] + }) + .append({ + id: 'temperature', + priority: 1, + filters: ['noValue'] + }) + .append({ + id: 'base', + priority: 1, + filters: ['noValue'] + }) + .append({ + id: 'flavor', + priority: 1, + filters: ['noValue'] + }) + .append({ + id: 'topping', + priority: 2, + filters: ['noValue'] + }) .append({ id: 'created_at', priority: 2 @@ -84,6 +109,16 @@ 'name': 'name', 'singleton': true }) + .append({ + 'label': gettext('Base'), + 'name': 'base', + 'singleton': true + }) + .append({ + 'label': gettext('Flavor'), + 'name': 'flavor', + 'singleton': true + }) .append({ 'label': gettext('ID'), 'name': 'id', @@ -95,6 +130,13 @@ return { id: { label: gettext('ID'), filters: ['noValue'] }, name: { label: gettext('Name'), filters: ['noName'] }, + description: { label: gettext('Description'), filters: ['noValue'] }, + enabled: { label: gettext('Enabled'), filters: ['yesno'] }, + size: { label: gettext('Size'), filters: ['noValue'] }, + temperature: { label: gettext('Temperature'), filters: ['noValue'] }, + base: { label: gettext('Base'), filters: ['noValue'] }, + flavor: { label: gettext('Flavor'), filters: ['noValue'] }, + topping: { label: gettext('Topping'), filters: ['noValue'] }, created_at: { label: gettext('Created'), filters: ['simpleDate', 'noValue'] }, updated_at: { label: gettext('Updated'), filters: ['simpleDate', 'noValue'] } }; diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/{{cookiecutter.panel}}s.service.spec.js b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/{{cookiecutter.panel}}s.service.spec.js index c862199..3c6fdf9 100644 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/{{cookiecutter.panel}}s.service.spec.js +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.module_folder}}/static/dashboard/{{cookiecutter.panel_group}}/{{cookiecutter.panel}}s/{{cookiecutter.panel}}s.service.spec.js @@ -1,11 +1,3 @@ - describe('horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s', function() { - it('should exist', function() { - expect(angular.module('horizon.dashboard.{{cookiecutter.panel_group}}.{{cookiecutter.panel}}s')).toBeDefined(); - }); - }); - -})(); - /** * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License.