/**
* @namespace flexygo.ui.wc
*/
var flexygo;
(function (flexygo) {
var ui;
(function (ui_1) {
var wc;
(function (wc) {
/**
* Library for the flx-filterManagerElement web component.
*
* @class FlxFilterManagerElement
* @constructor
* @return {FlxFilterManagerElement} .
*/
class FlxFilterManagerElement extends HTMLElement {
constructor() {
super();
this.tree = null;
this.objcmb = null;
this.cmb = null;
this.typecmb = null;
this.fields = null;
this.choosebar = null;
this.generic = false;
this.allSaved = true;
this.newValue = 0;
this.active = '';
this.resto = 0;
}
/**
* Fires when element is attached to DOM
* @method connectedCallback
*/
connectedCallback() {
let element = $(this);
this.objectname = element.attr('ObjectName');
this.active = element.attr("active");
this.generic = false;
let attr = element.attr('generic');
if (attr && attr === 'true') {
this.generic = true;
}
this.init();
}
/**
* Init the webcomponent.
* @method init
*/
init() {
this.refresh();
}
/**
* Refresh de webcomponent.
* @method refresh
*/
refresh() {
let me = $(this);
me.append('<span class="label">' + flexygo.localization.translate('filtermanager.objectname') + ':</span>');
me.append('<flx-dbcombo objectname="sysObject" viewname="sysOnlineCollections" sqlvaluefield="ObjectName" sqldisplayfield="Descrip"></flx-dbcombo>');
me.append('<span class="label">' + flexygo.localization.translate('filtermanager.choosefilter') + ':</span>');
//me.append('<div name="choosebar" class="row input-group"> <span class="input-group-addon clickable newFilter" > <i class="flx-icon icon-plus" /></span><span class="input-group-addon clickable editFilter"><i class="flx-icon icon-report-filters" /> </span><select class="filterCmb form-control"></select> <span class="input-group-addon clickable deleteFilter" > <i class="flx-icon icon-trash" /></span></div> ');
me.append('<div name="choosebar" class="row input-group"> <span class="input-group-addon clickable newFilter" > <i class="flx-icon icon-plus" /></span><span class="input-group-addon clickable editFilter"><i class="flx-icon icon-report-filters" /> </span><select class="filterCmb form-control"></select></div> ');
me.append('<span class="label">' + flexygo.localization.translate('filtermanager.filtertype') + ':</span>');
me.append('<select class="typefilterCmb form-control"></select><br/>');
me.append('<div class="col-5 box"><span class="label">' + flexygo.localization.translate('filtermanager.properties') + ':</span><br/><ul class="objtree list-group"></ul></div>');
me.append('<div class="col-7 box fieldsFilter"><span class="label">' + flexygo.localization.translate('filtermanager.fields') + ':</span><br/><ul class="filterFields list-group"></ul></div>');
if (me.closest('flx-objectmanager .tab-pane').length > 0) {
me.append('<div class="col-12 box"><button name="filtersave" class="btn btn-default bg-success"><i class="flx-icon icon-save" /> ' + flexygo.localization.translate('filtermanager.save') + '</button></div>');
me.find("button[name='filtersave']").on('click', () => { this.saveFilter(); });
}
else {
me.closest('.ui-dialog').find("button[name='save']").on("click", () => { this.saveFilter(); });
me.closest('.ui-dialog').find("button[name='delete']").on("click", () => { this.deleteFilter(); });
}
//me.append('<div class="col-12 box"><button name="filtersave" class="btn btn-default bg-success"><i class="flx-icon icon-save" /> ' + flexygo.localization.translate('filtermanager.save') + '</button></div>');
//me.find("button[name='filtersave']").on('click', () => { this.saveFilter(); });
me.find('.newFilter').on('click', () => { this.newFilter(); });
me.find('.editFilter').on('click', () => { this.editFilter(); });
this.objcmb = me.find('flx-dbcombo');
this.typecmb = me.find('.typefilterCmb');
this.tree = me.find('.objtree');
this.cmb = me.find('.filterCmb');
this.fields = me.find('.filterFields');
this.choosebar = me.find("[name='choosebar']");
if (this.generic === false) {
//Scripts buscadores objeto
this.objcmb.hide();
this.objcmb.prev().hide();
this.typecmb.show();
this.typecmb.prev().show();
this.choosebar.show();
this.choosebar.prev().show();
this.loadObj(this.objectname, this.tree, true);
this.objcmb.off('change');
this.cmb.focus();
}
else {
//Scripts buscador principal
this.objcmb.show();
this.objcmb.prev().show();
this.typecmb.hide();
this.typecmb.prev().hide();
this.choosebar.hide();
this.choosebar.prev().hide();
this.objcmb.focus();
this.objcmb.off('change').on('change', () => {
let value = this.objcmb.val();
if (this.objectname != value) {
this.objectname = value;
let params = {
ObjectName: value,
Generic: (this.generic),
NonGeneric: (!this.generic)
};
flexygo.ajax.post('~/api/Sys', 'getFilters', params, (response) => {
this.loadObj(this.objectname, this.tree, true);
let found = false;
if (response.Filters && Object.keys(response.Filters).length > 0) {
$.each(response.Filters, (i, e) => {
if (e.Generic === true) {
this.loadFilter(e);
found = true;
return false;
}
});
}
if (!found) {
this.applyNewFilter(this.objectname + ' generic search');
}
});
}
});
}
this.getFilters();
}
/**
* Gets filters from controller
* @method getFilters
*/
getFilters() {
let params = {
ObjectName: this.objectname,
Generic: (this.generic),
NonGeneric: (!this.generic)
};
flexygo.ajax.post('~/api/Sys', 'getFilters', params, (response) => {
this.filtertypes = response.Types;
this.types = response.FilterTypes;
$.each(this.filtertypes, (i, e) => {
let opt = $('<option/>').html(e.Type).attr('value', e.Type);
this.typecmb.append(opt);
});
this.type = this.typecmb.val();
if (response.Filters) {
$.each(response.Filters, (i, e) => {
let opt = $('<option/>');
opt.html(e.Name);
opt.attr('value', e.SearchId);
opt.data('extvalue', e);
if (this.active && this.active.length > 0) {
if (this.active.toLowerCase() === e.SearchId.toLowerCase()) {
opt.prop('selected', true);
}
}
this.cmb.append(opt);
});
}
let previous;
this.cmb.on('focus', () => {
previous = this.value;
}).change(() => {
if (this.allSaved || confirm(flexygo.localization.translate("filtermanager.unsaved"))) {
var sel = this.cmb.find('option:selected').data('extvalue');
this.loadFilter(sel);
previous = this.value;
this.allSaved = true;
this.active = this.value;
}
else {
this.value = previous;
}
});
this.typecmb.change(() => {
let value = this.typecmb.val();
this.type = value;
switch (value) {
case 'Text':
this.fields.find('select').hide();
break;
case 'Properties':
this.fields.find('select').show();
break;
}
});
let wcCombo = this.objcmb[0];
wcCombo.setValue(this.objectname);
if (this.generic === true) {
this.typecmb.val("Text");
this.typecmb.trigger("change");
}
this.loadFilter(this.cmb.find('option:selected').data('extvalue'));
});
}
/**
* Add a new filter
* @method newFilter
*/
newFilter() {
if (this.allSaved || confirm(flexygo.localization.translate('filtermanager.unsaved'))) {
flexygo.msg.prompt('New filter', "Enter new filter's title", (res) => {
this.applyNewFilter(res);
}, 'new title', '');
}
}
/**
* Apply new created filter
* @method applyNewFilter
* @param {string} name - The filter name.
*/
applyNewFilter(name) {
if (name != '') {
let newVal = 'newValue' + this.newValue;
this.newValue++;
let opt = $('<option/>').html(name).val(newVal);
this.cmb.append(opt);
this.fields.empty();
this.cmb.val(newVal).trigger("change");
}
}
/**
* Delete the filter
* @method deleteFilter
*/
deleteFilter() {
let success = false;
flexygo.msg.confirm('filtermanager.sure', (result) => {
if (result) {
if (this.cmb.is(':visible') == true && this.cmb.find('option:selected').data('extvalue')) {
let id = this.cmb.find('option:selected').data('extvalue').SearchId;
if (id.toLowerCase().indexOf('newval') === -1) {
let ent = new flexygo.obj.Entity('sysGenericSearch', "Objects_Search.SearchId='" + id + "'");
if (ent.delete()) {
success = true;
}
}
}
else {
//generic search
if (this.cmb.is(':visible') == false) {
let objname = this.objcmb.val();
if (objname) {
let ent = new flexygo.obj.Entity('sysGenericSearch', "Objects_Search.ObjectName='" + objname + "' and Objects_Search.Generic<>0");
if (ent.delete()) {
success = true;
}
}
}
else {
success = true;
}
}
if (success) {
this.cmb.find('option:selected').remove();
flexygo.msg.success('Deleted :)', null, null);
if (this.cmb.find('option:selected').length > 0) {
this.loadFilter(this.cmb.find('option:selected').data('extvalue'));
}
else {
this.fields.empty();
}
if (this.parentModule) {
let wcModule = this.parentModule[0];
wcModule.refresh();
}
}
}
});
}
/**
* Edit a filter
* @method editFilter
*/
editFilter() {
flexygo.msg.prompt('Edit filter', "Enter new filter's title", (res) => {
if (res != '') {
this.cmb.find('option:selected').text(res);
}
}, 'edit title', this.cmb.find('option:selected').text());
}
/**
* Save a filter
* @method saveFilter
*/
saveFilter() {
this.allSaved = true;
let itms = this.fields.find('li');
if (this.generic === false && this.cmb.find('option:selected').length == 0) {
flexygo.msg.error(flexygo.localization.translate('filtermanager.errornofilter'), null, null);
}
else if (itms.length == 0) {
flexygo.msg.error(flexygo.localization.translate('filtermanager.errornofields'), null, null);
}
else {
let fils = new Array();
let configs = new Array();
$.each(itms, (i, e) => {
let li = $(e);
let ctl = li.data('extvalue');
let fil = {
ObjectName: ctl.ObjectName,
PropertyName: ctl.PropertyName,
ObjectPath: ctl.ObjectPath,
Size: ctl.Size,
Order: i,
Label: li.find('input').val(),
OriginalLabel: li.find('input').val(),
PropertySearchType: li.find('select').val(),
Config: null
};
configs.push(ctl.Config);
fils.push(fil);
});
let searchid = null;
let filtername = null;
if (this.generic === true) {
if (this.genericFilter) {
searchid = this.genericFilter.SearchId;
filtername = this.genericFilter.Name;
}
else {
searchid = this.cmb.val();
filtername = this.cmb.find('option:selected').text();
}
}
else {
searchid = this.cmb.val();
filtername = this.cmb.find('option:selected').text();
}
let params = {
SearchId: searchid,
FilterName: filtername,
ObjectName: this.objectname,
Type: this.type,
Properties: fils,
Generic: this.generic
};
flexygo.ajax.post('~/api/Sys', 'saveFilter', params, (response) => {
this.cmb.find('option:selected').val(response);
params.Properties = fils;
$.each(params.Properties, (i, prop) => {
prop.Config = configs[i];
});
this.cmb.find('option:selected').data('extvalue', params);
flexygo.msg.success('Saved :)', null, null);
if (this.parentModule) {
let wcModule = this.parentModule[0];
wcModule.refresh();
}
});
}
}
/**
* Loads a filter
* @method loadFilter
* @param {flexygo.api.SearchSettings} filter - The filter search settings.
*/
loadFilter(filter) {
if (this.generic === true) {
this.genericFilter = filter;
}
this.fields.empty();
if (filter) {
$.each(filter.Properties, (i, e) => {
this.fields.append(this.createField(e));
});
this.fields.sortable({
update: (event, ui) => { this.allSaved = false; }
});
this.typecmb.val(filter.Type).trigger("change");
}
}
/**
* Loads an object
* @method loadObj
* @param {string} objectName - The object name.
* @param {JQuery} elem - The filter manager layout.
* @param {boolean} first - first time I entered.
*/
loadObj(objectName, elem, first) {
elem.html("");
if (objectName) {
let params = {
ObjectName: objectName
};
flexygo.ajax.post('~/api/Sys', 'getRelatedObjetsAndProps', params, (response) => {
if (first) {
let bitm = $('<li class="list-group-item"></li>');
let btn = $('<button class="btn btn-default bg-info"><i class="flx-icon icon-plus" /> ' + flexygo.localization.translate('filtermanager.add') + '</button>');
bitm.append(btn);
btn.on('click', () => { this.appendFields(); });
elem.append(bitm);
}
for (let key in response.RelatedObjects) {
let prop = $('');
if (response.RelatedObjects[key].ShowInAnalysis == true) {
prop = $('<li class="list-group-item objectFolder"></li>');
prop.html('<span><i class="flx-icon icon-folder" /> ' + key + '<span>');
prop.data('extvalue', response.RelatedObjects[key]);
prop.addClass('obj-filter');
prop.find('span').on('click', (e) => {
let el = $(e.currentTarget).closest('li');
el.find('i:first').toggleClass('icon-folder').toggleClass('icon-folder-2');
if (el.find('ul').length > 0) {
el.find('ul:first').toggle();
}
else {
let itm = $('<ul class="list-group" />');
this.loadObj(el.data('extvalue').ChildCollection, itm, false);
el.append(itm);
}
});
}
elem.append(prop);
}
let itm = $('<li class="list-group-item"></li>');
for (let key in response.Properties) {
if (response.Properties[key].ControlType != 'separator' && response.Properties[key].ControlType != 'placeholder') {
let obj = $('<div />');
obj.html('<label><input type="checkbox" /> ' + response.Properties[key].OriginalLabel + '</label>');
obj.data('extvalue', response.Properties[key]);
obj.addClass('prop-filter');
itm.append(obj);
}
}
itm.on('click', (ev) => {
ev.stopPropagation();
});
elem.append(itm);
//repeat add button at the end
let bitm = $('<li class="list-group-item"></li>');
let btn = $('<button class="btn btn-default bg-info"><i class="flx-icon icon-plus" /> ' + flexygo.localization.translate('filtermanager.add') + '</button>');
bitm.append(btn);
btn.on('click', () => { this.appendFields(); });
elem.append(bitm);
});
}
}
/**
* Append fields
* @method appendFields
*/
appendFields() {
let inp = this.tree.find('input:checked');
$.each(inp, (i, e) => {
let div = $(e).closest('div');
let prop = div.data('extvalue');
let fld = {
ObjectName: prop.ObjectName,
PropertyName: prop.Name,
Label: prop.Label,
OriginalLabel: prop.OriginalLabel,
Order: this.fields.find('.filterField').length,
PropertySearchType: prop.DefaultSearchType,
Type: prop.DefaultSearchType,
Config: prop,
ObjectPath: this.findPath(div),
Size: 2,
};
let fil = this.createField(fld);
fil.hide();
this.fields.append(fil);
});
this.fields.find('li:not(:visible)').show('250');
if (inp.length > 0) {
this.allSaved = false;
}
this.fields.sortable({
update: (event, ui) => { this.allSaved = false; }
});
inp.prop('checked', false);
}
createField(fld) {
let itm = $('<li class="list-group-item filterField" />');
itm.data('extvalue', fld);
itm.html('<input class="form-control" type="text" value="' + fld.OriginalLabel + '" />');
let cmd = $(' <select class="form-control" />');
$.each(this.types, (i, e) => {
let tmp = false;
let tyCmd = fld.Config.SearchTypes.split('|');
$.each(tyCmd, (j, ee) => {
if (ee.toLowerCase() === e.PropertySearchType.toLowerCase()) {
tmp = true;
return false;
}
});
if (tmp) {
let opt = $('<option/>').html(e.Descrip).attr('value', e.PropertySearchType);
cmd.append(opt);
}
});
cmd.val(fld.Type);
if (this.type === 'Text') {
cmd.hide();
}
itm.append(cmd);
itm.append(' <span class="comment">(' + flexygo.utils.parser.replaceAll(fld.ObjectPath, '|', ' > ') + ') <i class="flx-icon icon-trash clickable size-l" /></span>');
itm.find('.icon-trash').on('click', (e) => {
this.allSaved = false;
let li = $(e.currentTarget).closest('li');
li.hide(250, () => { li.remove(); });
});
return itm;
}
findPath(obj) {
let pathArr = new Array();
let parents = obj.parents('li.objectFolder');
$.each(parents, (i, e) => {
pathArr.unshift($(e).data('extvalue').ObjectName);
});
pathArr.push(obj.data('extvalue').ObjectName);
return pathArr.join('|');
}
}
wc.FlxFilterManagerElement = FlxFilterManagerElement;
})(wc = ui_1.wc || (ui_1.wc = {}));
})(ui = flexygo.ui || (flexygo.ui = {}));
})(flexygo || (flexygo = {}));
window.customElements.define('flx-filtermanager', flexygo.ui.wc.FlxFilterManagerElement);
//# sourceMappingURL=flx-filtermanager.js.map