Updated Branches: refs/heads/trunk 5fe89e76b -> 38f6f48d0
AMBARI-3745. Provide dialog to create new config-group by overriding property. (srimanth) Project: http://git-wip-us.apache.org/repos/asf/incubator-ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ambari/commit/38f6f48d Tree: http://git-wip-us.apache.org/repos/asf/incubator-ambari/tree/38f6f48d Diff: http://git-wip-us.apache.org/repos/asf/incubator-ambari/diff/38f6f48d Branch: refs/heads/trunk Commit: 38f6f48d007fc8982ac457294cc03872b9af4837 Parents: 5fe89e7 Author: Srimanth Gunturi <sgunt...@hortonworks.com> Authored: Mon Nov 11 15:31:48 2013 -0800 Committer: Srimanth Gunturi <sgunt...@hortonworks.com> Committed: Mon Nov 11 15:45:23 2013 -0800 ---------------------------------------------------------------------- ambari-web/app/messages.js | 11 +- ambari-web/app/styles/application.less | 9 ++ .../common/configs/selectCreateConfigGroup.hbs | 59 ++++++++ ambari-web/app/utils/ajax.js | 17 +++ ambari-web/app/utils/config.js | 141 +++++++++++++++++++ .../app/views/common/configs/services_config.js | 46 +++--- 6 files changed, 263 insertions(+), 20 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/38f6f48d/ambari-web/app/messages.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js index da1a4d3..f4ac81c 100644 --- a/ambari-web/app/messages.js +++ b/ambari-web/app/messages.js @@ -1672,6 +1672,13 @@ Em.I18n.translations = { 'quick.links.error.label': 'Hostname is undefined', - 'contact.administrator': 'Contact System Administrator for more information!' - + 'contact.administrator': 'Contact System Administrator for more information!', + + 'config.group.selection.dialog.title': 'Configuration Group', + 'config.group.selection.dialog.option.select': 'Select existing configuration group', + 'config.group.selection.dialog.option.select.msg': 'Overridden property will be changed for hosts belonging to the selected group.', + 'config.group.selection.dialog.option.create': 'Create new configuration group', + 'config.group.selection.dialog.option.create.msg': 'A new configuration group will be created with the given name. Initially there will be no hosts in the group, with only the selected property overridden.', + 'config.group.selection.dialog.err.name.exists': 'Configuration group with given name already exists', + 'config.group.selection.dialog.err.create': 'Error creating new configuration group [{0}]' }; http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/38f6f48d/ambari-web/app/styles/application.less ---------------------------------------------------------------------- diff --git a/ambari-web/app/styles/application.less b/ambari-web/app/styles/application.less index be613de..7ea9c63 100644 --- a/ambari-web/app/styles/application.less +++ b/ambari-web/app/styles/application.less @@ -4859,5 +4859,14 @@ i.icon-asterisks { } } } +} +#config-group-select-create-dialog { + .select-create-config-group-div { + margin-left: 20px; + margin-bottom: 20px; + .message{ + color: #777; + } + } } http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/38f6f48d/ambari-web/app/templates/common/configs/selectCreateConfigGroup.hbs ---------------------------------------------------------------------- diff --git a/ambari-web/app/templates/common/configs/selectCreateConfigGroup.hbs b/ambari-web/app/templates/common/configs/selectCreateConfigGroup.hbs new file mode 100644 index 0000000..9414cb0 --- /dev/null +++ b/ambari-web/app/templates/common/configs/selectCreateConfigGroup.hbs @@ -0,0 +1,59 @@ +{{! +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you 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. +}} +<div id="config-group-select-create-dialog"> + <div class="text-warning"> + {{#if view.parentView.warningMessage}} + {{view.parentView.warningMessage}} + {{else}} + + {{/if}} + </div> + <label class="radio"> + {{view view.selectConfigGroupRadioButton}} + {{t config.group.selection.dialog.option.select}} + </label> + <div class="select-create-config-group-div"> + <span class="btn-group"> + <button class="btn" {{bindAttr disabled="view.parentView.optionCreateConfigGroup"}}>{{view.parentView.selectedConfigGroup.name}}</button> + <button class="btn dropdown-toggle" data-toggle="dropdown" {{bindAttr disabled="view.parentView.optionCreateConfigGroup"}}> + <span class="caret"></span> + </button> + <ul class="dropdown-menu"> + <!-- available config group menu links --> + {{#each configGroup in view.parentView.availableConfigGroups}} + <li> + <a href="#" {{action "doSelectConfigGroup" configGroup target="view.parentView"}}> + {{configGroup.name}} + </a> + </li> + {{/each}} + </ul> + </span> + <div class="message">{{t config.group.selection.dialog.option.select.msg}}</div> + </div> + + <label class="radio"> + {{view view.createConfigGroupRadioButton}} + {{t config.group.selection.dialog.option.create}} + </label> + <div class="select-create-config-group-div"> + {{view Ember.TextField valueBinding="view.parentView.newConfigGroupName" + disabledBinding="view.parentView.optionSelectConfigGroup" class="span5"}} + <div class="message">{{t config.group.selection.dialog.option.create.msg}}</div> + </div> +</div> http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/38f6f48d/ambari-web/app/utils/ajax.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/utils/ajax.js b/ambari-web/app/utils/ajax.js index a06b7c3..52cd32e 100644 --- a/ambari-web/app/utils/ajax.js +++ b/ambari-web/app/utils/ajax.js @@ -1113,6 +1113,23 @@ var urls = { data: JSON.stringify(data.keyValuePair) } } + }, + 'config_groups.create': { + 'real': '/clusters/{clusterName}/config_groups', + 'mock': '', + 'format': function (data) { + return { + async: false, + type: 'POST', + data: JSON.stringify([{ + "ConfigGroup": { + "group_name": data.group_name, + "tag": data.service_id, + "description": data.description + } + }]) + } + } } }; /** http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/38f6f48d/ambari-web/app/utils/config.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/utils/config.js b/ambari-web/app/utils/config.js index 3a81b60..3008a10 100644 --- a/ambari-web/app/utils/config.js +++ b/ambari-web/app/utils/config.js @@ -974,6 +974,147 @@ App.config = Em.Object.create({ } }, + /** + * Launches a dialog where an existing config-group can be selected, or a new + * one can be created. This is different than the config-group management + * dialog where host membership can be managed. + * + * The callback will be passed the created/selected config-group in the form + * of {id:2, name:'New hardware group'}. In the case of dialog being cancelled, + * the callback is provided <code>null</code> + * + * @param callback Callback function which is invoked when dialog + * is closed, cancelled or OK is pressed. + */ + launchConfigGroupSelectionCreationDialog : function(serviceId, availableConfigGroups, callback) { + var self = this; + var selectedConfigGroup = availableConfigGroups && availableConfigGroups.length > 0 ? + availableConfigGroups[0] : null; + App.ModalPopup.show({ + classNames: [ 'sixty-percent-width-modal' ], + header: Em.I18n.t('config.group.selection.dialog.title'), + primary: Em.I18n.t('ok'), + secondary: Em.I18n.t('common.cancel'), + warningMessage: null, + optionSelectConfigGroup: true, + optionCreateConfigGroup: function(){ + return !this.get('optionSelectConfigGroup'); + }.property('optionSelectConfigGroup'), + availableConfigGroups: availableConfigGroups, + selectedConfigGroup: selectedConfigGroup, + newConfigGroupName: '', + onPrimary: function () { + if (this.get('optionSelectConfigGroup')) { + var selectedConfigGroup = this.get('selectedConfigGroup'); + this.hide(); + callback(selectedConfigGroup); + } else { + var newConfigGroupName = this.get('newConfigGroupName'); + var newConfigGroup = self.createNewConfigurationGroup(serviceId, newConfigGroupName); + if (newConfigGroup.configGroup!=null) { + this.hide(); + newConfigGroup.configGroup.name = newConfigGroupName; + callback(newConfigGroup.configGroup); + } else { + this.set('warningMessage', this.t('config.group.selection.dialog.err.create').format(newConfigGroup.error)); + } + } + }, + onSecondary: function () { + this.hide(); + callback(null); + }, + doSelectConfigGroup: function (event) { + var configGroup = event.context; + console.log(configGroup); + this.set('selectedConfigGroup', configGroup); + }, + validate: function () { + var msg = null; + var optionSelect = this.get('optionSelectConfigGroup'); + if (optionSelect) { + } else { + var nn = this.get('newConfigGroupName'); + var allCG = this.get('availableConfigGroups'); + if (nn) { + allCG.forEach(function(cg){ + if(!msg && nn === cg.get('name')) { + msg = Em.I18n.t("config.group.selection.dialog.err.name.exists"); + } + }); + } + } + this.set('warningMessage', msg); + }.observes('newConfigGroupName', 'availableConfigGroups', 'optionSelectConfigGroup'), + bodyClass: Ember.View.extend({ + templateName: require('templates/common/configs/selectCreateConfigGroup'), + controllerBinding: 'App.router.mainServiceInfoConfigsController', + selectConfigGroupRadioButton: Ember.Checkbox.extend({ + tagName: 'input', + attributeBindings: ['type', 'checked'], + checked: function () { + return this.get('parentView.parentView.optionSelectConfigGroup'); + }.property('parentView.parentView.optionSelectConfigGroup'), + type: 'radio', + click: function () { + this.set('parentView.parentView.optionSelectConfigGroup', true); + } + }), + createConfigGroupRadioButton: Ember.Checkbox.extend({ + tagName: 'input', + attributeBindings: ['type', 'checked'], + checked: function () { + return !this.get('parentView.parentView.optionSelectConfigGroup'); + }.property('parentView.parentView.optionSelectConfigGroup'), + type: 'radio', + click: function () { + this.set('parentView.parentView.optionSelectConfigGroup', false); + } + }) + }) + }); + }, + + /** + * Creates a new config-group for a service. + * + * @param serviceId Service for which this group has to be created + * @param configGroupName Name of the new config-group + * @return Returns the created config-group or error as + * { configGroup: {id:4}, error: {...}} + */ + createNewConfigurationGroup: function (serviceId, configGroupName) { + var newConfigGroupData = { + configGroup: null, + error: null + }; + var sendData = { + name: 'config_groups.create', + data: { + 'group_name': configGroupName, + 'service_id': serviceId, + 'description': "New configuration group created on " + new Date().toDateString() + }, + success: 'successFunction', + error: 'errorFunction', + successFunction: function(response){ + newConfigGroupData.configGroup = response.resources[0].ConfigGroup; + newConfigGroupData.error = null; + }, + errorFunction: function(request, ajaxOptions, error){ + newConfigGroupData.configGroup = null; + try{ + var errResponse = JSON.parse(request.responseText); + error = errResponse.message; + }catch(e){ + } + newConfigGroupData.error = request.status + ": " + error; + } + }; + sendData.sender = sendData; + App.ajax.send(sendData); + return newConfigGroupData; + }, /** * Gets all the configuration-groups for the given service. http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/38f6f48d/ambari-web/app/views/common/configs/services_config.js ---------------------------------------------------------------------- diff --git a/ambari-web/app/views/common/configs/services_config.js b/ambari-web/app/views/common/configs/services_config.js index 030e673..748c51e 100644 --- a/ambari-web/app/views/common/configs/services_config.js +++ b/ambari-web/app/views/common/configs/services_config.js @@ -488,24 +488,34 @@ App.ServiceConfigsByCategoryView = Ember.View.extend({ createOverrideProperty: function (event) { var serviceConfigProperty = event.contexts[0]; - var overrides = serviceConfigProperty.get('overrides'); - if (!overrides) { - overrides = []; - serviceConfigProperty.set('overrides', overrides); - } - - // create new override with new value - var newSCP = App.ServiceConfigProperty.create(serviceConfigProperty); - newSCP.set('value', ''); - newSCP.set('isOriginalSCP', false); // indicated this is overridden value, - newSCP.set('parentSCP', serviceConfigProperty); - newSCP.set('selectedHostOptions', Ember.A([])); - console.debug("createOverrideProperty(): Added:", newSCP, " to main-property:", serviceConfigProperty); - overrides.pushObject(newSCP); - - // Launch override window - var dummyEvent = {contexts: [newSCP]}; - this.showOverrideWindow(dummyEvent); + // Launch dialog to pick/create Config-group + var serviceConfigGroups = []; + App.config.launchConfigGroupSelectionCreationDialog(this.get('service.serviceName'), + serviceConfigGroups, function(selectedConfigGroup){ + console.log("launchConfigGroupSelectionCreationDialog(): Selected/Created:", selectedConfigGroup); + if (selectedConfigGroup) { + // TODO - show configurations for this new config-group +// var overrides = serviceConfigProperty.get('overrides'); +// if (!overrides) { +// overrides = []; +// serviceConfigProperty.set('overrides', overrides); +// } +// // create new override with new value +// var newSCP = App.ServiceConfigProperty.create(serviceConfigProperty); +// newSCP.set('value', ''); +// newSCP.set('isOriginalSCP', false); // indicated this is overridden value, +// newSCP.set('parentSCP', serviceConfigProperty); +// newSCP.set('selectedHostOptions', Ember.A([])); +// console.debug("createOverrideProperty(): Added:", newSCP, " to main-property:", serviceConfigProperty); +// overrides.pushObject(newSCP); +// +// // Launch override window +// var dummyEvent = {contexts: [newSCP]}; +// this.showOverrideWindow(dummyEvent); + } else { + // Cancelled dialog + } + }); }, showOverrideWindow: function (event) {