blob: 636f78212db2a18f160ade9db7afb51d7c0d4d81 [file] [log] [blame]
/**
* 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');
App.EditableList = Ember.View.extend({
templateName: require('templates/common/editable_list'),
items: [], // items show on list
resources: [], // original resources including all items
itemsOriginal: [], //backup of items
editMode: false,
input: '',
typeahead: [],
selectedTypeahed: 0,
isCaseSensitive: true,
init: function () {
this._super();
this.updateItemsOriginal();
this.set('input', '');
this.set('editMode', false);
},
updateItemsOriginal: function () {
this.set('itemsOriginal', Em.copy(this.get('items')));
}.observes('items'),
onPrimary: function (event) {
this.set('editMode', false);
this.set('input', '');
if(event){
event.stopPropagation();
}
},
onSecondary: function () {
// restore all items
this.set('items', this.get('itemsOriginal'));
this.set('input', '');
this.set('editMode', false);
},
enableEditMode: function() {
this.set('input', '');
this.set('editMode', true);
},
removeFromItems: function(event) {
var items = this.get('items');
items.removeObject(event.context);
this.set('input', '');
},
/**
* available items to add, will show up typing ahead
*/
availableItemsToAdd: function () {
var allItems = Em.copy(this.get('resources'));
var isCaseSensitive = this.get('isCaseSensitive');
var input = isCaseSensitive ? this.get('input') : this.get('input').toLowerCase();
var toRemove = [];
var existed = this.get('items');
allItems.forEach(function(item) {
var nameToCompare = isCaseSensitive ? item.name : item.name.toLowerCase();
if (nameToCompare.indexOf(input) < 0 || existed.findProperty('name', item.name)) {
toRemove.push(item);
}
});
toRemove.forEach(function(item) {
allItems.removeObject(item);
});
return allItems;
}.property('items', 'input'),
addItem: function(event) {
var items = this.get('items');
var toAdd;
if (event.context) {
toAdd = event.context;
} else if (this.get('typeahead.length') > 0){
toAdd = this.get('typeahead')[this.get('selectedTypeahead')];
}
items.pushObject(event.context);
this.set('input', '');
},
updateTypeahead: function() {
var newValue = this.get('input');
var self = this;
if(newValue){
var newValue = newValue.split(',');
if( newValue.length > 1){
// If coma separated string, then just add all items to list
newValue.forEach( function(item) {
self.addItem(item);
});
self.clearInput();
} else {
// Load typeahed items based on current input
var items = self.get('availableItemsToAdd');
self.set('typeahead', items);
self.set('selectedTypeahed', 0);
}
} else {
self.set('typeahead', []);
self.set('selectedTypeahed', 0);
}
}.observes('input')
});