/*
* Pim
* Free Extension
* Copyright (c) TreoLabs GmbH
* Copyright (c) Kenner Soft Service GmbH
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Espo.define('pim:views/category/record/panels/category-products', ['views/record/panels/relationship', 'views/record/panels/bottom', 'search-manager'],
(Dep, BottomPanel, SearchManager) => Dep.extend({
boolFilterData: {
notLinkedCategoryAndOnlyCatalogsProducts() {
return {
categoryId: this.model.id,
scope: 'Global'
};
}
},
setup() {
let bottomPanel = new BottomPanel();
bottomPanel.setup.call(this);
this.link = this.link || this.defs.link || this.panelName;
if (!this.scope && !(this.link in this.model.defs.links)) {
throw new Error('Link \'' + this.link + '\' is not defined in model \'' + this.model.name + '\'');
}
this.title = this.title || this.translate(this.link, 'links', this.model.name);
this.scope = this.scope || this.model.defs.links[this.link].entity;
var url = this.url || this.model.name + '/' + this.model.id + '/' + this.link;
if (!this.getConfig().get('scopeColorsDisabled')) {
var iconHtml = this.getHelper().getScopeColorIconHtml(this.scope);
if (iconHtml) {
if (this.defs.label) {
this.titleHtml = iconHtml + this.translate(this.defs.label, 'labels', this.scope);
} else {
this.titleHtml = iconHtml + this.title;
}
}
}
if (!this.getAcl().check('Category', 'create') || !this.getAcl().check('ProductCategory', 'create')) {
this.readOnly = true;
}
if (!this.readOnly && !this.defs.readOnly) {
if (!('create' in this.defs)) {
this.defs.create = true;
}
if (!('select' in this.defs)) {
this.defs.select = true;
}
}
this.filterList = this.defs.filterList || this.filterList || null;
if (this.filterList && this.filterList.length) {
this.filter = this.getStoredFilter();
}
if (this.defs.create) {
if (this.getAcl().check(this.scope, 'create')) {
this.buttonList.push({
title: 'Create',
action: this.defs.createAction || 'createRelated',
link: this.link,
acl: 'create',
aclScope: this.scope,
html: '<span class="fas fa-plus"></span>',
data: {
link: this.link,
layout: this.defs.detailLayout
}
});
}
}
if (this.defs.select) {
var data = {link: this.link};
if (this.defs.selectPrimaryFilterName) {
data.primaryFilterName = this.defs.selectPrimaryFilterName;
}
if (this.defs.selectBoolFilterList) {
data.boolFilterList = this.defs.selectBoolFilterList;
}
data.boolFilterListCallback = 'getSelectBoolFilterList';
data.boolFilterDataCallback = 'getSelectBoolFilterData';
data.afterSelectCallback = 'createProductCategory';
data.scope = 'Product';
this.actionList.unshift({
label: 'Select',
action: this.defs.selectAction || 'selectRelated',
data: data,
acl: 'edit',
aclScope: this.model.name
});
}
this.setupActions();
var layoutName = 'listSmall';
var listLayout = null;
var layout = this.defs.layout || null;
if (layout) {
if (typeof layout == 'string') {
layoutName = layout;
} else {
layoutName = 'listRelationshipCustom';
listLayout = layout;
}
}
var sortBy = this.defs.sortBy || null;
var asc = this.defs.asc || null;
this.wait(true);
this.getCollectionFactory().create(this.scope, function (collection) {
collection.maxSize = this.defs.recordsPerPage || this.getConfig().get('recordsPerPageSmall') || 5;
if (this.defs.filters) {
var searchManager = new SearchManager(collection, 'listRelationship', false, this.getDateTime());
searchManager.setAdvanced(this.defs.filters);
collection.where = searchManager.getWhere();
}
collection.url = collection.urlRoot = url;
if (sortBy) {
collection.sortBy = sortBy;
}
if (asc) {
collection.asc = asc;
}
this.collection = collection;
this.setFilter(this.filter);
if (this.fetchOnModelAfterRelate) {
this.listenTo(this.model, 'after:relate', function () {
collection.fetch();
}, this);
}
var viewName = this.defs.recordListView || this.getMetadata().get('clientDefs.' + this.scope + '.recordViews.list') || 'Record.List';
this.once('after:render', function () {
this.createView('list', viewName, {
collection: collection,
layoutName: layoutName,
listLayout: listLayout,
checkboxes: false,
rowActionsView: this.defs.readOnly || this.readOnly ? false : (this.defs.rowActionsView || this.rowActionsView),
buttonsDisabled: true,
el: this.options.el + ' .list-container',
skipBuildRows: true
}, function (view) {
view.getSelectAttributeList(function (selectAttributeList) {
if (selectAttributeList) {
collection.data.select = selectAttributeList.join(',');
}
collection.fetch();
}.bind(this));
});
}, this);
this.wait(false);
}, this);
this.setupFilterActions();
},
createProductCategory(selectObj) {
let promises = [];
selectObj.forEach(productModel => {
this.getModelFactory().create(this.scope, model => {
model.setRelate({
model: this.model,
link: this.model.defs.links[this.link].foreign
});
model.setRelate({
model: productModel,
link: productModel.defs.links[this.link].foreign
});
model.set({
assignedUserId: this.getUser().id,
assignedUserName: this.getUser().get('name'),
scope: 'Global'
});
promises.push(model.save());
});
});
Promise.all(promises).then(() => {
this.notify('Linked', 'success');
this.actionRefresh();
});
},
getSelectBoolFilterList() {
return this.defs.selectBoolFilterList || null
},
getSelectBoolFilterData(boolFilterList) {
let data = {};
if (Array.isArray(boolFilterList)) {
boolFilterList.forEach(item => {
if (this.boolFilterData && typeof this.boolFilterData[item] === 'function') {
data[item] = this.boolFilterData[item].call(this);
}
});
}
return data;
}
})
);
|