This repository has been archived on 2026-07-19. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
espocrm-base/client/src/views/list.js
T
2017-11-21 18:35:02 +02:00

303 lines
9.9 KiB
JavaScript

/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2017 Yuri Kuznetsov, Taras Machyshyn, Oleksiy Avramenko
* Website: http://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
Espo.define('views/list', ['views/main', 'search-manager'], function (Dep, SearchManager) {
return Dep.extend({
template: 'list',
scope: null,
name: 'List',
headerView: 'views/header',
searchView: 'views/record/search',
recordView: 'views/record/list',
searchPanel: true,
searchManager: null,
createButton: true,
quickCreate: false,
optionsToPass: [],
storeViewAfterCreate: false,
storeViewAfterUpdate: true,
setup: function () {
this.collection.maxSize = this.getConfig().get('recordsPerPage') || this.collection.maxSize;
if (this.getMetadata().get('clientDefs.' + this.scope + '.searchPanelDisabled')) {
this.searchPanel = false;
}
if (this.getMetadata().get(['clientDefs', this.scope, 'createDisabled'])) {
this.createButton = false;
}
this.entityType = this.collection.name;
this.headerView = this.options.headerView || this.headerView;
this.recordView = this.options.recordView || this.recordView;
this.searchView = this.options.searchView || this.searchView;
this.setupHeader();
if (this.searchPanel) {
this.setupSearchManager();
}
this.setupSorting();
if (this.searchPanel) {
this.setupSearchPanel();
}
if (this.createButton) {
this.setupCreateButton();
}
},
setupHeader: function () {
this.createView('header', this.headerView, {
collection: this.collection,
el: '#main > .page-header',
scope: this.scope
});
},
setupCreateButton: function () {
if (this.quickCreate) {
this.menu.buttons.unshift({
action: 'quickCreate',
label: 'Create ' + this.scope,
style: 'primary',
acl: 'create',
aclScope: this.entityType || this.scope
});
} else {
this.menu.buttons.unshift({
link: '#' + this.scope + '/create',
action: 'create',
label: 'Create ' + this.scope,
style: 'primary',
acl: 'create',
aclScope: this.entityType || this.scope
});
}
},
setupSearchPanel: function () {
this.createView('search', this.searchView, {
collection: this.collection,
el: '#main > .search-container',
searchManager: this.searchManager,
scope: this.scope
}, function (view) {
this.listenTo(view, 'reset', function () {
this.collection.sortBy = this.defaultSortBy;
this.collection.asc = this.defaultAsc;
this.getStorage().clear('listSorting', this.collection.name);
}, this);
}.bind(this));
},
getSearchDefaultData: function () {
return this.getMetadata().get('clientDefs.' + this.scope + '.defaultFilterData');
},
setupSearchManager: function () {
var collection = this.collection;
var searchManager = new SearchManager(collection, 'list', this.getStorage(), this.getDateTime(), this.getSearchDefaultData());
searchManager.scope = this.scope;
searchManager.loadStored();
collection.where = searchManager.getWhere();
this.searchManager = searchManager;
},
setupSorting: function () {
if (!this.searchPanel) return;
var collection = this.collection;
var sortingParams = this.getStorage().get('listSorting', collection.name) || {};
this.defaultSortBy = collection.sortBy;
this.defaultAsc = collection.asc;
if ('sortBy' in sortingParams) {
collection.sortBy = sortingParams.sortBy;
}
if ('asc' in sortingParams) {
collection.asc = sortingParams.asc;
}
},
getRecordViewName: function () {
return this.getMetadata().get('clientDefs.' + this.scope + '.recordViews.list') || this.recordView;
},
afterRender: function () {
if (!this.hasView('list')) {
this.loadList();
}
},
loadList: function () {
this.notify('Loading...');
if (this.collection.isFetched) {
this.createListRecordView(false);
} else {
this.listenToOnce(this.collection, 'sync', function () {
this.createListRecordView();
}, this);
this.collection.fetch();
}
},
createListRecordView: function (fetch) {
var o = {
collection: this.collection,
el: this.options.el + ' .list-container',
scope: this.scope
};
this.optionsToPass.forEach(function (option) {
o[option] = this.options[option];
}, this);
var listViewName = this.getRecordViewName();
this.createView('list', listViewName, o, function (view) {
if (!this.hasParentView()) {
view.undelegateEvents();
return;
}
view.render();
this.listenToOnce(view, 'after:render', function () {
if (!this.hasParentView()) {
view.undelegateEvents();
this.clearView('list');
}
}, this);
view.notify(false);
if (this.searchPanel) {
this.listenTo(view, 'sort', function (obj) {
this.getStorage().set('listSorting', this.collection.name, obj);
}, this);
}
if (fetch) {
setTimeout(function () {
this.collection.fetch();
}.bind(this), 2000);
}
});
},
getHeader: function () {
return this.buildHeaderHtml([
this.getLanguage().translate(this.scope, 'scopeNamesPlural')
]);
},
updatePageTitle: function () {
this.setPageTitle(this.getLanguage().translate(this.scope, 'scopeNamesPlural'));
},
getCreateAttributes: function () {},
actionQuickCreate: function () {
var attributes = this.getCreateAttributes() || {};
this.notify('Loading...');
var viewName = this.getMetadata().get('clientDefs.' + this.scope + '.modalViews.edit') || 'views/modals/edit';
var options = {
scope: this.scope,
attributes: attributes
};
if (this.storeViewAfterCreate) {
_.extend(options, {
returnUrl: '#' + this.scope,
returnDispatchParams: {
controller: this.scope,
action: null,
options: {
isReturn: true
}
}
});
}
this.createView('quickCreate', 'views/modals/edit', options, function (view) {
view.render();
view.notify(false);
this.listenToOnce(view, 'after:save', function () {
this.collection.fetch();
}, this);
}.bind(this));
},
actionCreate: function () {
var router = this.getRouter();
var url = '#' + this.scope + '/create';
var attributes = this.getCreateAttributes() || {};
var options = {
attributes: attributes
};
if (this.storeViewAfterCreate) {
_.extend(options, {
returnUrl: '#' + this.scope,
returnDispatchParams: {
controller: this.scope,
action: null,
options: {
isReturn: true
}
}
});
}
router.dispatch(this.scope, 'create', options);
router.navigate(url, {trigger: false});
}
});
});