blob: 2e8d7c10cad169a297a175fe40a6eab296b95515 [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',
'backbone',
'hbs!tmpl/business_metadata/BusinessMetadataTableLayoutView_tmpl',
'utils/Utils',
'utils/Messages'
], function(require, Backbone, BusinessMetadataTableLayoutView_tmpl, Utils, Messages) {
'use strict';
var BusinessMetadataTableLayoutView = Backbone.Marionette.LayoutView.extend(
/** @lends BusinessMetadataTableLayoutView */
{
_viewName: 'BusinessMetadataTableLayoutView',
template: BusinessMetadataTableLayoutView_tmpl,
/** Layout sub regions */
regions: {
RBusinessMetadataTableLayoutView: "#r_businessMetadataTableLayoutView",
RModal: "#r_modal"
},
/** ui selector cache */
ui: {
businessMetadataAttrPage: "[data-id='businessMetadataAttrPage']",
businessMetadataAttrPageTitle: "[data-id='businessMetadataAttrPageTitle']",
businessMetadataDetailPage: "[data-id='businessMetadataDetailPage']",
createBusinessMetadata: "[data-id='createBusinessMetadata']",
attributeEdit: "[data-id='attributeEdit']",
addAttribute: '[data-id="addAttribute"]',
businessMetadataAttrPageOk: '[data-id="businessMetadataAttrPageOk"]',
colManager: "[data-id='colManager']",
deleteBusinessMetadata: '[data-id="deleteBusinessMetadata"]'
},
/** ui events hash */
events: function() {
var events = {},
that = this;
events["click " + this.ui.createBusinessMetadata] = "onClickCreateBusinessMetadata";
events["click " + this.ui.addAttribute] = "onEditAttr";
events["click " + this.ui.attributeEdit] = "onEditAttr";
events["click " + this.ui.deleteBusinessMetadata] = function(e) {
that.guid = e.target.dataset.guid;
that.deleteBusinessMetadataElement();
};
return events;
},
/**
* intialize a new BusinessMetadataTableLayoutView Layout
* @constructs
*/
initialize: function(options) {
_.extend(this, _.pick(options, 'guid', 'entity', 'entityName', 'attributeDefs', 'typeHeaders', 'businessMetadataDefCollection', 'entityDefCollection', 'businessMetadataAttr', 'selectedBusinessMetadata'));
this.limit = 10;
this.newAttr = false;
this.commonTableOptions = {
collection: this.businessMetadataDefCollection,
includeFilter: false,
includePagination: true,
includeFooterRecords: true,
includePageSize: true,
includeGotoPage: true,
includeAtlasTableSorting: true,
includeTableLoader: true,
includeColumnManager: true,
gridOpts: {
className: "table table-hover backgrid table-quickMenu",
emptyText: 'No records found!'
},
columnOpts: {
opts: {
initialColumnsVisible: null,
saveState: false
},
visibilityControlOpts: {
buttonTemplate: _.template("<button class='btn btn-action btn-sm pull-right'>Columns&nbsp<i class='fa fa-caret-down'></i></button>")
},
el: this.ui.colManager
},
filterOpts: {},
paginatorOpts: {}
};
this.guid = null;
this.showDetails = true; // toggle between sttribute page and detail page
},
onRender: function() {
this.toggleBusinessMetadataDetailsAttrView();
$.extend(this.businessMetadataDefCollection.queryParams, { count: this.limit });
this.businessMetadataDefCollection.fullCollection.sort({ silent: true });
this.renderTableLayoutView();
this.$('.tableOverlay').hide();
this.$('.auditTable').show(); // Only for first time table show because we never hide after first render.
this.businessMetadataDefCollection.comparator = function(model) {
return -model.get('timestamp');
}
},
toggleBusinessMetadataDetailsAttrView: function() {
var that = this;
if (that.showDetails) {
that.ui.businessMetadataAttrPage.hide();
that.ui.businessMetadataDetailPage.show();
} else {
that.ui.businessMetadataAttrPage.show();
that.ui.businessMetadataDetailPage.hide();
}
},
bindEvents: function() {},
loaderStatus: function(isActive) {
var that = this;
if (isActive) {
that.$('.businessMetadata-attr-tableOverlay').show();
that.$('.business-metadata-attr-fontLoader').show();
} else {
that.$('.businessMetadata-attr-tableOverlay').hide();
that.$('.business-metadata-attr-fontLoader').hide();
}
},
onEditAttr: function(e) {
var that = this,
isAttrEdit = e.currentTarget.dataset && e.currentTarget.dataset.id === 'attributeEdit' ? true : false,
guid = e.currentTarget.dataset && e.currentTarget.dataset.guid ? e.currentTarget.dataset.guid : null,
selectedBusinessMetadata = that.businessMetadataDefCollection.fullCollection.findWhere({ guid: guid }),
attrributes = selectedBusinessMetadata ? selectedBusinessMetadata.get('attributeDefs') : null,
attrName = e.currentTarget.dataset.name ? e.currentTarget.dataset.name : null,
attrDetails = { name: attrName };
if (selectedBusinessMetadata) {
that.ui.businessMetadataAttrPageOk.text("Save");
that.newAttr = e.currentTarget && e.currentTarget.dataset.action === "createAttr" ? true : false;
that.guid = guid;
_.each(attrributes, function(attrObj) {
if (attrObj.name === attrName) {
attrDetails = $.extend(true, {}, attrObj);
if (attrObj.typeName.includes('array')) {
attrDetails.typeName = attrObj.typeName.replace("array<", "").replace(">", "");
attrDetails.multiValued = true;
}
}
});
that.showDetails = false;
that.toggleBusinessMetadataDetailsAttrView();
that.ui.businessMetadataAttrPageOk.attr('data-action', e.currentTarget.dataset.id);
require(["views/business_metadata/CreateBusinessMetadataLayoutView"], function(CreateBusinessMetadataLayoutView) {
that.view = new CreateBusinessMetadataLayoutView({
onEditCallback: function() {
that.businessMetadataDefCollection.fullCollection.sort({ silent: true });
that.renderTableLayoutView();
},
onUpdateBusinessMetadata: function(fetch) {
that.showDetails = true;
that.toggleBusinessMetadataDetailsAttrView();
if (fetch) {
enumDefCollection.fetch({ reset: true });
that.entityDefCollection.fetch({ silent: true });
}
},
parent: that.$el,
businessMetadataDefCollection: that.businessMetadataDefCollection,
enumDefCollection: enumDefCollection,
isAttrEdit: isAttrEdit,
typeHeaders: typeHeaders,
attrDetails: attrDetails,
selectedBusinessMetadata: selectedBusinessMetadata,
guid: that.guid,
isNewAttr: that.newAttr
});
if (isAttrEdit) {
that.ui.businessMetadataAttrPageTitle.text("Update Attribute of: " + selectedBusinessMetadata.get('name'));
} else {
that.ui.businessMetadataAttrPageTitle.text("Add Business Metadata Attribute for: " + selectedBusinessMetadata.get('name'));
}
that.RModal.show(that.view);
});
}
},
onClickCreateBusinessMetadata: function(e) {
var that = this,
isNewBusinessMetadata = true;
that.showDetails = false;
that.ui.businessMetadataAttrPageOk.text("Create");
that.ui.businessMetadataAttrPageOk.attr('data-action', 'createBusinessMetadata');
that.ui.businessMetadataAttrPageTitle.text("Create Business Metadata");
that.toggleBusinessMetadataDetailsAttrView();
require(["views/business_metadata/CreateBusinessMetadataLayoutView"], function(CreateBusinessMetadataLayoutView) {
that.view = new CreateBusinessMetadataLayoutView({
onUpdateBusinessMetadata: function(fetch) {
that.showDetails = true;
that.toggleBusinessMetadataDetailsAttrView();
if (fetch) {
enumDefCollection.fetch({ reset: true });
that.entityDefCollection.fetch({ silent: true });
}
},
businessMetadataDefCollection: that.businessMetadataDefCollection,
enumDefCollection: enumDefCollection,
typeHeaders: typeHeaders,
isNewBusinessMetadata: isNewBusinessMetadata
});
that.RModal.show(that.view);
Utils.addCustomTextEditor({ small: false });
});
},
renderTableLayoutView: function() {
var that = this;
require(['utils/TableLayout'], function(TableLayout) {
var cols = new Backgrid.Columns(that.getBusinessMetadataTableColumns());
that.RBusinessMetadataTableLayoutView.show(new TableLayout(_.extend({}, that.commonTableOptions, {
columns: cols
})));
if (!(that.businessMetadataDefCollection.models.length < that.limit)) {
that.RBusinessMetadataTableLayoutView.$el.find('table tr').last().hide();
}
});
},
getBusinessMetadataTableColumns: function() {
var that = this;
return this.businessMetadataDefCollection.constructor.getTableCols({
attributeDefs: {
label: "",
cell: "html",
editable: false,
sortable: false,
cell: Backgrid.ExpandableCell,
fixWidth: "20",
accordion: false,
alwaysVisible: true,
expand: function(el, model) {
el.attr('colspan', '8');
var attrValues = '',
attrTable = $('table'),
attrTableBody = $('tbody'),
attrTableHeading = "<thead><td style='display:table-cell'><b>Attribute</b></td><td style='display:table-cell'><b>Type</b></td><td style='display:table-cell'><b>Search Weight</b></td><td style='display:table-cell'><b>Enable Multivalues</b></td><td style='display:table-cell'><b>Max Length</b></td><td style='display:table-cell'><b>Applicable Type(s)</b></td><td style='display:table-cell'><b>Action</b></td></thead>",
attrRow = '',
attrTableDetails = '';
if (model.attributes && model.attributes.attributeDefs.length) {
_.each(model.attributes.attributeDefs, function(attrObj) {
var applicableEntityTypes = '',
typeName = attrObj.typeName,
multiSelect = '',
maxString = 'NA';
if (attrObj.options && attrObj.options.applicableEntityTypes) {
var entityTypes = JSON.parse(attrObj.options.applicableEntityTypes);
_.each(entityTypes, function(values) {
applicableEntityTypes += '<label class="btn btn-action btn-xs btn-blue no-pointer">' + values + '</label>';
})
}
if (typeName.includes('array')) {
typeName = _.escape(typeName);
multiSelect = 'checked';
}
if (typeName.includes('string') && attrObj.options && attrObj.options.maxStrLength) {
maxString = attrObj.options.maxStrLength;
}
attrRow += "<tr> <td style='display:table-cell'>" + _.escape(attrObj.name) + "</td><td style='display:table-cell'>" + typeName + "</td><td style='display:table-cell'>" + _.escape(attrObj.searchWeight) + "</td><td style='display:table-cell'><input type='checkbox' class='form-check-input multi-value-select' " + multiSelect + " disabled='disabled'> </td><td style='display:table-cell'>" + maxString + "</td><td style='display:table-cell'>" + applicableEntityTypes + "</td><td style='display:table-cell'> <div class='btn btn-action btn-sm' style='margin-left:0px;' data-id='attributeEdit' data-guid='" + model.get('guid') + "' data-name ='" + _.escape(attrObj.name) + "' data-action='attributeEdit' >Edit</div> </td></tr> ";
});
var adminText = '<div class="row"><div class="col-sm-12 attr-details"><table style="padding: 50px;">' + attrTableHeading + attrRow + '</table></div></div>';
$(el).append($('<div>').html(adminText));
} else {
var adminText = '<div class="row"><div class="col-sm-12 attr-details"><h5 class="text-center"> No attributes to show.</h5></div></div>';
$(el).append($('<div>').html(adminText));
}
}
},
name: {
label: "Name",
cell: "html",
editable: false,
formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
fromRaw: function(rawValue, model) {
return '<a title= "' + model.get('name') + '" href ="#!/administrator/businessMetadata/' + model.get('guid') + '?from=bm">' + model.get('name') + '</a>';
}
})
},
description: {
label: "Description",
cell: "html",
editable: false,
formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
fromRaw: function(rawValue, model) {
var description = model.get('description');
if (description.length > 50) {
description = description.substr(0, 50) + "...";
}
return description;
}
})
},
createdBy: {
label: "Created by",
cell: "html",
renderable: false,
editable: false,
formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
fromRaw: function(rawValue, model) {
return model.get('updatedBy');
}
})
},
createTime: {
label: "Created on",
cell: "html",
renderable: false,
editable: false,
formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
fromRaw: function(rawValue, model) {
return Utils.formatDate({ date: model.get('createTime') });
}
})
},
updatedBy: {
label: "Updated by",
cell: "html",
renderable: false,
editable: false,
formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
fromRaw: function(rawValue, model) {
return model.get('updatedBy');
}
})
},
updateTime: {
label: "Updated on",
cell: "html",
renderable: false,
editable: false,
formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
fromRaw: function(rawValue, model) {
return Utils.formatDate({ date: model.get('updateTime') });
}
})
},
tools: {
label: "Action",
cell: "html",
sortable: false,
editable: false,
formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
fromRaw: function(rawValue, model) {
return "<button type='button' data-id='addAttribute' data-guid='" + model.get('guid') + "' class='btn btn-action btn-sm' style='margin-bottom: 10px;' data-action='createAttr' data-original-title='Add Business Metadata attribute'><i class='fa fa-plus'></i> Attributes</button>";
}
})
}
}, this.businessMetadataDefCollection);
},
deleteBusinessMetadataElement: function(businessMetadataName) {
var that = this,
notifyObj = {
modal: true,
ok: function(argument) {
that.onNotifyDeleteOk();
},
cancel: function(argument) {}
};
var text = "Are you sure you want to delete the business metadata";
notifyObj["text"] = text;
Utils.notifyConfirm(notifyObj);
},
onNotifyDeleteOk: function(data) {
var that = this,
deleteBusinessMetadataData = that.businessMetadataDefCollection.fullCollection.findWhere({ guid: that.guid });
that.$('.tableOverlay').show();
if (deleteBusinessMetadataData) {
var businessMetadataName = deleteBusinessMetadataData.get("name");
deleteBusinessMetadataData.deleteBusinessMetadata({
typeName: businessMetadataName,
success: function() {
Utils.notifySuccess({
content: "Business Metadata " + businessMetadataName + Messages.getAbbreviationMsg(false, 'deleteSuccessMessage')
});
that.businessMetadataDefCollection.fullCollection.remove(deleteBusinessMetadataData);
that.businessMetadataDefCollection.fullCollection.sort({ silent: true });
that.renderTableLayoutView();
that.showDetails = true;
that.toggleBusinessMetadataDetailsAttrView();
that.loaderStatus(false);
},
complete: function() {
that.$('.tableOverlay').hide();
that.$('.position-relative .fontLoader').removeClass('show');
}
});
} else {
Utils.notifyError({
content: Messages.defaultErrorMessage
});
}
}
});
return BusinessMetadataTableLayoutView;
});