From 9a407eef6dd32d6d49fc8bc47b5773175e868bcf Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Tue, 25 Feb 2025 10:24:17 +0200 Subject: [PATCH] include shared dashlet parameter --- .../Resources/metadata/dashlets/Cases.json | 12 +++-- .../Resources/metadata/dashlets/Leads.json | 12 +++-- .../metadata/dashlets/Opportunities.json | 12 +++-- .../Resources/metadata/dashlets/Tasks.json | 19 ++++--- .../views/dashlets/abstract/record-list.js | 29 +++++++++-- client/src/views/dashlets/options/base.js | 17 ++++++- .../src/views/dashlets/options/record-list.js | 50 +++++++++++++++++++ 7 files changed, 132 insertions(+), 19 deletions(-) create mode 100644 client/src/views/dashlets/options/record-list.js diff --git a/application/Espo/Modules/Crm/Resources/metadata/dashlets/Cases.json b/application/Espo/Modules/Crm/Resources/metadata/dashlets/Cases.json index 6b36f07393..f559a3f62e 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/dashlets/Cases.json +++ b/application/Espo/Modules/Crm/Resources/metadata/dashlets/Cases.json @@ -1,8 +1,9 @@ { - "view":"views/dashlets/abstract/record-list", + "view": "views/dashlets/abstract/record-list", "aclScope": "Case", "entityType": "Case", "options": { + "view": "views/dashlets/options/record-list", "fields": { "title": { "type": "varchar", @@ -20,6 +21,9 @@ "expandedLayout": { "type": "base", "view": "views/dashlets/fields/records/expanded-layout" + }, + "includeShared": { + "type": "bool" } }, "defaults": { @@ -27,6 +31,7 @@ "order": "desc", "displayRecords": 5, "populateAssignedUser": true, + "includeShared": false, "expandedLayout": { "rows": [ [ @@ -65,11 +70,12 @@ { "rows": [ [ - {"name": "title"} + {"name": "title"}, + {"name": "autorefreshInterval"} ], [ {"name": "displayRecords"}, - {"name": "autorefreshInterval"} + {"name": "includeShared"} ], [ {"name": "expandedLayout"}, diff --git a/application/Espo/Modules/Crm/Resources/metadata/dashlets/Leads.json b/application/Espo/Modules/Crm/Resources/metadata/dashlets/Leads.json index 2f2b790a81..9485929678 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/dashlets/Leads.json +++ b/application/Espo/Modules/Crm/Resources/metadata/dashlets/Leads.json @@ -1,8 +1,9 @@ { - "view":"views/dashlets/abstract/record-list", + "view": "views/dashlets/abstract/record-list", "aclScope": "Lead", "entityType": "Lead", "options": { + "view": "views/dashlets/options/record-list", "fields": { "title": { "type": "varchar", @@ -20,6 +21,9 @@ "expandedLayout": { "type": "base", "view": "views/dashlets/fields/records/expanded-layout" + }, + "includeShared": { + "type": "bool" } }, "defaults": { @@ -27,6 +31,7 @@ "order": "desc", "displayRecords": 5, "populateAssignedUser": true, + "includeShared": false, "expandedLayout": { "rows": [ [ @@ -59,11 +64,12 @@ { "rows": [ [ - {"name": "title"} + {"name": "title"}, + {"name": "autorefreshInterval"} ], [ {"name": "displayRecords"}, - {"name": "autorefreshInterval"} + {"name": "includeShared"} ], [ {"name": "expandedLayout"}, diff --git a/application/Espo/Modules/Crm/Resources/metadata/dashlets/Opportunities.json b/application/Espo/Modules/Crm/Resources/metadata/dashlets/Opportunities.json index 915843340d..5459cbf37c 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/dashlets/Opportunities.json +++ b/application/Espo/Modules/Crm/Resources/metadata/dashlets/Opportunities.json @@ -1,8 +1,9 @@ { - "view":"views/dashlets/abstract/record-list", + "view": "views/dashlets/abstract/record-list", "aclScope": "Opportunity", "entityType": "Opportunity", "options": { + "view": "views/dashlets/options/record-list", "fields": { "title": { "type": "varchar", @@ -20,6 +21,9 @@ "expandedLayout": { "type": "base", "view": "views/dashlets/fields/records/expanded-layout" + }, + "includeShared": { + "type": "bool" } }, "defaults": { @@ -27,6 +31,7 @@ "order": "asc", "displayRecords": 5, "populateAssignedUser": true, + "includeShared": false, "expandedLayout": { "rows": [ [ @@ -56,11 +61,12 @@ { "rows": [ [ - {"name": "title"} + {"name": "title"}, + {"name": "autorefreshInterval"} ], [ {"name": "displayRecords"}, - {"name": "autorefreshInterval"} + {"name": "includeShared"} ], [ {"name": "expandedLayout"}, diff --git a/application/Espo/Modules/Crm/Resources/metadata/dashlets/Tasks.json b/application/Espo/Modules/Crm/Resources/metadata/dashlets/Tasks.json index 90882b6377..d837fb83bc 100644 --- a/application/Espo/Modules/Crm/Resources/metadata/dashlets/Tasks.json +++ b/application/Espo/Modules/Crm/Resources/metadata/dashlets/Tasks.json @@ -1,8 +1,9 @@ { - "view":"crm:views/dashlets/tasks", + "view": "crm:views/dashlets/tasks", "aclScope": "Task", "entityType": "Task", "options": { + "view": "views/dashlets/options/record-list", "fields": { "title": { "type": "varchar", @@ -20,12 +21,16 @@ "expandedLayout": { "type": "base", "view": "views/dashlets/fields/records/expanded-layout" + }, + "includeShared": { + "type": "bool" } }, "defaults": { "orderBy": "dateUpcoming", "order": "asc", "displayRecords": 5, + "includeShared": false, "expandedLayout": { "rows": [ [ @@ -58,14 +63,16 @@ { "rows": [ [ - {"name": "title"} - ], - [ - {"name": "displayRecords"}, + {"name": "title"}, {"name": "autorefreshInterval"} ], [ - {"name": "expandedLayout", "fullWidth": true} + {"name": "displayRecords"}, + {"name": "includeShared"} + ], + [ + {"name": "expandedLayout"}, + false ] ] } diff --git a/client/src/views/dashlets/abstract/record-list.js b/client/src/views/dashlets/abstract/record-list.js index 87215f7b87..f03fa35738 100644 --- a/client/src/views/dashlets/abstract/record-list.js +++ b/client/src/views/dashlets/abstract/record-list.js @@ -68,13 +68,21 @@ class RecordListDashletView extends BaseDashletView { rowActionsView = 'views/record/row-actions/view-and-edit' + /** + * @protected + * @type {boolean} + */ + hasCollaborators + init() { this.name = this.options.name || this.name; - this.scope = this.getMetadata().get(['dashlets', this.name, 'entityType']) || this.scope; + this.scope = this.getMetadata().get(`dashlets.${this.name}.entityType`) || this.scope; this.additionalRowActionList = this.getMetadata().get(`dashlets.${this.name}.rowActionList`) || this.additionalRowActionList; + this.hasCollaborators = !!this.getMetadata().get(`scopes.${this.scope}.collaborators`); + super.init(); } @@ -86,7 +94,22 @@ class RecordListDashletView extends BaseDashletView { * @return {module:search-manager~data} */ getSearchData() { - return this.getOption('searchData'); + /** @type {module:search-manager~data} */ + const data = Espo.Utils.cloneDeep(this.getOption('searchData')); + + if (!this.hasCollaborators) { + return data; + } + + if (this.getOption('includeShared')) { + if (!data.bool) { + data.bool = {}; + } + + data.bool.shared = true; + } + + return data; } afterRender() { @@ -172,7 +195,7 @@ class RecordListDashletView extends BaseDashletView { name: 'create', text: this.translate('Create ' + this.scope, 'labels', this.scope), iconHtml: '', - url: '#'+this.scope+'/create', + url: `#${this.scope}/create`, }); } } diff --git a/client/src/views/dashlets/options/base.js b/client/src/views/dashlets/options/base.js index e3da748309..65dee74a7c 100644 --- a/client/src/views/dashlets/options/base.js +++ b/client/src/views/dashlets/options/base.js @@ -36,8 +36,23 @@ class BaseDashletOptionsModalView extends ModalView { cssName = 'options-modal' className = 'dialog dialog-record' - name = '' + + /** + * @protected + * @type {string} + */ + name + + /** + * @protected + * @type {boolean} + */ escapeDisabled = true + + /** + * @protected + * @type {boolean} + */ saveDisabled = false; buttonList = [ diff --git a/client/src/views/dashlets/options/record-list.js b/client/src/views/dashlets/options/record-list.js new file mode 100644 index 0000000000..7f95e04b29 --- /dev/null +++ b/client/src/views/dashlets/options/record-list.js @@ -0,0 +1,50 @@ +/************************************************************************ + * This file is part of EspoCRM. + * + * EspoCRM – Open Source CRM application. + * Copyright (C) 2014-2025 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko + * Website: https://www.espocrm.com + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * 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 Affero General Public License version 3. + * + * In accordance with Section 7(b) of the GNU Affero General Public License version 3, + * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. + ************************************************************************/ + +import BaseDashletOptionsModalView from 'views/dashlets/options/base'; + +export default class RecordListDashletOptionsModalView extends BaseDashletOptionsModalView { + + /** + * @protected + * @type {boolean} + */ + hasCollaborators + + setup() { + const entityType = this.getMetadata().get(`dashlets.${this.name}.entityType`); + + this.hasCollaborators = entityType && !!this.getMetadata().get(`scopes.${entityType}.collaborators`); + + super.setup(); + + if (!this.hasCollaborators) { + this.getRecordView().hideField('includeShared'); + } + } +}