Files
espocrm/client/lib/original/espo-crm.js
2026-01-19 17:46:06 +01:00

14354 lines
560 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
define("modules/crm/views/meeting/fields/attendees", ["exports", "views/fields/link-multiple-with-role"], function (_exports, _linkMultipleWithRole) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_linkMultipleWithRole = _interopRequireDefault(_linkMultipleWithRole);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _linkMultipleWithRole.default {
columnName = 'status';
roleFieldIsForeign = false;
emptyRoleValue = 'None';
}
_exports.default = _default;
});
define("modules/crm/views/calendar/fields/teams", ["exports", "views/fields/link-multiple"], function (_exports, _linkMultiple) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_linkMultiple = _interopRequireDefault(_linkMultiple);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class CalendarSharedViewTeamsFieldView extends _linkMultiple.default {
foreignScope = 'Team';
getSelectBoolFilterList() {
if (this.getAcl().getPermissionLevel('userCalendar') === 'team') {
return ['onlyMy'];
}
}
}
_exports.default = CalendarSharedViewTeamsFieldView;
});
define("modules/crm/knowledge-base-helper", ["exports", "ajax"], function (_exports, _ajax) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_ajax = _interopRequireDefault(_ajax);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
/**
* @todo Move to modules/crm/helpers.
*/
class KnowledgeBaseHelper {
/**
* @param {module:language} language
*/
constructor(language) {
this.language = language;
}
getAttributesForEmail(model, attributes, callback) {
attributes = attributes || {};
attributes.body = model.get('body');
if (attributes.name) {
attributes.name = attributes.name + ' ';
} else {
attributes.name = '';
}
attributes.name += this.language.translate('KnowledgeBaseArticle', 'scopeNames') + ': ' + model.get('name');
_ajax.default.postRequest('KnowledgeBaseArticle/action/getCopiedAttachments', {
id: model.id,
parentType: 'Email',
field: 'attachments'
}).then(data => {
attributes.attachmentsIds = data.ids;
attributes.attachmentsNames = data.names;
attributes.isHtml = true;
callback(attributes);
});
}
}
var _default = _exports.default = KnowledgeBaseHelper;
});
define("modules/crm/views/task/record/list", ["exports", "views/record/list"], function (_exports, _list) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_list = _interopRequireDefault(_list);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _list.default {
rowActionsView = 'crm:views/task/record/row-actions/default';
actionSetCompleted(data) {
const id = data.id;
if (!id) {
return;
}
const model = this.collection.get(id);
if (!model) {
return;
}
Espo.Ui.notify(this.translate('saving', 'messages'));
model.save({
status: 'Completed'
}, {
patch: true
}).then(() => {
Espo.Ui.success(this.translate('Saved'));
this.collection.fetch();
});
}
}
_exports.default = _default;
});
define("modules/crm/views/record/panels/tasks", ["exports", "views/record/panels/relationship", "helpers/record/create-related"], function (_exports, _relationship, _createRelated) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_relationship = _interopRequireDefault(_relationship);
_createRelated = _interopRequireDefault(_createRelated);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class TasksRelationshipPanelView extends _relationship.default {
name = 'tasks';
entityType = 'Task';
filterList = ['all', 'actual', 'completed'];
orderBy = 'createdAt';
orderDirection = 'desc';
rowActionsView = 'crm:views/record/row-actions/tasks';
buttonList = [{
action: 'createTask',
title: 'Create Task',
acl: 'create',
aclScope: 'Task',
html: '<span class="fas fa-plus"></span>'
}];
actionList = [{
label: 'View List',
action: 'viewRelatedList'
}];
listLayout = {
rows: [[{
name: 'name',
link: true
}], [{
name: 'isOverdue'
}, {
name: 'assignedUser'
}, {
name: 'dateEnd',
soft: true
}, {
name: 'status'
}]]
};
setup() {
this.parentScope = this.model.entityType;
this.link = 'tasks';
this.panelName = 'tasksSide';
this.defs.create = true;
if (this.parentScope === 'Account') {
this.link = 'tasksPrimary';
}
this.url = this.model.entityType + '/' + this.model.id + '/' + this.link;
this.setupSorting();
if (this.filterList && this.filterList.length) {
this.filter = this.getStoredFilter();
}
this.setupFilterActions();
this.setupTitle();
this.wait(true);
this.getCollectionFactory().create('Task', collection => {
this.collection = collection;
collection.seeds = this.seeds;
collection.url = this.url;
collection.orderBy = this.defaultOrderBy;
collection.order = this.defaultOrder;
collection.maxSize = this.getConfig().get('recordsPerPageSmall') || 5;
this.setFilter(this.filter);
this.wait(false);
});
this.once('show', () => {
if (!this.isRendered() && !this.isBeingRendered()) {
this.collection.fetch();
}
});
let events = `update-related:${this.link} update-all`;
if (this.parentScope === 'Account') {
events += ' update-related:tasks';
}
this.listenTo(this.model, events, () => this.collection.fetch());
}
afterRender() {
this.createView('list', 'views/record/list-expanded', {
selector: '> .list-container',
pagination: false,
type: 'listRelationship',
rowActionsView: this.defs.rowActionsView || this.rowActionsView,
checkboxes: false,
collection: this.collection,
listLayout: this.listLayout,
skipBuildRows: true
}, view => {
view.getSelectAttributeList(selectAttributeList => {
if (selectAttributeList) {
this.collection.data.select = selectAttributeList.join(',');
}
if (!this.disabled) {
this.collection.fetch();
return;
}
this.once('show', () => this.collection.fetch());
});
});
}
actionCreateRelated() {
this.actionCreateTask();
}
actionCreateTask() {
let link = this.link;
if (this.parentScope === 'Account') {
link = 'tasks';
}
const helper = new _createRelated.default(this);
helper.process(this.model, link);
}
// noinspection JSUnusedGlobalSymbols
actionComplete(data) {
const id = data.id;
if (!id) {
return;
}
const model = this.collection.get(id);
model.save({
status: 'Completed'
}, {
patch: true
}).then(() => this.collection.fetch());
}
actionViewRelatedList(data) {
data.viewOptions = data.viewOptions || {};
data.viewOptions.massUnlinkDisabled = true;
super.actionViewRelatedList(data);
}
}
_exports.default = TasksRelationshipPanelView;
});
define("modules/crm/views/record/panels/activities", ["exports", "views/record/panels/relationship", "multi-collection", "helpers/record-modal"], function (_exports, _relationship, _multiCollection, _recordModal) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_relationship = _interopRequireDefault(_relationship);
_multiCollection = _interopRequireDefault(_multiCollection);
_recordModal = _interopRequireDefault(_recordModal);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class ActivitiesPanelView extends _relationship.default {
name = 'activities';
orderBy = 'dateStart';
serviceName = 'Activities';
order = 'desc';
rowActionsView = 'crm:views/record/row-actions/activities';
relatedListFiltersDisabled = true;
buttonMaxCount = null;
/**
* @type {Array<module:views/record/panels-container~action|false>}
*/
actionList = [{
action: 'composeEmail',
label: 'Compose Email',
acl: 'create',
aclScope: 'Email'
}];
listLayout = {};
defaultListLayout = {
rows: [[{
name: 'ico',
view: 'crm:views/fields/ico'
}, {
name: 'name',
link: true,
view: 'views/event/fields/name-for-history'
}], [{
name: 'dateStart',
soft: true
}, {
name: 'assignedUser'
}]]
};
BUTTON_MAX_COUNT = 3;
setup() {
this.scopeList = this.getConfig().get(this.name + 'EntityList') || [];
this.buttonMaxCount = this.getConfig().get('activitiesCreateButtonMaxCount');
if (typeof this.buttonMaxCount === 'undefined') {
this.buttonMaxCount = this.BUTTON_MAX_COUNT;
}
this.listLayout = Espo.Utils.cloneDeep(this.listLayout);
this.defs.create = true;
this.createAvailabilityHash = {};
this.entityTypeLinkMap = {};
this.createEntityTypeStatusMap = {};
this.setupActionList();
this.setupFinalActionList();
this.setupSorting();
this.scopeList.forEach(item => {
if (!(item in this.listLayout)) {
this.listLayout[item] = this.defaultListLayout;
}
});
this.url = this.serviceName + '/' + this.model.entityType + '/' + this.model.id + '/' + this.name;
this.seeds = {};
this.wait(true);
let i = 0;
this.scopeList.forEach(scope => {
this.getModelFactory().create(scope, seed => {
this.seeds[scope] = seed;
i++;
if (i === this.scopeList.length) {
this.wait(false);
}
});
});
if (this.scopeList.length === 0) {
this.wait(false);
}
this.filterList = [];
/*this.scopeList.forEach(item => {
if (!this.getAcl().check(item)) {
return;
}
if (!this.getAcl().check(item, 'read')) {
return;
}
if (this.getMetadata().get(['scopes', item, 'disabled'])) {
return;
}
this.filterList.push(item);
});*/
if (this.filterList.length) {
this.filterList.unshift('all');
}
if (this.filterList && this.filterList.length) {
this.filter = this.getStoredFilter();
}
this.setupFilterActions();
this.setupTitle();
this.collection = new _multiCollection.default();
this.collection.seeds = this.seeds;
this.collection.url = this.url;
this.collection.orderBy = this.orderBy;
this.collection.order = this.order;
this.collection.maxSize = this.getConfig().get('recordsPerPageSmall') || 5;
let events = `update-related:activities update-all`;
for (const entityType of this.scopeList) {
const link = this.entityTypeLinkMap[entityType];
if (!link) {
continue;
}
events += ` update-related:${link}`;
}
if (this.name === 'history') {
events += ' update-related:emails';
}
this.listenTo(this.model, events, () => this.collection.fetch());
this.setFilter(this.filter);
this.once('show', () => {
if (!this.isRendered() && !this.isBeingRendered()) {
this.collection.fetch();
}
});
}
translateFilter(name) {
if (name === 'all') {
return this.translate(name, 'presetFilters');
}
return this.translate(name, 'scopeNamesPlural');
}
isCreateAvailable(scope) {
return this.createAvailabilityHash[scope];
}
setupActionList() {
if (this.name === 'activities' && this.buttonMaxCount) {
this.buttonList.push({
action: 'composeEmail',
title: 'Compose Email',
acl: 'create',
aclScope: 'Email',
html: $('<span>').addClass(this.getMetadata().get(['clientDefs', 'Email', 'iconClass'])).get(0).outerHTML
});
}
this.scopeList.forEach(scope => {
if (!this.getMetadata().get(['clientDefs', scope, 'activityDefs', this.name + 'Create'])) {
return;
}
if (!this.getAcl().checkScope(scope, 'create')) {
return;
}
const label = (this.name === 'history' ? 'Log' : 'Schedule') + ' ' + scope;
const o = {
action: 'createActivity',
text: this.translate(label, 'labels', scope),
data: {},
acl: 'create',
aclScope: scope
};
const link = this.getMetadata().get(['clientDefs', scope, 'activityDefs', 'link']);
if (link) {
o.data.link = link;
this.entityTypeLinkMap[scope] = link;
if (!this.model.hasLink(link)) {
return;
}
} else {
o.data.scope = scope;
if (this.model.entityType !== 'User' && !this.checkParentTypeAvailability(scope, this.model.entityType)) {
return;
}
}
this.createAvailabilityHash[scope] = true;
o.data = o.data || {};
if (!o.data.status) {
const statusList = this.getMetadata().get(['scopes', scope, this.name + 'StatusList']);
if (statusList && statusList.length) {
o.data.status = statusList[0];
}
}
this.createEntityTypeStatusMap[scope] = o.data.status;
this.actionList.push(o);
if (this.name === 'activities' && this.buttonList.length < this.buttonMaxCount) {
const ob = Espo.Utils.cloneDeep(o);
const iconClass = this.getMetadata().get(['clientDefs', scope, 'iconClass']);
if (iconClass) {
ob.title = label;
ob.html = $('<span>').addClass(iconClass).get(0).outerHTML;
this.buttonList.push(ob);
}
}
});
}
setupFinalActionList() {
this.scopeList.forEach((scope, i) => {
if (i === 0 && this.actionList.length) {
this.actionList.push(false);
}
if (!this.getAcl().checkScope(scope, 'read')) {
return;
}
const o = {
action: 'viewRelatedList',
html: $('<span>').append($('<span>').text(this.translate(scope, 'scopeNamesPlural'))).get(0).innerHTML,
data: {
scope: scope
},
acl: 'read',
aclScope: scope
};
this.actionList.push(o);
});
}
setFilter(filter) {
this.filter = filter;
this.collection.data.entityType = null;
if (filter && filter !== 'all') {
this.collection.data.entityType = this.filter;
}
}
afterRender() {
const afterFetch = () => {
this.createView('list', 'views/record/list-expanded', {
selector: '> .list-container',
pagination: false,
type: 'listRelationship',
rowActionsView: this.rowActionsView,
checkboxes: false,
collection: this.collection,
listLayout: this.listLayout
}, view => {
view.render();
this.listenTo(view, 'after:save', () => {
this.model.trigger('update-related:activities');
});
});
};
if (!this.disabled) {
this.collection.fetch().then(() => afterFetch());
} else {
this.once('show', () => {
this.collection.fetch().then(() => afterFetch());
});
}
}
getCreateActivityAttributes(scope, data, callback) {
data = data || {};
const attributes = {
status: data.status
};
if (this.model.entityType === 'User') {
const model = /** @type {module:models/user} */this.model;
if (model.isPortal()) {
attributes.usersIds = [model.id];
const usersIdsNames = {};
usersIdsNames[model.id] = model.get('name');
attributes.usersIdsNames = usersIdsNames;
} else {
attributes.assignedUserId = model.id;
attributes.assignedUserName = model.get('name');
}
} else {
if (this.model.entityType === 'Contact') {
if (this.model.get('accountId') && !this.getConfig().get('b2cMode')) {
attributes.parentType = 'Account';
attributes.parentId = this.model.get('accountId');
attributes.parentName = this.model.get('accountName');
if (scope && !this.getMetadata().get(['entityDefs', scope, 'links', 'contacts']) && !this.getMetadata().get(['entityDefs', scope, 'links', 'contact'])) {
delete attributes.parentType;
delete attributes.parentId;
delete attributes.parentName;
}
}
} else if (this.model.entityType === 'Lead') {
attributes.parentType = 'Lead';
attributes.parentId = this.model.id;
attributes.parentName = this.model.get('name');
}
if (this.model.entityType !== 'Account' && this.model.has('contactsIds')) {
attributes.contactsIds = this.model.get('contactsIds');
attributes.contactsNames = this.model.get('contactsNames');
}
if (scope) {
if (!attributes.parentId) {
if (this.checkParentTypeAvailability(scope, this.model.entityType)) {
attributes.parentType = this.model.entityType;
attributes.parentId = this.model.id;
attributes.parentName = this.model.get('name');
}
} else {
if (attributes.parentType && !this.checkParentTypeAvailability(scope, attributes.parentType)) {
attributes.parentType = null;
attributes.parentId = null;
attributes.parentName = null;
}
}
}
}
callback.call(this, Espo.Utils.cloneDeep(attributes));
}
checkParentTypeAvailability(scope, parentType) {
return (this.getMetadata().get(['entityDefs', scope, 'fields', 'parent', 'entityList']) || []).includes(parentType);
}
// noinspection JSUnusedGlobalSymbols
actionCreateRelated(data) {
data.link = this.entityTypeLinkMap[data.scope];
if (this.createEntityTypeStatusMap[data.scope]) {
data.status = this.createEntityTypeStatusMap[data.scope];
}
this.actionCreateActivity(data);
}
/**
* @protected
* @param {Record} data
*/
actionCreateActivity(data) {
const link = data.link;
let foreignLink;
let scope;
if (link) {
scope = this.model.getLinkParam(link, 'entity');
foreignLink = this.model.getLinkParam(link, 'foreign');
} else {
scope = data.scope;
}
Espo.Ui.notifyWait();
this.getCreateActivityAttributes(scope, data, attributes => {
const helper = new _recordModal.default();
helper.showCreate(this, {
entityType: scope,
relate: link ? {
model: this.model,
link: foreignLink
} : undefined,
attributes: attributes,
afterSave: () => {
this.model.trigger(`update-related:${link}`);
this.model.trigger('after:relate');
}
});
});
}
getComposeEmailAttributes(scope, data, callback) {
const attributes = {
status: 'Draft',
to: this.model.get('emailAddress')
};
if (this.model.entityType === 'Contact') {
if (this.getConfig().get('b2cMode')) {
attributes.parentType = 'Contact';
attributes.parentName = this.model.get('name');
attributes.parentId = this.model.id;
} else if (this.model.get('accountId')) {
attributes.parentType = 'Account';
attributes.parentId = this.model.get('accountId');
attributes.parentName = this.model.get('accountName');
}
} else if (this.model.entityType === 'Lead') {
attributes.parentType = 'Lead';
attributes.parentId = this.model.id;
attributes.parentName = this.model.get('name');
}
if (['Contact', 'Lead', 'Account'].includes(this.model.entityType) && this.model.get('emailAddress')) {
attributes.nameHash = {};
attributes.nameHash[this.model.get('emailAddress')] = this.model.get('name');
}
if (scope) {
if (!attributes.parentId) {
if (this.checkParentTypeAvailability(scope, this.model.entityType)) {
attributes.parentType = this.model.entityType;
attributes.parentId = this.model.id;
attributes.parentName = this.model.get('name');
}
} else if (attributes.parentType && !this.checkParentTypeAvailability(scope, attributes.parentType)) {
attributes.parentType = null;
attributes.parentId = null;
attributes.parentName = null;
}
}
const emailKeepParentTeamsEntityList = this.getConfig().get('emailKeepParentTeamsEntityList') || [];
if (attributes.parentType && attributes.parentType === this.model.entityType && emailKeepParentTeamsEntityList.includes(attributes.parentType) && this.model.get('teamsIds') && this.model.get('teamsIds').length) {
attributes.teamsIds = Espo.Utils.clone(this.model.get('teamsIds'));
attributes.teamsNames = Espo.Utils.clone(this.model.get('teamsNames') || {});
const defaultTeamId = this.getUser().get('defaultTeamId');
if (defaultTeamId && !attributes.teamsIds.includes(defaultTeamId)) {
attributes.teamsIds.push(defaultTeamId);
attributes.teamsNames[defaultTeamId] = this.getUser().get('defaultTeamName');
}
attributes.teamsIds = attributes.teamsIds.filter(teamId => {
return this.getAcl().checkTeamAssignmentPermission(teamId);
});
}
if (this.model.attributes.accountId && this.model.getFieldType('account') === 'link' && this.model.getLinkParam('account', 'entity') === 'Account') {
attributes.accountId = this.model.attributes.accountId;
attributes.accountName = this.model.attributes.accountName;
}
if (!attributes.to && this.isBasePlus()) {
Espo.Ui.notifyWait();
Espo.Ajax.getRequest(`Activities/${this.model.entityType}/${this.model.id}/composeEmailAddressList`).then(/** Record[] */list => {
if (!list.length) {
callback.call(this, attributes);
return;
}
attributes.to = '';
attributes.nameHash = {};
list.forEach(item => {
attributes.to += item.emailAddress + ';';
attributes.nameHash[item.emailAddress] = item.name;
});
Espo.Ui.notify(false);
callback.call(this, attributes);
});
return;
}
callback.call(this, attributes);
}
// noinspection JSUnusedGlobalSymbols
actionComposeEmail(data) {
const scope = 'Email';
let relate = null;
if ('emails' in this.model.defs['links']) {
relate = {
model: this.model,
link: this.model.defs['links']['emails'].foreign
};
}
Espo.Ui.notifyWait();
this.getComposeEmailAttributes(scope, data, attributes => {
this.createView('quickCreate', 'views/modals/compose-email', {
relate: relate,
attributes: attributes
}, view => {
view.render();
view.notify(false);
this.listenToOnce(view, 'after:save', () => {
this.model.trigger(`update-related:emails`);
this.model.trigger('after:relate');
});
});
});
}
actionSetHeld(data) {
const id = data.id;
if (!id) {
return;
}
const model = this.collection.get(id);
model.save({
status: 'Held'
}, {
patch: true
}).then(() => {
this.model.trigger(`update-related:activities`);
});
}
actionSetNotHeld(data) {
const id = data.id;
if (!id) {
return;
}
const model = this.collection.get(id);
model.save({
status: 'Not Held'
}, {
patch: true
}).then(() => {
this.model.trigger(`update-related:activities`);
});
}
actionViewRelatedList(data) {
data.url = `Activities/${this.model.entityType}/${this.model.id}/${this.name}/list/${data.scope}`;
data.title = this.translate(this.defs.label) + ' @right ' + this.translate(data.scope, 'scopeNamesPlural');
const viewOptions = /** @type {Record.<string, *>} */data.viewOptions || {};
const fullFormUrl = `#${this.model.entityType}/${this.name}/${this.model.id}/${data.scope}`;
viewOptions.massUnlinkDisabled = true;
viewOptions.fullFormUrl = fullFormUrl;
viewOptions.createDisabled = true;
data.viewOptions = viewOptions;
super.actionViewRelatedList(data);
}
/**
* @protected
* @return {boolean}
*/
isBasePlus() {
const type = this.getMetadata().get(`scopes.${this.model.entityType}.type`);
return type === 'BasePlus';
}
}
var _default = _exports.default = ActivitiesPanelView;
});
define("modules/crm/views/meeting/detail", ["exports", "views/detail", "moment"], function (_exports, _detail, _moment) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_detail = _interopRequireDefault(_detail);
_moment = _interopRequireDefault(_moment);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class MeetingDetailView extends _detail.default {
cancellationPeriod = '8 hours';
setup() {
super.setup();
this.setupStatuses();
this.addMenuItem('buttons', {
name: 'sendInvitations',
text: this.translate('Send Invitations', 'labels', 'Meeting'),
acl: 'edit',
hidden: true,
onClick: () => this.actionSendInvitations()
});
this.addMenuItem('dropdown', {
name: 'sendCancellation',
text: this.translate('Send Cancellation', 'labels', 'Meeting'),
acl: 'edit',
hidden: true,
onClick: () => this.actionSendCancellation()
});
this.addMenuItem('buttons', {
name: 'setAcceptanceStatus',
text: '',
hidden: true,
onClick: () => this.actionSetAcceptanceStatus()
});
this.setupCancellationPeriod();
this.controlSendInvitationsButton();
this.controlAcceptanceStatusButton();
this.controlSendCancellationButton();
this.listenTo(this.model, 'sync', () => {
this.controlSendInvitationsButton();
this.controlSendCancellationButton();
});
this.listenTo(this.model, 'sync', () => this.controlAcceptanceStatusButton());
}
setupStatuses() {
this.canceledStatusList = this.getMetadata().get(`scopes.${this.entityType}.canceledStatusList`) || [];
this.notActualStatusList = [...(this.getMetadata().get(`scopes.${this.entityType}.completedStatusList`) || []), ...this.canceledStatusList];
}
setupCancellationPeriod() {
this.cancellationPeriodAmount = 0;
this.cancellationPeriodUnits = 'hours';
const cancellationPeriod = this.getConfig().get('eventCancellationPeriod') || this.cancellationPeriod;
if (!cancellationPeriod) {
return;
}
const arr = cancellationPeriod.split(' ');
this.cancellationPeriodAmount = parseInt(arr[0]);
this.cancellationPeriodUnits = arr[1] ?? 'hours';
}
controlAcceptanceStatusButton() {
if (!this.model.has('status')) {
return;
}
if (!this.model.has('usersIds')) {
return;
}
if (this.notActualStatusList.includes(this.model.get('status'))) {
this.hideHeaderActionItem('setAcceptanceStatus');
return;
}
if (!this.model.getLinkMultipleIdList('users').includes(this.getUser().id)) {
this.hideHeaderActionItem('setAcceptanceStatus');
return;
}
const acceptanceStatus = this.model.getLinkMultipleColumn('users', 'status', this.getUser().id);
let text;
let style = 'default';
if (acceptanceStatus && acceptanceStatus !== 'None') {
text = this.getLanguage().translateOption(acceptanceStatus, 'acceptanceStatus', this.model.entityType);
style = this.getMetadata().get(['entityDefs', this.model.entityType, 'fields', 'acceptanceStatus', 'style', acceptanceStatus]);
} else {
text = this.translate('Acceptance', 'labels', 'Meeting');
}
let iconHtml = '';
if (style) {
const iconClass = {
'success': 'fas fa-check-circle',
'danger': 'fas fa-times-circle',
'warning': 'fas fa-question-circle'
}[style];
iconHtml = $('<span>').addClass(iconClass).addClass('text-' + style).get(0).outerHTML;
}
this.updateMenuItem('setAcceptanceStatus', {
text: text,
iconHtml: iconHtml,
hidden: false
});
}
controlSendInvitationsButton() {
let show = true;
if (this.notActualStatusList.includes(this.model.get('status'))) {
show = false;
}
if (show && !this.getAcl().checkModel(this.model, 'edit')) {
show = false;
}
if (show) {
const userIdList = this.model.getLinkMultipleIdList('users');
const contactIdList = this.model.getLinkMultipleIdList('contacts');
const leadIdList = this.model.getLinkMultipleIdList('leads');
if (!contactIdList.length && !leadIdList.length && !userIdList.length) {
show = false;
}
/*else if (
!contactIdList.length &&
!leadIdList.length &&
userIdList.length === 1 &&
userIdList[0] === this.getUser().id &&
this.model.getLinkMultipleColumn('users', 'status', this.getUser().id) === 'Accepted'
) {
show = false;
}*/
}
if (show) {
const dateEnd = this.model.get('dateEnd');
if (dateEnd && this.getDateTime().toMoment(dateEnd).isBefore(_moment.default.now())) {
show = false;
}
}
show ? this.showHeaderActionItem('sendInvitations') : this.hideHeaderActionItem('sendInvitations');
}
controlSendCancellationButton() {
let show = this.canceledStatusList.includes(this.model.get('status'));
if (show) {
const dateEnd = this.model.get('dateEnd');
if (dateEnd && this.getDateTime().toMoment(dateEnd).add(this.cancellationPeriodAmount, this.cancellationPeriodUnits).isBefore(_moment.default.now())) {
show = false;
}
}
if (show) {
const userIdList = this.model.getLinkMultipleIdList('users');
const contactIdList = this.model.getLinkMultipleIdList('contacts');
const leadIdList = this.model.getLinkMultipleIdList('leads');
if (!contactIdList.length && !leadIdList.length && !userIdList.length) {
show = false;
}
}
show ? this.showHeaderActionItem('sendCancellation') : this.hideHeaderActionItem('sendCancellation');
}
actionSendInvitations() {
Espo.Ui.notifyWait();
this.createView('dialog', 'crm:views/meeting/modals/send-invitations', {
model: this.model
}).then(view => {
Espo.Ui.notify(false);
view.render();
this.listenToOnce(view, 'sent', () => this.model.fetch());
});
}
actionSendCancellation() {
Espo.Ui.notifyWait();
this.createView('dialog', 'crm:views/meeting/modals/send-cancellation', {
model: this.model
}).then(view => {
Espo.Ui.notify(false);
view.render();
this.listenToOnce(view, 'sent', () => this.model.fetch());
});
}
// noinspection JSUnusedGlobalSymbols
actionSetAcceptanceStatus() {
this.createView('dialog', 'crm:views/meeting/modals/acceptance-status', {
model: this.model
}, view => {
view.render();
this.listenTo(view, 'set-status', status => {
this.disableMenuItem('setAcceptanceStatus');
Espo.Ui.notifyWait();
Espo.Ajax.postRequest(this.model.entityType + '/action/setAcceptanceStatus', {
id: this.model.id,
status: status
}).then(() => {
this.model.fetch().then(() => {
Espo.Ui.notify(false);
this.enableMenuItem('setAcceptanceStatus');
});
}).catch(() => this.enableMenuItem('setAcceptanceStatus'));
});
});
}
}
var _default = _exports.default = MeetingDetailView;
});
define("modules/crm/views/meeting/record/list", ["exports", "views/record/list"], function (_exports, _list) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_list = _interopRequireDefault(_list);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _list.default {
rowActionsView = 'modules/crm/views/meeting/record/row-actions/default';
setup() {
super.setup();
if (this.getAcl().checkScope(this.entityType, 'edit') && this.getAcl().checkField(this.entityType, 'status', 'edit')) {
this.massActionList.push('setHeld');
this.massActionList.push('setNotHeld');
}
}
/**
* @protected
* @param {Record} data
*/
async actionSetHeld(data) {
const id = data.id;
if (!id) {
return;
}
const model = this.collection.get(id);
if (!model) {
return;
}
Espo.Ui.notify(this.translate('saving', 'messages'));
await model.save({
status: 'Held'
}, {
patch: true
});
Espo.Ui.success(this.translate('Saved'));
}
/**
* @protected
* @param {Record} data
*/
async actionSetNotHeld(data) {
const id = data.id;
if (!id) {
return;
}
const model = this.collection.get(id);
if (!model) {
return;
}
Espo.Ui.notify(this.translate('saving', 'messages'));
await model.save({
status: 'Not Held'
}, {
patch: true
});
Espo.Ui.success(this.translate('Saved'));
}
// noinspection JSUnusedGlobalSymbols
async massActionSetHeld() {
const data = {};
data.ids = this.checkedList;
Espo.Ui.notify(this.translate('saving', 'messages'));
await Espo.Ajax.postRequest(`${this.collection.entityType}/action/massSetHeld`, data);
Espo.Ui.success(this.translate('Saved'));
await this.collection.fetch();
data.ids.forEach(id => {
if (this.collection.get(id)) {
this.checkRecord(id);
}
});
}
// noinspection JSUnusedGlobalSymbols
async massActionSetNotHeld() {
const data = {};
data.ids = this.checkedList;
Espo.Ui.notify(this.translate('saving', 'messages'));
await Espo.Ajax.postRequest(`${this.collection.entityType}/action/massSetNotHeld`, data);
Espo.Ui.success(this.translate('Saved'));
await this.collection.fetch();
data.ids.forEach(id => {
if (this.collection.get(id)) {
this.checkRecord(id);
}
});
}
}
_exports.default = _default;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/mass-email/record/edit', ['views/record/edit'], function (Dep) {
return Dep.extend({
setup: function () {
Dep.prototype.setup.call(this);
this.initFieldsControl();
},
initFieldsControl: function () {
this.listenTo(this.model, 'change:smtpAccount', (model, value, o) => {
if (!o.ui) {
return;
}
if (!value || value === 'system') {
this.model.set('fromAddress', this.getConfig().get('outboundEmailFromAddress') || '');
this.model.set('fromName', this.getConfig().get('outboundEmailFromName') || '');
return;
}
var smtpAccountView = this.getFieldView('smtpAccount');
if (!smtpAccountView) {
return;
}
if (!smtpAccountView.loadedOptionAddresses) {
return;
}
if (!smtpAccountView.loadedOptionAddresses[value]) {
return;
}
this.model.set('fromAddress', smtpAccountView.loadedOptionAddresses[value]);
this.model.set('fromName', smtpAccountView.loadedOptionFromNames[value]);
});
},
});
});
define("modules/crm/views/mass-email/modals/send-test", ["exports", "views/modal", "model", "views/record/edit-for-modal", "views/fields/link-multiple"], function (_exports, _modal, _model, _editForModal, _linkMultiple) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_modal = _interopRequireDefault(_modal);
_model = _interopRequireDefault(_model);
_editForModal = _interopRequireDefault(_editForModal);
_linkMultiple = _interopRequireDefault(_linkMultiple);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class MassEmailSendTestModalView extends _modal.default {
// language=Handlebars
templateContent = `
<div class="record-container no-side-margin">{{{record}}}</div>
`;
/**
* @private
* @type {EditForModalRecordView}
*/
recordView;
/**
* @private
* @type {Model}
*/
formModel;
/**
* @param {{model: import('model').default}} options
*/
constructor(options) {
super(options);
this.model = options.model;
}
setup() {
super.setup();
this.headerText = this.translate('Send Test', 'labels', 'MassEmail');
const formModel = this.formModel = new _model.default();
formModel.set('usersIds', [this.getUser().id]);
const usersNames = {};
usersNames[this.getUser().id] = this.getUser().get('name');
formModel.set('usersNames', usersNames);
this.recordView = new _editForModal.default({
model: formModel,
detailLayout: [{
rows: [[{
view: new _linkMultiple.default({
name: 'users',
labelText: this.translate('users', 'links', 'TargetList'),
mode: 'edit',
params: {
entity: 'User'
}
})
}, false], [{
view: new _linkMultiple.default({
name: 'contacts',
labelText: this.translate('contacts', 'links', 'TargetList'),
mode: 'edit',
params: {
entity: 'Contact'
}
})
}, false], [{
view: new _linkMultiple.default({
name: 'leads',
labelText: this.translate('leads', 'links', 'TargetList'),
mode: 'edit',
params: {
entity: 'Lead'
}
})
}, false], [{
view: new _linkMultiple.default({
name: 'accounts',
labelText: this.translate('accounts', 'links', 'TargetList'),
mode: 'edit',
params: {
entity: 'Account'
}
})
}, false]]
}]
});
this.assignView('record', this.recordView);
this.buttonList.push({
name: 'sendTest',
label: 'Send Test',
style: 'danger',
onClick: () => this.actionSendTest()
});
this.buttonList.push({
name: 'cancel',
label: 'Cancel',
onClick: () => this.actionClose()
});
}
actionSendTest() {
const list = [];
if (Array.isArray(this.formModel.attributes.usersIds)) {
this.formModel.attributes.usersIds.forEach(id => {
list.push({
id: id,
type: 'User'
});
});
}
if (Array.isArray(this.formModel.attributes.contactsIds)) {
this.formModel.attributes.contactsIds.forEach(id => {
list.push({
id: id,
type: 'Contact'
});
});
}
if (Array.isArray(this.formModel.attributes.leadsIds)) {
this.formModel.attributes.leadsIds.forEach(id => {
list.push({
id: id,
type: 'Lead'
});
});
}
if (Array.isArray(this.formModel.attributes.accountsIds)) {
this.formModel.attributes.accountsIds.forEach(id => {
list.push({
id: id,
type: 'Account'
});
});
}
if (list.length === 0) {
Espo.Ui.error(this.translate('selectAtLeastOneTarget', 'messages', 'MassEmail'));
return;
}
this.disableButton('sendTest');
Espo.Ui.notifyWait();
Espo.Ajax.postRequest('MassEmail/action/sendTest', {
id: this.model.id,
targetList: list
}).then(() => {
Espo.Ui.success(this.translate('testSent', 'messages', 'MassEmail'));
this.close();
}).catch(() => {
this.enableButton('sendTest');
});
}
}
_exports.default = MassEmailSendTestModalView;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/dashlets/options/chart', ['views/dashlets/options/base'], function (Dep) {
return Dep.extend({
setupBeforeFinal: function () {
this.listenTo(this.model, 'change:dateFilter', this.controlDateFilter);
this.controlDateFilter();
},
controlDateFilter: function () {
if (this.model.get('dateFilter') === 'between') {
this.showField('dateFrom');
this.showField('dateTo');
} else {
this.hideField('dateFrom');
this.hideField('dateTo');
}
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/contact/record/detail', ['views/record/detail'], function (Dep) {
return Dep.extend({});
});
define("modules/crm/views/call/record/list", ["exports", "views/record/list"], function (_exports, _list) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_list = _interopRequireDefault(_list);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _list.default {
rowActionsView = 'modules/crm/views/call/record/row-actions/default';
setup() {
super.setup();
if (this.getAcl().checkScope(this.entityType, 'edit') && this.getAcl().checkField(this.entityType, 'status', 'edit')) {
this.massActionList.push('setHeld');
this.massActionList.push('setNotHeld');
}
}
/**
* @protected
* @param {Record} data
*/
async actionSetHeld(data) {
const id = data.id;
if (!id) {
return;
}
const model = this.collection.get(id);
if (!model) {
return;
}
Espo.Ui.notify(this.translate('saving', 'messages'));
await model.save({
status: 'Held'
}, {
patch: true
});
Espo.Ui.success(this.translate('Saved'));
}
/**
* @protected
* @param {Record} data
*/
async actionSetNotHeld(data) {
const id = data.id;
if (!id) {
return;
}
const model = this.collection.get(id);
if (!model) {
return;
}
Espo.Ui.notify(this.translate('saving', 'messages'));
await model.save({
status: 'Not Held'
}, {
patch: true
});
Espo.Ui.success(this.translate('Saved'));
}
// noinspection JSUnusedGlobalSymbols
async massActionSetHeld() {
const data = {};
data.ids = this.checkedList;
Espo.Ui.notify(this.translate('saving', 'messages'));
await Espo.Ajax.postRequest(`${this.collection.entityType}/action/massSetHeld`, data);
Espo.Ui.success(this.translate('Saved'));
await this.collection.fetch();
data.ids.forEach(id => {
if (this.collection.get(id)) {
this.checkRecord(id);
}
});
}
// noinspection JSUnusedGlobalSymbols
async massActionSetNotHeld() {
const data = {};
data.ids = this.checkedList;
Espo.Ui.notify(this.translate('saving', 'messages'));
await Espo.Ajax.postRequest(`${this.collection.entityType}/action/massSetNotHeld`, data);
Espo.Ui.success(this.translate('Saved'));
await this.collection.fetch();
data.ids.forEach(id => {
if (this.collection.get(id)) {
this.checkRecord(id);
}
});
}
}
_exports.default = _default;
});
define("modules/crm/views/call/fields/contacts", ["exports", "modules/crm/views/meeting/fields/attendees"], function (_exports, _attendees) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_attendees = _interopRequireDefault(_attendees);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _attendees.default {
getAttributeList() {
return [...super.getAttributeList(), 'phoneNumbersMap'];
}
getDetailLinkHtml(id, name) {
const html = super.getDetailLinkHtml(id, name);
const key = this.foreignScope + '_' + id;
const phoneNumbersMap = this.model.get('phoneNumbersMap') || {};
if (!(key in phoneNumbersMap)) {
return html;
}
const number = phoneNumbersMap[key];
const $item = $(html);
// @todo Format phone number.
$item.append(' ', $('<span>').addClass('text-muted middle-dot'), ' ', $('<a>').attr('href', 'tel:' + number).attr('data-phone-number', number).attr('data-action', 'dial').addClass('small').text(number));
return $('<div>').append($item).get(0).outerHTML;
}
}
_exports.default = _default;
});
define("modules/crm/views/calendar/modals/edit-view", ["exports", "views/modal", "model", "views/record/edit-for-modal", "views/fields/enum", "views/fields/varchar", "crm:views/calendar/fields/teams"], function (_exports, _modal, _model, _editForModal, _enum, _varchar, _teams) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_modal = _interopRequireDefault(_modal);
_model = _interopRequireDefault(_model);
_editForModal = _interopRequireDefault(_editForModal);
_enum = _interopRequireDefault(_enum);
_varchar = _interopRequireDefault(_varchar);
_teams = _interopRequireDefault(_teams);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class CalendarEditViewModal extends _modal.default {
// language=Handlebars
templateContent = `
<div class="record-container no-side-margin">{{{record}}}</div>
`;
className = 'dialog dialog-record';
/**
* @private
* @type {EditForModalRecordView}
*/
recordView;
/**
* @param {{
* afterSave?: function({id: string}): void,
* afterRemove?: function(): void,
* id?: string,
* }} options
*/
constructor(options) {
super();
this.options = options;
}
setup() {
const id = this.options.id;
this.buttonList = [{
name: 'cancel',
label: 'Cancel',
onClick: () => this.actionCancel()
}];
this.isNew = !id;
const calendarViewDataList = this.getPreferences().get('calendarViewDataList') || [];
if (this.isNew) {
this.buttonList.unshift({
name: 'save',
label: 'Create',
style: 'danger',
onClick: () => this.actionSave()
});
} else {
this.dropdownItemList.push({
name: 'remove',
label: 'Remove',
onClick: () => this.actionRemove()
});
this.buttonList.unshift({
name: 'save',
label: 'Save',
style: 'primary',
onClick: () => this.actionSave()
});
}
const model = new _model.default();
model.name = 'CalendarView';
const modelData = {};
if (!this.isNew) {
calendarViewDataList.forEach(item => {
if (id === item.id) {
modelData.teamsIds = item.teamIdList || [];
modelData.teamsNames = item.teamNames || {};
modelData.id = item.id;
modelData.name = item.name;
modelData.mode = item.mode;
}
});
} else {
modelData.name = this.translate('Shared', 'labels', 'Calendar');
let foundCount = 0;
calendarViewDataList.forEach(item => {
if (item.name.indexOf(modelData.name) === 0) {
foundCount++;
}
});
if (foundCount) {
modelData.name += ' ' + foundCount;
}
modelData.id = id;
modelData.teamsIds = this.getUser().get('teamsIds') || [];
modelData.teamsNames = this.getUser().get('teamsNames') || {};
}
model.set(modelData);
this.recordView = new _editForModal.default({
model: model,
detailLayout: [{
rows: [[{
view: new _varchar.default({
name: 'name',
labelText: this.translate('name', 'fields'),
params: {
required: true
}
})
}, {
view: new _enum.default({
name: 'mode',
labelText: this.translate('mode', 'fields', 'DashletOptions'),
params: {
translation: 'DashletOptions.options.mode',
options: this.getMetadata().get('clientDefs.Calendar.sharedViewModeList') || []
}
})
}], [{
view: new _teams.default({
name: 'teams',
labelText: this.translate('teams', 'fields'),
params: {
required: true
}
})
}, false]]
}]
});
this.assignView('record', this.recordView);
if (this.isNew) {
this.headerText = this.translate('Create Shared View', 'labels', 'Calendar');
} else {
this.headerText = this.translate('Edit Shared View', 'labels', 'Calendar') + ' · ' + modelData.name;
}
}
async actionSave() {
if (this.recordView.validate()) {
return;
}
const modelData = this.recordView.fetch();
const calendarViewDataList = this.getPreferences().get('calendarViewDataList') || [];
const data = {
name: modelData.name,
teamIdList: modelData.teamsIds,
teamNames: modelData.teamsNames,
mode: modelData.mode,
id: undefined
};
if (this.isNew) {
data.id = Math.random().toString(36).substring(2, 12);
calendarViewDataList.push(data);
} else {
data.id = this.getView('record').model.id;
calendarViewDataList.forEach((item, i) => {
if (item.id === data.id) {
calendarViewDataList[i] = data;
}
});
}
Espo.Ui.notify(this.translate('saving', 'messages'));
this.disableButton('save');
this.disableButton('remove');
try {
await this.getPreferences().save({
calendarViewDataList: calendarViewDataList
}, {
patch: true
});
} catch (e) {
this.enableButton('remove');
this.enableButton('save');
return;
}
Espo.Ui.notify();
this.trigger('after:save', data);
if (this.options.afterSave) {
this.options.afterSave(data);
}
this.close();
}
async actionRemove() {
await this.confirm(this.translate('confirmation', 'messages'));
this.disableButton('save');
this.disableButton('remove');
const id = this.options.id;
if (!id) {
return;
}
const newCalendarViewDataList = [];
const calendarViewDataList = this.getPreferences().get('calendarViewDataList') || [];
calendarViewDataList.forEach(item => {
if (item.id !== id) {
newCalendarViewDataList.push(item);
}
});
Espo.Ui.notifyWait();
try {
await this.getPreferences().save({
calendarViewDataList: newCalendarViewDataList
}, {
patch: true
});
} catch (e) {
this.enableButton('remove');
this.enableButton('save');
return;
}
Espo.Ui.notify();
this.trigger('after:remove');
if (this.options.afterRemove) {
this.options.afterRemove();
}
this.close();
}
}
_exports.default = CalendarEditViewModal;
});
define("modules/crm/views/calendar/fields/users", ["exports", "views/fields/link-multiple"], function (_exports, _linkMultiple) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_linkMultiple = _interopRequireDefault(_linkMultiple);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class CalendarUsersFieldView extends _linkMultiple.default {
foreignScope = 'User';
sortable = true;
getSelectBoolFilterList() {
if (this.getAcl().getPermissionLevel('userCalendar') === 'team') {
return ['onlyMyTeam'];
}
}
getSelectPrimaryFilterName() {
return 'active';
}
}
var _default = _exports.default = CalendarUsersFieldView;
});
define("modules/crm/acl/meeting", ["exports", "acl"], function (_exports, _acl) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_acl = _interopRequireDefault(_acl);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class MeetingAcl extends _acl.default {
// noinspection JSUnusedGlobalSymbols
checkModelRead(model, data, precise) {
return this._checkModelCustom('read', model, data, precise);
}
// noinspection JSUnusedGlobalSymbols
checkModelStream(model, data, precise) {
return this._checkModelCustom('stream', model, data, precise);
}
_checkModelCustom(action, model, data, precise) {
let result = this.checkModel(model, data, action, precise);
if (result) {
return true;
}
if (data === false) {
return false;
}
let d = data || {};
if (d[action] === 'no') {
return false;
}
if (model.has('usersIds')) {
if (~(model.get('usersIds') || []).indexOf(this.getUser().id)) {
return true;
}
} else if (precise) {
return null;
}
return result;
}
}
var _default = _exports.default = MeetingAcl;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/user/record/panels/tasks', ['crm:views/record/panels/tasks'], function (Dep) {
return Dep.extend({
listLayout: {
rows: [
[
{
name: 'name',
link: true,
},
{
name: 'isOverdue',
}
],
[
{name: 'status'},
{name: 'dateEnd'},
],
]
},
setup: function () {
Dep.prototype.setup.call(this);
if (this.getMetadata().get(['entityDefs', 'Task', 'fields', 'assignedUsers'])) {
var foreignLink = this.getMetadata().get(['entityDefs', 'Task', 'links', 'assignedUsers', 'foreign']);
if (foreignLink) {
this.link = foreignLink;
}
}
},
});
});
define("modules/crm/views/task/list", ["exports", "views/list"], function (_exports, _list) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_list = _interopRequireDefault(_list);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _list.default {}
_exports.default = _default;
;
});
define("modules/crm/views/task/detail", ["exports", "views/detail"], function (_exports, _detail) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_detail = _interopRequireDefault(_detail);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _detail.default {}
_exports.default = _default;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/task/record/list-expanded',
['views/record/list-expanded', 'crm:views/task/record/list'], function (Dep, List) {
return Dep.extend({
rowActionsView: 'crm:views/task/record/row-actions/default',
actionSetCompleted: function (data) {
List.prototype.actionSetCompleted.call(this, data);
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/task/record/detail', ['views/record/detail'], function (Dep) {
return Dep.extend({
duplicateAction: true,
setupActionItems: function () {
Dep.prototype.setupActionItems.call(this);
if (this.getAcl().checkModel(this.model, 'edit')) {
if (
!~['Completed', 'Canceled'].indexOf(this.model.get('status')) &&
this.getAcl().checkField(this.entityType, 'status', 'edit')
) {
this.dropdownItemList.push({
'label': 'Complete',
'name': 'setCompleted'
});
}
this.listenToOnce(this.model, 'sync', function () {
if (~['Completed', 'Canceled'].indexOf(this.model.get('status'))) {
this.removeButton('setCompleted');
}
}, this);
}
},
manageAccessEdit: function (second) {
Dep.prototype.manageAccessEdit.call(this, second);
if (second) {
if (!this.getAcl().checkModel(this.model, 'edit', true)) {
this.hideActionItem('setCompleted');
}
}
},
actionSetCompleted: function () {
this.model.save({status: 'Completed'}, {patch: true})
.then(() => Espo.Ui.success(this.translate('Saved')));
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/task/record/row-actions/default', ['views/record/row-actions/view-and-edit'], function (Dep) {
return Dep.extend({
getActionList: function () {
var actionList = Dep.prototype.getActionList.call(this);
if (this.options.acl.edit && !~['Completed', 'Canceled'].indexOf(this.model.get('status'))) {
actionList.push({
action: 'setCompleted',
label: 'Complete',
data: {
id: this.model.id
},
groupIndex: 1,
});
}
if (this.options.acl.delete) {
actionList.push({
action: 'quickRemove',
label: 'Remove',
data: {
id: this.model.id,
scope: this.model.entityType
},
groupIndex: 0,
});
}
return actionList;
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/task/record/row-actions/dashlet', ['views/record/row-actions/view-and-edit'], function (Dep) {
return Dep.extend({
getActionList: function () {
var actionList = Dep.prototype.getActionList.call(this);
if (this.options.acl.edit && !~['Completed', 'Canceled'].indexOf(this.model.get('status'))) {
actionList.push({
action: 'setCompleted',
label: 'Complete',
data: {
id: this.model.id
},
groupIndex: 1,
});
}
if (this.options.acl.delete) {
actionList.push({
action: 'quickRemove',
label: 'Remove',
data: {
id: this.model.id,
scope: this.model.entityType
},
groupIndex: 0,
});
}
return actionList;
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/task/modals/detail', ['views/modals/detail'], function (Dep) {
return Dep.extend({});
});
define("modules/crm/views/task/fields/tasks", ["exports", "views/fields/link-multiple-with-status"], function (_exports, _linkMultipleWithStatus) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_linkMultipleWithStatus = _interopRequireDefault(_linkMultipleWithStatus);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _linkMultipleWithStatus.default {
setup() {
super.setup();
this.canceledStatusList = this.getMetadata().get(`scopes.Task.canceledStatusList`) || [];
}
}
_exports.default = _default;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/task/fields/priority-for-dashlet', ['views/fields/enum'], function (Dep) {
return Dep.extend({
data: function () {
var data = Dep.prototype.data.call(this);
if (!data.style || data.style === 'default') {
data.isNotEmpty = false;
}
return data;
},
});
});
define("modules/crm/views/task/fields/is-overdue", ["exports", "views/fields/base", "moment"], function (_exports, _base, _moment) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_base = _interopRequireDefault(_base);
_moment = _interopRequireDefault(_moment);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
// noinspection JSUnusedGlobalSymbols
class _default extends _base.default {
readOnly = true;
templateContent = `
{{~#if isOverdue}}
<span class="label label-danger">{{translate "overdue" scope="Task"}}</span>
{{/if~}}
`;
data() {
let isOverdue = false;
if (['Completed', 'Canceled'].indexOf(this.model.get('status')) === -1) {
if (this.model.has('dateEnd')) {
if (!this.isDate()) {
const value = this.model.get('dateEnd');
if (value) {
const d = this.getDateTime().toMoment(value);
const now = _moment.default.tz(this.getDateTime().timeZone || 'UTC');
if (d.unix() < now.unix()) {
isOverdue = true;
}
}
} else {
const value = this.model.get('dateEndDate');
if (value) {
const d = _moment.default.utc(value + ' 23:59', this.getDateTime().internalDateTimeFormat);
const now = this.getDateTime().getNowMoment();
if (d.unix() < now.unix()) {
isOverdue = true;
}
}
}
}
}
return {
isOverdue: isOverdue
};
}
setup() {
this.mode = 'detail';
}
isDate() {
const dateValue = this.model.get('dateEnd');
if (dateValue) {
return true;
}
return false;
}
}
_exports.default = _default;
});
define("modules/crm/views/task/fields/date-end", ["exports", "views/fields/datetime-optional", "moment"], function (_exports, _datetimeOptional, _moment) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_datetimeOptional = _interopRequireDefault(_datetimeOptional);
_moment = _interopRequireDefault(_moment);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class TaskDateEndFieldView extends _datetimeOptional.default {
isEnd = true;
getAttributeList() {
return [...super.getAttributeList(), 'status'];
}
data() {
const data = super.data();
const status = this.model.attributes.status;
if (!status || this.notActualStatusList.includes(status)) {
return data;
}
if (this.mode === this.MODE_DETAIL || this.mode === this.MODE_LIST) {
if (this.isDateInPast()) {
data.isOverdue = true;
} else if (this.isDateToday()) {
data.style = 'warning';
}
}
if (data.isOverdue) {
data.style = 'danger';
}
return data;
}
setup() {
super.setup();
this.notActualStatusList = [...(this.getMetadata().get(`scopes.${this.entityType}.completedStatusList`) || []), ...(this.getMetadata().get(`scopes.${this.entityType}.canceledStatusList`) || [])];
if (this.isEditMode() || this.isDetailMode()) {
this.on('change', () => {
if (!this.model.get('dateEnd') && this.model.get('reminders')) {
this.model.set('reminders', []);
}
});
}
}
/**
* @private
* @return {boolean}
*/
isDateInPast() {
if (this.isDate()) {
const value = this.model.get(this.nameDate);
if (value) {
const d = _moment.default.tz(value + ' 23:59', this.getDateTime().getTimeZone());
const now = this.getDateTime().getNowMoment();
if (d.unix() < now.unix()) {
return true;
}
}
}
const value = this.model.get(this.name);
if (value) {
const d = this.getDateTime().toMoment(value);
const now = (0, _moment.default)().tz(this.getDateTime().timeZone || 'UTC');
if (d.unix() < now.unix()) {
return true;
}
}
return false;
}
/**
* @private
* @return {boolean}
*/
isDateToday() {
if (!this.isDate()) {
return false;
}
return this.getDateTime().getToday() === this.model.attributes[this.nameDate];
}
}
var _default = _exports.default = TaskDateEndFieldView;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/target-list/record/detail', ['views/record/detail'], function (Dep) {
return Dep.extend({
setup: function () {
Dep.prototype.setup.call(this);
this.listenTo(this.model, 'after:relate', () => {
this.model.fetch();
});
this.listenTo(this.model, 'after:unrelate', () => {
this.model.fetch();
});
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/target-list/record/row-actions/opted-out', ['views/record/row-actions/default'], function (Dep) {
return Dep.extend({
getActionList: function () {
return [
{
action: 'cancelOptOut',
text: this.translate('Cancel Opt-Out', 'labels', 'TargetList'),
data: {
id: this.model.id,
type: this.model.entityType,
},
},
];
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/target-list/record/row-actions/default', ['views/record/row-actions/relationship'], function (Dep) {
return Dep.extend({
getActionList: function () {
const list = Dep.prototype.getActionList.call(this);
if (this.options.acl.edit) {
if (this.model.get('targetListIsOptedOut')) {
list.push({
action: 'cancelOptOut',
text: this.translate('Cancel Opt-Out', 'labels', 'TargetList'),
data: {
id: this.model.id,
type: this.model.entityType,
},
});
} else {
list.push({
action: 'optOut',
text: this.translate('Opt-Out', 'labels', 'TargetList'),
data: {
id: this.model.id,
type: this.model.entityType,
},
});
}
}
return list;
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/target-list/record/panels/relationship', ['views/record/panels/relationship'], function (Dep) {
return Dep.extend({
fetchOnModelAfterRelate: true,
actionOptOut: function (data) {
this.confirm(this.translate('confirmation', 'messages'), () => {
Espo.Ajax
.postRequest('TargetList/action/optOut', {
id: this.model.id,
targetId: data.id,
targetType: data.type,
})
.then(() => {
this.collection.fetch();
Espo.Ui.success(this.translate('Done'));
this.model.trigger('opt-out');
});
});
},
actionCancelOptOut: function (data) {
this.confirm(this.translate('confirmation', 'messages'), () => {
Espo.Ajax
.postRequest('TargetList/action/cancelOptOut', {
id: this.model.id,
targetId: data.id,
targetType: data.type,
})
.then(() => {
this.collection.fetch();
Espo.Ui.success(this.translate('Done'));
this.collection.fetch();
this.model.trigger('cancel-opt-out');
});
});
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/target-list/record/panels/opted-out', ['views/record/panels/relationship', 'multi-collection'],
function (Dep, MultiCollection) {
return Dep.extend({
name: 'optedOut',
template: 'crm:target-list/record/panels/opted-out',
scopeList: ['Contact', 'Lead', 'User', 'Account'],
data: function () {
return {
currentTab: this.currentTab,
scopeList: this.scopeList,
};
},
getStorageKey: function () {
return 'target-list-opted-out-' + this.model.entityType + '-' + this.name;
},
setup: function () {
this.seeds = {};
let linkList = this.getMetadata().get(['scopes', 'TargetList', 'targetLinkList']) || [];
this.scopeList = [];
linkList.forEach(link => {
let entityType = this.getMetadata().get(['entityDefs', 'TargetList', 'links', link, 'entity']);
if (entityType) {
this.scopeList.push(entityType);
}
});
this.listLayout = {};
this.scopeList.forEach(scope => {
this.listLayout[scope] = {
rows: [
[
{
name: 'name',
link: true,
}
]
]
};
});
if (this.scopeList.length) {
this.wait(true);
var i = 0;
this.scopeList.forEach(scope => {
this.getModelFactory().create(scope, seed => {
this.seeds[scope] = seed;
i++;
if (i === this.scopeList.length) {
this.wait(false);
}
});
});
}
this.listenTo(this.model, 'opt-out', () => {
this.actionRefresh();
});
this.listenTo(this.model, 'cancel-opt-out', () => {
this.actionRefresh();
});
},
afterRender: function () {
var url = 'TargetList/' + this.model.id + '/' + this.name;
this.collection = new MultiCollection();
this.collection.seeds = this.seeds;
this.collection.url = url;
this.collection.maxSize = this.getConfig().get('recordsPerPageSmall') || 5;
this.listenToOnce(this.collection, 'sync', () => {
this.createView('list', 'views/record/list-expanded', {
selector: '> .list-container',
pagination: false,
type: 'listRelationship',
rowActionsView: 'crm:views/target-list/record/row-actions/opted-out',
checkboxes: false,
collection: this.collection,
listLayout: this.listLayout,
}, view => {
view.render();
});
});
this.collection.fetch();
},
actionRefresh: function () {
this.collection.fetch();
},
actionCancelOptOut: function (data) {
this.confirm(this.translate('confirmation', 'messages'), () => {
Espo.Ajax.postRequest('TargetList/action/cancelOptOut', {
id: this.model.id,
targetId: data.id,
targetType: data.type,
}).then(() => {
this.collection.fetch();
});
});
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/target-list/fields/target-status', ['views/fields/base'], function (Dep) {
return Dep.extend({
getValueForDisplay: function () {
if (this.model.get('isOptedOut')) {
return this.getLanguage().translateOption('Opted Out', 'targetStatus', 'TargetList');
}
return this.getLanguage().translateOption('Listed', 'targetStatus', 'TargetList');
}
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/target-list/fields/including-action-list', ['views/fields/multi-enum'], function (Dep) {
return Dep.extend({
setupOptions: function () {
this.params.options = this.getMetadata().get('entityDefs.CampaignLogRecord.fields.action.options') || [];
this.translatedOptions = {};
this.params.options.forEach(item => {
this.translatedOptions[item] = this.getLanguage().translateOption(item, 'action', 'CampaignLogRecord');
});
},
});
});
define("modules/crm/views/stream/notes/event-confirmation", ["exports", "views/stream/note"], function (_exports, _note) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_note = _interopRequireDefault(_note);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class EventConfirmationNoteView extends _note.default {
// language=Handlebars
templateContent = `
{{#unless noEdit}}
<div class="pull-right right-container cell-buttons">
{{{right}}}
</div>
{{/unless}}
<div class="stream-head-container">
<div class="pull-left">
{{{avatar}}}
</div>
<div class="stream-head-text-container">
{{#if iconHtml}}{{{iconHtml}}}{{/if}}
<span class="text-muted message">{{{message}}}</span>
</div>
</div>
<div class="stream-post-container">
<span class="{{statusIconClass}} text-{{style}}"></span>
</div>
<div class="stream-date-container">
<a class="text-muted small" href="#Note/view/{{model.id}}">{{{createdAt}}}</a>
</div>
`;
data() {
const statusIconClass = {
'success': 'fas fa-check fa-sm',
'danger': 'fas fa-times fa-sm',
'warning': 'fas fa-question fa-sm'
}[this.style] || '';
return {
...super.data(),
statusText: this.statusText,
style: this.style,
statusIconClass: statusIconClass,
iconHtml: this.getIconHtml()
};
}
init() {
if (this.getUser().isAdmin()) {
this.isRemovable = true;
}
super.init();
}
setup() {
this.inviteeType = this.model.get('relatedType');
this.inviteeId = this.model.get('relatedId');
this.inviteeName = this.model.get('relatedName');
const data = this.model.get('data') || {};
const status = data.status || 'Tentative';
this.style = data.style || 'default';
this.statusText = this.getLanguage().translateOption(status, 'acceptanceStatus', 'Meeting');
this.messageName = 'eventConfirmation' + status;
if (this.isThis) {
this.messageName += 'This';
}
this.messageData['invitee'] = $('<a>').attr('href', '#' + this.inviteeType + '/view/' + this.inviteeId).attr('data-id', this.inviteeId).attr('data-scope', this.inviteeType).text(this.inviteeName);
this.createMessage();
}
}
// noinspection JSUnusedGlobalSymbols
var _default = _exports.default = EventConfirmationNoteView;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/record/list-activities-dashlet',
['views/record/list-expanded', 'crm:views/meeting/record/list', 'crm:views/task/record/list'],
function (Dep, MeetingList, TaskList) {
return Dep.extend({
actionSetHeld: function (data) {
MeetingList.prototype.actionSetHeld.call(this, data);
},
actionSetNotHeld: function (data) {
MeetingList.prototype.actionSetNotHeld.call(this, data);
},
actionSetCompleted: function (data) {
TaskList.prototype.actionSetCompleted.call(this, data);
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/record/row-actions/tasks', ['views/record/row-actions/relationship-no-unlink'], function (Dep) {
return Dep.extend({
getActionList: function () {
var list = [{
action: 'quickView',
label: 'View',
data: {
id: this.model.id
},
link: '#' + this.model.entityType + '/view/' + this.model.id,
groupIndex: 0,
}];
if (this.options.acl.edit) {
list.push({
action: 'quickEdit',
label: 'Edit',
data: {
id: this.model.id
},
link: '#' + this.model.entityType + '/edit/' + this.model.id,
groupIndex: 0,
});
if (!~['Completed', 'Canceled'].indexOf(this.model.get('status'))) {
list.push({
action: 'Complete',
text: this.translate('Complete', 'labels', 'Task'),
data: {
id: this.model.id
},
groupIndex: 1,
});
}
}
if (this.options.acl.delete) {
list.push({
action: 'removeRelated',
label: 'Remove',
data: {
id: this.model.id
},
groupIndex: 0,
});
}
return list;
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/record/row-actions/relationship-target', ['views/record/row-actions/relationship-unlink-only'], function (Dep) {
return Dep.extend({
getActionList: function () {
var list = Dep.prototype.getActionList.call(this);
if (this.options.acl.edit) {
if (this.model.get('isOptedOut')) {
list.push({
action: 'cancelOptOut',
text: this.translate('Cancel Opt-Out', 'labels', 'TargetList'),
data: {
id: this.model.id
},
groupIndex: 1,
});
} else {
list.push({
action: 'optOut',
text: this.translate('Opt-Out', 'labels', 'TargetList'),
data: {
id: this.model.id
},
groupIndex: 1,
});
}
}
return list;
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/record/row-actions/history', ['views/record/row-actions/relationship'], function (Dep) {
return Dep.extend({
getActionList: function () {
var list = [{
action: 'quickView',
label: 'View',
data: {
id: this.model.id
},
link: '#' + this.model.entityType + '/view/' + this.model.id,
groupIndex: 0,
}];
if (this.model.entityType === 'Email') {
list.push({
action: 'reply',
text: this.translate('Reply', 'labels', 'Email'),
data: {
id: this.model.id
},
groupIndex: 1,
});
}
if (this.options.acl.edit) {
list = list.concat([
{
action: 'quickEdit',
label: 'Edit',
data: {
id: this.model.id
},
link: '#' + this.model.entityType + '/edit/' + this.model.id,
groupIndex: 0,
},
]);
}
if (this.options.acl.delete) {
list.push({
action: 'removeRelated',
label: 'Remove',
data: {
id: this.model.id
},
groupIndex: 0,
});
}
return list;
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/record/row-actions/activities', ['views/record/row-actions/relationship'], function (Dep) {
return Dep.extend({
getActionList: function () {
var list = [{
action: 'quickView',
label: 'View',
data: {
id: this.model.id,
},
link: '#' + this.model.entityType + '/view/' + this.model.id,
groupIndex: 0,
}];
if (this.options.acl.edit) {
list.push({
action: 'quickEdit',
label: 'Edit',
data: {
id: this.model.id,
},
link: '#' + this.model.entityType + '/edit/' + this.model.id,
groupIndex: 0,
});
if (this.model.entityType === 'Meeting' || this.model.entityType === 'Call') {
list.push({
action: 'setHeld',
text: this.translate('Set Held', 'labels', 'Meeting'),
data: {
id: this.model.id,
},
groupIndex: 1,
});
list.push({
action: 'setNotHeld',
text: this.translate('Set Not Held', 'labels', 'Meeting'),
data: {
id: this.model.id,
},
groupIndex: 1,
});
}
}
if (this.options.acl.delete) {
list.push({
action: 'removeRelated',
label: 'Remove',
data: {
id: this.model.id,
},
groupIndex: 0,
});
}
return list;
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/record/row-actions/activities-dashlet', ['views/record/row-actions/view-and-edit'], function (Dep) {
return Dep.extend({
getActionList: function () {
var actionList = Dep.prototype.getActionList.call(this);
var scope = this.model.entityType;
actionList.forEach(function (item) {
item.data = item.data || {};
item.data.scope = this.model.entityType;
}, this);
if (scope === 'Task') {
if (this.options.acl.edit && !~['Completed', 'Canceled'].indexOf(this.model.get('status'))) {
actionList.push({
action: 'setCompleted',
label: 'Complete',
data: {
id: this.model.id
},
groupIndex: 1,
});
}
} else {
if (this.options.acl.edit && !~['Held', 'Not Held'].indexOf(this.model.get('status'))) {
actionList.push({
action: 'setHeld',
label: 'Set Held',
data: {
id: this.model.id,
scope: this.model.entityType
},
groupIndex: 1,
});
actionList.push({
action: 'setNotHeld',
label: 'Set Not Held',
data: {
id: this.model.id,
scope: this.model.entityType
},
groupIndex: 1,
});
}
}
if (this.options.acl.edit) {
actionList.push({
action: 'quickRemove',
label: 'Remove',
data: {
id: this.model.id,
scope: this.model.entityType
},
groupIndex: 0,
});
}
return actionList;
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/record/panels/target-lists', ['views/record/panels/relationship'], function (Dep) {
return Dep.extend({
actionOptOut: function (data) {
this.confirm(this.translate('confirmation', 'messages'), () => {
Espo.Ajax
.postRequest('TargetList/action/optOut', {
id: data.id,
targetId: this.model.id,
targetType: this.model.entityType,
})
.then(() => {
this.collection.fetch();
Espo.Ui.success(this.translate('Done'));
this.model.trigger('opt-out');
});
});
},
actionCancelOptOut: function (data) {
this.confirm(this.translate('confirmation', 'messages'), () => {
Espo.Ajax
.postRequest('TargetList/action/cancelOptOut', {
id: data.id,
targetId: this.model.id,
targetType: this.model.entityType,
})
.then(() => {
this.collection.fetch();
Espo.Ui.success(this.translate('Done'));
this.model.trigger('cancel-opt-out');
});
});
},
});
});
define("modules/crm/views/record/panels/history", ["exports", "crm:views/record/panels/activities", "email-helper", "helpers/record-modal"], function (_exports, _activities, _emailHelper, _recordModal) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_activities = _interopRequireDefault(_activities);
_emailHelper = _interopRequireDefault(_emailHelper);
_recordModal = _interopRequireDefault(_recordModal);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class HistoryPanelView extends _activities.default {
name = 'history';
orderBy = 'dateStart';
orderDirection = 'desc';
rowActionsView = 'crm:views/record/row-actions/history';
actionList = [];
listLayout = {
'Email': {
rows: [[{
name: 'ico',
view: 'crm:views/fields/ico'
}, {
name: 'name',
link: true
}], [{
name: 'dateSent',
soft: true
}, {
name: 'from'
}, {
name: 'hasAttachment',
view: 'views/email/fields/has-attachment'
}]]
}
};
where = {
scope: false
};
setupActionList() {
super.setupActionList();
this.actionList.push({
action: 'archiveEmail',
label: 'Archive Email',
acl: 'create',
aclScope: 'Email'
});
}
getArchiveEmailAttributes(scope, data, callback) {
const attributes = {
dateSent: this.getDateTime().getNow(15),
status: 'Archived',
from: this.model.get('emailAddress'),
to: this.getUser().get('emailAddress')
};
if (this.model.entityType === 'Contact') {
if (this.getConfig().get('b2cMode')) {
attributes.parentType = 'Contact';
attributes.parentName = this.model.get('name');
attributes.parentId = this.model.id;
} else {
if (this.model.get('accountId')) {
attributes.parentType = 'Account';
attributes.parentId = this.model.get('accountId');
attributes.parentName = this.model.get('accountName');
}
}
} else if (this.model.entityType === 'Lead') {
attributes.parentType = 'Lead';
attributes.parentId = this.model.id;
attributes.parentName = this.model.get('name');
}
attributes.nameHash = {};
attributes.nameHash[this.model.get('emailAddress')] = this.model.get('name');
if (scope) {
if (!attributes.parentId) {
if (this.checkParentTypeAvailability(scope, this.model.entityType)) {
attributes.parentType = this.model.entityType;
attributes.parentId = this.model.id;
attributes.parentName = this.model.get('name');
}
} else {
if (attributes.parentType && !this.checkParentTypeAvailability(scope, attributes.parentType)) {
attributes.parentType = null;
attributes.parentId = null;
attributes.parentName = null;
}
}
}
callback.call(this, attributes);
}
// noinspection JSUnusedGlobalSymbols
actionArchiveEmail(data) {
const scope = 'Email';
let relate = null;
if (this.model.hasLink('emails')) {
relate = {
model: this.model,
link: this.model.getLinkParam('emails', 'foreign')
};
}
this.getArchiveEmailAttributes(scope, data, attributes => {
const helper = new _recordModal.default();
helper.showCreate(this, {
entityType: 'Email',
attributes: attributes,
relate: relate,
afterSave: () => {
this.collection.fetch();
this.model.trigger('after:relate');
}
});
});
}
// noinspection JSUnusedGlobalSymbols
actionReply(data) {
const id = data.id;
if (!id) {
return;
}
const emailHelper = new _emailHelper.default();
Espo.Ui.notifyWait();
this.getModelFactory().create('Email').then(model => {
model.id = id;
model.fetch().then(() => {
const attributes = emailHelper.getReplyAttributes(model, data, this.getPreferences().get('emailReplyToAllByDefault'));
const viewName = this.getMetadata().get('clientDefs.Email.modalViews.compose') || 'views/modals/compose-email';
return this.createView('quickCreate', viewName, {
attributes: attributes,
focusForCreate: true
});
}).then(view => {
view.render();
this.listenToOnce(view, 'after:save', () => {
this.collection.fetch();
this.model.trigger('after:relate');
});
Espo.Ui.notify(false);
});
});
}
}
var _default = _exports.default = HistoryPanelView;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/opportunity/detail', ['views/detail'], function (Dep) {
/** Left for bc. */
return Dep.extend({});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/opportunity/record/list', ['views/record/list'], function (Dep) {
return Dep.extend({
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/opportunity/record/kanban', ['views/record/kanban'], function (Dep) {
return Dep.extend({
handleAttributesOnGroupChange: function (model, attributes, group) {
if (this.statusField !== 'stage') {
return;
}
var probability = this.getMetadata()
.get(['entityDefs', 'Opportunity', 'fields', 'stage', 'probabilityMap', group]);
probability = parseInt(probability);
attributes['probability'] = probability;
},
});
});
define("modules/crm/views/opportunity/record/edit", ["exports", "views/record/edit"], function (_exports, _edit) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_edit = _interopRequireDefault(_edit);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class OpportunityEditRecordView extends _edit.default {}
var _default = _exports.default = OpportunityEditRecordView;
});
define("modules/crm/views/opportunity/record/edit-small", ["exports", "views/record/edit-small"], function (_exports, _editSmall) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_editSmall = _interopRequireDefault(_editSmall);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class OpportunityEditSmallRecordView extends _editSmall.default {}
var _default = _exports.default = OpportunityEditSmallRecordView;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/opportunity/record/panels/activities', ['crm:views/record/panels/activities'], function (Dep) {
return Dep.extend({
getComposeEmailAttributes: function (scope, data, callback) {
data = data || {};
Espo.Ui.notifyWait();
Dep.prototype.getComposeEmailAttributes.call(this, scope, data, (attributes) => {
Espo.Ajax.getRequest('Opportunity/action/emailAddressList?id=' + this.model.id).then(list => {
attributes.to = '';
attributes.cc = '';
attributes.nameHash = {};
list.forEach(item => {
attributes.to += item.emailAddress + ';';
attributes.nameHash[item.emailAddress] = item.name;
});
Espo.Ui.notify(false);
callback.call(this, attributes);
});
})
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/opportunity/fields/stage', ['views/fields/enum'], function (Dep) {
return Dep.extend({
setup: function () {
Dep.prototype.setup.call(this);
this.probabilityMap = this.getMetadata().get('entityDefs.Opportunity.fields.stage.probabilityMap') || {};
if (this.mode !== 'list') {
this.on('change', () => {
var probability = this.probabilityMap[this.model.get(this.name)];
if (probability !== null && probability !== undefined) {
this.model.set('probability', probability);
}
});
}
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/opportunity/fields/lead-source', ['views/fields/enum'], function (Dep) {
return Dep.extend({});
});
define("modules/crm/views/opportunity/fields/last-stage", ["exports", "views/fields/enum"], function (_exports, _enum) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_enum = _interopRequireDefault(_enum);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
// noinspection JSUnusedGlobalSymbols
class _default extends _enum.default {
setup() {
/** @type {string[]} */
const optionList = this.getMetadata().get('entityDefs.Opportunity.fields.stage.options', []);
/** @type {Record.<string, number|null>} */
const probabilityMap = this.getMetadata().get('entityDefs.Opportunity.fields.stage.probabilityMap', {});
this.params.options = [];
optionList.forEach(item => {
if (!probabilityMap[item]) {
return;
}
if (probabilityMap[item] === 100) {
return;
}
this.params.options.push(item);
});
this.params.translation = 'Opportunity.options.stage';
super.setup();
}
}
_exports.default = _default;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/opportunity/fields/contacts',
['views/fields/link-multiple-with-columns-with-primary'], function (Dep) {
/** Left for bc. */
return Dep.extend({});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/opportunity/fields/contact-role', ['views/fields/enum'], function (Dep) {
return Dep.extend({
searchTypeList: ['anyOf', 'noneOf'],
});
});
define("modules/crm/views/opportunity/admin/field-manager/fields/probability-map", ["exports", "views/fields/base", "jquery"], function (_exports, _base, _jquery) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_base = _interopRequireDefault(_base);
_jquery = _interopRequireDefault(_jquery);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
// noinspection JSUnusedGlobalSymbols
class _default extends _base.default {
editTemplateContent = `
<div class="list-group link-container no-input">
{{#each stageList}}
<div class="list-group-item form-inline">
<div style="display: inline-block; width: 100%;">
<input
class="role form-control input-sm pull-right"
data-name="{{./this}}" value="{{prop ../values this}}"
>
<div>{{./this}}</div>
</div>
<br class="clear: both;">
</div>
{{/each}}
</div>
`;
setup() {
super.setup();
this.listenTo(this.model, 'change:options', function (m, v, o) {
const probabilityMap = this.model.get('probabilityMap') || {};
if (o.ui) {
(this.model.get('options') || []).forEach(item => {
if (!(item in probabilityMap)) {
probabilityMap[item] = 50;
}
});
this.model.set('probabilityMap', probabilityMap);
}
this.reRender();
});
}
data() {
const data = {};
const values = this.model.get('probabilityMap') || {};
data.stageList = this.model.get('options') || [];
data.values = values;
return data;
}
fetch() {
const data = {
probabilityMap: {}
};
(this.model.get('options') || []).forEach(item => {
data.probabilityMap[item] = parseInt((0, _jquery.default)(this.element).find(`input[data-name="${item}"]`).val());
});
return data;
}
afterRender() {
(0, _jquery.default)(this.element).find('input').on('change', () => {
this.trigger('change');
});
}
}
_exports.default = _default;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/notification/items/event-attendee', ['views/notification/items/base'], function (Dep) {
return Dep.extend({
messageName: 'eventAttendee',
templateContent: `
<div class="stream-head-container">
<div class="pull-left">{{{avatar}}}</div>
<div class="stream-head-text-container">
<span class="text-muted message">{{{message}}}</span>
</div>
</div>
<div class="stream-date-container">
<span class="text-muted small">{{{createdAt}}}</span>
</div>
`,
setup: function () {
let data = this.model.get('data') || {};
this.userId = data.userId;
this.messageData['entityType'] = this.translateEntityType(data.entityType);
this.messageData['entity'] =
$('<a>')
.attr('href', '#' + data.entityType + '/view/' + data.entityId)
.attr('data-id', data.entityId)
.attr('data-scope', data.entityType)
.text(data.entityName);
this.messageData['user'] =
$('<a>')
.attr('href', '#User/view/' + data.userId)
.attr('data-id', data.userId)
.attr('data-scope', 'User')
.text(data.userName);
this.createMessage();
},
});
});
define("modules/crm/views/meeting/popup-notification", ["exports", "views/popup-notification"], function (_exports, _popupNotification) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_popupNotification = _interopRequireDefault(_popupNotification);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class MeetingPopupNotificationView extends _popupNotification.default {
template = 'crm:meeting/popup-notification';
type = 'event';
style = 'primary';
closeButton = true;
setup() {
if (!this.notificationData.entityType) {
return;
}
const promise = this.getModelFactory().create(this.notificationData.entityType, model => {
const field = this.notificationData.dateField;
const fieldType = model.getFieldParam(field, 'type') || 'base';
const viewName = this.getFieldManager().getViewName(fieldType);
model.set(this.notificationData.attributes);
this.createView('date', viewName, {
model: model,
mode: 'detail',
selector: `.field[data-name="${field}"]`,
name: field,
readOnly: true
});
});
this.wait(promise);
}
data() {
return {
header: this.translate(this.notificationData.entityType, 'scopeNames'),
dateField: this.notificationData.dateField,
...super.data()
};
}
onCancel() {
Espo.Ajax.postRequest('Activities/action/removePopupNotification', {
id: this.notificationId
});
}
}
var _default = _exports.default = MeetingPopupNotificationView;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/meeting/record/list-expanded',
['views/record/list-expanded', 'crm:views/meeting/record/list'], function (Dep, List) {
return Dep.extend({
actionSetHeld: function (data) {
List.prototype.actionSetHeld.call(this, data);
},
actionSetNotHeld: function (data) {
List.prototype.actionSetNotHeld.call(this, data);
},
});
});
define("modules/crm/views/meeting/record/edit-small", ["exports", "views/record/edit"], function (_exports, _edit) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_edit = _interopRequireDefault(_edit);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _edit.default {}
_exports.default = _default;
});
define("modules/crm/views/meeting/record/detail", ["exports", "views/record/detail"], function (_exports, _detail) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_detail = _interopRequireDefault(_detail);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class MeetingDetailRecordView extends _detail.default {
duplicateAction = true;
setupActionItems() {
super.setupActionItems();
if (!this.getAcl().checkModel(this.model, 'edit')) {
return;
}
if (['Held', 'Not Held'].includes(this.model.get('status')) || !this.getAcl().checkField(this.entityType, 'status', 'edit')) {
return;
}
const historyStatusList = this.getMetadata().get(`scopes.${this.entityType}.historyStatusList`) || [];
if (!historyStatusList.includes('Held') || !historyStatusList.includes('Not Held')) {
return;
}
this.dropdownItemList.push({
'label': 'Set Held',
'name': 'setHeld',
onClick: () => this.actionSetHeld()
});
this.dropdownItemList.push({
'label': 'Set Not Held',
'name': 'setNotHeld',
onClick: () => this.actionSetNotHeld()
});
}
manageAccessEdit(second) {
super.manageAccessEdit(second);
if (second && !this.getAcl().checkModel(this.model, 'edit', true)) {
this.hideActionItem('setHeld');
this.hideActionItem('setNotHeld');
}
}
actionSetHeld() {
this.model.save({
status: 'Held'
}, {
patch: true
}).then(() => {
Espo.Ui.success(this.translate('Saved'));
this.removeActionItem('setHeld');
this.removeActionItem('setNotHeld');
});
}
actionSetNotHeld() {
this.model.save({
status: 'Not Held'
}, {
patch: true
}).then(() => {
Espo.Ui.success(this.translate('Saved'));
this.removeActionItem('setHeld');
this.removeActionItem('setNotHeld');
});
}
}
var _default = _exports.default = MeetingDetailRecordView;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/meeting/record/row-actions/default', ['views/record/row-actions/view-and-edit'], function (Dep) {
return Dep.extend({
getActionList: function () {
var actionList = Dep.prototype.getActionList.call(this);
actionList.forEach(item => {
item.data = item.data || {};
item.data.scope = this.model.entityType;
});
if (
this.options.acl.edit &&
!['Held', 'Not Held'].includes(this.model.get('status')) &&
this.getAcl().checkField(this.model.entityType, 'status', 'edit')
) {
actionList.push({
action: 'setHeld',
label: 'Set Held',
data: {
id: this.model.id,
scope: this.model.entityType,
},
groupIndex: 1,
});
actionList.push({
action: 'setNotHeld',
label: 'Set Not Held',
data: {
id: this.model.id,
scope: this.model.entityType,
},
groupIndex: 1,
});
}
if (this.options.acl.delete) {
actionList.push({
action: 'quickRemove',
label: 'Remove',
data: {
id: this.model.id,
scope: this.model.entityType,
},
groupIndex: 0,
});
}
return actionList;
}
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/meeting/record/row-actions/dashlet', ['views/record/row-actions/view-and-edit'], function (Dep) {
return Dep.extend({
getActionList: function () {
var actionList = Dep.prototype.getActionList.call(this);
actionList.forEach(item => {
item.data = item.data || {};
item.data.scope = this.model.entityType;
});
if (
this.options.acl.edit &&
!['Held', 'Not Held'].includes(this.model.get('status')) &&
this.getAcl().checkField(this.model.entityType, 'status', 'edit')
) {
actionList.push({
action: 'setHeld',
label: 'Set Held',
data: {
id: this.model.id,
scope: this.model.entityType,
},
groupIndex: 1,
});
actionList.push({
action: 'setNotHeld',
label: 'Set Not Held',
data: {
id: this.model.id,
scope: this.model.entityType,
},
groupIndex: 1,
});
}
if (this.options.acl.delete) {
actionList.push({
action: 'quickRemove',
label: 'Remove',
data: {
id: this.model.id,
scope: this.model.entityType,
},
groupIndex: 0,
});
}
return actionList;
}
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/meeting/record/panels/scheduler', ['views/record/panels/bottom'], function (Dep) {
return Dep.extend({
templateContent: '<div class="scheduler-container no-margin">{{{scheduler}}}</div>',
setup: function () {
Dep.prototype.setup.call(this);
var viewName = this.getMetadata().get(['clientDefs', this.scope, 'schedulerView']) ||
'crm:views/scheduler/scheduler';
this.createView('scheduler', viewName, {
selector: '.scheduler-container',
notToRender: true,
model: this.model,
});
this.once('after:render', () => {
if (this.disabled) {
return;
}
this.getView('scheduler').render();
this.getView('scheduler').notToRender = false;
});
if (this.defs.disabled) {
this.once('show', () => {
this.getView('scheduler').render();
this.getView('scheduler').notToRender = false;
});
}
},
actionRefresh: function () {
this.getView('scheduler').reRender();
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/meeting/record/panels/attendees', ['views/record/panels/side'], function (Dep) {
return Dep.extend({
setupFields: function () {
this.fieldList = [];
this.fieldList.push('users');
if (this.getAcl().check('Contact') && !this.getMetadata().get('scopes.Contact.disabled')) {
this.fieldList.push('contacts');
}
if (this.getAcl().check('Lead') && !this.getMetadata().get('scopes.Lead.disabled')) {
this.fieldList.push('leads');
}
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/meeting/modals/send-invitations', ['views/modal', 'collection'], function (Dep, Collection) {
/**
* @module crm_views/meeting/modals/send-invitations
*/
/**
* @class
* @name Class
* @extends module:views/modal
* @memberOf module:crm_views/meeting/modals/send-invitations
*/
return Dep.extend(/** @lends module:crm_views/meeting/modals/send-invitations.Class# */{
backdrop: true,
templateContent: `
<div class="margin-bottom">
<p>{{message}}</p>
</div>
<div class="list-container">{{{list}}}</div>
`,
data: function () {
return {
message: this.translate('sendInvitationsToSelectedAttendees', 'messages', 'Meeting'),
};
},
setup: function () {
Dep.prototype.setup.call(this);
this.shortcutKeys = {};
this.shortcutKeys['Control+Enter'] = e => {
if (!this.hasAvailableActionItem('send')) {
return;
}
e.preventDefault();
this.actionSend();
};
this.$header = $('<span>').append(
$('<span>')
.text(this.translate(this.model.entityType, 'scopeNames')),
' <span class="chevron-right"></span> ',
$('<span>')
.text(this.model.get('name')),
' <span class="chevron-right"></span> ',
$('<span>')
.text(this.translate('Send Invitations', 'labels', 'Meeting'))
);
this.addButton({
label: 'Send',
name: 'send',
style: 'danger',
disabled: true,
});
this.addButton({
label: 'Cancel',
name: 'cancel',
});
this.collection = new Collection();
this.collection.url = this.model.entityType + `/${this.model.id}/attendees`;
this.wait(
this.collection.fetch()
.then(() => {
Espo.Utils.clone(this.collection.models).forEach(model => {
model.entityType = model.get('_scope');
if (!model.get('emailAddress')) {
this.collection.remove(model.id);
}
});
return this.createView('list', 'views/record/list', {
selector: '.list-container',
collection: this.collection,
rowActionsDisabled: true,
massActionsDisabled: true,
checkAllResultDisabled: true,
selectable: true,
buttonsDisabled: true,
listLayout: [
{
name: 'name',
customLabel: this.translate('name', 'fields'),
notSortable: true,
},
{
name: 'acceptanceStatus',
width: 40,
customLabel: this.translate('acceptanceStatus', 'fields', 'Meeting'),
notSortable: true,
view: 'views/fields/enum',
params: {
options: this.model.getFieldParam('acceptanceStatus', 'options'),
style: this.model.getFieldParam('acceptanceStatus', 'style'),
},
},
],
})
})
.then(view => {
this.collection.models
.filter(model => {
let status = model.get('acceptanceStatus');
return !status || status === 'None';
})
.forEach(model => {
this.getListView().checkRecord(model.id);
});
this.listenTo(view, 'check', () => this.controlSendButton());
this.controlSendButton();
})
);
},
controlSendButton: function () {
this.getListView().checkedList.length ?
this.enableButton('send') :
this.disableButton('send');
},
/**
* @return {module:views/record/list}
*/
getListView: function () {
return this.getView('list');
},
actionSend: function () {
this.disableButton('send');
Espo.Ui.notifyWait();
let targets = this.getListView().checkedList.map(id => {
return {
entityType: this.collection.get(id).entityType,
id: id,
};
});
Espo.Ajax
.postRequest(this.model.entityType + '/action/sendInvitations', {
id: this.model.id,
targets: targets,
})
.then(result => {
result ?
Espo.Ui.success(this.translate('Sent')) :
Espo.Ui.warning(this.translate('nothingHasBeenSent', 'messages', 'Meeting'));
this.trigger('sent');
this.close();
})
.catch(() => {
this.enableButton('send');
});
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/meeting/modals/send-cancellation', ['views/modal', 'collection'], function (Dep, Collection) {
/**
* @module crm_views/meeting/modals/send-cancellation
*/
/**
* @class
* @name Class
* @extends module:views/modal
* @memberOf module:crm_views/meeting/modals/send-cancellation
*/
return Dep.extend(/** @lends module:crm_views/meeting/modals/send-cancellation.Class# */{
backdrop: true,
templateContent: `
<div class="margin-bottom">
<p>{{message}}</p>
</div>
<div class="list-container">{{{list}}}</div>
`,
data: function () {
return {
message: this.translate('sendCancellationsToSelectedAttendees', 'messages', 'Meeting'),
};
},
setup: function () {
Dep.prototype.setup.call(this);
this.shortcutKeys = {};
this.shortcutKeys['Control+Enter'] = e => {
if (!this.hasAvailableActionItem('send')) {
return;
}
e.preventDefault();
this.actionSend();
};
this.$header = $('<span>').append(
$('<span>')
.text(this.translate(this.model.entityType, 'scopeNames')),
' <span class="chevron-right"></span> ',
$('<span>')
.text(this.model.get('name')),
' <span class="chevron-right"></span> ',
$('<span>')
.text(this.translate('Send Cancellation', 'labels', 'Meeting'))
);
this.addButton({
label: 'Send',
name: 'send',
style: 'danger',
disabled: true,
});
this.addButton({
label: 'Cancel',
name: 'cancel',
});
this.collection = new Collection();
this.collection.url = this.model.entityType + `/${this.model.id}/attendees`;
this.wait(
this.collection.fetch()
.then(() => {
Espo.Utils.clone(this.collection.models).forEach(model => {
model.entityType = model.get('_scope');
if (!model.get('emailAddress')) {
this.collection.remove(model.id);
}
});
return this.createView('list', 'views/record/list', {
selector: '.list-container',
collection: this.collection,
rowActionsDisabled: true,
massActionsDisabled: true,
checkAllResultDisabled: true,
selectable: true,
buttonsDisabled: true,
listLayout: [
{
name: 'name',
customLabel: this.translate('name', 'fields'),
notSortable: true,
},
{
name: 'acceptanceStatus',
width: 40,
customLabel: this.translate('acceptanceStatus', 'fields', 'Meeting'),
notSortable: true,
view: 'views/fields/enum',
params: {
options: this.model.getFieldParam('acceptanceStatus', 'options'),
style: this.model.getFieldParam('acceptanceStatus', 'style'),
},
},
],
})
})
.then(view => {
this.collection.models
.filter(model => {
if (model.id === this.getUser().id && model.entityType === 'User') {
return false;
}
return true;
})
.forEach(model => {
this.getListView().checkRecord(model.id);
});
this.listenTo(view, 'check', () => this.controlSendButton());
this.controlSendButton();
})
);
},
controlSendButton: function () {
this.getListView().checkedList.length ?
this.enableButton('send') :
this.disableButton('send');
},
/**
* @return {module:views/record/list}
*/
getListView: function () {
return this.getView('list');
},
actionSend: function () {
this.disableButton('send');
Espo.Ui.notifyWait();
let targets = this.getListView().checkedList.map(id => {
return {
entityType: this.collection.get(id).entityType,
id: id,
};
});
Espo.Ajax
.postRequest(this.model.entityType + '/action/sendCancellation', {
id: this.model.id,
targets: targets,
})
.then(result => {
result ?
Espo.Ui.success(this.translate('Sent')) :
Espo.Ui.warning(this.translate('nothingHasBeenSent', 'messages', 'Meeting'));
this.trigger('sent');
this.close();
})
.catch(() => {
this.enableButton('send');
});
},
});
});
define("modules/crm/views/meeting/modals/detail", ["exports", "moment", "views/modals/detail"], function (_exports, _moment, _detail) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_moment = _interopRequireDefault(_moment);
_detail = _interopRequireDefault(_detail);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class MeetingModalDetailView extends _detail.default {
duplicateAction = true;
setup() {
super.setup();
this.setupStatuses();
}
setupStatuses() {
if (this.notActualStatusList) {
return;
}
this.notActualStatusList = [...(this.getMetadata().get(`scopes.${this.entityType}.completedStatusList`) || []), ...(this.getMetadata().get(`scopes.${this.entityType}.canceledStatusList`) || [])];
}
setupAfterModelCreated() {
super.setupAfterModelCreated();
const buttonData = this.getAcceptanceButtonData();
this.addButton({
name: 'setAcceptanceStatus',
html: buttonData.html,
hidden: this.hasAcceptanceStatusButton(),
style: buttonData.style,
className: 'btn-text',
pullLeft: true,
onClick: () => this.actionSetAcceptanceStatus()
}, 'cancel');
if (!this.getAcl().getScopeForbiddenFieldList(this.model.entityType).includes('status')) {
this.addDropdownItem({
name: 'setHeld',
text: this.translate('Set Held', 'labels', this.model.entityType),
hidden: true
});
this.addDropdownItem({
name: 'setNotHeld',
text: this.translate('Set Not Held', 'labels', this.model.entityType),
hidden: true
});
}
this.addDropdownItem({
name: 'sendInvitations',
text: this.translate('Send Invitations', 'labels', 'Meeting'),
hidden: !this.isSendInvitationsToBeDisplayed(),
onClick: () => this.actionSendInvitations()
});
this.initAcceptanceStatus();
this.on('switch-model', (model, previousModel) => {
this.stopListening(previousModel, 'sync');
this.initAcceptanceStatus();
});
this.on('after:save', () => {
if (this.hasAcceptanceStatusButton()) {
this.showAcceptanceButton();
} else {
this.hideAcceptanceButton();
}
if (this.isSendInvitationsToBeDisplayed()) {
this.showActionItem('sendInvitations');
} else {
this.hideActionItem('sendInvitations');
}
});
this.listenTo(this.model, 'sync', () => {
if (this.isSendInvitationsToBeDisplayed()) {
this.showActionItem('sendInvitations');
return;
}
this.hideActionItem('sendInvitations');
});
this.listenTo(this.model, 'after:save', () => {
if (this.isSendInvitationsToBeDisplayed()) {
this.showActionItem('sendInvitations');
return;
}
this.hideActionItem('sendInvitations');
});
}
controlRecordButtonsVisibility() {
super.controlRecordButtonsVisibility();
this.controlStatusActionVisibility();
}
controlStatusActionVisibility() {
this.setupStatuses();
if (this.getAcl().check(this.model, 'edit') && !this.notActualStatusList.includes(this.model.get('status'))) {
this.showActionItem('setHeld');
this.showActionItem('setNotHeld');
return;
}
this.hideActionItem('setHeld');
this.hideActionItem('setNotHeld');
}
initAcceptanceStatus() {
if (this.hasAcceptanceStatusButton()) {
this.showAcceptanceButton();
} else {
this.hideAcceptanceButton();
}
this.listenTo(this.model, 'sync', () => {
if (this.hasAcceptanceStatusButton()) {
this.showAcceptanceButton();
} else {
this.hideAcceptanceButton();
}
});
}
/**
*
* @return {{
* style: 'default'|'danger'|'success'|'warning'|'info',
* html: string,
* text: string,
* }}
*/
getAcceptanceButtonData() {
const acceptanceStatus = this.model.getLinkMultipleColumn('users', 'status', this.getUser().id);
let text;
let style = 'default';
let iconHtml = null;
if (acceptanceStatus && acceptanceStatus !== 'None') {
text = this.getLanguage().translateOption(acceptanceStatus, 'acceptanceStatus', this.model.entityType);
style = this.getMetadata().get(['entityDefs', this.model.entityType, 'fields', 'acceptanceStatus', 'style', acceptanceStatus]);
if (style) {
const iconClass = {
'success': 'fas fa-check-circle',
'danger': 'fas fa-times-circle',
'warning': 'fas fa-question-circle'
}[style];
iconHtml = $('<span>').addClass(iconClass).addClass('text-' + style).get(0).outerHTML;
}
} else {
text = typeof acceptanceStatus !== 'undefined' ? this.translate('Acceptance', 'labels', 'Meeting') : ' ';
}
let html = this.getHelper().escapeString(text);
if (iconHtml) {
html = iconHtml + ' ' + html;
}
return {
style: style,
text: text,
html: html
};
}
showAcceptanceButton() {
this.showActionItem('setAcceptanceStatus');
if (!this.isRendered()) {
this.once('after:render', this.showAcceptanceButton, this);
return;
}
const data = this.getAcceptanceButtonData();
const $button = this.$el.find('.modal-footer [data-name="setAcceptanceStatus"]');
$button.html(data.html);
$button.removeClass('btn-default');
$button.removeClass('btn-success');
$button.removeClass('btn-warning');
$button.removeClass('btn-info');
$button.removeClass('btn-primary');
$button.removeClass('btn-danger');
$button.addClass('btn-' + data.style);
}
hideAcceptanceButton() {
this.hideActionItem('setAcceptanceStatus');
}
hasAcceptanceStatusButton() {
if (!this.model.has('status')) {
return false;
}
if (!this.model.has('usersIds')) {
return false;
}
if (this.notActualStatusList.includes(this.model.get('status'))) {
return false;
}
if (!~this.model.getLinkMultipleIdList('users').indexOf(this.getUser().id)) {
return false;
}
return true;
}
actionSetAcceptanceStatus() {
this.createView('dialog', 'crm:views/meeting/modals/acceptance-status', {
model: this.model
}, view => {
view.render();
this.listenTo(view, 'set-status', status => {
this.hideAcceptanceButton();
Espo.Ui.notifyWait();
Espo.Ajax.postRequest(this.model.entityType + '/action/setAcceptanceStatus', {
id: this.model.id,
status: status
}).then(() => {
this.model.fetch().then(() => {
Espo.Ui.notify(false);
setTimeout(() => {
this.$el.find(`button[data-name="setAcceptanceStatus"]`).focus();
}, 50);
});
});
});
});
}
actionSetHeld() {
this.model.save({
status: 'Held'
});
this.trigger('after:save', this.model);
}
actionSetNotHeld() {
this.model.save({
status: 'Not Held'
});
this.trigger('after:save', this.model);
}
isSendInvitationsToBeDisplayed() {
if (this.notActualStatusList.includes(this.model.get('status'))) {
return false;
}
const dateEnd = this.model.get('dateEnd');
if (dateEnd && this.getDateTime().toMoment(dateEnd).isBefore(_moment.default.now())) {
return false;
}
if (!this.getAcl().checkModel(this.model, 'edit')) {
return false;
}
const userIdList = this.model.getLinkMultipleIdList('users');
const contactIdList = this.model.getLinkMultipleIdList('contacts');
const leadIdList = this.model.getLinkMultipleIdList('leads');
if (!contactIdList.length && !leadIdList.length && !userIdList.length) {
return false;
}
return true;
}
actionSendInvitations() {
Espo.Ui.notifyWait();
this.createView('dialog', 'crm:views/meeting/modals/send-invitations', {
model: this.model
}).then(view => {
Espo.Ui.notify(false);
view.render();
this.listenToOnce(view, 'sent', () => this.model.fetch());
});
}
}
var _default = _exports.default = MeetingModalDetailView;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/meeting/modals/acceptance-status', ['views/modal'], function (Dep) {
return Dep.extend({
backdrop: true,
templateContent: `
<div class="margin-bottom">
<p>{{viewObject.message}}</p>
</div>
<div>
{{#each viewObject.statusDataList}}
<div class="margin-bottom">
<div>
<button
class="action btn btn-{{style}} btn-x-wide"
type="button"
data-action="setStatus"
data-status="{{name}}"
>
{{label}}
</button>
{{#if selected}}<span class="check-icon fas fa-check" style="vertical-align: middle; margin: 0 10px;"></span>{{/if}}
</div>
</div>
{{/each}}
</div>
`,
setup: function () {
Dep.prototype.setup.call(this);
this.$header = $('<span>').append(
$('<span>').text(this.translate(this.model.entityType, 'scopeNames')),
' <span class="chevron-right"></span> ',
$('<span>').text(this.model.get('name')),
' <span class="chevron-right"></span> ',
$('<span>').text(this.translate('Acceptance', 'labels', 'Meeting'))
);
let statusList = this.getMetadata()
.get(['entityDefs', this.model.entityType, 'fields', 'acceptanceStatus', 'options']) || [];
this.statusDataList = [];
statusList.filter(item => item !== 'None').forEach(item => {
let o = {
name: item,
style: this.getMetadata()
.get(['entityDefs', this.model.entityType, 'fields', 'acceptanceStatus', 'style', item]) ||
'default',
label: this.getLanguage().translateOption(item, 'acceptanceStatus', this.model.entityType),
selected: this.model.getLinkMultipleColumn('users', 'status', this.getUser().id) === item,
};
this.statusDataList.push(o);
});
this.message = this.translate('selectAcceptanceStatus', 'messages', 'Meeting')
},
actionSetStatus: function (data) {
this.trigger('set-status', data.status);
this.close();
},
});
});
define("modules/crm/views/meeting/fields/users", ["exports", "modules/crm/views/meeting/fields/attendees"], function (_exports, _attendees) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_attendees = _interopRequireDefault(_attendees);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _attendees.default {
selectPrimaryFilterName = 'active';
init() {
this.assignmentPermission = this.getAcl().getPermissionLevel('assignmentPermission');
if (this.assignmentPermission === 'no') {
this.readOnly = true;
}
super.init();
}
getSelectBoolFilterList() {
if (this.assignmentPermission === 'team') {
return ['onlyMyTeam'];
}
}
/**
* @private
* @param {string} id
* @return {string}
*/
getIconHtml(id) {
return this.getHelper().getAvatarHtml(id, 'small', 18, 'avatar-link');
}
/**
* @inheritDoc
*/
prepareEditItemElement(id, name) {
const itemElement = super.prepareEditItemElement(id, name);
const avatarHtml = this.getHelper().getAvatarHtml(id, 'small', 18, 'avatar-link');
if (avatarHtml) {
const img = new DOMParser().parseFromString(avatarHtml, 'text/html').body.childNodes[0];
const nameElement = itemElement.children[0].querySelector('.link-item-name');
if (nameElement) {
nameElement.prepend(img);
}
}
return itemElement;
}
}
_exports.default = _default;
});
define("modules/crm/views/meeting/fields/reminders", ["exports", "ui/select", "moment", "views/fields/base"], function (_exports, _select, _moment, _base) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_select = _interopRequireDefault(_select);
_moment = _interopRequireDefault(_moment);
_base = _interopRequireDefault(_base);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class MeetingRemindersField extends _base.default {
detailTemplate = 'crm:meeting/fields/reminders/detail';
listTemplate = 'crm:meeting/fields/reminders/detail';
editTemplate = 'crm:meeting/fields/reminders/edit';
/**
* @private
* @type {string}
*/
dateField = 'dateStart';
/**
* @private
* @type {boolean}
*/
isDateTimeOptional;
/**
* @private
* @type {number}
*/
minAllDaySeconds = 120 * 60;
getAttributeList() {
return [this.name];
}
setup() {
this.addActionHandler('addReminder', () => this.actionAddReminder());
this.addActionHandler('removeReminder', (e, target) => {
const element = target.closest('.reminder');
const index = Array.from(element.parentElement.childNodes).indexOf(element);
this.removeReminder(index);
});
this.setupReminderList();
this.listenTo(this.model, 'change:' + this.name, () => {
this.reminderList = Espo.Utils.cloneDeep(this.model.get(this.name) || []);
});
this.typeList = Espo.Utils.clone(this.getMetadata().get('entityDefs.Reminder.fields.type.options') || []);
this.secondsList = Espo.Utils.clone(this.getMetadata().get('entityDefs.Reminder.fields.seconds.options') || []);
this.dateField = this.model.getFieldParam(this.name, 'dateField') || this.dateField;
this.listenTo(this.model, 'change:' + this.dateField, () => {
if (this.isEditMode()) {
this.reRender();
}
});
this.isDateTimeOptional = this.model.getFieldParam(this.dateField, 'type') === 'datetimeOptional';
}
/**
* @private
*/
setupReminderList() {
if (this.model.isNew() && !this.model.get(this.name) && this.model.entityType !== 'Preferences') {
let param = 'defaultReminders';
if (this.model.entityType === 'Task') {
param = 'defaultRemindersTask';
}
this.reminderList = this.getPreferences().get(param) || [];
} else {
this.reminderList = this.model.get(this.name) || [];
}
this.reminderList = Espo.Utils.cloneDeep(this.reminderList);
}
afterRender() {
if (this.isEditMode()) {
this.$container = this.$el.find('.reminders-container');
this.reminderList.forEach(item => {
this.addItemHtml(item);
});
}
}
focusOnButton() {
// noinspection JSUnresolvedReference
this.$el.find('button[data-action="addReminder"]').get(0).focus({
preventScroll: true
});
}
/**
* @private
* @param {string} type
* @param {number} index
*/
updateType(type, index) {
this.reminderList[index].type = type;
this.trigger('change');
}
/**
* @private
* @param {number} seconds
* @param {number} index
*/
updateSeconds(seconds, index) {
this.reminderList[index].seconds = seconds;
this.trigger('change');
}
/**
* @private
* @param {{type: string, seconds: number}} item
*/
addItemHtml(item) {
const $item = $('<div>').addClass('input-group').addClass('reminder');
const $type = $('<select>').attr('name', 'type').attr('data-name', 'type').addClass('form-control');
this.typeList.forEach(type => {
const $o = $('<option>').attr('value', type).text(this.getLanguage().translateOption(type, 'reminderTypes'));
$type.append($o);
});
$type.val(item.type).addClass('radius-left');
$type.on('change', () => {
this.updateType($type.val(), $type.closest('.reminder').index());
});
const $seconds = $('<select>').attr('name', 'seconds').attr('data-name', 'seconds').addClass('form-control radius-right');
const limitDate = this.model.get(this.dateField) ? this.getDateTime().toMoment(this.model.get(this.dateField)) : null;
/** @var {number[]} secondsList */
let secondsList = Espo.Utils.clone(this.secondsList);
if (this.isDateTimeOptional && this.model.attributes[this.dateField + 'Date']) {
secondsList = secondsList.filter(seconds => !seconds || seconds >= this.minAllDaySeconds);
}
if (!secondsList.includes(item.seconds)) {
secondsList.push(item.seconds);
}
secondsList.filter(seconds => {
return seconds === item.seconds || !limitDate || this.isBefore(seconds, limitDate);
}).sort((a, b) => a - b).forEach(seconds => {
const $o = $('<option>').attr('value', seconds).text(this.stringifySeconds(seconds));
$seconds.append($o);
});
$seconds.val(item.seconds);
$seconds.on('change', () => {
const seconds = parseInt($seconds.val());
const index = $seconds.closest('.reminder').index();
this.updateSeconds(seconds, index);
});
const $remove = $('<button>').addClass('btn').addClass('btn-link').css('margin-left', '5px').attr('type', 'button').attr('data-action', 'removeReminder').html('<span class="fas fa-times"></span>');
$item.append($('<div class="input-group-item">').append($type)).append($('<div class="input-group-item">').append($seconds)).append($('<div class="input-group-btn">').append($remove));
this.$container.append($item);
_select.default.init($type, {});
_select.default.init($seconds, {
sortBy: '$score',
sortDirection: 'desc',
/**
* @param {string} search
* @param {{value: string}} item
* @return {number}
*/
score: (search, item) => {
const num = parseInt(item.value);
const searchNum = parseInt(search);
if (isNaN(searchNum)) {
return 0;
}
const numOpposite = Number.MAX_SAFE_INTEGER - num;
if (searchNum === 0 && num === 0) {
return numOpposite;
}
if (searchNum * 60 === num) {
return numOpposite;
}
if (searchNum * 60 * 60 === num) {
return numOpposite;
}
if (searchNum * 60 * 60 * 24 === num) {
return numOpposite;
}
return 0;
},
load: (item, callback) => {
const num = parseInt(item);
if (isNaN(num) || num < 0) {
return;
}
if (num > 59) {
return;
}
const list = [];
const mSeconds = num * 60;
if (!this.isBefore(mSeconds, limitDate)) {
return;
}
list.push({
value: mSeconds.toString(),
text: this.stringifySeconds(mSeconds)
});
if (num <= 24) {
const hSeconds = num * 3600;
if (this.isBefore(hSeconds, limitDate)) {
list.push({
value: hSeconds.toString(),
text: this.stringifySeconds(hSeconds)
});
}
}
if (num <= 30) {
const dSeconds = num * 3600 * 24;
if (this.isBefore(dSeconds, limitDate)) {
list.push({
value: dSeconds.toString(),
text: this.stringifySeconds(dSeconds)
});
}
}
callback(list);
}
});
}
/**
* @private
* @param {number} seconds
* @param {moment.Moment} limitDate
* @return {boolean}
*/
isBefore(seconds, limitDate) {
return _moment.default.utc().add(seconds, 'seconds').isBefore(limitDate);
}
/**
* @private
* @param {number} totalSeconds
* @return {string}
*/
stringifySeconds(totalSeconds) {
if (!totalSeconds) {
return this.translate('on time', 'labels', 'Meeting');
}
let d = totalSeconds;
const days = Math.floor(d / 86400);
d = d % 86400;
const hours = Math.floor(d / 3600);
d = d % 3600;
const minutes = Math.floor(d / 60);
const seconds = d % 60;
const parts = [];
if (days) {
parts.push(days + '' + this.getLanguage().translate('d', 'durationUnits'));
}
if (hours) {
parts.push(hours + '' + this.getLanguage().translate('h', 'durationUnits'));
}
if (minutes) {
parts.push(minutes + '' + this.getLanguage().translate('m', 'durationUnits'));
}
if (seconds) {
parts.push(seconds + '' + this.getLanguage().translate('s', 'durationUnits'));
}
return parts.join(' ') + ' ' + this.translate('before', 'labels', 'Meeting');
}
/**
* @private
* @param {{type: string, seconds: number}} item
* @return {string}
*/
getDetailItemHtml(item) {
return $('<div>').append($('<span>').text(this.getLanguage().translateOption(item.type, 'reminderTypes')), ' ', $('<span>').text(this.stringifySeconds(item.seconds))).get(0).outerHTML;
}
getValueForDisplay() {
if (this.isDetailMode() || this.isListMode()) {
let html = '';
this.reminderList.forEach(item => {
html += this.getDetailItemHtml(item);
});
return html;
}
}
fetch() {
const data = {};
data[this.name] = Espo.Utils.cloneDeep(this.reminderList);
return data;
}
/**
* @private
*/
actionAddReminder() {
const type = this.getMetadata().get('entityDefs.Reminder.fields.type.default');
const seconds = this.getMetadata().get('entityDefs.Reminder.fields.seconds.default') || 0;
const item = {
type: type,
seconds: seconds
};
this.reminderList.push(item);
this.addItemHtml(item);
this.trigger('change');
this.focusOnButton();
}
/**
* @private
* @param {number} index
*/
removeReminder(index) {
const element = this.element.querySelectorAll('.reminder')[index] ?? null;
if (!element) {
return;
}
element.parentElement.removeChild(element);
this.reminderList.splice(index, 1);
this.focusOnButton();
}
}
var _default = _exports.default = MeetingRemindersField;
});
define("modules/crm/views/meeting/fields/date-start", ["exports", "views/fields/datetime-optional", "moment"], function (_exports, _datetimeOptional, _moment) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_datetimeOptional = _interopRequireDefault(_datetimeOptional);
_moment = _interopRequireDefault(_moment);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class DateStartMeetingFieldView extends _datetimeOptional.default {
emptyTimeInInlineEditDisabled = true;
setup() {
super.setup();
this.noneOption = this.translate('All-Day', 'labels', 'Meeting');
this.notActualStatusList = [...(this.getMetadata().get(`scopes.${this.entityType}.completedStatusList`) || []), ...(this.getMetadata().get(`scopes.${this.entityType}.canceledStatusList`) || [])];
}
getAttributeList() {
return [...super.getAttributeList(), 'dateEnd', 'dateEndDate', 'status'];
}
data() {
let style;
const status = this.model.get('status');
if (status && !this.notActualStatusList.includes(status) && (this.mode === this.MODE_DETAIL || this.mode === this.MODE_LIST)) {
if (this.isDateInPast('dateEnd')) {
style = 'danger';
} else if (this.isDateInPast('dateStart', true)) {
style = 'warning';
}
}
// noinspection JSValidateTypes
return {
...super.data(),
style: style
};
}
/**
* @private
* @param {string} field
* @param {boolean} [isFrom]
* @return {boolean}
*/
isDateInPast(field, isFrom) {
if (this.isDate()) {
const value = this.model.get(field + 'Date');
if (value) {
const timeValue = isFrom ? value + ' 00:00' : value + ' 23:59';
const d = _moment.default.tz(timeValue, this.getDateTime().getTimeZone());
const now = this.getDateTime().getNowMoment();
if (d.unix() < now.unix()) {
return true;
}
}
return false;
}
const value = this.model.get(field);
if (value) {
const d = this.getDateTime().toMoment(value);
const now = (0, _moment.default)().tz(this.getDateTime().timeZone || 'UTC');
if (d.unix() < now.unix()) {
return true;
}
}
return false;
}
afterRender() {
super.afterRender();
if (this.isEditMode()) {
this.controlTimePartVisibility();
}
}
fetch() {
const data = super.fetch();
if (data[this.nameDate]) {
data.isAllDay = true;
} else {
data.isAllDay = false;
}
return data;
}
controlTimePartVisibility() {
if (!this.isEditMode()) {
return;
}
if (!this.isInlineEditMode()) {
return;
}
if (this.model.get('isAllDay')) {
this.$time.addClass('hidden');
this.$el.find('.time-picker-btn').addClass('hidden');
} else {
this.$time.removeClass('hidden');
this.$el.find('.time-picker-btn').removeClass('hidden');
}
}
}
var _default = _exports.default = DateStartMeetingFieldView;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/meeting/fields/date-end', ['views/fields/datetime-optional'], function (Dep) {
return Dep.extend({
validateAfterAllowSameDay: true,
emptyTimeInInlineEditDisabled: true,
noneOptionIsHidden: true,
isEnd: true,
setup: function () {
Dep.prototype.setup.call(this);
this.isAllDayValue = this.model.get('isAllDay');
this.listenTo(this.model, 'change:isAllDay', (model, value, o) => {
if (!o.ui) {
return;
}
if (!this.isEditMode()) {
return;
}
if (this.isAllDayValue === undefined && !value) {
this.isAllDayValue = value;
return;
}
this.isAllDayValue = value;
if (value) {
this.$time.val(this.noneOption);
} else {
let dateTime = this.model.get('dateStart');
if (!dateTime) {
dateTime = this.getDateTime().getNow(5);
}
let m = this.getDateTime().toMoment(dateTime);
dateTime = m.format(this.getDateTime().getDateTimeFormat());
let index = dateTime.indexOf(' ');
let time = dateTime.substring(index + 1);
if (this.model.get('dateEnd')) {
this.$time.val(time);
}
}
this.trigger('change');
this.controlTimePartVisibility();
});
},
afterRender: function () {
Dep.prototype.afterRender.call(this);
if (this.isEditMode()) {
this.controlTimePartVisibility();
}
},
controlTimePartVisibility: function () {
if (!this.isEditMode()) {
return;
}
if (this.model.get('isAllDay')) {
this.$time.addClass('hidden');
this.$el.find('.time-picker-btn').addClass('hidden');
return;
}
this.$time.removeClass('hidden');
this.$el.find('.time-picker-btn').removeClass('hidden');
},
});
});
define("modules/crm/views/meeting/fields/contacts", ["exports", "modules/crm/views/meeting/fields/attendees"], function (_exports, _attendees) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_attendees = _interopRequireDefault(_attendees);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _attendees.default {}
_exports.default = _default;
});
define("modules/crm/views/meeting/fields/acceptance-status", ["exports", "views/fields/enum"], function (_exports, _enum) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_enum = _interopRequireDefault(_enum);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _enum.default {
searchTypeList = ['anyOf', 'noneOf'];
fetchSearch() {
let data = super.fetchSearch();
if (data && data.data.type === 'noneOf' && data.value && data.value.length > 1) {
data.value = [data.value[0]];
}
return data;
}
}
_exports.default = _default;
});
define("modules/crm/views/mass-email/detail", ["exports", "views/detail", "crm:views/mass-email/modals/send-test"], function (_exports, _detail, _sendTest) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_detail = _interopRequireDefault(_detail);
_sendTest = _interopRequireDefault(_sendTest);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _detail.default {
setup() {
super.setup();
if (['Draft', 'Pending'].includes(this.model.attributes.status) && this.getAcl().checkModel(this.model, 'edit')) {
this.addMenuItem('buttons', {
label: 'Send Test',
action: 'sendTest',
acl: 'edit',
onClick: () => this.actionSendTest()
});
}
}
async actionSendTest() {
const view = new _sendTest.default({
model: this.model
});
await this.assignView('modal', view);
await view.render();
}
}
_exports.default = _default;
});
define("modules/crm/views/mass-email/record/list-for-campaign", ["exports", "views/record/list", "crm:views/mass-email/modals/send-test"], function (_exports, _list, _sendTest) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_list = _interopRequireDefault(_list);
_sendTest = _interopRequireDefault(_sendTest);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _list.default {
// noinspection JSUnusedGlobalSymbols
async actionSendTest(data) {
const id = data.id;
const model = this.collection.get(id);
if (!model) {
return;
}
const view = new _sendTest.default({
model: model
});
await this.assignView('modal', view);
await view.render();
}
}
_exports.default = _default;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/mass-email/record/edit-small',
['views/record/edit-small', 'crm:views/mass-email/record/edit'], function (Dep, Edit) {
return Dep.extend({
setup: function () {
Dep.prototype.setup.call(this);
Edit.prototype.initFieldsControl.call(this);
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/mass-email/record/detail', ['views/record/detail'], function (Dep) {
return Dep.extend({
duplicateAction: true,
bottomView: 'crm:views/mass-email/record/detail-bottom',
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/mass-email/record/detail-bottom', ['views/record/detail-bottom'], function (Dep) {
return Dep.extend({
setupPanels: function () {
Dep.prototype.setupPanels.call(this);
this.panelList.unshift({
name: 'queueItems',
label: this.translate('queueItems', 'links', 'MassEmail'),
view: 'views/record/panels/relationship',
select: false,
create: false,
layout: 'listForMassEmail',
rowActionsView: 'views/record/row-actions/empty',
filterList: ['all', 'pending', 'sent', 'failed'],
});
},
afterRender: function () {
Dep.prototype.setupPanels.call(this);
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/mass-email/record/row-actions/for-campaign',
['views/record/row-actions/relationship-no-unlink'], function (Dep) {
return Dep.extend({
getActionList: function () {
var actionList = Dep.prototype.getActionList.call(this);
if (this.options.acl.edit && !~['Complete'].indexOf(this.model.get('status'))) {
actionList.unshift({
action: 'sendTest',
label: 'Send Test',
data: {
id: this.model.id,
}
});
}
return actionList;
}
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/mass-email/fields/smtp-account', ['views/lead-capture/fields/smtp-account'], function (Dep) {
return Dep.extend({
dataUrl: 'MassEmail/action/smtpAccountDataList',
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/mass-email/fields/from-address', ['views/fields/varchar'], function (Dep) {
return Dep.extend({
setup: function () {
Dep.prototype.setup.call(this);
if (this.model.isNew() && !this.model.has('fromAddress')) {
this.model.set('fromAddress', this.getConfig().get('outboundEmailFromAddress'));
}
if (this.model.isNew() && !this.model.has('fromName')) {
this.model.set('fromName', this.getConfig().get('outboundEmailFromName'));
}
},
});
});
define("modules/crm/views/mass-email/fields/email-template", ["exports", "views/fields/link"], function (_exports, _link) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_link = _interopRequireDefault(_link);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _link.default {
getCreateAttributes() {
return {
oneOff: true
};
}
}
_exports.default = _default;
});
define("modules/crm/views/lead/detail", ["exports", "views/detail"], function (_exports, _detail) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_detail = _interopRequireDefault(_detail);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class LeadDetailView extends _detail.default {
setup() {
super.setup();
this.addMenuItem('buttons', {
name: 'convert',
action: 'convert',
label: 'Convert',
acl: 'edit',
hidden: !this.isConvertable(),
onClick: () => this.actionConvert()
});
this.listenTo(this.model, 'sync', () => {
this.isConvertable() ? this.showHeaderActionItem('convert') : this.hideHeaderActionItem('convert');
});
}
isConvertable() {
const notActualList = [...(this.getMetadata().get(`entityDefs.Lead.fields.status.notActualOptions`) || []), 'Converted'];
return !notActualList.includes(this.model.get('status')) && this.model.has('status');
}
actionConvert() {
this.getRouter().navigate(`${this.model.entityType}/convert/${this.model.id}`, {
trigger: true
});
}
}
var _default = _exports.default = LeadDetailView;
});
define("modules/crm/views/lead/convert", ["exports", "views/main"], function (_exports, _main) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_main = _interopRequireDefault(_main);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class ConvertLeadView extends _main.default {
template = 'crm:lead/convert';
data() {
return {
scopeList: this.scopeList,
scope: this.scope
};
}
setup() {
this.scope = 'Lead';
this.addHandler('change', 'input.check-scope', (e, /** HTMLInputElement */target) => {
const scope = target.dataset.scope;
const $div = this.$el.find(`.edit-container-${Espo.Utils.toDom(scope)}`);
if (target.checked) {
$div.removeClass('hide');
} else {
$div.addClass('hide');
}
});
this.addActionHandler('convert', () => this.convert());
this.addActionHandler('cancel', () => {
this.getRouter().navigate(`#Lead/view/${this.id}`, {
trigger: true
});
});
this.createView('header', 'views/header', {
model: this.model,
fullSelector: '#main > .header',
scope: this.scope,
fontSizeFlexible: true
});
this.wait(true);
this.id = this.options.id;
Espo.Ui.notifyWait();
this.getModelFactory().create('Lead', model => {
this.model = model;
model.id = this.id;
this.listenToOnce(model, 'sync', () => this.build());
model.fetch();
});
}
build() {
const scopeList = this.scopeList = [];
(this.getMetadata().get('entityDefs.Lead.convertEntityList') || []).forEach(scope => {
if (scope === 'Account' && this.getConfig().get('b2cMode')) {
return;
}
if (this.getMetadata().get(['scopes', scope, 'disabled'])) {
return;
}
if (this.getAcl().check(scope, 'create')) {
scopeList.push(scope);
}
});
let i = 0;
const ignoreAttributeList = ['createdAt', 'modifiedAt', 'modifiedById', 'modifiedByName', 'createdById', 'createdByName'];
if (scopeList.length === 0) {
this.wait(false);
return;
}
Espo.Ajax.postRequest('Lead/action/getConvertAttributes', {
id: this.model.id
}).then(data => {
scopeList.forEach(scope => {
this.getModelFactory().create(scope, model => {
model.populateDefaults();
model.set(data[scope] || {}, {
silent: true
});
const convertEntityViewName = this.getMetadata().get(['clientDefs', scope, 'recordViews', 'edit']) || 'views/record/edit';
this.createView(scope, convertEntityViewName, {
model: model,
fullSelector: '#main .edit-container-' + Espo.Utils.toDom(scope),
buttonsPosition: false,
buttonsDisabled: true,
layoutName: 'detailConvert',
exit: () => {}
}, () => {
i++;
if (i === scopeList.length) {
this.wait(false);
Espo.Ui.notify(false);
}
});
});
});
});
}
convert() {
const scopeList = [];
this.scopeList.forEach(scope => {
/** @type {HTMLInputElement} */
const el = this.$el.find(`input[data-scope="${scope}"]`).get(0);
if (el && el.checked) {
scopeList.push(scope);
}
});
if (scopeList.length === 0) {
Espo.Ui.error(this.translate('selectAtLeastOneRecord', 'messages'));
return;
}
this.getRouter().confirmLeaveOut = false;
let notValid = false;
scopeList.forEach(scope => {
const editView = /** @type {import('views/record/edit').default} */this.getView(scope);
editView.setConfirmLeaveOut(false);
editView.model.set(editView.fetch());
notValid = editView.validate() || notValid;
});
const data = {
id: this.model.id,
records: {}
};
scopeList.forEach(scope => {
data.records[scope] = this.getView(scope).model.attributes;
});
const process = data => {
this.$el.find('[data-action="convert"]').addClass('disabled');
Espo.Ui.notifyWait();
Espo.Ajax.postRequest('Lead/action/convert', data).then(() => {
this.getRouter().confirmLeaveOut = false;
this.getRouter().navigate('#Lead/view/' + this.model.id, {
trigger: true
});
Espo.Ui.notify(this.translate('Converted', 'labels', 'Lead'));
}).catch(xhr => {
Espo.Ui.notify(false);
this.$el.find('[data-action="convert"]').removeClass('disabled');
if (xhr.status !== 409) {
return;
}
if (xhr.getResponseHeader('X-Status-Reason') !== 'duplicate') {
return;
}
let response = null;
try {
response = JSON.parse(xhr.responseText);
} catch (e) {
console.error('Could not parse response header.');
return;
}
xhr.errorIsHandled = true;
this.createView('duplicate', 'views/modals/duplicate', {
duplicates: response
}, view => {
view.render();
this.listenToOnce(view, 'save', () => {
data.skipDuplicateCheck = true;
process(data);
});
});
});
};
if (notValid) {
Espo.Ui.error(this.translate('Not valid'));
return;
}
process(data);
}
getHeader() {
const headerIconHtml = this.getHeaderIconHtml();
const scopeLabel = this.getLanguage().translate(this.model.entityType, 'scopeNamesPlural');
const $root = $('<span>').append($('<a>').attr('href', '#Lead').text(scopeLabel));
if (headerIconHtml) {
$root.prepend(headerIconHtml);
}
const name = this.model.get('name') || this.model.id;
const url = `#${this.model.entityType}/view/${this.model.id}`;
const $name = $('<a>').attr('href', url).addClass('action').append($('<span>').text(name));
return this.buildHeaderHtml([$root, $name, $('<span>').text(this.translate('convert', 'labels', 'Lead'))]);
}
}
var _default = _exports.default = ConvertLeadView;
});
define("modules/crm/views/lead/record/detail", ["exports", "views/record/detail"], function (_exports, _detail) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_detail = _interopRequireDefault(_detail);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _detail.default {
selfAssignAction = true;
sideView = 'crm:views/lead/record/detail-side';
getSelfAssignAttributes() {
if (this.model.attributes.status === 'New') {
const options = this.getMetadata().get(['entityDefs', 'Lead', 'fields', 'status', 'options']) || [];
if (options.includes('Assigned')) {
return {
'status': 'Assigned'
};
}
}
return {};
}
}
_exports.default = _default;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/lead/record/detail-side', ['views/record/detail-side'], function (Dep) {
return Dep.extend({
setupPanels: function () {},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/lead/record/panels/converted-to', ['views/record/panels/side'], function (Dep) {
return Dep.extend({
setupFields: function () {
this.fieldList = [];
if (this.getAcl().check('Account') && !this.getMetadata().get('scopes.Account.disabled')) {
this.fieldList.push('createdAccount');
}
if (this.getAcl().check('Contact') && !this.getMetadata().get('scopes.Contact.disabled')) {
this.fieldList.push('createdContact');
}
if (this.getAcl().check('Opportunity') && !this.getMetadata().get('scopes.Opportunity.disabled')) {
this.fieldList.push('createdOpportunity');
}
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/lead/fields/industry', ['views/fields/enum'], function (Dep) {
return Dep.extend({});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/lead/fields/created-opportunity', ['views/fields/link'], function (Dep) {
return Dep.extend({
getSelectFilters: function () {
if (this.model.get('createdAccountId')) {
return {
'account': {
type: 'equals',
attribute: 'accountId',
value: this.model.get('createdAccountId'),
data: {
type: 'is',
nameValue: this.model.get('createdAccountName'),
},
}
};
}
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/lead/fields/created-contact', ['views/fields/link'], function (Dep) {
return Dep.extend({
getSelectFilters: function () {
if (this.model.get('createdAccountId')) {
return {
'account': {
type: 'equals',
attribute: 'accountId',
value: this.model.get('createdAccountId'),
data: {
type: 'is',
nameValue: this.model.get('createdAccountName')
}
}
};
}
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/lead/fields/acceptance-status', ['views/fields/enum-column'], function (Dep) {
return Dep.extend({
searchTypeList: ['anyOf', 'noneOf'],
setup: function () {
this.params.options = this.getMetadata().get('entityDefs.Meeting.fields.acceptanceStatus.options');
this.params.translation = 'Meeting.options.acceptanceStatus';
Dep.prototype.setup.call(this);
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/knowledge-base-article/list', ['views/list-with-categories'], function (Dep) {
return Dep.extend({
categoryScope: 'KnowledgeBaseCategory',
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/knowledge-base-article/record/list', ['views/record/list'], function (Dep) {
return Dep.extend({});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/knowledge-base-article/record/edit', ['views/record/edit'], function (Dep) {
return Dep.extend({
saveAndContinueEditingAction: true,
});
});
define("modules/crm/views/knowledge-base-article/record/edit-quick", ["exports", "views/record/edit"], function (_exports, _edit) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_edit = _interopRequireDefault(_edit);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _edit.default {}
_exports.default = _default;
});
define("modules/crm/views/knowledge-base-article/record/detail", ["exports", "modules/crm/knowledge-base-helper", "views/record/detail"], function (_exports, _knowledgeBaseHelper, _detail) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_knowledgeBaseHelper = _interopRequireDefault(_knowledgeBaseHelper);
_detail = _interopRequireDefault(_detail);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class KnowledgeBaseRecordDetailView extends _detail.default {
saveAndContinueEditingAction = true;
setup() {
super.setup();
if (this.getUser().isPortal()) {
this.sideDisabled = true;
}
if (this.getAcl().checkScope('Email', 'create')) {
this.dropdownItemList.push({
'label': 'Send in Email',
'name': 'sendInEmail'
});
}
if (this.getUser().isPortal() && !this.getAcl().checkScope(this.scope, 'edit') && !this.model.getLinkMultipleIdList('attachments').length) {
this.hideField('attachments');
this.listenToOnce(this.model, 'sync', () => {
if (this.model.getLinkMultipleIdList('attachments').length) {
this.showField('attachments');
}
});
}
}
// noinspection JSUnusedGlobalSymbols
actionSendInEmail() {
Espo.Ui.notifyWait();
const helper = new _knowledgeBaseHelper.default(this.getLanguage());
helper.getAttributesForEmail(this.model, {}, attributes => {
const viewName = this.getMetadata().get('clientDefs.Email.modalViews.compose') || 'views/modals/compose-email';
this.createView('composeEmail', viewName, {
attributes: attributes,
selectTemplateDisabled: true,
signatureDisabled: true
}, view => {
Espo.Ui.notify(false);
view.render();
});
});
}
}
var _default = _exports.default = KnowledgeBaseRecordDetailView;
});
define("modules/crm/views/knowledge-base-article/record/detail-quick", ["exports", "views/record/detail"], function (_exports, _detail) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_detail = _interopRequireDefault(_detail);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _detail.default {}
_exports.default = _default;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/knowledge-base-article/modals/select-records',
['views/modals/select-records-with-categories'], function (Dep) {
return Dep.extend({
categoryScope: 'KnowledgeBaseCategory',
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/knowledge-base-article/fields/status', ['views/fields/enum'], function (Dep) {
return Dep.extend({
setup: function () {
Dep.prototype.setup.call(this);
var publishDateWasSet = false;
this.on('change', () => {
if (this.model.get('status') === 'Published') {
if (!this.model.get('publishDate')) {
publishDateWasSet = true;
this.model.set('publishDate', this.getDateTime().getToday());
}
} else {
if (publishDateWasSet) {
this.model.set('publishDate', null);
}
}
});
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/knowledge-base-article/fields/language', ['views/fields/enum'], function (Dep) {
return Dep.extend({
setupOptions: function () {
this.params.options = Espo.Utils.clone(this.getMetadata().get(['app', 'language', 'list']) || []);
this.params.options.unshift('');
this.translatedOptions = Espo.Utils.clone(this.getLanguage().translate('language', 'options') || {});
this.translatedOptions[''] = this.translate('Any', 'labels', 'KnowledgeBaseArticle')
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/fields/ico', ['views/fields/base'], function (Dep) {
return Dep.extend({
// language=Handlebars
templateContent: `{{! ~}}
<span
class="{{iconClass}} text-muted action icon"
style="cursor: pointer"
title="{{viewLabel}}"
data-action="quickView"
data-id="{{id}}"
{{#if notRelationship}}data-scope="{{scope}}"{{/if}}
></span>
{{~!}}`,
data: function () {
return {
notRelationship: this.params.notRelationship,
viewLabel: this.translate('View'),
id: this.model.id,
scope: this.model.entityType,
iconClass: this.getMetadata().get(['clientDefs', this.model.entityType, 'iconClass']) ||
'far fa-calendar-times',
};
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/event-confirmation/confirmation', ['view'], function (Dep) {
return Dep.extend({
template: 'crm:event-confirmation/confirmation',
data: function () {
let style = this.actionData.style || 'default';
return {
actionData: this.actionData,
style: style,
dateStart: this.actionData.dateStart ?
this.convertDateTime(this.actionData.dateStart) : null,
sentDateStart: this.actionData.sentDateStart ?
this.convertDateTime(this.actionData.sentDateStart) : null,
dateStartChanged: this.actionData.sentDateStart &&
this.actionData.dateStart !== this.actionData.sentDateStart,
actionDataList: this.getActionDataList(),
};
},
setup: function () {
this.actionData = this.options.actionData;
},
getActionDataList: function () {
let actionMap = {
'Accepted': 'accept',
'Declined': 'decline',
'Tentative': 'tentative',
};
let statusList = ['Accepted', 'Tentative', 'Declined'];
if (!statusList.includes(this.actionData.status)) {
return null;
}
let url = window.location.href.replace('action=' + actionMap[this.actionData.status], 'action={action}');
return statusList.map(item => {
let active = item === this.actionData.status;
return {
active: active,
link: active ? '' : url.replace('{action}', actionMap[item]),
label: this.actionData.statusTranslation[item],
};
});
},
convertDateTime: function (value) {
let timezone = this.getConfig().get('timeZone');
let m = this.getDateTime().toMoment(value)
.tz(timezone);
return m.format(this.getDateTime().getDateTimeFormat()) + ' ' +
m.format('Z z');
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/email-queue-item/list', ['views/list'], function (Dep) {
return Dep.extend({
createButton: false,
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/email-queue-item/record/list', ['views/record/list'], function (Dep) {
return Dep.extend({
rowActionsView: 'views/record/row-actions/remove-only',
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/document/list', ['views/list-with-categories'], function (Dep) {
return Dep.extend({
categoryScope: 'DocumentFolder',
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/document/modals/select-records', ['views/modals/select-records-with-categories'], function (Dep) {
return Dep.extend({
categoryScope: 'DocumentFolder',
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/document/fields/name', ['views/fields/varchar'], function (Dep) {
return Dep.extend({
setup: function () {
Dep.prototype.setup.call(this);
if (this.model.isNew()) {
this.listenTo(this.model, 'change:fileName', () => {
this.model.set('name', this.model.get('fileName'));
});
}
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/document/fields/file', ['views/fields/file'], function (Dep) {
return Dep.extend({
getValueForDisplay: function () {
if (this.isListMode()) {
let name = this.model.get(this.nameName);
let id = this.model.get(this.idName);
if (!id) {
return '';
}
return $('<a>')
.attr('title', name)
.attr('href', this.getBasePath() + '?entryPoint=download&id=' + id)
.attr('target', '_BLANK')
.append(
$('<span>').addClass('fas fa-paperclip small')
)
.get(0).outerHTML;
}
return Dep.prototype.getValueForDisplay.call(this);
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/dashlets/tasks', ['views/dashlets/abstract/record-list'], function (Dep) {
return Dep.extend({
listView: 'crm:views/task/record/list-expanded',
rowActionsView: 'crm:views/task/record/row-actions/dashlet',
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/dashlets/meetings', ['views/dashlets/abstract/record-list'], function (Dep) {
return Dep.extend({
name: 'Meetings',
scope: 'Meeting',
listView: 'crm:views/meeting/record/list-expanded',
rowActionsView: 'crm:views/meeting/record/row-actions/dashlet',
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/dashlets/calls', ['views/dashlets/abstract/record-list'], function (Dep) {
return Dep.extend({
name: 'Calls',
scope: 'Call',
listView: 'crm:views/call/record/list-expanded',
rowActionsView: 'crm:views/call/record/row-actions/dashlet',
});
});
define("modules/crm/views/dashlets/calendar", ["exports", "views/dashlets/abstract/base"], function (_exports, _base) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_base = _interopRequireDefault(_base);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class CalendarDashletView extends _base.default {
name = 'Calendar';
noPadding = true;
templateContent = `<div class="calendar-container">{{{calendar}}}</div>`;
afterRender() {
const mode = this.getOption('mode');
if (mode === 'timeline') {
const userList = [];
const userIdList = this.getOption('usersIds') || [];
const userNames = this.getOption('usersNames') || {};
userIdList.forEach(id => {
userList.push({
id: id,
name: userNames[id] || id
});
});
const viewName = this.getMetadata().get(['clientDefs', 'Calendar', 'timelineView']) || 'crm:views/calendar/timeline';
this.createView('calendar', viewName, {
selector: '> .calendar-container',
header: false,
calendarType: 'shared',
userList: userList,
enabledScopeList: this.getOption('enabledScopeList'),
suppressLoadingAlert: true
}, view => {
view.render();
});
return;
}
let teamIdList = null;
if (['basicWeek', 'month', 'basicDay'].includes(mode)) {
teamIdList = this.getOption('teamsIds');
}
const viewName = this.getMetadata().get(['clientDefs', 'Calendar', 'calendarView']) || 'crm:views/calendar/calendar';
this.createView('calendar', viewName, {
mode: mode,
selector: '> .calendar-container',
header: false,
enabledScopeList: this.getOption('enabledScopeList'),
containerSelector: this.getSelector(),
teamIdList: teamIdList,
scrollToNowSlots: 3,
suppressLoadingAlert: true
}, view => {
this.listenTo(view, 'view', () => {
if (this.getOption('mode') === 'month') {
const title = this.getOption('title');
const $container = $('<span>').append($('<span>').text(title), ' <span class="chevron-right"></span> ', $('<span>').text(view.getTitle()));
const $headerSpan = this.$el.closest('.panel').find('.panel-heading > .panel-title > span');
$headerSpan.html($container.get(0).innerHTML);
}
});
view.render();
this.on('resize', () => {
setTimeout(() => view.adjustSize(), 50);
});
});
}
setupActionList() {
this.actionList.unshift({
name: 'viewCalendar',
text: this.translate('View Calendar', 'labels', 'Calendar'),
url: '#Calendar',
iconHtml: '<span class="far fa-calendar-alt"></span>',
onClick: () => this.actionViewCalendar()
});
}
setupButtonList() {
if (this.getOption('mode') !== 'timeline') {
this.buttonList.push({
name: 'previous',
html: '<span class="fas fa-chevron-left"></span>',
onClick: () => this.actionPrevious()
});
this.buttonList.push({
name: 'next',
html: '<span class="fas fa-chevron-right"></span>',
onClick: () => this.actionNext()
});
}
}
/**
* @return {
* import('modules/crm/views/calendar/calendar').default |
* import('modules/crm/views/calendar/timeline').default
* }
*/
getCalendarView() {
return this.getView('calendar');
}
actionRefresh() {
const view = this.getCalendarView();
if (!view) {
return;
}
view.actionRefresh();
}
autoRefresh() {
const view = this.getCalendarView();
if (!view) {
return;
}
view.actionRefresh({
suppressLoadingAlert: true
});
}
actionNext() {
const view = this.getCalendarView();
if (!view) {
return;
}
view.actionNext();
}
actionPrevious() {
const view = this.getCalendarView();
if (!view) {
return;
}
view.actionPrevious();
}
actionViewCalendar() {
this.getRouter().navigate('#Calendar', {
trigger: true
});
}
}
var _default = _exports.default = CalendarDashletView;
});
define("modules/crm/views/dashlets/activities", ["exports", "views/dashlets/abstract/base", "multi-collection", "helpers/record-modal"], function (_exports, _base, _multiCollection, _recordModal) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_base = _interopRequireDefault(_base);
_multiCollection = _interopRequireDefault(_multiCollection);
_recordModal = _interopRequireDefault(_recordModal);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class ActivitiesDashletView extends _base.default {
name = 'Activities';
// language=Handlebars
templateContent = '<div class="list-container">{{{list}}}</div>';
rowActionsView = 'crm:views/record/row-actions/activities-dashlet';
defaultListLayout = {
rows: [[{
name: 'ico',
view: 'crm:views/fields/ico',
params: {
notRelationship: true
}
}, {
name: 'name',
link: true
}], [{
name: 'dateStart',
soft: true
}, {
name: 'parent'
}]]
};
listLayoutEntityTypeMap = {
Task: {
rows: [[{
name: 'ico',
view: 'crm:views/fields/ico',
params: {
notRelationship: true
}
}, {
name: 'name',
link: true
}], [{
name: 'status'
}, {
name: 'dateEnd',
soft: true
}, {
name: 'priority',
view: 'crm:views/task/fields/priority-for-dashlet'
}, {
name: 'parent'
}]]
}
};
setup() {
this.seeds = {};
this.scopeList = this.getOption('enabledScopeList') || [];
this.listLayout = {};
this.scopeList.forEach(item => {
if (item in this.listLayoutEntityTypeMap) {
this.listLayout[item] = this.listLayoutEntityTypeMap[item];
return;
}
this.listLayout[item] = this.defaultListLayout;
});
this.wait(true);
let i = 0;
this.scopeList.forEach(scope => {
this.getModelFactory().create(scope, seed => {
this.seeds[scope] = seed;
i++;
if (i === this.scopeList.length) {
this.wait(false);
}
});
});
this.scopeList.slice(0).reverse().forEach(scope => {
if (this.getAcl().checkScope(scope, 'create')) {
this.actionList.unshift({
name: 'createActivity',
text: this.translate('Create ' + scope, 'labels', scope),
iconHtml: '<span class="fas fa-plus"></span>',
url: '#' + scope + '/create',
data: {
scope: scope
}
});
}
});
}
afterRender() {
this.collection = new _multiCollection.default();
this.collection.seeds = this.seeds;
this.collection.url = 'Activities/upcoming';
this.collection.maxSize = this.getOption('displayRecords') || this.getConfig().get('recordsPerPageSmall') || 5;
this.collection.data.entityTypeList = this.scopeList;
this.collection.data.futureDays = this.getOption('futureDays');
if (this.getOption('includeShared')) {
this.collection.data.includeShared = true;
}
this.listenToOnce(this.collection, 'sync', () => {
this.createView('list', 'crm:views/record/list-activities-dashlet', {
selector: '> .list-container',
pagination: false,
type: 'list',
rowActionsView: this.rowActionsView,
checkboxes: false,
collection: this.collection,
listLayout: this.listLayout
}, view => {
view.render();
});
});
this.collection.fetch();
}
actionRefresh() {
this.refreshInternal();
}
autoRefresh() {
this.refreshInternal({
skipNotify: true
});
}
/**
* @private
* @param {{skipNotify?: boolean}} [options]
* @return {Promise<void>}
*/
async refreshInternal() {
let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
if (!options.skipNotify) {
Espo.Ui.notifyWait();
}
await this.collection.fetch({
previousTotal: this.collection.total,
previousDataList: this.collection.models.map(model => {
return Espo.Utils.cloneDeep(model.attributes);
})
});
if (!options.skipNotify) {
Espo.Ui.notify();
}
}
// noinspection JSUnusedGlobalSymbols
actionCreateActivity(data) {
const scope = data.scope;
const attributes = {};
this.populateAttributesAssignedUser(scope, attributes);
const helper = new _recordModal.default();
helper.showCreate(this, {
entityType: scope,
attributes: attributes,
afterSave: () => {
this.actionRefresh();
}
});
}
// noinspection JSUnusedGlobalSymbols
actionCreateMeeting() {
const attributes = {};
this.populateAttributesAssignedUser('Meeting', attributes);
const helper = new _recordModal.default();
helper.showCreate(this, {
entityType: 'Meeting',
attributes: attributes,
afterSave: () => {
this.actionRefresh();
}
});
}
// noinspection JSUnusedGlobalSymbols
actionCreateCall() {
const attributes = {};
this.populateAttributesAssignedUser('Call', attributes);
const helper = new _recordModal.default();
helper.showCreate(this, {
entityType: 'Call',
attributes: attributes,
afterSave: () => {
this.actionRefresh();
}
});
}
populateAttributesAssignedUser(scope, attributes) {
if (this.getMetadata().get(['entityDefs', scope, 'fields', 'assignedUsers'])) {
attributes['assignedUsersIds'] = [this.getUser().id];
attributes['assignedUsersNames'] = {};
attributes['assignedUsersNames'][this.getUser().id] = this.getUser().get('name');
} else {
attributes['assignedUserId'] = this.getUser().id;
attributes['assignedUserName'] = this.getUser().get('name');
}
}
}
var _default = _exports.default = ActivitiesDashletView;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/dashlets/options/sales-pipeline', ['crm:views/dashlets/options/chart'], function (Dep) {
return Dep.extend({
setup: function () {
Dep.prototype.setup.call(this);
if (this.getAcl().getLevel('Opportunity', 'read') === 'own') {
this.hideField('team');
}
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/dashlets/options/calendar', ['views/dashlets/options/base'], function (Dep) {
return Dep.extend({
setup: function () {
Dep.prototype.setup.call(this);
this.manageFields();
this.listenTo(this.model, 'change:mode', this.manageFields, this);
},
init: function () {
Dep.prototype.init.call(this);
this.fields.enabledScopeList.options = this.getConfig().get('calendarEntityList') || [];
},
manageFields: function (model, value, o) {
if (this.model.get('mode') === 'timeline') {
this.showField('users');
} else {
this.hideField('users');
}
if (
this.getAcl().getPermissionLevel('userCalendar') !== 'no'
&&
~['basicWeek', 'month', 'basicDay'].indexOf(this.model.get('mode'))
) {
this.showField('teams');
} else {
if (o && o.ui) {
this.model.set('teamsIds', []);
}
this.hideField('teams');
}
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/dashlets/options/activities', ['views/dashlets/options/base'], function (Dep) {
return Dep.extend({
init: function () {
Dep.prototype.init.call(this);
var entityTypeList = [];
var activitiesEntityList = Espo.Utils.clone(this.getConfig().get('activitiesEntityList') || []);
activitiesEntityList.push('Task');
activitiesEntityList.forEach(item => {
if (this.getMetadata().get(['scopes', item, 'disabled'])) {
return;
}
if (!this.getAcl().checkScope(item)) {
return;
}
entityTypeList.push(item);
});
this.fields.enabledScopeList.options = entityTypeList;
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/dashlets/options/sales-pipeline/fields/team', ['views/fields/link'], function (Dep) {
return Dep.extend({
getSelectBoolFilterList: function () {
if (this.getAcl().getLevel('Opportunity', 'read') === 'team') {
return ['onlyMy'];
}
},
});
});
define("modules/crm/views/contact/detail", ["exports", "views/detail"], function (_exports, _detail) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_detail = _interopRequireDefault(_detail);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
/** Left for bc. */
class _default extends _detail.default {}
_exports.default = _default;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/contact/record/detail-small', ['views/record/detail-small', 'crm:views/contact/record/detail'], function (Dep, Detail) {
return Dep.extend({
});
});
define("modules/crm/views/contact/modals/select-for-portal-user", ["exports", "views/modals/select-records"], function (_exports, _selectRecords) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_selectRecords = _interopRequireDefault(_selectRecords);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class SelectForPortalUserModalView extends _selectRecords.default {
/**
* @param {
* module:views/modals/select-records~Options &
* {onSkip: function()}
* } options
*/
constructor(options) {
super(options);
this.options = options;
}
setup() {
super.setup();
this.buttonList.unshift({
name: 'skip',
text: this.translate('Proceed w/o Contact', 'labels', 'User'),
onClick: () => this.actionSkip()
});
}
actionSkip() {
this.options.onSkip();
this.close();
}
}
_exports.default = SelectForPortalUserModalView;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/contact/fields/title', ['views/fields/varchar'], function (Dep) {
return Dep.extend({
setupOptions: function () {
this.params.options = Espo.Utils.clone(
this.getMetadata().get('entityDefs.Account.fields.contactRole.options') || []
);
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/contact/fields/opportunity-role', ['views/fields/enum'], function (Dep) {
return Dep.extend({
searchTypeList: ['anyOf', 'noneOf'],
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/contact/fields/name-for-account', ['views/fields/person-name'], function (Dep) {
return Dep.extend({
afterRender: function () {
Dep.prototype.afterRender.call(this);
if (this.mode === 'listLink') {
if (this.model.get('accountIsInactive')) {
this.$el.find('a').css('text-decoration', 'line-through');
}
}
},
getAttributeList: function () {
return ['name', 'accountIsInactive'];
},
});
});
define("modules/crm/views/contact/fields/accounts", ["exports", "views/fields/link-multiple-with-columns"], function (_exports, _linkMultipleWithColumns) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_linkMultipleWithColumns = _interopRequireDefault(_linkMultipleWithColumns);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class AccountsFieldView extends _linkMultipleWithColumns.default {
getAttributeList() {
const list = super.getAttributeList();
list.push('accountId');
list.push('accountName');
list.push('title');
return list;
}
setup() {
super.setup();
this.events['click [data-action="switchPrimary"]'] = e => {
const $target = $(e.currentTarget);
const id = $target.data('id');
if (!$target.hasClass('active')) {
this.$el.find('button[data-action="switchPrimary"]').removeClass('active').children().addClass('text-muted');
$target.addClass('active').children().removeClass('text-muted');
this.setPrimaryId(id);
}
};
this.primaryIdFieldName = 'accountId';
this.primaryNameFieldName = 'accountName';
this.primaryRoleFieldName = 'title';
this.primaryId = this.model.get(this.primaryIdFieldName);
this.primaryName = this.model.get(this.primaryNameFieldName);
this.listenTo(this.model, 'change:' + this.primaryIdFieldName, () => {
this.primaryId = this.model.get(this.primaryIdFieldName);
this.primaryName = this.model.get(this.primaryNameFieldName);
});
if (this.isEditMode() || this.isDetailMode()) {
this.events['click a[data-action="setPrimary"]'] = e => {
const id = $(e.currentTarget).data('id');
this.setPrimaryId(id);
this.reRender();
};
}
}
setPrimaryId(id) {
this.primaryId = id;
if (id) {
this.primaryName = this.nameHash[id];
} else {
this.primaryName = null;
}
this.trigger('change');
}
renderLinks() {
if (this.primaryId) {
this.addLinkHtml(this.primaryId, this.primaryName);
}
this.ids.forEach(id => {
if (id !== this.primaryId) {
this.addLinkHtml(id, this.nameHash[id]);
}
});
}
getValueForDisplay() {
if (this.isDetailMode() || this.isListMode()) {
const itemList = [];
if (this.primaryId) {
itemList.push(this.getDetailLinkHtml(this.primaryId, this.primaryName));
}
this.ids.forEach(id => {
if (id !== this.primaryId) {
itemList.push(this.getDetailLinkHtml(id));
}
});
return itemList.map(item => {
return $('<div>').addClass('link-multiple-item').html(item).get(0).outerHTML;
}).join('');
}
}
getDetailLinkHtml(id, name) {
const html = super.getDetailLinkHtml(id, name);
if (this.getColumnValue(id, 'isInactive')) {
const $el = $('<div>').html(html);
$el.find('a').css('text-decoration', 'line-through');
return $el.get(0).innerHTML;
}
return html;
}
afterAddLink(id) {
super.afterAddLink(id);
if (this.ids.length === 1) {
this.primaryId = id;
this.primaryName = this.nameHash[id];
}
this.controlPrimaryAppearance();
}
afterDeleteLink(id) {
super.afterDeleteLink(id);
if (this.ids.length === 0) {
this.primaryId = null;
this.primaryName = null;
return;
}
if (id === this.primaryId) {
this.primaryId = this.ids[0];
this.primaryName = this.nameHash[this.primaryId];
}
this.controlPrimaryAppearance();
}
controlPrimaryAppearance() {
this.$el.find('li.set-primary-list-item').removeClass('hidden');
if (this.primaryId) {
this.$el.find('li.set-primary-list-item[data-id="' + this.primaryId + '"]').addClass('hidden');
}
}
addLinkHtml(id, name) {
name = name || id;
if (this.isSearchMode()) {
return super.addLinkHtml(id, name);
}
const $el = super.addLinkHtml(id, name);
const isPrimary = id === this.primaryId;
const $a = $('<a>').attr('role', 'button').attr('tabindex', '0').attr('data-action', 'setPrimary').attr('data-id', id).text(this.translate('Set Primary', 'labels', 'Account'));
const $li = $('<li>').addClass('set-primary-list-item').attr('data-id', id).append($a);
if (isPrimary || this.ids.length === 1) {
$li.addClass('hidden');
}
$el.find('ul.dropdown-menu').append($li);
if (this.getColumnValue(id, 'isInactive')) {
$el.find('div.link-item-name').css('text-decoration', 'line-through');
}
}
fetch() {
const data = super.fetch();
data[this.primaryIdFieldName] = this.primaryId;
data[this.primaryNameFieldName] = this.primaryName;
data[this.primaryRoleFieldName] = (this.columns[this.primaryId] || {}).role || null;
// noinspection JSUnresolvedReference
data.accountIsInactive = (this.columns[this.primaryId] || {}).isInactive || false;
if (!this.primaryId) {
data[this.primaryRoleFieldName] = null;
data.accountIsInactive = null;
}
return data;
}
}
var _default = _exports.default = AccountsFieldView;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/contact/fields/account', ['views/fields/link'], function (Dep) {
return Dep.extend({
getAttributeList: function () {
var list = Dep.prototype.getAttributeList.call(this);
list.push('accountIsInactive');
return list;
},
afterRender: function () {
Dep.prototype.afterRender.call(this);
if (this.mode === 'list' || this.mode === 'detail') {
if (this.model.get('accountIsInactive')) {
this.$el.find('a').css('textDecoration', 'line-through');
}
}
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/contact/fields/account-role', ['views/fields/varchar'], function (Dep) {
return Dep.extend({
detailTemplate: 'crm:contact/fields/account-role/detail',
listTemplate: 'crm:contact/fields/account-role/detail',
setup: function () {
Dep.prototype.setup.call(this);
this.listenTo(this.model, 'change:title', () => {
this.model.set('accountRole', this.model.get('title'));
});
},
getAttributeList: function () {
var list = Dep.prototype.getAttributeList.call(this);
list.push('title');
list.push('accountIsInactive');
return list;
},
data: function () {
var data = Dep.prototype.data.call(this);
if (this.model.has('accountIsInactive')) {
data.accountIsInactive = this.model.get('accountIsInactive');
}
return data;
}
});
});
define("modules/crm/views/case/record/detail", ["exports", "views/record/detail"], function (_exports, _detail) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_detail = _interopRequireDefault(_detail);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _detail.default {
selfAssignAction = true;
getSelfAssignAttributes() {
if (this.model.attributes.status === 'New') {
const options = this.getMetadata().get(['entityDefs', 'Case', 'fields', 'status', 'options']) || [];
if (options.includes('Assigned')) {
return {
status: 'Assigned'
};
}
}
return {};
}
}
_exports.default = _default;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/case/record/panels/activities', ['crm:views/record/panels/activities'], function (Dep) {
return Dep.extend({
getComposeEmailAttributes: function (scope, data, callback) {
data = data || {};
Espo.Ui.notifyWait();
Dep.prototype.getComposeEmailAttributes.call(this, scope, data, attributes => {
attributes.name = '[#' + this.model.get('number') + '] ' + this.model.get('name');
Espo.Ajax.getRequest('Case/action/emailAddressList?id=' + this.model.id).then(list => {
attributes.to = '';
attributes.cc = '';
attributes.nameHash = {};
list.forEach((item, i) => {
if (i === 0) {
attributes.to += item.emailAddress + ';';
} else {
attributes.cc += item.emailAddress + ';';
}
attributes.nameHash[item.emailAddress] = item.name;
});
Espo.Ui.notify(false);
callback.call(this, attributes);
});
})
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/campaign-tracking-url/record/edit', ['views/record/edit'], function (Dep) {
return Dep.extend({
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/campaign-tracking-url/record/edit-small', ['views/record/edit-small'], function (Dep) {
return Dep.extend({
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/campaign-log-record/fields/data', ['views/fields/base'], function (Dep) {
return Dep.extend({
listTemplate: 'crm:campaign-log-record/fields/data/detail',
getValueForDisplay: function () {
let action = this.model.get('action');
switch (action) {
case 'Sent':
case 'Opened':
if (
this.model.get('objectId') &&
this.model.get('objectType') &&
this.model.get('objectName')
) {
return $('<a>')
.attr('href', '#' + this.model.get('objectType') + '/view/' + this.model.get('objectId'))
.text(this.model.get('objectName'))
.get(0).outerHTML;
}
return $('<span>')
.text(this.model.get('stringData') || '')
.get(0).outerHTML;
case 'Clicked':
if (
this.model.get('objectId') &&
this.model.get('objectType') &&
this.model.get('objectName')
) {
return $('<a>')
.attr('href', '#' + this.model.get('objectType') + '/view/' + this.model.get('objectId'))
.text(this.model.get('objectName'))
.get(0).outerHTML;
}
return $('<span>')
.text(this.model.get('stringData') || '')
.get(0).outerHTML;
case 'Opted Out':
return $('<span>')
.text(this.model.get('stringData') || '')
.addClass('text-danger')
.get(0).outerHTML;
case 'Bounced':
let emailAddress = this.model.get('stringData');
let type = this.model.get('stringAdditionalData');
let typeLabel = type === 'Hard' ?
this.translate('hard', 'labels', 'Campaign') :
this.translate('soft', 'labels', 'Campaign')
return $('<span>')
.append(
$('<span>')
.addClass('label label-default')
.text(typeLabel),
' ',
$('<s>')
.text(emailAddress)
.addClass(type === 'Hard' ? 'text-danger' : '')
)
.get(0).outerHTML;
}
return '';
},
});
});
define("modules/crm/views/campaign/unsubscribe", ["exports", "view"], function (_exports, _view) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_view = _interopRequireDefault(_view);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class CampaignUnsubscribeView extends _view.default {
template = 'crm:campaign/unsubscribe';
data() {
return {
isSubscribed: this.isSubscribed,
inProcess: this.inProcess
};
}
setup() {
super.setup();
this.actionData = /** @type {Record} */this.options.actionData;
this.isSubscribed = this.actionData.isSubscribed;
this.inProcess = false;
const endpointUrl = this.actionData.hash && this.actionData.emailAddress ? `Campaign/unsubscribe/${this.actionData.emailAddress}/${this.actionData.hash}` : `Campaign/unsubscribe/${this.actionData.queueItemId}`;
this.addActionHandler('subscribe', () => {
Espo.Ui.notifyWait();
this.inProcess = true;
this.reRender();
Espo.Ajax.deleteRequest(endpointUrl).then(() => {
this.isSubscribed = true;
this.inProcess = false;
this.reRender().then(() => {
const message = this.translate('subscribedAgain', 'messages', 'Campaign');
Espo.Ui.notify(message, 'success', 0, {
closeButton: true
});
});
}).catch(() => {
this.inProcess = false;
this.reRender();
});
});
this.addActionHandler('unsubscribe', () => {
Espo.Ui.notifyWait();
this.inProcess = true;
this.reRender();
Espo.Ajax.postRequest(endpointUrl).then(() => {
Espo.Ui.success(this.translate('unsubscribed', 'messages', 'Campaign'), {
closeButton: true
});
this.isSubscribed = false;
this.inProcess = false;
this.reRender().then(() => {
const message = this.translate('unsubscribed', 'messages', 'Campaign');
Espo.Ui.notify(message, 'success', 0, {
closeButton: true
});
});
}).catch(() => {
this.inProcess = false;
this.reRender();
});
});
}
}
var _default = _exports.default = CampaignUnsubscribeView;
});
define("modules/crm/views/campaign/tracking-url", ["exports", "view"], function (_exports, _view) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_view = _interopRequireDefault(_view);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _view.default {
// language=Handlebars
templateContent = `
<div class="container content">
<div class="block-center-md">
<div class="panel panel-default">
<div class="panel-body">
<div class="complex-text">{{complexText message}}</div>
</div>
</div>
</div>
</div>
`;
data() {
// noinspection JSUnresolvedReference
return {
message: this.options.message
};
}
}
_exports.default = _default;
});
define("modules/crm/views/campaign/detail", ["exports", "views/detail"], function (_exports, _detail) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_detail = _interopRequireDefault(_detail);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _detail.default {}
_exports.default = _default;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/campaign/record/detail', ['views/record/detail'], function (Dep) {
return Dep.extend({
duplicateAction: true,
setupActionItems: function () {
Dep.prototype.setupActionItems.call(this);
this.dropdownItemList.push({
'label': 'Generate Mail Merge PDF',
'name': 'generateMailMergePdf',
'hidden': !this.isMailMergeAvailable()
});
this.listenTo(this.model, 'change', function () {
if (this.isMailMergeAvailable()) {
this.showActionItem('generateMailMergePdf');
} else {
this.hideActionItem('generateMailMergePdf');
}
}, this);
},
afterRender: function () {
Dep.prototype.afterRender.call(this);
},
isMailMergeAvailable: function () {
if (this.model.get('type') !== 'Mail') {
return false;
}
if (!this.model.get('targetListsIds') || !this.model.get('targetListsIds').length) {
return false;
}
if (
!this.model.get('leadsTemplateId') &&
!this.model.get('contactsTemplateId') &&
!this.model.get('accountsTemplateId') &&
!this.model.get('usersTemplateId')
) {
return false;
}
return true;
},
actionGenerateMailMergePdf: function () {
this.createView('dialog', 'crm:views/campaign/modals/mail-merge-pdf', {
model: this.model,
}, function (view) {
view.render();
this.listenToOnce(view, 'proceed', (link) => {
this.clearView('dialog');
Espo.Ui.notifyWait();
Espo.Ajax.postRequest(`Campaign/${this.model.id}/generateMailMerge`, {link: link})
.then(response => {
Espo.Ui.notify(false);
window.open('?entryPoint=download&id=' + response.id, '_blank');
});
});
});
},
});
});
define("modules/crm/views/campaign/record/panels/campaign-stats", ["exports", "views/record/panels/side"], function (_exports, _side) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_side = _interopRequireDefault(_side);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
// noinspection JSUnusedGlobalSymbols
class _default extends _side.default {
controlStatsFields() {
const type = this.model.attributes.type;
let fieldList;
switch (type) {
case 'Email':
case 'Newsletter':
fieldList = ['sentCount', 'openedCount', 'clickedCount', 'optedOutCount', 'bouncedCount', 'leadCreatedCount', 'optedInCount', 'revenue'];
break;
case 'Informational Email':
fieldList = ['sentCount', 'bouncedCount'];
break;
case 'Web':
fieldList = ['leadCreatedCount', 'optedInCount', 'revenue'];
break;
case 'Television':
case 'Radio':
fieldList = ['leadCreatedCount', 'revenue'];
break;
case 'Mail':
fieldList = ['sentCount', 'leadCreatedCount', 'optedInCount', 'revenue'];
break;
default:
fieldList = ['leadCreatedCount', 'revenue'];
}
if (!this.getConfig().get('massEmailOpenTracking')) {
const i = fieldList.indexOf('openedCount');
if (i > -1) {
fieldList.splice(i, 1);
}
}
this.statsFieldList.forEach(item => {
this.options.recordViewObject.hideField(item);
});
fieldList.forEach(item => {
this.options.recordViewObject.showField(item);
});
if (!this.getAcl().checkScope('Lead')) {
this.options.recordViewObject.hideField('leadCreatedCount', true);
}
if (!this.getAcl().checkScope('Opportunity')) {
this.options.recordViewObject.hideField('revenue', true);
}
}
setupFields() {
this.fieldList = ['sentCount', 'openedCount', 'clickedCount', 'optedOutCount', 'bouncedCount', 'leadCreatedCount', 'optedInCount', 'revenue'];
this.statsFieldList = this.fieldList;
}
setup() {
super.setup();
this.controlStatsFields();
this.listenTo(this.model, 'change:type', () => this.controlStatsFields());
}
}
_exports.default = _default;
});
define("modules/crm/views/campaign/record/panels/campaign-log-records", ["exports", "views/record/panels/relationship", "helpers/record-modal"], function (_exports, _relationship, _recordModal) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_relationship = _interopRequireDefault(_relationship);
_recordModal = _interopRequireDefault(_recordModal);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
// noinspection JSUnusedGlobalSymbols
class CampaignLogRecordsPanelView extends _relationship.default {
filterList = ["all", "sent", "opened", "optedOut", "bounced", "clicked", "optedIn", "leadCreated"];
setup() {
if (this.getAcl().checkScope('TargetList', 'create')) {
this.actionList.push({
action: 'createTargetList',
label: 'Create Target List'
});
}
this.filterList = Espo.Utils.clone(this.filterList);
if (!this.getConfig().get('massEmailOpenTracking')) {
const i = this.filterList.indexOf('opened');
if (i >= 0) {
this.filterList.splice(i, 1);
}
}
super.setup();
}
actionCreateTargetList() {
const attributes = {
sourceCampaignId: this.model.id,
sourceCampaignName: this.model.attributes.name
};
if (!this.collection.data.primaryFilter) {
attributes.includingActionList = [];
} else {
const status = Espo.Utils.upperCaseFirst(this.collection.data.primaryFilter).replace(/([A-Z])/g, ' $1');
attributes.includingActionList = [status];
}
const helper = new _recordModal.default();
helper.showCreate(this, {
entityType: 'TargetList',
attributes: attributes,
fullFormDisabled: true,
layoutName: 'createFromCampaignLog',
afterSave: () => {
Espo.Ui.success(this.translate('Done'));
},
beforeRender: view => {
view.getRecordView().setFieldRequired('includingActionList');
}
});
}
}
_exports.default = CampaignLogRecordsPanelView;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/campaign/modals/mail-merge-pdf', ['views/modal', 'ui/select'],
function (Dep, /** module:ui/select */ Select) {
return Dep.extend({
template: 'crm:campaign/modals/mail-merge-pdf',
data: function () {
return {
linkList: this.linkList,
};
},
setup: function () {
Dep.prototype.setup.call(this);
this.headerText = this.translate('Generate Mail Merge PDF', 'labels', 'Campaign');
var linkList = ['contacts', 'leads', 'accounts', 'users'];
this.linkList = [];
linkList.forEach(link => {
if (!this.model.get(link + 'TemplateId')) {
return;
}
let targetEntityType = this.getMetadata()
.get(['entityDefs', 'TargetList', 'links', link, 'entity']);
if (!this.getAcl().checkScope(targetEntityType)) {
return;
}
this.linkList.push(link);
});
this.buttonList.push({
name: 'proceed',
label: 'Proceed',
style: 'danger'
});
this.buttonList.push({
name: 'cancel',
label: 'Cancel'
});
},
afterRender: function () {
Select.init(this.$el.find('.field[data-name="link"] select'));
},
actionProceed: function () {
let link = this.$el.find('.field[data-name="link"] select').val();
this.trigger('proceed', link);
},
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/campaign/fields/template', ['views/fields/link'], function (Dep) {
return Dep.extend({
createDisabled: true,
getSelectFilters: function () {
return {
entityType: {
type: 'in',
value: [
this.getMetadata().get(['entityDefs', 'Campaign', 'fields', this.name, 'targetEntityType'])
],
}
};
}
});
});
define("modules/crm/views/campaign/fields/int-with-percentage", ["exports", "views/fields/int"], function (_exports, _int) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_int = _interopRequireDefault(_int);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
// noinspection JSUnusedGlobalSymbols
class _default extends _int.default {
setup() {
this.percentageField = this.name.substr(0, this.name.length - 5) + 'Percentage';
super.setup();
}
getAttributeList() {
const list = super.getAttributeList();
if (this.model.hasField(this.percentageField)) {
list.push(this.percentageField);
}
return list;
}
getValueForDisplay() {
const percentageFieldName = this.percentageField;
let value = this.model.get(this.name);
const percentageValue = this.model.get(percentageFieldName);
if (percentageValue != null && percentageValue) {
value += ' ' + '(' + this.model.get(percentageFieldName) + '%)';
}
return value;
}
}
_exports.default = _default;
});
define("modules/crm/views/call/detail", ["exports", "modules/crm/views/meeting/detail"], function (_exports, _detail) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_detail = _interopRequireDefault(_detail);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _detail.default {}
_exports.default = _default;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/call/record/list-expanded', ['views/record/list-expanded', 'crm:views/call/record/list'],
function (Dep, List) {
return Dep.extend({
actionSetHeld: function (data) {
List.prototype.actionSetHeld.call(this, data);
},
actionSetNotHeld: function (data) {
List.prototype.actionSetNotHeld.call(this, data);
},
});
});
define("modules/crm/views/call/record/edit-small", ["exports", "views/record/edit"], function (_exports, _edit) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_edit = _interopRequireDefault(_edit);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _edit.default {}
_exports.default = _default;
});
define("modules/crm/views/call/record/detail", ["exports", "views/record/detail"], function (_exports, _detail) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_detail = _interopRequireDefault(_detail);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _detail.default {
duplicateAction = true;
setupActionItems() {
super.setupActionItems();
if (this.getAcl().checkModel(this.model, 'edit') && this.getAcl().checkField(this.entityType, 'status', 'edit')) {
if (!['Held', 'Not Held'].includes(this.model.attributes.status)) {
this.dropdownItemList.push({
label: 'Set Held',
name: 'setHeld',
onClick: () => this.actionSetHeld()
});
this.dropdownItemList.push({
label: 'Set Not Held',
name: 'setNotHeld',
onClick: () => this.actionSetNotHeld()
});
}
}
}
manageAccessEdit(second) {
super.manageAccessEdit(second);
if (second) {
if (!this.getAcl().checkModel(this.model, 'edit', true)) {
this.hideActionItem('setHeld');
this.hideActionItem('setNotHeld');
}
}
}
actionSetHeld() {
this.model.save({
status: 'Held'
}, {
patch: true
}).then(() => {
Espo.Ui.success(this.translate('Saved'));
this.removeActionItem('setHeld');
this.removeActionItem('setNotHeld');
});
}
actionSetNotHeld() {
this.model.save({
status: 'Not Held'
}, {
patch: true
}).then(() => {
Espo.Ui.success(this.translate('Saved'));
this.removeActionItem('setHeld');
this.removeActionItem('setNotHeld');
});
}
}
_exports.default = _default;
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/call/record/row-actions/default', ['views/record/row-actions/view-and-edit'], function (Dep) {
return Dep.extend({
getActionList: function () {
const actionList = Dep.prototype.getActionList.call(this);
if (
this.options.acl.edit &&
!['Held', 'Not Held'].includes(this.model.get('status')) &&
this.getAcl().checkField(this.model.entityType, 'status', 'edit')
) {
actionList.push({
action: 'setHeld',
label: 'Set Held',
data: {
id: this.model.id
},
groupIndex: 1,
});
actionList.push({
action: 'setNotHeld',
label: 'Set Not Held',
data: {
id: this.model.id
},
groupIndex: 1,
});
}
if (this.options.acl.delete) {
actionList.push({
action: 'quickRemove',
label: 'Remove',
data: {
id: this.model.id,
scope: this.model.entityType
},
groupIndex: 0,
});
}
return actionList;
}
});
});
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
define('crm:views/call/record/row-actions/dashlet', ['views/record/row-actions/view-and-edit'], function (Dep) {
return Dep.extend({
getActionList: function () {
var actionList = Dep.prototype.getActionList.call(this);
if (
this.options.acl.edit &&
!['Held', 'Not Held'].includes(this.model.get('status')) &&
this.getAcl().checkField(this.model.entityType, 'status', 'edit')
) {
actionList.push({
action: 'setHeld',
label: 'Set Held',
data: {
id: this.model.id
},
groupIndex: 1,
});
actionList.push({
action: 'setNotHeld',
label: 'Set Not Held',
data: {
id: this.model.id
},
groupIndex: 1,
});
}
if (this.options.acl.delete) {
actionList.push({
action: 'quickRemove',
label: 'Remove',
data: {
id: this.model.id,
scope: this.model.entityType
},
groupIndex: 0,
});
}
return actionList;
}
});
});
define("modules/crm/views/call/fields/leads", ["exports", "modules/crm/views/call/fields/contacts"], function (_exports, _contacts) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_contacts = _interopRequireDefault(_contacts);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _contacts.default {}
_exports.default = _default;
});
define("modules/crm/views/call/fields/date-start", ["exports", "views/fields/datetime", "moment"], function (_exports, _datetime, _moment) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_datetime = _interopRequireDefault(_datetime);
_moment = _interopRequireDefault(_moment);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class DateStartCallFieldView extends _datetime.default {
setup() {
super.setup();
this.notActualStatusList = [...(this.getMetadata().get(`scopes.${this.entityType}.completedStatusList`) || []), ...(this.getMetadata().get(`scopes.${this.entityType}.canceledStatusList`) || [])];
}
getAttributeList() {
return [...super.getAttributeList(), 'dateEnd', 'status'];
}
data() {
let style;
const status = this.model.get('status');
if (status && !this.notActualStatusList.includes(status) && (this.mode === this.MODE_DETAIL || this.mode === this.MODE_LIST)) {
if (this.isDateInPast('dateEnd')) {
style = 'danger';
} else if (this.isDateInPast('dateStart')) {
style = 'warning';
}
}
// noinspection JSValidateTypes
return {
...super.data(),
style: style
};
}
/**
* @private
* @param {string} field
* @return {boolean}
*/
isDateInPast(field) {
const value = this.model.get(field);
if (value) {
const d = this.getDateTime().toMoment(value);
const now = (0, _moment.default)().tz(this.getDateTime().timeZone || 'UTC');
if (d.unix() < now.unix()) {
return true;
}
}
return false;
}
}
var _default = _exports.default = DateStartCallFieldView;
});
define("modules/crm/views/calendar/mode-buttons", ["exports", "view"], function (_exports, _view) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_view = _interopRequireDefault(_view);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
/** @module modules/crm/views/calendar/mode-buttons */
class CalendarModeButtons extends _view.default {
template = 'crm:calendar/mode-buttons';
visibleModeListCount = 3;
data() {
const scopeFilterList = Espo.Utils.clone(this.scopeList);
scopeFilterList.unshift('all');
const scopeFilterDataList = [];
this.scopeList.forEach(scope => {
const o = {
scope: scope
};
if (!this.getCalendarParentView().enabledScopeList.includes(scope)) {
o.disabled = true;
}
scopeFilterDataList.push(o);
});
return {
mode: this.mode,
visibleModeDataList: this.getVisibleModeDataList(),
hiddenModeDataList: this.getHiddenModeDataList(),
scopeFilterDataList: scopeFilterDataList,
isCustomViewAvailable: this.isCustomViewAvailable,
hasMoreItems: this.isCustomViewAvailable,
hasWorkingTimeCalendarLink: this.getAcl().checkScope('WorkingTimeCalendar')
};
}
/**
* @return {
* import('modules/crm/views/calendar/calendar').default|
* import('modules/crm/views/calendar/timeline').default
* }
*/
getCalendarParentView() {
// noinspection JSValidateTypes
return this.getParentView();
}
setup() {
this.isCustomViewAvailable = this.options.isCustomViewAvailable;
this.modeList = this.options.modeList;
this.scopeList = this.options.scopeList;
this.mode = this.options.mode;
}
/**
* @param {boolean} [originalOrder]
* @return {Object.<string, *>[]}
*/
getModeDataList(originalOrder) {
const list = [];
this.modeList.forEach(name => {
const o = {
mode: name,
label: this.translate(name, 'modes', 'Calendar'),
labelShort: this.translate(name, 'modes', 'Calendar').substring(0, 2)
};
list.push(o);
});
if (this.isCustomViewAvailable) {
(this.getPreferences().get('calendarViewDataList') || []).forEach(item => {
item = Espo.Utils.clone(item);
item.mode = 'view-' + item.id;
item.label = item.name;
item.labelShort = (item.name || '').substring(0, 2);
list.push(item);
});
}
if (originalOrder) {
return list;
}
let currentIndex = -1;
list.forEach((item, i) => {
if (item.mode === this.mode) {
currentIndex = i;
}
});
return list;
}
getVisibleModeDataList() {
const fullList = this.getModeDataList();
const current = fullList.find(it => it.mode === this.mode);
const list = fullList.slice(0, this.visibleModeListCount);
if (current && !list.find(it => it.mode === this.mode)) {
list.push(current);
}
return list;
}
getHiddenModeDataList() {
const fullList = this.getModeDataList();
const list = [];
fullList.forEach((o, i) => {
if (i < this.visibleModeListCount) {
return;
}
list.push(o);
});
return list;
}
}
var _default = _exports.default = CalendarModeButtons;
});
define("modules/crm/views/calendar/calendar-page", ["exports", "view", "crm:views/calendar/modals/edit-view", "di", "helpers/site/shortcut-manager", "helpers/util/debounce", "web-socket-manager", "utils"], function (_exports, _view, _editView, _di, _shortcutManager, _debounce, _webSocketManager, _utils) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_view = _interopRequireDefault(_view);
_editView = _interopRequireDefault(_editView);
_shortcutManager = _interopRequireDefault(_shortcutManager);
_debounce = _interopRequireDefault(_debounce);
_webSocketManager = _interopRequireDefault(_webSocketManager);
_utils = _interopRequireDefault(_utils);
let _init_shortcutManager, _init_extra_shortcutManager, _init_webSocketManager, _init_extra_webSocketManager;
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function _applyDecs(e, t, n, r, o, i) { var a, c, u, s, f, l, p, d = Symbol.metadata || Symbol.for("Symbol.metadata"), m = Object.defineProperty, h = Object.create, y = [h(null), h(null)], v = t.length; function g(t, n, r) { return function (o, i) { n && (i = o, o = e); for (var a = 0; a < t.length; a++) i = t[a].apply(o, r ? [i] : []); return r ? i : o; }; } function b(e, t, n, r) { if ("function" != typeof e && (r || void 0 !== e)) throw new TypeError(t + " must " + (n || "be") + " a function" + (r ? "" : " or undefined")); return e; } function applyDec(e, t, n, r, o, i, u, s, f, l, p) { function d(e) { if (!p(e)) throw new TypeError("Attempted to access private element on non-instance"); } var h = [].concat(t[0]), v = t[3], w = !u, D = 1 === o, S = 3 === o, j = 4 === o, E = 2 === o; function I(t, n, r) { return function (o, i) { return n && (i = o, o = e), r && r(o), P[t].call(o, i); }; } if (!w) { var P = {}, k = [], F = S ? "get" : j || D ? "set" : "value"; if (f ? (l || D ? P = { get: _setFunctionName(function () { return v(this); }, r, "get"), set: function (e) { t[4](this, e); } } : P[F] = v, l || _setFunctionName(P[F], r, E ? "" : F)) : l || (P = Object.getOwnPropertyDescriptor(e, r)), !l && !f) { if ((c = y[+s][r]) && 7 != (c ^ o)) throw Error("Decorating two elements with the same name (" + P[F].name + ") is not supported yet"); y[+s][r] = o < 3 ? 1 : o; } } for (var N = e, O = h.length - 1; O >= 0; O -= n ? 2 : 1) { var T = b(h[O], "A decorator", "be", !0), z = n ? h[O - 1] : void 0, A = {}, H = { kind: ["field", "accessor", "method", "getter", "setter", "class"][o], name: r, metadata: a, addInitializer: function (e, t) { if (e.v) throw new TypeError("attempted to call addInitializer after decoration was finished"); b(t, "An initializer", "be", !0), i.push(t); }.bind(null, A) }; if (w) c = T.call(z, N, H), A.v = 1, b(c, "class decorators", "return") && (N = c);else if (H.static = s, H.private = f, c = H.access = { has: f ? p.bind() : function (e) { return r in e; } }, j || (c.get = f ? E ? function (e) { return d(e), P.value; } : I("get", 0, d) : function (e) { return e[r]; }), E || S || (c.set = f ? I("set", 0, d) : function (e, t) { e[r] = t; }), N = T.call(z, D ? { get: P.get, set: P.set } : P[F], H), A.v = 1, D) { if ("object" == typeof N && N) (c = b(N.get, "accessor.get")) && (P.get = c), (c = b(N.set, "accessor.set")) && (P.set = c), (c = b(N.init, "accessor.init")) && k.unshift(c);else if (void 0 !== N) throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined"); } else b(N, (l ? "field" : "method") + " decorators", "return") && (l ? k.unshift(N) : P[F] = N); } return o < 2 && u.push(g(k, s, 1), g(i, s, 0)), l || w || (f ? D ? u.splice(-1, 0, I("get", s), I("set", s)) : u.push(E ? P[F] : b.call.bind(P[F])) : m(e, r, P)), N; } function w(e) { return m(e, d, { configurable: !0, enumerable: !0, value: a }); } return void 0 !== i && (a = i[d]), a = h(null == a ? null : a), f = [], l = function (e) { e && f.push(g(e)); }, p = function (t, r) { for (var i = 0; i < n.length; i++) { var a = n[i], c = a[1], l = 7 & c; if ((8 & c) == t && !l == r) { var p = a[2], d = !!a[3], m = 16 & c; applyDec(t ? e : e.prototype, a, m, d ? "#" + p : _toPropertyKey(p), l, l < 2 ? [] : t ? s = s || [] : u = u || [], f, !!t, d, r, t && d ? function (t) { return _checkInRHS(t) === e; } : o); } } }, p(8, 0), p(0, 0), p(8, 1), p(0, 1), l(u), l(s), c = f, v || w(e), { e: c, get c() { var n = []; return v && [w(e = applyDec(e, [t], r, e.name, 5, n)), g(n, 1)]; } }; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
function _setFunctionName(e, t, n) { "symbol" == typeof t && (t = (t = t.description) ? "[" + t + "]" : ""); try { Object.defineProperty(e, "name", { configurable: !0, value: n ? n + " " + t : t }); } catch (e) {} return e; }
function _checkInRHS(e) { if (Object(e) !== e) throw TypeError("right-hand side of 'in' should be an object, got " + (null !== e ? typeof e : "null")); return e; }
class CalendarPage extends _view.default {
static #_ = [_init_shortcutManager, _init_extra_shortcutManager, _init_webSocketManager, _init_extra_webSocketManager] = _applyDecs(this, [], [[(0, _di.inject)(_shortcutManager.default), 0, "shortcutManager"], [(0, _di.inject)(_webSocketManager.default), 0, "webSocketManager"]], 0, void 0, _view.default).e;
template = 'crm:calendar/calendar-page';
//el = '#main'
fullCalendarModeList = ['month', 'agendaWeek', 'agendaDay', 'basicWeek', 'basicDay', 'listWeek'];
events = {
/** @this CalendarPage */
'click [data-action="createCustomView"]': function () {
this.createCustomView();
},
/** @this CalendarPage */
'click [data-action="editCustomView"]': function () {
this.editCustomView();
}
};
/**
* @private
* @type {ShortcutManager}
*/
shortcutManager = _init_shortcutManager(this);
/**
* @private
* @type {DebounceHelper|null}
*/
webSocketDebounceHelper = (_init_extra_shortcutManager(this), null);
/**
* @private
* @type {number}
*/
webSocketDebounceInterval = 500;
/**
* @private
* @type {number}
*/
webSocketBlockInterval = 1000;
/**
* @private
* @type {WebSocketManager}
*/
webSocketManager = _init_webSocketManager(this);
/**
* A shortcut-key => action map.
*
* @protected
* @type {?Object.<string, function (KeyboardEvent): void>}
*/
shortcutKeys = (_init_extra_webSocketManager(this), {
/** @this CalendarPage */
'Home': function (e) {
this.handleShortcutKeyHome(e);
},
/** @this CalendarPage */
'Numpad7': function (e) {
this.handleShortcutKeyHome(e);
},
/** @this CalendarPage */
'Numpad4': function (e) {
this.handleShortcutKeyArrowLeft(e);
},
/** @this CalendarPage */
'Numpad6': function (e) {
this.handleShortcutKeyArrowRight(e);
},
/** @this CalendarPage */
'ArrowLeft': function (e) {
this.handleShortcutKeyArrowLeft(e);
},
/** @this CalendarPage */
'ArrowRight': function (e) {
this.handleShortcutKeyArrowRight(e);
},
/** @this CalendarPage */
'Control+ArrowLeft': function (e) {
this.handleShortcutKeyArrowLeft(e);
},
/** @this CalendarPage */
'Control+ArrowRight': function (e) {
this.handleShortcutKeyArrowRight(e);
},
/** @this CalendarPage */
'Minus': function (e) {
this.handleShortcutKeyMinus(e);
},
/** @this CalendarPage */
'Equal': function (e) {
this.handleShortcutKeyPlus(e);
},
/** @this CalendarPage */
'NumpadSubtract': function (e) {
this.handleShortcutKeyMinus(e);
},
/** @this CalendarPage */
'NumpadAdd': function (e) {
this.handleShortcutKeyPlus(e);
},
/** @this CalendarPage */
'Digit1': function (e) {
this.handleShortcutKeyDigit(e, 1);
},
/** @this CalendarPage */
'Digit2': function (e) {
this.handleShortcutKeyDigit(e, 2);
},
/** @this CalendarPage */
'Digit3': function (e) {
this.handleShortcutKeyDigit(e, 3);
},
/** @this CalendarPage */
'Digit4': function (e) {
this.handleShortcutKeyDigit(e, 4);
},
/** @this CalendarPage */
'Digit5': function (e) {
this.handleShortcutKeyDigit(e, 5);
},
/** @this CalendarPage */
'Digit6': function (e) {
this.handleShortcutKeyDigit(e, 6);
},
/** @this CalendarPage */
'Control+Space': function (e) {
this.handleShortcutKeyControlSpace(e);
}
});
/**
* @param {{
* userId?: string,
* userName?: string|null,
* mode?: string|null,
* date?: string|null,
* }} options
*/
constructor(options) {
super(options);
this.options = options;
}
setup() {
this.mode = this.mode || this.options.mode || null;
this.date = this.date || this.options.date || null;
if (!this.mode) {
this.mode = this.getStorage().get('state', 'calendarMode') || null;
if (this.mode && this.mode.indexOf('view-') === 0) {
const viewId = this.mode.slice(5);
const calendarViewDataList = this.getPreferences().get('calendarViewDataList') || [];
let isFound = false;
calendarViewDataList.forEach(item => {
if (item.id === viewId) {
isFound = true;
}
});
if (!isFound) {
this.mode = null;
}
if (this.options.userId) {
this.mode = null;
}
}
}
this.shortcutManager.add(this, this.shortcutKeys);
this.on('remove', () => {
this.shortcutManager.remove(this);
});
if (!this.mode || ~this.fullCalendarModeList.indexOf(this.mode) || this.mode.indexOf('view-') === 0) {
this.setupCalendar();
} else if (this.mode === 'timeline') {
this.setupTimeline();
}
this.initWebSocket();
}
/**
* @private
*/
initWebSocket() {
if (this.options.userId && this.getUser().id !== this.options.userId) {
return;
}
this.webSocketDebounceHelper = new _debounce.default({
interval: this.webSocketDebounceInterval,
blockInterval: this.webSocketBlockInterval,
handler: () => this.handleWebSocketUpdate()
});
if (!this.webSocketManager.isEnabled()) {
const testHandler = () => this.webSocketDebounceHelper.process();
this.on('remove', () => window.removeEventListener('calendar-update', testHandler));
// For testing purpose.
window.addEventListener('calendar-update', testHandler);
return;
}
this.webSocketManager.subscribe('calendarUpdate', () => this.webSocketDebounceHelper.process());
this.on('remove', () => this.webSocketManager.unsubscribe('calendarUpdate'));
}
/**
* @private
*/
handleWebSocketUpdate() {
var _this$getCalendarView;
(_this$getCalendarView = this.getCalendarView()) === null || _this$getCalendarView === void 0 || _this$getCalendarView.actionRefresh({
suppressLoadingAlert: true
});
}
/**
* @private
*/
onSave() {
if (!this.webSocketDebounceHelper) {
return;
}
this.webSocketDebounceHelper.block();
}
afterRender() {
this.$el.focus();
}
updateUrl(trigger) {
let url = '#Calendar/show';
if (this.mode || this.date) {
url += '/';
}
if (this.mode) {
url += 'mode=' + this.mode;
}
if (this.date) {
url += '&date=' + this.date;
}
if (this.options.userId) {
url += '&userId=' + this.options.userId;
if (this.options.userName) {
url += '&userName=' + encodeURIComponent(this.options.userName);
}
}
this.getRouter().navigate(url, {
trigger: trigger
});
}
/**
* @private
*/
setupCalendar() {
const viewName = this.getMetadata().get(['clientDefs', 'Calendar', 'calendarView']) || 'crm:views/calendar/calendar';
this.createView('calendar', viewName, {
date: this.date,
userId: this.options.userId,
userName: this.options.userName,
mode: this.mode,
fullSelector: '#main > .calendar-container',
onSave: () => this.onSave()
}, view => {
let initial = true;
this.listenTo(view, 'view', (date, mode) => {
this.date = date;
this.mode = mode;
if (!initial) {
this.updateUrl();
}
initial = false;
});
this.listenTo(view, 'change:mode', (mode, refresh) => {
this.mode = mode;
if (!this.options.userId) {
this.getStorage().set('state', 'calendarMode', mode);
}
if (refresh) {
this.updateUrl(true);
return;
}
if (!~this.fullCalendarModeList.indexOf(mode)) {
this.updateUrl(true);
}
this.$el.focus();
});
});
}
/**
* @private
*/
setupTimeline() {
const viewName = this.getMetadata().get(['clientDefs', 'Calendar', 'timelineView']) || 'crm:views/calendar/timeline';
this.createView('calendar', viewName, {
date: this.date,
userId: this.options.userId,
userName: this.options.userName,
fullSelector: '#main > .calendar-container',
onSave: () => this.onSave()
}, view => {
let initial = true;
this.listenTo(view, 'view', (date, mode) => {
this.date = date;
this.mode = mode;
if (!initial) {
this.updateUrl();
}
initial = false;
});
this.listenTo(view, 'change:mode', mode => {
this.mode = mode;
if (!this.options.userId) {
this.getStorage().set('state', 'calendarMode', mode);
}
this.updateUrl(true);
});
});
}
updatePageTitle() {
this.setPageTitle(this.translate('Calendar', 'scopeNames'));
}
async createCustomView() {
const view = new _editView.default({
afterSave: data => {
this.mode = `view-${data.id}`;
this.date = null;
this.updateUrl(true);
}
});
await this.assignView('modal', view);
await view.render();
}
async editCustomView() {
const viewId = this.getCalendarView().viewId;
if (!viewId) {
return;
}
const view = new _editView.default({
id: viewId,
afterSave: () => {
this.getCalendarView().setupMode();
this.getCalendarView().reRender();
},
afterRemove: () => {
this.mode = null;
this.date = null;
this.updateUrl(true);
}
});
await this.assignView('modal', view);
await view.render();
}
/**
* @private
* @return {import('./calendar').default|import('./timeline').default}
*/
getCalendarView() {
return this.getView('calendar');
}
/**
* @private
* @param {KeyboardEvent} e
*/
handleShortcutKeyHome(e) {
if (_utils.default.isKeyEventInTextInput(e)) {
return;
}
e.preventDefault();
this.getCalendarView().actionToday();
}
/**
* @private
* @param {KeyboardEvent} e
*/
handleShortcutKeyArrowLeft(e) {
if (_utils.default.isKeyEventInTextInput(e)) {
return;
}
if (e.target instanceof HTMLElement && e.target.parentElement instanceof HTMLLIElement) {
return;
}
e.preventDefault();
this.getCalendarView().actionPrevious();
}
/**
* @private
* @param {KeyboardEvent} e
*/
handleShortcutKeyArrowRight(e) {
if (_utils.default.isKeyEventInTextInput(e)) {
return;
}
if (e.target instanceof HTMLElement && e.target.parentElement instanceof HTMLLIElement) {
return;
}
e.preventDefault();
this.getCalendarView().actionNext();
}
/**
* @private
* @param {KeyboardEvent} e
*/
handleShortcutKeyMinus(e) {
if (_utils.default.isKeyEventInTextInput(e)) {
return;
}
if (!this.getCalendarView().actionZoomOut) {
return;
}
e.preventDefault();
this.getCalendarView().actionZoomOut();
}
/**
* @private
* @param {KeyboardEvent} e
*/
handleShortcutKeyPlus(e) {
if (_utils.default.isKeyEventInTextInput(e)) {
return;
}
if (!this.getCalendarView().actionZoomIn) {
return;
}
e.preventDefault();
this.getCalendarView().actionZoomIn();
}
/**
* @private
* @param {KeyboardEvent} e
* @param {Number} digit
*/
handleShortcutKeyDigit(e, digit) {
if (_utils.default.isKeyEventInTextInput(e)) {
return;
}
const modeList = this.getCalendarView().hasView('modeButtons') ? this.getCalendarView().getModeButtonsView().getModeDataList(true).map(item => item.mode) : this.getCalendarView().modeList;
const mode = modeList[digit - 1];
if (!mode) {
return;
}
e.preventDefault();
if (mode === this.mode) {
this.getCalendarView().actionRefresh();
return;
}
this.getCalendarView().selectMode(mode);
}
/**
* @private
* @param {KeyboardEvent} e
*/
handleShortcutKeyControlSpace(e) {
if (_utils.default.isKeyEventInTextInput(e)) {
return;
}
if (!this.getCalendarView().createEvent) {
return;
}
e.preventDefault();
this.getCalendarView().createEvent();
}
}
// noinspection JSUnusedGlobalSymbols
var _default = _exports.default = CalendarPage;
});
define("modules/crm/views/calendar/modals/shared-options", ["exports", "views/modal", "model", "views/record/edit-for-modal", "crm:views/calendar/fields/users"], function (_exports, _modal, _model, _editForModal, _users) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_modal = _interopRequireDefault(_modal);
_model = _interopRequireDefault(_model);
_editForModal = _interopRequireDefault(_editForModal);
_users = _interopRequireDefault(_users);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class TimelineSharedOptionsModalView extends _modal.default {
className = 'dialog dialog-record';
templateContent = `
<div class="record-container no-side-margin">{{{record}}}</div>
`;
/**
* @private
* @type {EditForModalRecordView}
*/
recordView;
/**
*
* @param {{
* users: {id: string, name: string}[],
* onApply: function({
* users: {id: string, name: string}[],
* }),
* }} options
*/
constructor(options) {
super(options);
this.options = options;
}
setup() {
this.buttonList = [{
name: 'save',
label: 'Save',
style: 'primary',
onClick: () => this.actionSave()
}, {
name: 'cancel',
label: 'Cancel',
onClick: () => this.actionClose()
}];
this.headerText = this.translate('timeline', 'modes', 'Calendar') + ' · ' + this.translate('Shared Mode Options', 'labels', 'Calendar');
const users = this.options.users;
const userIdList = [];
const userNames = {};
users.forEach(item => {
userIdList.push(item.id);
userNames[item.id] = item.name;
});
this.model = new _model.default({
usersIds: userIdList,
usersNames: userNames
});
this.recordView = new _editForModal.default({
model: this.model,
detailLayout: [{
rows: [[{
view: new _users.default({
name: 'users'
})
}, false]]
}]
});
this.assignView('record', this.recordView);
}
/**
* @private
*/
actionSave() {
const data = this.recordView.processFetch();
if (this.recordView.validate()) {
return;
}
/** @type {{id: string, name: string}[]} */
const users = [];
const userIds = this.model.attributes.usersIds || [];
userIds.forEach(id => {
users.push({
id: id,
name: (data.usersNames || {})[id] || id
});
});
this.options.onApply({
users: users
});
this.close();
}
}
_exports.default = TimelineSharedOptionsModalView;
});
define("modules/crm/views/calendar/modals/edit", ["exports", "views/modals/edit"], function (_exports, _edit) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_edit = _interopRequireDefault(_edit);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class CalenderEditModalView extends _edit.default {
template = 'crm:calendar/modals/edit';
scopeList = ['Meeting', 'Call', 'Task'];
data() {
return {
scopeList: this.scopeList,
scope: this.scope,
isNew: !this.id
};
}
additionalEvents = {
/** @this CalenderEditModalView */
'change .scope-switcher input[name="scope"]': function () {
Espo.Ui.notifyWait();
const prevScope = this.scope;
const scope = $('.scope-switcher input[name="scope"]:checked').val();
this.scope = scope;
this.getModelFactory().create(this.scope, model => {
model.populateDefaults();
let attributes = this.getRecordView().fetch();
attributes = {
...attributes,
...this.getRecordView().model.getClonedAttributes()
};
this.filterAttributesForEntityType(attributes, scope, prevScope);
model.set(attributes);
this.model = model;
this.createRecordView(model, view => {
view.render();
view.notify(false);
});
this.handleAccess(model);
});
}
};
/**
* @param {Record} attributes
* @param {string} entityType
* @param {string} previousEntityType
*/
filterAttributesForEntityType(attributes, entityType, previousEntityType) {
if (entityType === 'Task' || previousEntityType === 'Task') {
delete attributes.reminders;
}
this.getHelper().fieldManager.getEntityTypeFieldList(entityType, {
type: 'enum'
}).forEach(field => {
if (!(field in attributes)) {
return;
}
const options = this.getMetadata().get(['entityDefs', entityType, 'fields', field, 'options']) || [];
const value = attributes[field];
if (!~options.indexOf(value)) {
delete attributes[field];
}
});
}
createRecordView(model, callback) {
if (!this.id && !this.dateIsChanged) {
if (this.options.dateStart && this.options.dateEnd) {
this.model.set('dateStart', this.options.dateStart);
this.model.set('dateEnd', this.options.dateEnd);
}
if (this.options.allDay) {
const allDayScopeList = this.getMetadata().get('clientDefs.Calendar.allDayScopeList') || [];
if (~allDayScopeList.indexOf(this.scope)) {
this.model.set('dateStart', null);
this.model.set('dateEnd', null);
this.model.set('dateStartDate', null);
this.model.set('dateEndDate', this.options.dateEndDate);
if (this.options.dateEndDate !== this.options.dateStartDate) {
this.model.set('dateStartDate', this.options.dateStartDate);
}
} else if (this.getMetadata().get(['entityDefs', this.scope, 'fields', 'dateStartDate'])) {
this.model.set('dateStart', null);
this.model.set('dateEnd', null);
this.model.set('dateStartDate', this.options.dateStartDate);
this.model.set('dateEndDate', this.options.dateEndDate);
this.model.set('isAllDay', true);
} else {
this.model.set('isAllDay', false);
this.model.set('dateStartDate', null);
this.model.set('dateEndDate', null);
}
}
}
this.listenTo(this.model, 'change:dateStart', (m, value, o) => {
if (o.ui) {
this.dateIsChanged = true;
}
});
this.listenTo(this.model, 'change:dateEnd', (m, value, o) => {
if (o.ui || o.updatedByDuration) {
this.dateIsChanged = true;
}
});
super.createRecordView(model, callback);
}
handleAccess(model) {
if (this.id && !this.getAcl().checkModel(model, 'edit') || !this.id && !this.getAcl().checkModel(model, 'create')) {
this.hideButton('save');
this.hideButton('fullForm');
this.$el.find('button[data-name="save"]').addClass('hidden');
this.$el.find('button[data-name="fullForm"]').addClass('hidden');
} else {
this.showButton('save');
this.showButton('fullForm');
}
if (!this.getAcl().checkModel(model, 'delete')) {
this.hideButton('remove');
} else {
this.showButton('remove');
}
}
afterRender() {
super.afterRender();
if (this.hasView('edit')) {
const model = this.getView('edit').model;
if (model) {
this.handleAccess(model);
}
}
}
setup() {
this.events = {
...this.additionalEvents,
...this.events
};
this.scopeList = Espo.Utils.clone(this.options.scopeList || this.scopeList);
this.enabledScopeList = this.options.enabledScopeList || this.scopeList;
if (!this.options.id && !this.options.scope) {
const scopeList = [];
this.scopeList.forEach(scope => {
if (this.getAcl().check(scope, 'create')) {
if (~this.enabledScopeList.indexOf(scope)) {
scopeList.push(scope);
}
}
});
this.scopeList = scopeList;
const calendarDefaultEntity = scopeList[0];
if (calendarDefaultEntity && ~this.scopeList.indexOf(calendarDefaultEntity)) {
this.options.scope = calendarDefaultEntity;
} else {
this.options.scope = this.scopeList[0] || null;
}
if (this.scopeList.length === 0) {
this.remove();
return;
}
}
super.setup();
if (!this.id) {
this.$header = $('<a>').attr('title', this.translate('Full Form')).attr('role', 'button').attr('data-action', 'fullForm').addClass('action').text(this.translate('Create', 'labels', 'Calendar'));
}
if (this.id) {
this.buttonList.splice(1, 0, {
name: 'remove',
text: this.translate('Remove'),
onClick: () => this.actionRemove()
});
}
this.once('after:save', () => {
this.$el.find('.scope-switcher').remove();
});
}
actionRemove() {
const model = this.getView('edit').model;
this.confirm(this.translate('removeRecordConfirmation', 'messages'), () => {
const $buttons = this.dialog.$el.find('.modal-footer button');
$buttons.addClass('disabled');
model.destroy().then(() => {
this.trigger('after:delete', model);
this.dialog.close();
}).catch(() => {
$buttons.removeClass('disabled');
});
});
}
}
var _default = _exports.default = CalenderEditModalView;
});
define("modules/crm/views/admin/entity-manager/fields/status-list", ["exports", "views/fields/multi-enum"], function (_exports, _multiEnum) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_multiEnum = _interopRequireDefault(_multiEnum);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _multiEnum.default {
setupOptions() {
const entityType = this.model.get('name');
const options = this.getMetadata().get(['entityDefs', entityType, 'fields', 'status', 'options']) || [];
this.params.options = [...options];
this.params.translation = `${entityType}.options.status`;
}
}
_exports.default = _default;
});
define("modules/crm/views/activities/list", ["exports", "views/list-related"], function (_exports, _listRelated) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_listRelated = _interopRequireDefault(_listRelated);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class ActivitiesListView extends _listRelated.default {
createButton = false;
unlinkDisabled = true;
filtersDisabled = true;
allResultDisabled = true;
setup() {
this.rowActionsView = 'views/record/row-actions/default';
super.setup();
this.type = this.options.type;
}
getHeader() {
const name = this.model.get('name') || this.model.id;
const recordUrl = `#${this.scope}/view/${this.model.id}`;
const $name = $('<a>').attr('href', recordUrl).addClass('font-size-flexible title').text(name).css('user-select', 'none');
if (this.model.get('deleted')) {
$name.css('text-decoration', 'line-through');
}
const headerIconHtml = this.getHelper().getScopeColorIconHtml(this.foreignScope);
const scopeLabel = this.getLanguage().translate(this.scope, 'scopeNamesPlural');
let $root = $('<span>').text(scopeLabel);
if (!this.rootLinkDisabled) {
$root = $('<span>').append($('<a>').attr('href', '#' + this.scope).addClass('action').attr('data-action', 'navigateToRoot').text(scopeLabel));
}
$root.css('user-select', 'none');
if (headerIconHtml) {
$root.prepend(headerIconHtml);
}
const linkLabel = this.type === 'history' ? this.translate('History') : this.translate('Activities');
const $link = $('<span>').text(linkLabel);
$link.css('user-select', 'none');
const $target = $('<span>').text(this.translate(this.foreignScope, 'scopeNamesPlural'));
$target.css('user-select', 'none').css('cursor', 'pointer').attr('data-action', 'fullRefresh').attr('title', this.translate('clickToRefresh', 'messages'));
return this.buildHeaderHtml([$root, $name, $link, $target]);
}
/**
* @inheritDoc
*/
updatePageTitle() {
this.setPageTitle(this.translate(this.foreignScope, 'scopeNamesPlural'));
}
}
_exports.default = ActivitiesListView;
});
define("modules/crm/views/account/detail", ["exports", "views/detail"], function (_exports, _detail) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_detail = _interopRequireDefault(_detail);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
/** Left for bc. */
class _default extends _detail.default {}
_exports.default = _default;
});
define("modules/crm/views/account/fields/shipping-address", ["exports", "views/fields/address"], function (_exports, _address) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_address = _interopRequireDefault(_address);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class _default extends _address.default {
copyFrom = 'billingAddress';
setup() {
super.setup();
this.addActionHandler('copyFromBilling', () => this.copy());
this.attributePartList = this.getMetadata().get(['fields', 'address', 'actualFields']) || [];
this.allAddressAttributeList = [];
this.attributePartList.forEach(part => {
this.allAddressAttributeList.push(this.copyFrom + Espo.Utils.upperCaseFirst(part));
this.allAddressAttributeList.push(this.name + Espo.Utils.upperCaseFirst(part));
});
this.listenTo(this.model, 'change', () => {
let isChanged = false;
for (const attribute of this.allAddressAttributeList) {
if (this.model.hasChanged(attribute)) {
isChanged = true;
break;
}
}
if (!isChanged) {
return;
}
if (!this.isEditMode() || !this.isRendered() || !this.copyButtonElement) {
return;
}
if (this.toShowCopyButton()) {
this.copyButtonElement.classList.remove('hidden');
} else {
this.copyButtonElement.classList.add('hidden');
}
});
}
afterRender() {
super.afterRender();
if (this.mode === this.MODE_EDIT && this.element) {
const label = this.translate('Copy Billing', 'labels', 'Account');
const button = this.copyButtonElement = document.createElement('button');
button.classList.add('btn', 'btn-default', 'btn-sm', 'action');
button.textContent = label;
button.setAttribute('data-action', 'copyFromBilling');
if (!this.toShowCopyButton()) {
button.classList.add('hidden');
}
this.element.append(button);
}
}
/**
* @private
*/
copy() {
const fieldFrom = this.copyFrom;
Object.keys(this.getMetadata().get('fields.address.fields') || {}).forEach(attr => {
const destField = this.name + Espo.Utils.upperCaseFirst(attr);
const sourceField = fieldFrom + Espo.Utils.upperCaseFirst(attr);
this.model.set(destField, this.model.get(sourceField));
});
}
/**
* @private
* @return {boolean}
*/
toShowCopyButton() {
let billingIsNotEmpty = false;
let shippingIsNotEmpty = false;
this.attributePartList.forEach(part => {
const attribute1 = this.copyFrom + Espo.Utils.upperCaseFirst(part);
if (this.model.get(attribute1)) {
billingIsNotEmpty = true;
}
const attribute2 = this.name + Espo.Utils.upperCaseFirst(part);
if (this.model.get(attribute2)) {
shippingIsNotEmpty = true;
}
});
return billingIsNotEmpty && !shippingIsNotEmpty;
}
}
_exports.default = _default;
});
define("modules/crm/view-setup-handlers/document/record-list-drag-n-drop", ["exports", "underscore", "bullbone"], function (_exports, _underscore, _bullbone) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_underscore = _interopRequireDefault(_underscore);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
const Handler = function (view) {
this.view = view;
};
_underscore.default.extend(Handler.prototype, {
process: function () {
this.listenTo(this.view, 'after:render', () => this.initDragDrop());
this.listenTo(this.view, 'remove', () => this.disable());
},
disable: function () {
const $el = this.view.$el.parent();
/** @type {Element} */
const el = $el.get(0);
$el.off('drop');
if (!el) {
return;
}
if (!this.onDragoverBind) {
return;
}
el.removeEventListener('dragover', this.onDragoverBind);
el.removeEventListener('dragenter', this.onDragenterBind);
el.removeEventListener('dragleave', this.onDragleaveBind);
},
initDragDrop: function () {
this.disable();
const $el = this.view.$el.parent();
const el = $el.get(0);
$el.on('drop', e => {
e.preventDefault();
e.stopPropagation();
e = e.originalEvent;
if (e.dataTransfer && e.dataTransfer.files && e.dataTransfer.files.length === 1 && this.dropEntered) {
this.removeDrop();
this.create(e.dataTransfer.files[0]);
return;
}
this.removeDrop($el);
});
this.dropEntered = false;
this.onDragoverBind = this.onDragover.bind(this);
this.onDragenterBind = this.onDragenter.bind(this);
this.onDragleaveBind = this.onDragleave.bind(this);
el.addEventListener('dragover', this.onDragoverBind);
el.addEventListener('dragenter', this.onDragenterBind);
el.addEventListener('dragleave', this.onDragleaveBind);
},
renderDrop: function () {
this.dropEntered = true;
const $backdrop = $('<div class="dd-backdrop">').css('pointer-events', 'none').append('<span class="fas fa-paperclip"></span>').append(' ').append($('<span>').text(this.view.getLanguage().translate('Create Document', 'labels', 'Document')));
this.view.$el.append($backdrop);
},
removeDrop: function () {
this.view.$el.find('> .dd-backdrop').remove();
this.dropEntered = false;
},
create: function (file) {
this.view.actionQuickCreate().then(view => {
const fileView = view.getRecordView().getFieldView('file');
if (!fileView) {
const msg = "No 'file' field on the layout.";
Espo.Ui.error(msg);
console.error(msg);
return;
}
if (fileView.isRendered()) {
fileView.uploadFile(file);
return;
}
this.listenToOnce(fileView, 'after:render', () => {
fileView.uploadFile(file);
});
});
},
/**
* @param {DragEvent} e
*/
onDragover: function (e) {
e.preventDefault();
},
/**
* @param {DragEvent} e
*/
onDragenter: function (e) {
e.preventDefault();
if (!e.dataTransfer.types || !e.dataTransfer.types.length) {
return;
}
if (!~e.dataTransfer.types.indexOf('Files')) {
return;
}
if (!this.dropEntered) {
this.renderDrop();
}
},
/**
* @param {DragEvent} e
*/
onDragleave: function (e) {
e.preventDefault();
if (!this.dropEntered) {
return;
}
let fromElement = e.fromElement || e.relatedTarget;
if (fromElement && $.contains(this.view.$el.parent().get(0), fromElement)) {
return;
}
if (fromElement && fromElement.parentNode && fromElement.parentNode.toString() === '[object ShadowRoot]') {
return;
}
this.removeDrop();
}
});
Object.assign(Handler.prototype, _bullbone.Events);
// noinspection JSUnusedGlobalSymbols
var _default = _exports.default = Handler;
});
define("modules/crm/handlers/task/reminders-handler", ["exports", "bullbone"], function (_exports, _bullbone) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
/**
* @mixes Bull.Events
*/
class RemindersHandler {
/**
* @param {import('views/record/detail').default} view
*/
constructor(view) {
this.view = view;
this.model = view.model;
this.user = this.view.getUser();
this.ignoreStatusList = [...(this.view.getMetadata().get(['scopes', this.view.entityType, 'completedStatusList']) || []), ...(this.view.getMetadata().get(['scopes', this.view.entityType, 'canceledStatusList']) || [])];
}
process() {
this.control();
this.listenTo(this.model, 'change', () => {
if (!this.model.hasChanged('assignedUserId') && !this.model.hasChanged('assignedUsersIds') && !this.model.hasChanged('dateEnd') && !this.model.hasChanged('dateEndDate') && !this.model.hasChanged('status')) {
return;
}
this.control();
});
}
control() {
if (!this.model.attributes.dateEnd && !this.model.attributes.dateEndDate) {
this.view.hideField('reminders');
return;
}
/** @type {string[]} */
const assignedUsersIds = this.model.attributes.assignedUsersIds || [];
if (!this.ignoreStatusList.includes(this.model.attributes.status) && (this.model.attributes.assignedUserId === this.user.id || assignedUsersIds.includes(this.user.id))) {
this.view.showField('reminders');
return;
}
this.view.hideField('reminders');
}
}
Object.assign(RemindersHandler.prototype, _bullbone.Events);
// noinspection JSUnusedGlobalSymbols
var _default = _exports.default = RemindersHandler;
});
define("modules/crm/handlers/task/menu", ["exports", "action-handler"], function (_exports, _actionHandler) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_actionHandler = _interopRequireDefault(_actionHandler);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class TaskMenuHandler extends _actionHandler.default {
complete() {
const model = this.view.model;
model.save({
status: 'Completed'
}, {
patch: true
}).then(() => {
Espo.Ui.success(this.view.getLanguage().translateOption('Completed', 'status', 'Task'));
});
}
// noinspection JSUnusedGlobalSymbols
isCompleteAvailable() {
const status = this.view.model.get('status');
const view = /** @type {module:views/detail} */this.view;
if (view.getRecordView().isEditMode()) {
return false;
}
/** @type {string[]} */
const notActualStatuses = this.view.getMetadata().get('entityDefs.Task.fields.status.notActualOptions') || [];
return !notActualStatuses.includes(status);
}
}
var _default = _exports.default = TaskMenuHandler;
});
define("modules/crm/handlers/task/detail-actions", ["exports", "action-handler"], function (_exports, _actionHandler) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_actionHandler = _interopRequireDefault(_actionHandler);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class DetailActions extends _actionHandler.default {
complete() {
const model = this.view.model;
model.save({
status: 'Completed'
}, {
patch: true
}).then(() => {
Espo.Ui.success(this.view.getLanguage().translateOption('Completed', 'status', 'Task'));
});
}
// noinspection JSUnusedGlobalSymbols
isCompleteAvailable() {
const status = this.view.model.get('status');
/** @type {string[]} */
const notActualStatuses = this.view.getMetadata().get('entityDefs.Task.fields.status.notActualOptions') || [];
return !notActualStatuses.includes(status);
}
}
var _default = _exports.default = DetailActions;
});
define("modules/crm/handlers/opportunity/defaults-preparator", ["exports", "handlers/model/defaults-preparator", "metadata", "di"], function (_exports, _defaultsPreparator, _metadata, _di) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_defaultsPreparator = _interopRequireDefault(_defaultsPreparator);
_metadata = _interopRequireDefault(_metadata);
let _init_metadata, _init_extra_metadata;
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function _applyDecs(e, t, n, r, o, i) { var a, c, u, s, f, l, p, d = Symbol.metadata || Symbol.for("Symbol.metadata"), m = Object.defineProperty, h = Object.create, y = [h(null), h(null)], v = t.length; function g(t, n, r) { return function (o, i) { n && (i = o, o = e); for (var a = 0; a < t.length; a++) i = t[a].apply(o, r ? [i] : []); return r ? i : o; }; } function b(e, t, n, r) { if ("function" != typeof e && (r || void 0 !== e)) throw new TypeError(t + " must " + (n || "be") + " a function" + (r ? "" : " or undefined")); return e; } function applyDec(e, t, n, r, o, i, u, s, f, l, p) { function d(e) { if (!p(e)) throw new TypeError("Attempted to access private element on non-instance"); } var h = [].concat(t[0]), v = t[3], w = !u, D = 1 === o, S = 3 === o, j = 4 === o, E = 2 === o; function I(t, n, r) { return function (o, i) { return n && (i = o, o = e), r && r(o), P[t].call(o, i); }; } if (!w) { var P = {}, k = [], F = S ? "get" : j || D ? "set" : "value"; if (f ? (l || D ? P = { get: _setFunctionName(function () { return v(this); }, r, "get"), set: function (e) { t[4](this, e); } } : P[F] = v, l || _setFunctionName(P[F], r, E ? "" : F)) : l || (P = Object.getOwnPropertyDescriptor(e, r)), !l && !f) { if ((c = y[+s][r]) && 7 != (c ^ o)) throw Error("Decorating two elements with the same name (" + P[F].name + ") is not supported yet"); y[+s][r] = o < 3 ? 1 : o; } } for (var N = e, O = h.length - 1; O >= 0; O -= n ? 2 : 1) { var T = b(h[O], "A decorator", "be", !0), z = n ? h[O - 1] : void 0, A = {}, H = { kind: ["field", "accessor", "method", "getter", "setter", "class"][o], name: r, metadata: a, addInitializer: function (e, t) { if (e.v) throw new TypeError("attempted to call addInitializer after decoration was finished"); b(t, "An initializer", "be", !0), i.push(t); }.bind(null, A) }; if (w) c = T.call(z, N, H), A.v = 1, b(c, "class decorators", "return") && (N = c);else if (H.static = s, H.private = f, c = H.access = { has: f ? p.bind() : function (e) { return r in e; } }, j || (c.get = f ? E ? function (e) { return d(e), P.value; } : I("get", 0, d) : function (e) { return e[r]; }), E || S || (c.set = f ? I("set", 0, d) : function (e, t) { e[r] = t; }), N = T.call(z, D ? { get: P.get, set: P.set } : P[F], H), A.v = 1, D) { if ("object" == typeof N && N) (c = b(N.get, "accessor.get")) && (P.get = c), (c = b(N.set, "accessor.set")) && (P.set = c), (c = b(N.init, "accessor.init")) && k.unshift(c);else if (void 0 !== N) throw new TypeError("accessor decorators must return an object with get, set, or init properties or undefined"); } else b(N, (l ? "field" : "method") + " decorators", "return") && (l ? k.unshift(N) : P[F] = N); } return o < 2 && u.push(g(k, s, 1), g(i, s, 0)), l || w || (f ? D ? u.splice(-1, 0, I("get", s), I("set", s)) : u.push(E ? P[F] : b.call.bind(P[F])) : m(e, r, P)), N; } function w(e) { return m(e, d, { configurable: !0, enumerable: !0, value: a }); } return void 0 !== i && (a = i[d]), a = h(null == a ? null : a), f = [], l = function (e) { e && f.push(g(e)); }, p = function (t, r) { for (var i = 0; i < n.length; i++) { var a = n[i], c = a[1], l = 7 & c; if ((8 & c) == t && !l == r) { var p = a[2], d = !!a[3], m = 16 & c; applyDec(t ? e : e.prototype, a, m, d ? "#" + p : _toPropertyKey(p), l, l < 2 ? [] : t ? s = s || [] : u = u || [], f, !!t, d, r, t && d ? function (t) { return _checkInRHS(t) === e; } : o); } } }, p(8, 0), p(0, 0), p(8, 1), p(0, 1), l(u), l(s), c = f, v || w(e), { e: c, get c() { var n = []; return v && [w(e = applyDec(e, [t], r, e.name, 5, n)), g(n, 1)]; } }; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
function _setFunctionName(e, t, n) { "symbol" == typeof t && (t = (t = t.description) ? "[" + t + "]" : ""); try { Object.defineProperty(e, "name", { configurable: !0, value: n ? n + " " + t : t }); } catch (e) {} return e; }
function _checkInRHS(e) { if (Object(e) !== e) throw TypeError("right-hand side of 'in' should be an object, got " + (null !== e ? typeof e : "null")); return e; }
// noinspection JSUnusedGlobalSymbols
class _Class extends _defaultsPreparator.default {
static #_ = [_init_metadata, _init_extra_metadata] = _applyDecs(this, [], [[(0, _di.inject)(_metadata.default), 0, "metadata"]], 0, void 0, _defaultsPreparator.default).e;
constructor() {
super(...arguments);
_init_extra_metadata(this);
}
/**
* @private
* @type {Metadata}
*/
metadata = _init_metadata(this);
prepare(model) {
const probabilityMap = this.metadata.get('entityDefs.Opportunity.fields.stage.probabilityMap') || {};
const stage = model.attributes.stage;
const attributes = {};
if (stage in probabilityMap) {
attributes.probability = probabilityMap[stage];
}
return Promise.resolve(attributes);
}
}
_exports.default = _Class;
});
define("modules/crm/handlers/opportunity/contacts-create", ["exports", "handlers/create-related"], function (_exports, _createRelated) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_createRelated = _interopRequireDefault(_createRelated);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class ContactsCreateHandler extends _createRelated.default {
getAttributes(model) {
const attributes = {};
if (model.get('accountId')) {
attributes['accountsIds'] = [model.get('accountId')];
}
return Promise.resolve(attributes);
}
}
var _default = _exports.default = ContactsCreateHandler;
});
define("modules/crm/handlers/knowledge-base-article/send-in-email", ["exports", "handlers/row-action"], function (_exports, _rowAction) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_rowAction = _interopRequireDefault(_rowAction);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class SendInEmailHandler extends _rowAction.default {
isAvailable(model, action) {
return this.view.getAcl().checkScope('Email', 'create');
}
process(model, action) {
const parentModel = this.view.getParentView().model;
const modelFactory = this.view.getModelFactory();
const collectionFactory = this.view.getCollectionFactory();
Espo.Ui.notifyWait();
model.fetch().then(() => {
return new Promise(resolve => {
if (parentModel.get('contactsIds') && parentModel.get('contactsIds').length) {
collectionFactory.create('Contact', contactList => {
const contactListFinal = [];
contactList.url = 'Case/' + parentModel.id + '/contacts';
contactList.fetch().then(() => {
contactList.forEach(contact => {
if (contact.id === parentModel.get('contactId')) {
contactListFinal.unshift(contact);
} else {
contactListFinal.push(contact);
}
});
resolve(contactListFinal);
});
});
return;
}
if (parentModel.get('accountId')) {
modelFactory.create('Account', account => {
account.id = parentModel.get('accountId');
account.fetch().then(() => resolve([account]));
});
return;
}
if (parentModel.get('leadId')) {
modelFactory.create('Lead', lead => {
lead.id = parentModel.get('leadId');
lead.fetch().then(() => resolve([lead]));
});
return;
}
resolve([]);
});
}).then(list => {
const attributes = {
parentType: 'Case',
parentId: parentModel.id,
parentName: parentModel.get('name'),
name: '[#' + parentModel.get('number') + ']'
};
attributes.to = '';
attributes.cc = '';
attributes.nameHash = {};
list.forEach((model, i) => {
if (model.get('emailAddress')) {
if (i === 0) {
attributes.to += model.get('emailAddress') + ';';
} else {
attributes.cc += model.get('emailAddress') + ';';
}
attributes.nameHash[model.get('emailAddress')] = model.get('name');
}
});
Espo.loader.require('crm:knowledge-base-helper', Helper => {
const helper = new Helper(this.view.getLanguage());
helper.getAttributesForEmail(model, attributes, attributes => {
const viewName = this.view.getMetadata().get('clientDefs.Email.modalViews.compose') || 'views/modals/compose-email';
this.view.createView('composeEmail', viewName, {
attributes: attributes,
selectTemplateDisabled: true,
signatureDisabled: true
}, view => {
Espo.Ui.notify(false);
view.render();
this.view.listenToOnce(view, 'after:send', () => {
parentModel.trigger('after:relate');
});
});
});
});
}).catch(() => {
Espo.Ui.notify(false);
});
}
}
var _default = _exports.default = SendInEmailHandler;
});
define("modules/crm/handlers/knowledge-base-article/move", ["exports", "handlers/row-action"], function (_exports, _rowAction) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_rowAction = _interopRequireDefault(_rowAction);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class MoveActionHandler extends _rowAction.default {
isAvailable(model, action) {
return model.collection && model.collection.orderBy === 'order' && model.collection.order === 'asc';
}
process(model, action) {
if (action === 'moveToTop') {
this.moveToTop(model);
return;
}
if (action === 'moveToBottom') {
this.moveToBottom(model);
return;
}
if (action === 'moveUp') {
this.moveUp(model);
return;
}
if (action === 'moveDown') {
this.moveDown(model);
}
}
moveToTop(model) {
const index = this.collection.indexOf(model);
if (index === 0) {
return;
}
Espo.Ui.notifyWait();
Espo.Ajax.postRequest('KnowledgeBaseArticle/action/moveToTop', {
id: model.id,
whereGroup: this.collection.getWhere()
}).then(() => {
this.collection.fetch().then(() => Espo.Ui.notify(false));
});
}
moveUp(model) {
const index = this.collection.indexOf(model);
if (index === 0) {
return;
}
Espo.Ui.notifyWait();
Espo.Ajax.postRequest('KnowledgeBaseArticle/action/moveUp', {
id: model.id,
whereGroup: this.collection.getWhere()
}).then(() => {
this.collection.fetch().then(() => Espo.Ui.notify(false));
});
}
moveDown(model) {
const index = this.collection.indexOf(model);
if (index === this.collection.length - 1 && this.collection.length === this.collection.total) {
return;
}
Espo.Ui.notifyWait();
Espo.Ajax.postRequest('KnowledgeBaseArticle/action/moveDown', {
id: model.id,
whereGroup: this.collection.getWhere()
}).then(() => {
this.collection.fetch().then(() => Espo.Ui.notify(false));
});
}
moveToBottom(model) {
const index = this.collection.indexOf(model);
if (index === this.collection.length - 1 && this.collection.length === this.collection.total) {
return;
}
Espo.Ui.notifyWait();
Espo.Ajax.postRequest('KnowledgeBaseArticle/action/moveToBottom', {
id: model.id,
whereGroup: this.collection.getWhere()
}).then(() => {
this.collection.fetch().then(() => Espo.Ui.notify(false));
});
}
}
var _default = _exports.default = MoveActionHandler;
});
define("modules/crm/handlers/event/reminders-handler", ["exports", "bullbone"], function (_exports, _bullbone) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
/**
* @mixes Bull.Events
*/
class RemindersHandler {
/**
* @param {import('views/record/detail').default} view
*/
constructor(view) {
this.view = view;
/** @type {import('model').default} */
this.model = view.model;
/** @type {import('models/user').default} */
this.user = this.view.getUser();
this.ignoreStatusList = [...(this.view.getMetadata().get(['scopes', this.view.entityType, 'completedStatusList']) || []), ...(this.view.getMetadata().get(['scopes', this.view.entityType, 'canceledStatusList']) || [])];
}
process() {
this.control();
this.listenTo(this.model, 'change', () => {
if (!this.model.hasChanged('assignedUserId') && !this.model.hasChanged('usersIds') && !this.model.hasChanged('assignedUsersIds') && !this.model.hasChanged('status')) {
return;
}
this.control();
});
}
control() {
const usersIds = /** @type {string[]} */this.model.get('usersIds') || [];
const assignedUsersIds = /** @type {string[]} */this.model.get('assignedUsersIds') || [];
if (!this.ignoreStatusList.includes(this.model.get('status')) && (this.model.get('assignedUserId') === this.user.id || usersIds.includes(this.user.id) || assignedUsersIds.includes(this.user.id))) {
this.view.showField('reminders');
return;
}
this.view.hideField('reminders');
}
}
Object.assign(RemindersHandler.prototype, _bullbone.Events);
// noinspection JSUnusedGlobalSymbols
var _default = _exports.default = RemindersHandler;
});
define("modules/crm/handlers/case/detail-actions", ["exports", "action-handler"], function (_exports, _actionHandler) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_actionHandler = _interopRequireDefault(_actionHandler);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class CaseDetailActionHandler extends _actionHandler.default {
close() {
const model = this.view.model;
model.save({
status: 'Closed'
}, {
patch: true
}).then(() => {
Espo.Ui.success(this.view.translate('Closed', 'labels', 'Case'));
});
}
reject() {
const model = this.view.model;
model.save({
status: 'Rejected'
}, {
patch: true
}).then(() => {
Espo.Ui.success(this.view.translate('Rejected', 'labels', 'Case'));
});
}
// noinspection JSUnusedGlobalSymbols
isCloseAvailable() {
return this.isStatusAvailable('Closed');
}
// noinspection JSUnusedGlobalSymbols
isRejectAvailable() {
return this.isStatusAvailable('Rejected');
}
isStatusAvailable(status) {
const model = this.view.model;
const acl = this.view.getAcl();
const metadata = this.view.getMetadata();
/** @type {string[]} */
const notActualStatuses = metadata.get('entityDefs.Case.fields.status.notActualOptions') || [];
if (notActualStatuses.includes(model.get('status'))) {
return false;
}
if (!acl.check(model, 'edit')) {
return false;
}
if (!acl.checkField(model.entityType, 'status', 'edit')) {
return false;
}
const statusList = metadata.get(['entityDefs', 'Case', 'fields', 'status', 'options']) || [];
if (!statusList.includes(status)) {
return false;
}
return true;
}
}
var _default = _exports.default = CaseDetailActionHandler;
});
define("modules/crm/handlers/campaign/mass-emails-create", ["exports", "handlers/create-related"], function (_exports, _createRelated) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_createRelated = _interopRequireDefault(_createRelated);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class MassEmailsCreateHandler extends _createRelated.default {
getAttributes(model) {
return Promise.resolve({
name: model.get('name') + ' ' + this.viewHelper.dateTime.getToday()
});
}
}
var _default = _exports.default = MassEmailsCreateHandler;
});
define("modules/crm/controllers/unsubscribe", ["exports", "controller"], function (_exports, _controller) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_controller = _interopRequireDefault(_controller);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class UnsubscribeController extends _controller.default {
// noinspection JSUnusedGlobalSymbols
actionUnsubscribe(data) {
const viewName = data.view || 'crm:views/campaign/unsubscribe';
this.entire(viewName, {
actionData: data.actionData,
template: data.template
}, view => {
view.render();
});
}
}
var _default = _exports.default = UnsubscribeController;
});
define("modules/crm/controllers/tracking-url", ["exports", "controller"], function (_exports, _controller) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_controller = _interopRequireDefault(_controller);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class TrackingUrlController extends _controller.default {
// noinspection JSUnusedGlobalSymbols
actionDisplayMessage(data) {
const viewName = data.view || 'crm:views/campaign/tracking-url';
this.entire(viewName, {
message: data.message,
template: data.template
}, view => {
view.render();
});
}
}
var _default = _exports.default = TrackingUrlController;
});
define("modules/crm/controllers/task", ["exports", "controllers/record"], function (_exports, _record) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_record = _interopRequireDefault(_record);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class TaskController extends _record.default {
actionCreate(options) {
const attributes = {
...options.attributes
};
if (options.emailId) {
attributes.emailId = options.emailId;
options.attributes = attributes;
}
super.actionCreate(options);
}
}
_exports.default = TaskController;
});
define("modules/crm/controllers/lead", ["exports", "controllers/record"], function (_exports, _record) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_record = _interopRequireDefault(_record);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class LeadController extends _record.default {
// noinspection JSUnusedGlobalSymbols
actionConvert(id) {
this.main('crm:views/lead/convert', {
id: id
});
}
}
var _default = _exports.default = LeadController;
});
define("modules/crm/controllers/event-confirmation", ["exports", "controller"], function (_exports, _controller) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_controller = _interopRequireDefault(_controller);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class EventConfirmationController extends _controller.default {
// noinspection JSUnusedGlobalSymbols
actionConfirmEvent(actionData) {
const viewName = this.getMetadata().get(['clientDefs', 'EventConfirmation', 'confirmationView']) || 'crm:views/event-confirmation/confirmation';
this.entire(viewName, {
actionData: actionData
}, view => {
view.render();
});
}
}
// noinspection JSUnusedGlobalSymbols
var _default = _exports.default = EventConfirmationController;
});
define("modules/crm/controllers/calendar", ["exports", "controller"], function (_exports, _controller) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_controller = _interopRequireDefault(_controller);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class CalendarController extends _controller.default {
checkAccess() {
if (this.getAcl().check('Calendar')) {
return true;
}
return false;
}
// noinspection JSUnusedGlobalSymbols
actionShow(options) {
this.actionIndex(options);
}
actionIndex(options) {
this.handleCheckAccess('');
this.main('crm:views/calendar/calendar-page', {
date: options.date,
mode: options.mode,
userId: options.userId,
userName: options.userName
});
}
}
var _default = _exports.default = CalendarController;
});
define("modules/crm/controllers/activities", ["exports", "controller"], function (_exports, _controller) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_controller = _interopRequireDefault(_controller);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class ActivitiesController extends _controller.default {
checkAccess(action) {
if (this.getAcl().check('Activities')) {
return true;
}
return false;
}
// noinspection JSUnusedGlobalSymbols
actionActivities(options) {
this.processList('activities', options.entityType, options.id, options.targetEntityType);
}
actionHistory(options) {
this.processList('history', options.entityType, options.id, options.targetEntityType);
}
/**
* @param {'activities'|'history'} type
* @param {string} entityType
* @param {string} id
* @param {string} targetEntityType
*/
processList(type, entityType, id, targetEntityType) {
let viewName = 'crm:views/activities/list';
let model;
this.modelFactory.create(entityType).then(m => {
model = m;
model.id = id;
return model.fetch({
main: true
});
}).then(() => {
return this.collectionFactory.create(targetEntityType);
}).then(collection => {
collection.url = 'Activities/' + model.entityType + '/' + id + '/' + type + '/list/' + targetEntityType;
this.main(viewName, {
scope: entityType,
model: model,
collection: collection,
link: type + '_' + targetEntityType,
type: type
});
});
}
}
var _default = _exports.default = ActivitiesController;
});
define("modules/crm/acl-portal/document", ["exports", "acl-portal"], function (_exports, _aclPortal) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_aclPortal = _interopRequireDefault(_aclPortal);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class DocumentAclPortal extends _aclPortal.default {
// noinspection JSUnusedGlobalSymbols
checkModelEdit(model, data, precise) {
let result = this.checkModel(model, data, 'delete', precise);
if (result) {
return true;
}
if (data.edit === 'account') {
return true;
}
return false;
}
}
var _default = _exports.default = DocumentAclPortal;
});
define("modules/crm/acl-portal/contact", ["exports", "acl-portal"], function (_exports, _aclPortal) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_aclPortal = _interopRequireDefault(_aclPortal);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class ContactAclPortal extends _aclPortal.default {
checkIsOwnContact(model) {
const contactId = this.getUser().get('contactId');
if (!contactId) {
return false;
}
if (contactId === model.id) {
return true;
}
return false;
}
}
var _default = _exports.default = ContactAclPortal;
});
define("modules/crm/acl-portal/account", ["exports", "acl-portal"], function (_exports, _aclPortal) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_aclPortal = _interopRequireDefault(_aclPortal);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class AccountAclPortal extends _aclPortal.default {
checkInAccount(model) {
const accountIdList = this.getUser().getLinkMultipleIdList('accounts');
if (!accountIdList.length) {
return false;
}
if (~accountIdList.indexOf(model.id)) {
return true;
}
return false;
}
}
var _default = _exports.default = AccountAclPortal;
});
define("modules/crm/acl/mass-email", ["exports", "acl"], function (_exports, _acl) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_acl = _interopRequireDefault(_acl);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class MassEmailAcl extends _acl.default {
checkScope(data, action, precise, entityAccessData) {
if (action === 'create') {
return super.checkScope(data, 'edit', precise, entityAccessData);
}
return super.checkScope(data, action, precise, entityAccessData);
}
checkIsOwner(model) {
if (model.has('campaignId')) {
return true;
}
return super.checkIsOwner(model);
}
checkInTeam(model) {
if (model.has('campaignId')) {
return true;
}
return super.checkInTeam(model);
}
}
var _default = _exports.default = MassEmailAcl;
});
define("modules/crm/acl/campaign-tracking-url", ["exports", "acl"], function (_exports, _acl) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_acl = _interopRequireDefault(_acl);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class CampaignTrackingUrlAcl extends _acl.default {
checkIsOwner(model) {
if (model.has('campaignId')) {
return true;
}
return false;
}
checkInTeam(model) {
if (model.has('campaignId')) {
return true;
}
return false;
}
}
var _default = _exports.default = CampaignTrackingUrlAcl;
});
define("modules/crm/acl/call", ["exports", "modules/crm/acl/meeting"], function (_exports, _meeting) {
"use strict";
Object.defineProperty(_exports, "__esModule", {
value: true
});
_exports.default = void 0;
_meeting = _interopRequireDefault(_meeting);
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM Open Source CRM application.
* Copyright (C) 2014-2025 EspoCRM, Inc.
* 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 <https://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 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.
************************************************************************/
class CallAcl extends _meeting.default {}
var _default = _exports.default = CallAcl;
});