/** * 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', 'utils/Utils', 'modules/Modal', 'utils/Messages', 'utils/Enums'], function(require, Utils, Modal, Messages, Enums) { 'use strict'; var CommonViewFunction = {}; CommonViewFunction.deleteTagModel = function(options) { var modal = new Modal({ title: options.titleMessage, okText: options.buttonText, htmlContent: options.msg, cancelText: "Cancel", allowCancel: true, okCloses: true, showFooter: true, }).open(); return modal; }; CommonViewFunction.deleteTag = function(options) { require(['models/VTag'], function(VTag) { var tagModel = new VTag(); if (options && options.guid && options.tagName) { if (options.showLoader) { options.showLoader(); } tagModel.deleteAssociation(options.guid, options.tagName, { skipDefaultError: true, success: function(data) { var msg = "Tag " + name.name + Messages.removeSuccessMessage; if (options.tagOrTerm === "term") { msg = "Term " + options.tagName + Messages.removeSuccessMessage; } else if (options.tagOrTerm === "tag") { msg = "Tag " + options.tagName + Messages.removeSuccessMessage; } Utils.notifySuccess({ content: msg }); if (options.callback) { options.callback(); } if (options.collection) { options.collection.fetch({ reset: true }); } }, cust_error: function(model, response) { var message = options.tagName + Messages.deleteErrorMessage; if (response && response.responseJSON) { message = response.responseJSON.errorMessage; } if (options.hideLoader) { options.hideLoader(); } Utils.notifyError({ content: message }); } }); } }); }; CommonViewFunction.propertyTable = function(options) { var scope = options.scope, valueObject = options.valueObject, extractJSON = options.extractJSON, isTable = _.isUndefined(options.isTable) ? true : options.isTable, attributeDefs = options.attributeDefs; var table = "", fetchInputOutputValue = function(id) { var that = this; scope.entityModel.getEntity(id, { success: function(serverData) { var value = "", deleteButton = "", data = serverData.entity; value = Utils.getName(data); var id = ""; if (data.guid) { if (Enums.entityStateReadOnly[data.status]) { deleteButton += '<button title="Deleted" class="btn btn-atlasAction btn-atlas deleteBtn"><i class="fa fa-trash"></i></button>'; } id = data.guid; } if (value.length > 1) { scope.$('td div[data-id="' + id + '"]').html('<a href="#!/detailPage/' + id + '">' + value + '</a>'); } else { scope.$('td div[data-id="' + id + '"]').html('<a href="#!/detailPage/' + id + '">' + _.escape(id) + '</a>'); } if (deleteButton.length) { scope.$('td div[data-id="' + id + '"]').addClass('block readOnlyLink'); scope.$('td div[data-id="' + id + '"]').append(deleteButton); } }, complete: function() {} }); }, extractObject = function(keyValue) { var valueOfArray = []; if (!_.isArray(keyValue) && _.isObject(keyValue)) { keyValue = [keyValue]; } var subLink = ""; for (var i = 0; i < keyValue.length; i++) { var inputOutputField = keyValue[i], id = inputOutputField.guid || (_.isObject(inputOutputField.id) ? inputOutputField.id.id : inputOutputField.id), tempLink = "", status = inputOutputField.status || (_.isObject(inputOutputField.id) ? inputOutputField.id.state : inputOutputField.state), readOnly = Enums.entityStateReadOnly[status]; if (!inputOutputField.attributes && inputOutputField.values) { inputOutputField['attributes'] = inputOutputField.values; } if (_.isString(inputOutputField) || _.isBoolean(inputOutputField) || _.isNumber(inputOutputField)) { var tempVarfor$check = inputOutputField.toString(); if (tempVarfor$check.indexOf("$") == -1) { valueOfArray.push('<span>' + _.escape(inputOutputField) + '</span>'); } } else if (_.isObject(inputOutputField) && !id) { var attributesList = inputOutputField; if (scope.typeHeaders && inputOutputField.typeName) { var typeNameCategory = scope.typeHeaders.fullCollection.findWhere({ name: inputOutputField.typeName }); if (attributesList.attributes && typeNameCategory && typeNameCategory.get('category') === 'STRUCT') { attributesList = attributesList.attributes; } } _.each(attributesList, function(objValue, objKey) { var value = objValue, tempVarfor$check = objKey.toString(); if (tempVarfor$check.indexOf("$") == -1) { if (_.isObject(value)) { value = JSON.stringify(value); } if (extractJSON) { if (extractJSON && extractJSON.extractKey) { if (_.isObject(extractJSON.extractKey)) { _.each(extractJSON.extractKey, function(extractKey) { if (objKey === extractKey) { valueOfArray.push('<span>' + _.escape(objKey) + ':' + _.escape(value) + '</span>'); } }); } else if (_.isString(extractJSON.extractKey) && extractJSON.extractKey === objKey) { valueOfArray.push(_.escape(value)); } } } else { valueOfArray.push('<span>' + _.escape(objKey) + ':' + _.escape(value) + '</span>'); } } }); } if (id && inputOutputField) { var name = Utils.getName(inputOutputField); if ((name === "-" || name === id) && !inputOutputField.attributes) { var fetch = true; var fetchId = (_.isObject(id) ? id.id : id); fetchInputOutputValue(fetchId); tempLink += '<div data-id="' + fetchId + '"></div>'; } else { tempLink += '<a href="#!/detailPage/' + id + '">' + name + '</a>' } } if (readOnly) { if (!fetch) { tempLink += '<button title="Deleted" class="btn btn-atlasAction btn-atlas deleteBtn"><i class="fa fa-trash"></i></button>'; subLink += '<div class="block readOnlyLink">' + tempLink + '</div>'; } else { fetch = false; subLink += tempLink; } } else { if (tempLink.search('href') != -1) { subLink += '<div>' + tempLink + '</div>' } else if (tempLink.length) { subLink += tempLink } } } if (valueOfArray.length) { subLink = valueOfArray.join(', '); } return subLink; } _.sortBy(_.keys(valueObject)).map(function(key) { key = _.escape(key); var keyValue = valueObject[key]; var defEntity = _.find(attributeDefs, { name: key }); if (defEntity && defEntity.typeName) { var defEntityType = defEntity.typeName.toLocaleLowerCase(); if (defEntityType === 'date' || defEntityType === 'time') { keyValue = new Date(keyValue); } else if (_.isObject(keyValue)) { keyValue = extractObject(keyValue); } } else { if (_.isObject(keyValue)) { keyValue = extractObject(keyValue) } } if (isTable) { table += '<tr><td>' + _.escape(key) + '</td><td>' + (_.isObject(valueObject[key]) ? keyValue : _.escape(keyValue)) + '</td></tr>'; } else { table += '<div>' + (_.isObject(valueObject[key]) ? keyValue : _.escape(keyValue)) + '</div>'; } }); return table; } CommonViewFunction.breadcrumbUrlMaker = function(url) { if (url) { var urlList = []; var splitURL = url.split("api/atlas/v1/taxonomies/"); if (splitURL.length > 1) { var splitUrlWithoutTerm = splitURL[1].split("/terms/"); if (splitUrlWithoutTerm.length == 1) { splitUrlWithoutTerm = splitUrlWithoutTerm[0].split("/"); } } else { var splitUrlWithoutTerm = splitURL[0].split("/terms/"); if (splitUrlWithoutTerm.length == 1) { splitUrlWithoutTerm = splitUrlWithoutTerm[0].split("/"); } } var href = ""; for (var i in splitUrlWithoutTerm) { if (i == 0) { href = splitUrlWithoutTerm[i]; urlList.push({ value: _.escape(splitUrlWithoutTerm[i]), href: href }); } else { href += "/terms/" + splitUrlWithoutTerm[i]; urlList.push({ value: _.escape(splitUrlWithoutTerm[i]), href: href }); }; } return urlList; } } CommonViewFunction.breadcrumbMaker = function(options) { var li = ""; if (options.urlList) { _.each(options.urlList, function(object) { li += '<li><a class="link" href="#!/taxonomy/detailCatalog/api/atlas/v1/taxonomies/' + object.href + '?load=true">' + _.escape(object.value) + '</a></li>'; }); } if (options.scope) { options.scope.html(li); options.scope.asBreadcrumbs("destroy"); options.scope.asBreadcrumbs({ namespace: 'breadcrumb', overflow: "left", responsive: false, toggleIconClass: 'fa fa-ellipsis-h', dropdown: function(classes) { var dropdownClass = 'dropdown'; var dropdownMenuClass = 'dropdown-menu popover popoverTerm bottom arrowPosition'; if (this.options.overflow === 'right') { dropdownMenuClass += ' dropdown-menu-right'; } return '<li class="' + dropdownClass + ' ' + classes.dropdownClass + '">' + '<a href="javascript:void(0);" class="' + classes.toggleClass + '" data-toggle="dropdown">' + '<i class="' + classes.toggleIconClass + '"></i>' + '</a>' + '<ul class="' + dropdownMenuClass + ' ' + classes.dropdownMenuClass + '">' + '<div class="arrow"></div>' + '</ul>' + '</li>'; } }); } } CommonViewFunction.termTableBreadcrumbMaker = function(obj) { if (!obj) { return ""; } var traits = obj.classificationNames || _.pluck(obj.classifications, 'typeName'), url = "", deleteHtml = "", html = "", id = obj.guid, terms = [], entityName = Utils.getName(obj); if (traits) { traits.map(function(term) { var checkTagOrTerm = Utils.checkTagOrTerm(term); if (checkTagOrTerm.term) { terms.push({ deleteHtml: '<a class="pull-left" title="Remove Term"><i class="fa fa-trash" data-id="tagClick" data-type="term" data-assetname="' + entityName + '" data-name="' + term + '" data-guid="' + obj.guid + '" ></i></a>', url: _.unescape(term).split(".").join("/"), name: term }); } }); } _.each(terms, function(obj, i) { var className = ""; if (i >= 1) { className += "showHideDiv hide"; } obj['valueUrl'] = CommonViewFunction.breadcrumbUrlMaker(obj.url); html += '<div class="' + className + '" dataterm-name="' + obj.name + '"><div class="liContent"></div>' + obj.deleteHtml + '</div>'; }) if (terms.length > 1) { html += '<div><a href="javascript:void(0)" data-id="showMoreLessTerm" class="inputTag inputTagGreen"><span>Show More </span><i class="fa fa-angle-right"></i></a></div>' } if (!Enums.entityStateReadOnly[obj.status]) { if (obj.guid) { html += '<div><a href="javascript:void(0)" class="inputAssignTag" data-id="addTerm" data-guid="' + (obj.guid) + '"><i class="fa fa-folder-o"></i>' + " " + 'Assign Term</a></div>' } else { html += '<div><a href="javascript:void(0)" class="inputAssignTag" data-id="addTerm"><i class="fa fa-folder-o"></i>' + " " + 'Assign Term</a></div>' } } return { html: '<div class="termTableBreadcrumb" dataterm-id="' + id + '">' + html + '</div>', object: { scopeId: id, value: terms } } } CommonViewFunction.tagForTable = function(obj) { var traits = obj.classificationNames || _.pluck(obj.classifications, 'typeName'), atags = "", addTag = "", popTag = "", count = 0, entityName = Utils.getName(obj); if (traits) { traits.map(function(tag) { var checkTagOrTerm = Utils.checkTagOrTerm(tag); if (checkTagOrTerm.tag) { var className = "inputTag", tagString = '<a class="' + className + '" data-id="tagClick"><span class="inputValue">' + tag + '</span><i class="fa fa-times" data-id="delete" data-assetname="' + entityName + '"data-name="' + tag + '" data-type="tag" data-guid="' + obj.guid + '" ></i></a>'; if (count >= 1) { popTag += tagString; } else { atags += tagString; } ++count; } }); } if (!Enums.entityStateReadOnly[obj.status]) { if (obj.guid) { addTag += '<a href="javascript:void(0)" data-id="addTag" class="inputTagAdd assignTag" data-guid="' + obj.guid + '" ><i class="fa fa-plus"></i></a>'; } else { addTag += '<a href="javascript:void(0)" data-id="addTag" class="inputTagAdd assignTag"><i style="right:0" class="fa fa-plus"></i></a>'; } } if (count > 1) { addTag += '<div data-id="showMoreLess" class="inputTagAdd assignTag tagDetailPopover"><i class="fa fa-ellipsis-h" aria-hidden="true"></i></div>' } return '<div class="tagList">' + atags + addTag + '<div class="popover popoverTag bottom" style="display:none"><div class="arrow"></div><div class="popover-content popoverContainer">' + popTag + '</div></div></div>'; } CommonViewFunction.saveTermToAsset = function(options, that) { require(['models/VCatalog'], function(Vcatalog) { var VCatalog = new Vcatalog(); var name = options.termName; ++that.asyncFetchCounter; VCatalog.url = function() { return "api/atlas/v1/entities/" + options.guid + "/tags/" + name; }; VCatalog.save(null, { success: function(data) { Utils.notifySuccess({ content: "Term " + name + Messages.addTermToEntitySuccessMessage }); if (options.collection) { options.collection.fetch({ reset: true }); } }, complete: function() { --that.asyncFetchCounter if (that.callback && that.asyncFetchCounter === 0) { that.callback(); // It will call to parent of parent Callback i.e callback of searchLayoutView } } }); }) } CommonViewFunction.attributeFilter = { generateUrl: function(attrObj) { var attrQuery = []; if (attrObj) { _.each(attrObj, function(obj) { attrQuery.push(obj.id + "::" + obj.operator + "::" + obj.value + "::" + obj.type); }); return attrQuery.join(); } else { return null; } }, extractUrl: function(urlObj) { var attrObj = []; if (urlObj && urlObj.length) { _.each(urlObj.split(","), function(obj) { var temp = obj.split("::"); attrObj.push({ id: temp[0], operator: temp[1], value: temp[2], type: temp[3] }); }); return attrObj; } else { return null; } }, generateAPIObj: function(url) { if (url && url.length) { var parsObj = { "condition": 'AND', "criterion": convertKeyAndExtractObj(this.extractUrl(url)) } return parsObj; } else { return null; } function convertKeyAndExtractObj(rules) { var convertObj = []; _.each(rules, function(rulObj) { var tempObj = {}; // For nested // if (rulObj.rules) { // tempObj = { // "condition": "AND", // "criterion": convertKeyAndExtractObj(rulObj.rules) // } // } else { // } tempObj = { "attributeName": rulObj.id, "operator": rulObj.operator, "attributeValue": (rulObj.type === "date" ? Date.parse(rulObj.value) : rulObj.value) } convertObj.push(tempObj); }); return convertObj; } } } CommonViewFunction.addRestCsrfCustomHeader = function(xhr, settings) { // if (settings.url == null || !settings.url.startsWith('/webhdfs/')) { if (settings.url == null) { return; } var method = settings.type; if (CommonViewFunction.restCsrfCustomHeader != null && !CommonViewFunction.restCsrfMethodsToIgnore[method]) { // The value of the header is unimportant. Only its presence matters. xhr.setRequestHeader(CommonViewFunction.restCsrfCustomHeader, '""'); } } CommonViewFunction.restCsrfCustomHeader = null; CommonViewFunction.restCsrfMethodsToIgnore = null; CommonViewFunction.userDataFetch = function(options) { var csrfEnabled = false, header = null, methods = []; function getTrimmedStringArrayValue(string) { var str = string, array = []; if (str) { var splitStr = str.split(','); for (var i = 0; i < splitStr.length; i++) { array.push(splitStr[i].trim()); } } return array; } if (options.url) { $.ajax({ url: options.url, success: function(response) { if (response) { if (response['atlas.rest-csrf.enabled']) { var str = "" + response['atlas.rest-csrf.enabled']; csrfEnabled = (str.toLowerCase() == 'true'); } if (response['atlas.rest-csrf.custom-header']) { header = response['atlas.rest-csrf.custom-header'].trim(); } if (response['atlas.rest-csrf.methods-to-ignore']) { methods = getTrimmedStringArrayValue(response['atlas.rest-csrf.methods-to-ignore']); } if (csrfEnabled) { CommonViewFunction.restCsrfCustomHeader = header; CommonViewFunction.restCsrfMethodsToIgnore = {}; methods.map(function(method) { CommonViewFunction.restCsrfMethodsToIgnore[method] = true; }); Backbone.$.ajaxSetup({ beforeSend: CommonViewFunction.addRestCsrfCustomHeader }); } } }, complete: function(response) { if (options.callback) { options.callback(response.responseJSON); } } }); } } return CommonViewFunction; });