From 9f57e68252349054e07bbdda97989ca0f434adc0 Mon Sep 17 00:00:00 2001 From: yuri Date: Tue, 21 Nov 2017 16:45:39 +0200 Subject: [PATCH] categoties refactor --- .../crm/res/templates/document/list.tpl | 1 - client/modules/crm/src/views/document/list.js | 93 +--------- .../src/views/knowledge-base-article/list.js | 15 +- client/res/templates/list-with-categories.tpl | 9 + client/src/views/list-with-categories.js | 159 ++++++++++++++++++ 5 files changed, 172 insertions(+), 105 deletions(-) create mode 100644 client/res/templates/list-with-categories.tpl create mode 100644 client/src/views/list-with-categories.js diff --git a/client/modules/crm/res/templates/document/list.tpl b/client/modules/crm/res/templates/document/list.tpl index db00915dd4..306d839acb 100644 --- a/client/modules/crm/res/templates/document/list.tpl +++ b/client/modules/crm/res/templates/document/list.tpl @@ -7,4 +7,3 @@ {{/unless}}
{{{list}}}
- diff --git a/client/modules/crm/src/views/document/list.js b/client/modules/crm/src/views/document/list.js index ffd34723d7..a927910289 100644 --- a/client/modules/crm/src/views/document/list.js +++ b/client/modules/crm/src/views/document/list.js @@ -26,12 +26,10 @@ * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ -Espo.define('crm:views/document/list', 'views/list', function (Dep) { +Espo.define('crm:views/document/list', 'views/list-with-categories', function (Dep) { return Dep.extend({ - template: 'crm:document/list', - quickCreate: true, currentCategoryId: null, @@ -42,94 +40,7 @@ Espo.define('crm:views/document/list', 'views/list', function (Dep) { categoryField: 'folder', - categoryFilterType: 'inCategory', - - data: function () { - var data = {}; - data.categoriesDisabled = this.categoriesDisabled; - return data; - }, - - setup: function () { - Dep.prototype.setup.call(this); - this.categoriesDisabled = this.categoriesDisabled || - this.getMetadata().get('scopes.' + this.categoryScope + '.disabled') || - !this.getAcl().checkScope(this.categoryScope); - }, - - afterRender: function () { - Dep.prototype.afterRender.call(this); - if (!this.categoriesDisabled && !this.hasView('categories')) { - this.loadCategories(); - } - }, - - getTreeCollection: function (callback) { - this.getCollectionFactory().create(this.categoryScope, function (collection) { - collection.url = collection.name + '/action/listTree'; - - this.collection.treeCollection = collection; - - this.listenToOnce(collection, 'sync', function () { - callback.call(this, collection); - }, this); - collection.fetch(); - }, this); - }, - - loadCategories: function () { - this.getTreeCollection(function (collection) { - this.createView('categories', 'views/record/list-tree', { - collection: collection, - el: this.options.el + ' .categories-container', - selectable: true, - createDisabled: true, - showRoot: true, - rootName: this.translate(this.scope, 'scopeNamesPlural'), - buttonsDisabled: true, - checkboxes: false, - showEditLink: this.getAcl().check(this.categoryScope, 'edit') - }, function (view) { - view.render(); - - this.listenTo(view, 'select', function (model) { - this.currentCategoryId = null; - this.currentCategoryName = ''; - - if (model && model.id) { - this.currentCategoryId = model.id; - this.currentCategoryName = model.get('name'); - } - this.collection.whereAdditional = null; - - if (this.currentCategoryId) { - this.collection.whereAdditional = [ - { - field: this.categoryField, - type: this.categoryFilterType, - value: model.id - } - ]; - } - - this.notify('Please wait...'); - this.listenToOnce(this.collection, 'sync', function () { - this.notify(false); - }, this); - this.collection.fetch(); - - }, this); - }, this); - - }, this); - }, - - getCreateAttributes: function () { - return { - folderId: this.currentCategoryId, - folderName: this.currentCategoryName - }; - } + categoryFilterType: 'inCategory' }); diff --git a/client/modules/crm/src/views/knowledge-base-article/list.js b/client/modules/crm/src/views/knowledge-base-article/list.js index bde8751a6a..868563bd42 100644 --- a/client/modules/crm/src/views/knowledge-base-article/list.js +++ b/client/modules/crm/src/views/knowledge-base-article/list.js @@ -26,7 +26,7 @@ * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ -Espo.define('crm:views/knowledge-base-article/list', 'crm:views/document/list', function (Dep) { +Espo.define('crm:views/knowledge-base-article/list', 'views/list-with-categories', function (Dep) { return Dep.extend({ @@ -34,18 +34,7 @@ Espo.define('crm:views/knowledge-base-article/list', 'crm:views/document/list', categoryField: 'categories', - categoryFilterType: 'inCategory', - - getCreateAttributes: function () { - if (this.currentCategoryId) { - var names = {}; - names[this.currentCategoryId] = this.currentCategoryName; - return { - categoriesIds: [this.currentCategoryId], - categoriesNames: names - }; - } - } + categoryFilterType: 'inCategory' }); diff --git a/client/res/templates/list-with-categories.tpl b/client/res/templates/list-with-categories.tpl new file mode 100644 index 0000000000..306d839acb --- /dev/null +++ b/client/res/templates/list-with-categories.tpl @@ -0,0 +1,9 @@ + +
{{{search}}}
+ +
+ {{#unless categoriesDisabled}} +
{{{categories}}}
+ {{/unless}} +
{{{list}}}
+
diff --git a/client/src/views/list-with-categories.js b/client/src/views/list-with-categories.js new file mode 100644 index 0000000000..940ccc98b3 --- /dev/null +++ b/client/src/views/list-with-categories.js @@ -0,0 +1,159 @@ +/************************************************************************ + * This file is part of EspoCRM. + * + * EspoCRM - Open Source CRM application. + * Copyright (C) 2014-2017 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko + * Website: http://www.espocrm.com + * + * EspoCRM 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. + * + * EspoCRM 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 EspoCRM. If not, see http://www.gnu.org/licenses/. + * + * The interactive user interfaces in modified source and object code versions + * of this program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU General Public License version 3. + * + * In accordance with Section 7(b) of the GNU General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. + ************************************************************************/ + +Espo.define('views/list-with-categories', 'views/list', function (Dep) { + + return Dep.extend({ + + template: 'list-with-categories', + + quickCreate: true, + + currentCategoryId: null, + + currentCategoryName: '', + + categoryScope: null, + + categoryField: 'cagegory', + + categoryFilterType: 'inCategory', + + data: function () { + var data = {}; + data.categoriesDisabled = this.categoriesDisabled; + return data; + }, + + setup: function () { + Dep.prototype.setup.call(this); + + if (!this.categoryScope) { + this.categoryScope = this.scope + 'Category'; + } + + this.categoriesDisabled = + this.categoriesDisabled || + this.getMetadata().get('scopes.' + this.categoryScope + '.disabled') || + !this.getAcl().checkScope(this.categoryScope); + }, + + afterRender: function () { + Dep.prototype.afterRender.call(this); + if (!this.categoriesDisabled && !this.hasView('categories')) { + this.loadCategories(); + } + }, + + getTreeCollection: function (callback) { + this.getCollectionFactory().create(this.categoryScope, function (collection) { + collection.url = collection.name + '/action/listTree'; + + this.collection.treeCollection = collection; + + this.listenToOnce(collection, 'sync', function () { + callback.call(this, collection); + }, this); + collection.fetch(); + }, this); + }, + + loadCategories: function () { + this.getTreeCollection(function (collection) { + this.createView('categories', 'views/record/list-tree', { + collection: collection, + el: this.options.el + ' .categories-container', + selectable: true, + createDisabled: true, + showRoot: true, + rootName: this.translate(this.scope, 'scopeNamesPlural'), + buttonsDisabled: true, + checkboxes: false, + showEditLink: this.getAcl().check(this.categoryScope, 'edit') + }, function (view) { + view.render(); + + this.listenTo(view, 'select', function (model) { + this.currentCategoryId = null; + this.currentCategoryName = ''; + + if (model && model.id) { + this.currentCategoryId = model.id; + this.currentCategoryName = model.get('name'); + } + this.collection.whereAdditional = null; + + if (this.currentCategoryId) { + this.collection.whereAdditional = [ + { + field: this.categoryField, + type: this.categoryFilterType, + value: model.id + } + ]; + } + + this.notify('Please wait...'); + this.listenToOnce(this.collection, 'sync', function () { + this.notify(false); + }, this); + this.collection.fetch(); + + }, this); + }, this); + + }, this); + }, + + getCreateAttributes: function () { + var fieldType = this.getMetadata().get(['entityDefs', this.scope, 'fields', this.categoryField, 'type']); + + if (fieldType === 'linkMultiple') { + if (this.currentCategoryId) { + var names = {}; + names[this.currentCategoryId] = this.currentCategoryName; + var data = {}; + var idsAttribute = this.categoryField + 'Ids'; + var namesAttribute = this.categoryField + 'Names'; + data[idsAttribute] = [this.currentCategoryId], + data[namesAttribute] = names; + return data; + } + } else { + var idAttribute = this.categoryField + 'Id'; + var nameAttribute = this.categoryField + 'Name'; + var data = {}; + data[idAttribute] = this.currentCategoryId; + data[nameAttribute] = this.currentCategoryName; + return data; + } + } + + }); +}); +