dynamicsmobile
Version:
Allows development of off-line mobile and web business apps over the Dynamics Mobile platform. More info on https://www.dynamicsmobile.com
338 lines • 18.2 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.DmsOptionsControl = exports.GridToolbarType = void 0;
const tslib_1 = require("tslib");
const dms_controls_controlbase_1 = require("./dms-controls-controlbase");
const jquery_1 = tslib_1.__importDefault(require("jquery"));
require("daterangepicker");
const ko = tslib_1.__importStar(require("knockout"));
var GridToolbarType;
(function (GridToolbarType) {
GridToolbarType[GridToolbarType["DefaultTopView"] = 0] = "DefaultTopView";
GridToolbarType[GridToolbarType["GridEmbedded"] = 1] = "GridEmbedded";
GridToolbarType[GridToolbarType["Custom"] = 2] = "Custom";
})(GridToolbarType || (exports.GridToolbarType = GridToolbarType = {}));
class DmsOptionsControl extends dms_controls_controlbase_1.DmsControl {
constructor(controlId, hostingView, parentGrid, optionOptions, entityView, gridToolbarType) {
super(controlId, hostingView);
this.parentGrid = parentGrid;
this.optionOptions = optionOptions;
this.entityView = entityView;
this.customExpands = {};
this.initializeViewColumns = () => tslib_1.__awaiter(this, void 0, void 0, function* () {
const viewName = this.parentGrid.listEntityViewName ? this.parentGrid.listEntityViewName : 'list';
const optionsOptions = this.optionOptions;
const dataModel = this.hostingView;
const dataSource = (0, jquery_1.default)('#' + optionsOptions.dataSourceId).dmsDataSource();
if (!dataSource) {
throw new Error('DMS Search [' + optionsOptions.id + '] has invalid [data-dms-datasource] attribute!');
}
const entityMeta = yield dataSource.getEntityMetadata();
let searchView = entityMeta.views[viewName];
this.customExpands = {};
const customViewAsString = localStorage.getItem(`${this.parentGrid.controlId}CustomGridView`);
if (customViewAsString) {
searchView = JSON.parse(customViewAsString);
}
if (!searchView) {
throw new Error(`View "${viewName}" not found in entity definition.`);
}
this.customExpands = searchView.customExpands ? searchView.customExpands : {};
dataModel[`${this.id}OptionsViewColumns`]([]);
searchView.properties.forEach((viewItem, idx) => {
if (viewItem.type != "group") {
const entityProp = entityMeta.properties[viewItem.name];
dataModel[`${this.id}OptionsViewColumns`].push({
name: viewItem.name,
label: viewItem.label ? viewItem.label : (entityProp ? entityProp.label : viewItem.name),
format: viewItem.format ? viewItem.format : (entityProp && entityProp.format ? entityProp.format : undefined),
});
}
});
});
this.addOptionsColumn = () => {
let dataModel = this.hostingView;
const selected = dataModel[`${this.id}OptionsSelectedEntityField`]();
const maxColumns = 15;
//console.log('add ', selected);
if (selected) {
const arr = dataModel[`${this.id}OptionsViewColumns`]();
if (arr.length > maxColumns) {
alert(`Maximum ${maxColumns} columns are allowed`);
return;
}
const idx = arr.findIndex(c => c.name == selected.name);
const arr2 = dataModel[`${this.id}OptionsEntityFields`]();
const field = arr2.find(c => c.name == selected.name);
if (field && idx < 0) {
arr.push(field);
if (field.expandPath) {
this.customExpands[field.expandPath] = true;
}
dataModel[`${this.id}OptionsViewColumns`](arr);
dataModel[`${this.id}OptionsViewColumns`].notifySubscribers();
}
}
};
this.removeOptionsColumn = (column) => {
const dataModel = this.hostingView;
const arr = dataModel[`${this.id}OptionsViewColumns`]();
const idx = arr.findIndex(c => c.name === column.name);
if (idx >= 0) {
if (column.expandPath) {
delete this.customExpands[column.expandPath];
}
arr.splice(idx, 1);
dataModel[`${this.id}OptionsViewColumns`](arr);
dataModel[`${this.id}OptionsViewColumns`].notifySubscribers();
}
};
this.openGridSetupDialog = () => tslib_1.__awaiter(this, void 0, void 0, function* () {
yield this.initializeViewColumns();
(0, jquery_1.default)(`#${this.parentGrid.controlId}SetupDlg`).show();
});
this.upOptionsColumn = (column) => {
const dataModel = this.hostingView;
const arr = dataModel[`${this.id}OptionsViewColumns`]();
const fromIndex = arr.findIndex(c => c.name === column.name);
const toIndex = fromIndex - 1;
if (fromIndex == 0) {
return;
}
const element = arr[fromIndex];
arr.splice(fromIndex, 1);
arr.splice(toIndex, 0, element);
dataModel[`${this.id}OptionsViewColumns`](arr);
dataModel[`${this.id}OptionsViewColumns`].notifySubscribers();
};
this.downOptionsColumn = (column) => {
const dataModel = this.hostingView;
const arr = dataModel[`${this.id}OptionsViewColumns`]();
const fromIndex = arr.findIndex(c => c.name === column.name);
const toIndex = fromIndex + 1;
if (fromIndex < 0 || fromIndex > arr.length - 1) {
return;
}
const element = arr[fromIndex];
arr.splice(fromIndex, 1);
arr.splice(toIndex, 0, element);
dataModel[`${this.id}OptionsViewColumns`](arr);
dataModel[`${this.id}OptionsViewColumns`].notifySubscribers();
};
this.resetOptionsColumns = () => {
localStorage.removeItem(`${this.parentGrid.controlId}CustomGridView`);
this.initializeViewColumns();
};
this.saveOptionsColumns = () => {
const dataModel = this.hostingView;
const arr = dataModel[`${this.id}OptionsViewColumns`]();
if (arr.length == 0) {
alert('Please select at least one column to display.');
return;
}
const view = {
properties: [],
customExpands: this.customExpands
};
arr.forEach((col, idx) => {
view.properties.push({
name: col.name,
label: col.label ? col.label : col.name,
format: col.format ? col.format : undefined
});
});
localStorage.setItem(`${this.parentGrid.controlId}CustomGridView`, JSON.stringify(view));
this.closeGridSetupDlg();
if (window.parent) {
window.parent.location.reload();
}
else {
window.location.reload();
}
};
this.closeGridSetupDlg = () => {
(0, jquery_1.default)(`#${this.parentGrid.controlId}SetupDlg`).hide();
};
}
load() {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
let optionsOptions = this.optionOptions;
let element = (0, jquery_1.default)(`#${this.controlId}>.content`);
let dataModel = this.hostingView;
let dataSource = (0, jquery_1.default)('#' + optionsOptions.dataSourceId).dmsDataSource();
if (!dataSource) {
throw new Error('DMS Search [' + optionsOptions.id + '] has invalid [data-dms-datasource] attribute!');
}
const entityMeta = yield dataSource.getEntityMetadata();
if (!entityMeta) {
throw new Error('DMS Search [' + optionsOptions.id + '] can not find cached entity metadata!');
}
const me = this;
dataModel[`${optionsOptions.id}optionsClose`] = function () {
(0, jquery_1.default)(`#${me.controlId}`).toggle(200);
//$(`#${me.controlId}Button`).toggleClass(`grid-search-control-active`);
};
const excelFunc = `${this.id}OptionsExcel`;
if (optionsOptions.gridToolbarType == GridToolbarType.DefaultTopView) {
(0, jquery_1.default)(`#${this.hostingView.$element.id} .converters`).append(`<span style="margin-left:10px"> </span>`);
const excelButtonHml = `<a href="#" data-bind="click: function(){($parent && $parent.${excelFunc})?$parent.${excelFunc}():$data.${excelFunc}()}"><span class="fa fa-fw fa-file-excel"></span></a>`;
(0, jquery_1.default)(`#${this.hostingView.$element.id} .converters`).append(excelButtonHml);
}
dataModel[excelFunc] = function () {
me.parentGrid.export();
};
const columnsFunc = `${this.id}OptionsCols`;
if (optionsOptions.gridToolbarType == GridToolbarType.DefaultTopView) {
const columnsButtonHml = `<a href="#" data-bind="click: function(){($parent && $parent.${columnsFunc})?$parent.${columnsFunc}():$data.${columnsFunc}()}"><span class="fa fa-fw fa-columns"></span></a>`;
(0, jquery_1.default)(`#${this.hostingView.$element.id} .converters`).append(columnsButtonHml);
}
dataModel[columnsFunc] = function () {
me.openGridSetupDialog();
};
const closeGridSetupDlg = `${this.id}closeGridSetupDlg`;
dataModel[closeGridSetupDlg] = function () {
me.closeGridSetupDlg();
};
const addColumn = `${this.id}AddColumn`;
dataModel[addColumn] = function () {
me.addOptionsColumn();
};
const removeColumn = `${this.id}RemoveColumn`;
dataModel[removeColumn] = function (col) {
me.removeOptionsColumn(col);
};
const saveColumns = `${this.id}SaveColumns`;
dataModel[saveColumns] = function () {
me.saveOptionsColumns();
};
const resetColumns = `${this.id}ResetColumns`;
dataModel[resetColumns] = function () {
me.resetOptionsColumns();
};
const upColumn = `${this.id}UpColumns`;
dataModel[upColumn] = function (col) {
me.upOptionsColumn(col);
};
const dnColumn = `${this.id}DownColumns`;
dataModel[dnColumn] = function (col) {
me.downOptionsColumn(col);
};
dataModel[`${this.id}OptionsViewColumns`] = ko.observableArray([]);
dataModel[`${this.id}OptionsEntityFields`] = ko.observableArray([]);
dataModel[`${this.id}OptionsSelectedEntityField`] = ko.observable();
dataModel[`${this.id}OptionsEntityFieldsGroups`] = ko.computed(() => {
const fields = dataModel[`${this.id}OptionsEntityFields`]();
const groups = [];
for (let i = 0; i < fields.length; i++) {
const field = fields[i];
if (field.expandPath) {
const newGroupLabel = field.expandPath;
if (!groups.find(g => newGroupLabel == g.label)) {
groups.push({ label: newGroupLabel, children: [] });
}
const group = groups.find(g => newGroupLabel == g.label);
group.children.push(field);
}
else {
const newGroupLabel = entityMeta.label ? entityMeta.label : 'Object';
if (!groups.find(g => newGroupLabel == g.label)) {
groups.push({ label: newGroupLabel, children: [] });
}
const group = groups.find(g => newGroupLabel == g.label);
group.children.push(field);
}
}
return groups;
});
const entityPropNames = Object.getOwnPropertyNames(entityMeta.properties);
entityPropNames.forEach((propName, idx) => {
const prop = entityMeta.properties[propName];
dataModel[`${this.id}OptionsEntityFields`].push({
name: prop.name,
label: prop.label,
display: `${prop.label} (${prop.name})`,
});
});
if (entityMeta.expand) {
const expandPathNames = Object.getOwnPropertyNames(entityMeta.expand);
for (let ep = 0; ep < expandPathNames.length; ep++) {
const expandPathName = expandPathNames[ep];
const expandPath = entityMeta.expand[expandPathName];
const expanedEntity = yield dataSource.getEntityMetadata(expandPath.entity);
if (expanedEntity) {
const expanedEntityPropNames = Object.getOwnPropertyNames(expanedEntity.properties);
expanedEntityPropNames.forEach((propName, idx) => {
const prop = expanedEntity.properties[propName];
dataModel[`${this.id}OptionsEntityFields`].push({
name: expandPathName + '__' + prop.name,
label: prop.label,
display: `${expanedEntity.name} / ${prop.label} (${prop.name})`,
expandPath: expandPathName
});
});
}
}
}
;
(0, jquery_1.default)(`#${this.parentGrid.controlId}`).parent().append(`
<div id="${this.parentGrid.controlId}SetupDlg" style="overflow-y: auto;display:none;width:60%;height:95%;position:absolute;top:30px;left:50px;z-index:999999;border: 1px Solid Black;background-color: white">
<h5 class="row m-2">
<div class="col-11">Grid Options</div>
<div class="col-1" style="text-align: right" data-bind="click: ${this.id}closeGridSetupDlg">X</div>
</h5>
<div class="m-2 mt-4">
<div class="row">
<div class="col-1">
Fields
</div>
<div class="col-6">
<div class="row">
<div class="col-10 btn-group">
<select style="width: 150px" class="form-control form-control-sm" data-bind="value: ${this.id}OptionsSelectedEntityField">
<!-- ko foreach: ${this.id}OptionsEntityFieldsGroups -->
<optgroup data-bind="attr:{label: '---'+label+'---'}">
<!-- ko foreach: $data.children?$data.children:[] -->
<option data-bind="value: $data, text:label"></option>
<!-- /ko -->
</optgroup>
<!-- /ko -->
</select>
<button class="btn btn-sm btn-outline-primary" data-bind="click: ${this.id}AddColumn" style="marging-left:1em">Add</button>
</div>
</div>
</div>
<div class="col-2">
<div class="btn-group">
<button class="btn btn-sm btn-success me-1" data-bind="click: ${this.id}SaveColumns">Save</button>
<button class="btn btn-sm btn-primary" data-bind="click: ${this.id}ResetColumns">Reset</button>
</div>
</div>
</div>
<div class="row mt-2" style="border:1px solid #0000005e">
<div class="col-3"></div>
<div class="col-4">Field</div>
<div class="col-3">Label</div>
</div>
<ul data-bind="foreach: ${this.id}OptionsViewColumns">
<li>
<div class="row p-1" style="border-bottom: 1px solid #c0c0c047">
<div class="col-3">
<div class="btn-group">
<button class="btn btn-sm btn-outline-primary" data-bind="click: $root.${this.id}UpColumns"><i class="fa fa-arrow-up"></i></button>
<button class="btn btn-sm btn-outline-primary" data-bind="click: $root.${this.id}DownColumns"><i class="fa fa-arrow-down"></i></button>
<button class="btn btn-sm btn-outline-danger" data-bind="click: $root.${this.id}RemoveColumn"><i class="fa fa-trash"></i></button>
</div>
</div>
<div class="col-4 ml-1 mr-1" data-bind="text: $data.name"></div>
<div class="col-3"><input type="text" data-bind="value: $data.label" class="form-control form-control-sm"/></div>
</div>
</li>
</ul>
</div>
</div>`);
});
}
}
exports.DmsOptionsControl = DmsOptionsControl;
;
//# sourceMappingURL=dms-control-options.js.map