123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- /**
- * 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.
- */
- var App = require('app');
- /**
- * Mixin for host select view on step 5 install wizard
- * Implements base login for select, input types
- * Each view which use this mixin should redefine method <code>changeHandler</code> (with
- * observing <code>controller.hostNameCheckTrigger</code>)
- *
- * @type {Ember.Mixin}
- */
- App.SelectHost = Em.Mixin.create({
- /**
- * Element of <code>controller.servicesMasters</code>
- * Binded from template
- * @type {object}
- */
- component: null,
- /**
- * List of avaiable host names
- * @type {string[]}
- */
- content: [],
- /**
- * Host component name
- * @type {string}
- */
- componentName: null,
- /**
- * Handler for selected value change
- * Triggers <code>changeHandler</code> execution
- * @method change
- */
- change: function () {
- if ('destroyed' === this.get('state')) return;
- this.set('controller.lastChangedComponent', this.get('component.component_name'));
- this.get('controller').toggleProperty('hostNameCheckTrigger');
- },
- /**
- * Add or remove <code>error</code> class from parent div-element
- * @param {bool} flag true - add class, false - remove
- * @method updateErrorStatus
- */
- updateErrorStatus: function(flag) {
- var parentBlock = this.$().parent('div');
- /* istanbul ignore next */
- if (flag) {
- parentBlock.removeClass('error');
- }
- else {
- parentBlock.addClass('error');
- }
- },
- /**
- * If component is multiple (defined in <code>controller.multipleComponents</code>),
- * should update <code>controller.componentToRebalance</code> and trigger rebalancing
- * @method tryTriggerRebalanceForMultipleComponents
- */
- tryTriggerRebalanceForMultipleComponents: function() {
- var componentIsMultiple = this.get('controller.multipleComponents').contains(this.get("component.component_name"));
- if(componentIsMultiple) {
- this.get('controller').set('componentToRebalance', this.get("component.component_name"));
- this.get('controller').incrementProperty('rebalanceComponentHostsCounter');
- }
- },
- /**
- * Handler for value changing
- * Should be redeclared in child views
- * Each redeclarion should contains code:
- * <code>
- * if (!this.shouldChangeHandlerBeCalled()) return;
- * </code>
- * @method changeHandler
- */
- changeHandler: function() {}.observes('controller.hostNameCheckTrigger'),
- /**
- * If view is destroyed or not current component's host name was changed we should do nothing
- * This method should be called from <code>changeHandler</code>:
- * <code>
- * changeHandler: function() {
- * if (!this.shouldChangeHandlerBeCalled()) return;
- * // your code
- * }.observes(...)
- * </code>
- * @returns {boolean}
- * @method shouldChangeHandlerBeCalled
- */
- shouldChangeHandlerBeCalled: function() {
- return !(('destroyed' === this.get('state')) || (this.get('controller.lastChangedComponent') !== this.get("component.component_name")));
- },
- /**
- * If <code>component.isHostNameValid</code> was changed,
- * error status should be updated according to new value
- * @method isHostNameValidObs
- */
- isHostNameValidObs: function() {
- this.updateErrorStatus(this.get('component.isHostNameValid'));
- }.observes('component.isHostNameValid'),
- /**
- * Recalculate available hosts
- * This should be done only once per Ember loop
- * @method rebalanceComponentHosts
- */
- rebalanceComponentHosts: function () {
- Em.run.once(this, 'rebalanceComponentHostsOnce');
- }.observes('controller.rebalanceComponentHostsCounter'),
- /**
- * Recalculate available hosts
- * @method rebalanceComponentHostsOnce
- */
- rebalanceComponentHostsOnce: function() {
- if (this.get('component.component_name') === this.get('controller.componentToRebalance')) {
- this.initContent();
- }
- },
- /**
- * Get available hosts
- * multipleComponents component can be assigned to multiple hosts,
- * shared hosts among the same component should be filtered out
- * @return {string[]}
- * @method getAvailableHosts
- */
- getAvailableHosts: function () {
- var hosts = this.get('controller.hosts').slice(),
- componentName = this.get('component.component_name'),
- multipleComponents = this.get('controller.multipleComponents'),
- occupiedHosts = this.get('controller.selectedServicesMasters')
- .filterProperty('component_name', componentName)
- .mapProperty('selectedHost')
- .without(this.get('component.selectedHost'));
- if (multipleComponents.contains(componentName)) {
- return hosts.filter(function (host) {
- return !occupiedHosts.contains(host.get('host_name'));
- }, this);
- }
- return hosts;
- },
- /**
- * Extract hosts from controller,
- * filter out available to selection and
- * push them into form element content
- * @method initContent
- */
- initContent: function () {
- this.set("content", this.getAvailableHosts());
- }
- });
|