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.