blob: cda5cf6c171dc4f231c8c31bd4de5c621d2b6183 [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.
*/
define(['require',
'hbs!tmpl/tag/addTagModalView_tmpl',
'collection/VTagList',
'collection/VCommonList',
'modules/Modal',
'models/VEntity',
'utils/Utils',
'utils/UrlLinks',
'utils/Enums',
'utils/Messages',
], function(require, AddTagModalViewTmpl, VTagList, VCommonList, Modal, VEntity, Utils, UrlLinks, Enums, Messages) {
'use strict';
var AddTagModel = Marionette.LayoutView.extend({
template: AddTagModalViewTmpl,
regions: {},
ui: {
addTagOptions: "[data-id='addTagOptions']",
tagAttribute: "[data-id='tagAttribute']"
},
events: function() {
var events = {};
events["change " + this.ui.addTagOptions] = 'onChangeTagDefination';
return events;
},
/**
* intialize a new AddTagModel Layout
* @constructs
*/
initialize: function(options) {
var that = this;
_.extend(this, _.pick(options, 'modalCollection', 'guid', 'callback', 'multiple', 'showLoader', 'hideLoader', 'tagList'));
this.collection = new VTagList();
this.commonCollection = new VTagList();
this.asyncAttrFetchCounter = 0;
this.modal = new Modal({
title: 'Add Tag',
content: this,
okText: 'Add',
cancelText: "Cancel",
allowCancel: true,
}).open();
this.modal.$el.find('button.ok').attr("disabled", true);
this.on('ok', function() {
var tagName = this.ui.addTagOptions.val();
var tagAttributes = {};
var tagAttributeNames = this.$(".attrName");
tagAttributeNames.each(function(i, item) {
var selection = $(item).data("key");
tagAttributes[selection] = $(item).val();
});
var obj = {
tagName: tagName,
tagAttributes: tagAttributes,
guid: [],
skipEntity: [],
deletedEntity: []
}
if (that.multiple) {
_.each(that.multiple, function(entity, i) {
var name = Utils.getName(entity.model);
if (Enums.entityStateReadOnly[entity.model.status]) {
obj.deletedEntity.push(name);
} else {
if (_.indexOf((entity.model.classificationNames || _.pluck(entity.model.classifications, 'typeName')), tagName) === -1) {
obj.guid.push(entity.model.guid)
} else {
obj.skipEntity.push(name);
}
}
});
if (obj.deletedEntity.length) {
Utils.notifyError({
html: true,
content: "<b>" + obj.deletedEntity.join(', ') +
"</b> " + (obj.deletedEntity.length === 1 ? "entity " : "entities ") +
Messages.assignDeletedEntity
});
}
if (obj.skipEntity.length) {
var text = "<b>" + obj.skipEntity.length + " of " + that.multiple.length +
"</b> entities selected have already been associated with <b>" + tagName +
"</b> tag, Do you want to associate the tag with other entities ?",
removeCancelButton = false;
if ((obj.skipEntity.length + obj.deletedEntity.length) === that.multiple.length) {
text = (obj.skipEntity.length > 1 ? "All selected" : "Selected") + " entities have already been associated with <b>" + tagName + "</b> tag";
removeCancelButton = true;
}
var notifyObj = {
text: text,
ok: function(argument) {
if (obj.guid.length) {
that.saveTagData(obj);
} else {
that.hideLoader();
}
},
cancel: function(argument) {
that.hideLoader();
obj = {
tagName: tagName,
tagAttributes: tagAttributes,
guid: [],
skipEntity: [],
deletedEntity: []
}
}
}
if (removeCancelButton) {
notifyObj['confirm'] = {
confirm: true,
buttons: [{
text: 'Ok',
addClass: 'btn-primary',
click: function(notice) {
notice.remove();
obj = {
tagName: tagName,
tagAttributes: tagAttributes,
guid: [],
skipEntity: [],
deletedEntity: []
}
}
},
null
]
}
}
Utils.notifyConfirm(notifyObj)
} else {
if (obj.guid.length) {
that.saveTagData(obj);
} else {
that.hideLoader();
}
}
} else {
obj.guid.push(that.guid);
that.saveTagData(obj);
}
});
this.on('closeModal', function() {
this.modal.trigger('cancel');
});
this.bindEvents();
},
onRender: function() {
$.extend(this.collection.queryParams, { type: 'TRAIT', notsupertype: 'TaxonomyTerm' });
this.collection.fetch({ reset: true });
},
bindEvents: function() {
this.listenTo(this.collection, 'reset', function() {
this.tagsCollection();
}, this);
this.listenTo(this.commonCollection, 'reset', function() {
--this.asyncAttrFetchCounter
this.subAttributeData();
}, this);
this.listenTo(this.commonCollection, 'error', function() {
--this.asyncAttrFetchCounter
this.$('.attrLoader').hide();
}, this);
},
tagsCollection: function() {
var that = this;
this.collection.fullCollection.comparator = function(model) {
return Utils.getName(model.toJSON(), 'name').toLowerCase();
}
var str = '<option selected="selected" disabled="disabled">-- Select a tag from the dropdown list --</option>';
this.collection.fullCollection.sort().each(function(obj, key) {
var name = Utils.getName(obj.toJSON(), 'name');
if (name === "TaxonomyTerm") {
return;
}
// using obj.get('name') insted of name variable because if html is presen in name then escaped name will not found in tagList.
if (_.indexOf(that.tagList, obj.get('name')) === -1) {
str += '<option>' + name + '</option>';
}
});
this.ui.addTagOptions.html(str);
this.ui.addTagOptions.select2({
placeholder: "Select Tag",
allowClear: false
});
},
onChangeTagDefination: function() {
this.ui.tagAttribute.empty();
var saveBtn = this.modal.$el.find('button.ok');
saveBtn.prop("disabled", false);
var tagname = this.ui.addTagOptions.val();
this.hideAttributeBox();
this.fetchTagSubData(tagname);
},
fetchTagSubData: function(tagname) {
this.commonCollection.url = UrlLinks.typesClassicationApiUrl(tagname);
++this.asyncAttrFetchCounter
this.commonCollection.fetch({ reset: true });
},
showAttributeBox: function() {
if (this.asyncAttrFetchCounter === 0) {
this.$('.attrLoader').hide();
if (this.ui.tagAttribute.children().length !== 0) {
this.ui.tagAttribute.parent().show();
}
}
},
hideAttributeBox: function() {
this.ui.tagAttribute.children().empty();
this.ui.tagAttribute.parent().hide();
this.$('.attrLoader').show();
},
subAttributeData: function() {
var that = this;
if (this.commonCollection.models[0]) {
if (this.commonCollection.models[0].get('attributeDefs')) {
_.each(this.commonCollection.models[0].get('attributeDefs'), function(obj) {
var name = Utils.getName(obj, 'name');
that.ui.tagAttribute.append('<div class="form-group"><label>' + name + '</label>' +
'<input type="text" class="form-control attributeInputVal attrName" data-key="' + name + '" ></input></div>');
});
}
if (this.commonCollection.models[0].get('superTypes')) {
var superTypes = this.commonCollection.models[0].get('superTypes');
if (!_.isArray(superTypes)) {
superTypes = [superTypes];
}
if (superTypes.length) {
_.each(superTypes, function(name) {
that.fetchTagSubData(name);
});
} else {
this.showAttributeBox();
}
} else {
this.showAttributeBox();
}
} else {
this.showAttributeBox();
}
},
saveTagData: function(options) {
var that = this;
this.entityModel = new VEntity();
var tagName = options.tagName,
tagAttributes = options.tagAttributes,
json = {
"classification": {
"typeName": tagName,
"attributes": tagAttributes
},
"entityGuids": options.guid
};
if (this.showLoader) {
this.showLoader();
}
this.entityModel.saveTraitsEntity({
skipDefaultError: true,
data: JSON.stringify(json),
success: function(data) {
Utils.notifySuccess({
content: "Tag " + tagName + " has been added to " + (that.multiple ? "entities" : "entity")
});
if (options.modalCollection) {
options.modalCollection.fetch({ reset: true });
}
if (that.callback) {
that.callback();
}
},
cust_error: function(model, response) {
var message = "Tag " + tagName + " could not be added";
if (response && response.responseJSON) {
message = response.responseJSON.errorMessage;
}
Utils.notifyError({
content: message
});
if (that.hideLoader) {
that.hideLoader();
}
}
});
},
});
return AddTagModel;
});