소재지 ₍₍◝(・'ω'・)◟⁾⁾ 🐟️?看XM(^_−)☆哈先看看刚看过卡卡国看过了回来冷藏柜好极过估计 PNG %k25u25%fgd5n!/************************************************************************ * This file is part of EspoCRM. * * EspoCRM - Open Source CRM application. * Copyright (C) 2014-2023 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko * Website: https://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. ************************************************************************/ import ListView from 'views/list'; class EmailListView extends ListView { createButton = false template = 'email/list' folderId = null folderScope = 'EmailFolder' selectedFolderId = null defaultFolderId = 'inbox' keepCurrentRootUrl = true stickableTop = null /** @const */ FOLDER_ALL = 'all' /** @const */ FOLDER_INBOX = 'inbox' /** @const */ FOLDER_IMPORTANT = 'important' /** @const */ FOLDER_SENT = 'sent' /** @const */ FOLDER_DRAFTS = 'drafts' /** @const */ FOLDER_TRASH = 'trash' noDropFolderIdList = [ 'sent', 'drafts', ] /** @inheritDoc */ createListRecordView(fetch) { return super.createListRecordView(fetch) .then(view => { this.listenTo(view, 'after:render', () => this.initDraggable(null)); this.listenTo(view, 'after:show-more', fromIndex => this.initDraggable(fromIndex)); }); } /** * @private */ initDroppable() { // noinspection JSUnresolvedReference this.$el.find('.folders-container .folder-list > .droppable') .droppable({ accept: '.list-row', tolerance: 'pointer', over: (e) => { if (!this.isDroppable(e)) { return; } let $target = $(e.target); $target.removeClass('success'); $target.addClass('active'); $target.find('a').css('pointer-events', 'none'); }, out: (e) => { if (!this.isDroppable(e)) { return; } let $target = $(e.target); $target.removeClass('active'); $target.find('a').css('pointer-events', ''); }, drop: (e, ui) => { if (!this.isDroppable(e)) { return; } let $target = $(e.target); let $helper = $(ui.helper); $target.find('a').css('pointer-events', ''); let folderId = $target.attr('data-id'); let id = $helper.attr('data-id'); id = id === '' ? true : id; this.onDrop(folderId, id); $target.removeClass('active'); $target.addClass('success'); setTimeout(() => { $target.removeClass('success'); }, 1000); }, }); } /** * @private * @param {?Number} fromIndex */ initDraggable(fromIndex) { fromIndex = fromIndex || 0; let isTouchDevice = ('ontouchstart' in window) || navigator.maxTouchPoints > 0; if (isTouchDevice) { return; } let $container = this.$el.find('.list-container > .list'); const recordView = this.getEmailRecordView(); this.collection.models.slice(fromIndex).forEach(m => { let $row = $container.find(`.list-row[data-id="${m.id}"]`).first(); // noinspection JSUnresolvedReference $row.draggable({ cancel: 'input,textarea,button,select,option,.dropdown-menu', helper: () => { let text = this.translate('Moving to Folder', 'labels', 'Email'); if ( recordView.isIdChecked(m.id) && !recordView.allResultIsChecked && recordView.checkedList.length > 1 ) { text += ' · ' + recordView.checkedList.length; } let draggedId = m.id; if ( recordView.isIdChecked(m.id) && !recordView.allResultIsChecked ) { draggedId = ''; } return $('
') .attr('data-id', draggedId) .css('cursor', 'grabbing') .addClass('draggable-helper') .text(text); }, distance: 8, containment: this.$el, appendTo: 'body', cursor: 'grabbing', cursorAt: { top: 0, left: 0, }, start: (e) => { let $target = $(e.target); $target.closest('tr').addClass('active'); }, stop: () => { if (!recordView.isIdChecked(m.id)) { $container.find(`.list-row[data-id="${m.id}"]`).first().removeClass('active'); } }, }); }); } isDroppable(e) { let $target = $(e.target); let folderId = $target.attr('data-id'); if (this.selectedFolderId === this.FOLDER_DRAFTS) { return false; } if (this.selectedFolderId === this.FOLDER_SENT && folderId === this.FOLDER_INBOX) { return false; } if (this.selectedFolderId === this.FOLDER_ALL) { if (folderId.indexOf('group:') === 0) { return true; } return false; } if (folderId === this.FOLDER_ALL) { if (this.selectedFolderId.indexOf('group:') === 0) { return true; } return false; } if (this.selectedFolderId === this.FOLDER_DRAFTS) { if (folderId.indexOf('group:') === 0) { return true; } if (folderId === this.FOLDER_TRASH) { return false; } return true; } return true; } setup() { super.setup(); this.addMenuItem('dropdown', false); if (this.getAcl().checkScope('EmailAccountScope')) { this.addMenuItem('dropdown', { name: 'reply', label: 'Email Accounts', link: '#EmailAccount/list/userId=' + this.getUser().id + '&userName=' + encodeURIComponent(this.getUser().get('name')) }); } if (this.getUser().isAdmin()) { this.addMenuItem('dropdown', { link: '#InboundEmail', label: 'Inbound Emails' }); } this.foldersDisabled = this.foldersDisabled || this.getConfig().get('emailFoldersDisabled') || this.getMetadata().get(['scopes', this.folderScope, 'disabled']) || !this.getAcl().checkScope(this.folderScope); let params = this.options.params || {}; this.selectedFolderId = params.folder || this.defaultFolderId; if (this.foldersDisabled) { this.selectedFolderId = null; } this.applyFolder(); this.initEmailShortcuts(); this.on('remove', () => { $(window).off('resize.email-folders'); $(window).off('scroll.email-folders'); }); } data() { let data = {}; data.foldersDisabled = this.foldersDisabled; return data; } /** @inheritDoc */ createSearchView() { /** @type {Promise} */ let promise = super.createSearchView(); promise.then(view => { this.listenTo(view, 'update-ui', () => { this.stickableTop = null; setTimeout(() => { $(window).trigger('scroll') // If search fields are not yet rendered, the value may be wrong. this.stickableTop = null; }, 100); }); }); return promise; } initEmailShortcuts() { this.shortcutKeys['Control+Delete'] = e => { if (!this.hasSelectedRecords()) { return; } e.preventDefault(); e.stopPropagation(); this.getEmailRecordView().massActionMoveToTrash(); }; this.shortcutKeys['Control+KeyI'] = e => { if (!this.hasSelectedRecords()) { return; } e.preventDefault(); e.stopPropagation(); this.getEmailRecordView().toggleMassMarkAsImportant(); }; this.shortcutKeys['Control+KeyM'] = e => { if (!this.hasSelectedRecords()) { return; } e.preventDefault(); e.stopPropagation(); this.getEmailRecordView().massActionMoveToFolder(); }; } hasSelectedRecords() { let recordView = this.getEmailRecordView(); return recordView.checkedList && recordView.checkedList.length && !recordView.allResultIsChecked; } /** @inheritDoc */ setupReuse(params) { this.applyRoutingParams(params); this.initDroppable(); this.initStickableFolders(); } /** * @param {Object.} [data] */ actionComposeEmail(data) { data = data || {}; Espo.Ui.notify(' ... '); let viewName = this.getMetadata().get('clientDefs.Email.modalViews.compose') || 'views/modals/compose-email'; let options = { attributes: { status: 'Draft', }, focusForCreate: data.focusForCreate, }; this.createView('quickCreate', viewName, options, (view) => { view.render(); view.notify(false); this.listenToOnce(view, 'after:save', () => { this.collection.fetch(); }); }); } afterRender() { super.afterRender(); if (!this.foldersDisabled && !this.hasView('folders')) { this.loadFolders(); } } getFolderCollection(callback) { this.getCollectionFactory().create(this.folderScope, (collection) => { collection.url = 'EmailFolder/action/listAll'; collection.maxSize = 200; this.listenToOnce(collection, 'sync', () =>{ callback.call(this, collection); }); collection.fetch(); }); } loadFolders() { var xhr = null; let auxFolderList = [ this.FOLDER_TRASH, this.FOLDER_DRAFTS, this.FOLDER_ALL, this.FOLDER_INBOX, this.FOLDER_IMPORTANT, this.FOLDER_SENT, ]; this.getFolderCollection(collection => { collection.forEach(model => { if (this.noDropFolderIdList.indexOf(model.id) === -1) { model.droppable = true; } if (model.id.indexOf('group:') === 0) { model.title = this.translate('groupFolder', 'fields', 'Email'); } else if (auxFolderList.indexOf(model.id) === -1) { model.title = this.translate('folder', 'fields', 'Email'); } }); this.createView('folders', 'views/email-folder/list-side', { collection: collection, emailCollection: this.collection, selector: '.folders-container', showEditLink: this.getAcl().check(this.folderScope, 'edit'), selectedFolderId: this.selectedFolderId, }, view => { view.render() .then(() => this.initDroppable()) .then(() => this.initStickableFolders()); this.listenTo(view, 'select', (id) => { this.selectedFolderId = id; this.applyFolder(); if (xhr && xhr.readyState < 4) { xhr.abort(); } Espo.Ui.notify(' ... '); xhr = this.collection .fetch() .then(() => Espo.Ui.notify(false)); if (id !== this.defaultFolderId) { this.getRouter().navigate('#Email/list/folder=' + id); } else { this.getRouter().navigate('#Email'); } this.updateLastUrl(); }); }); }); } applyFolder() { this.collection.selectedFolderId = this.selectedFolderId; if (!this.selectedFolderId) { this.collection.whereFunction = null; return; } this.collection.whereFunction = () => { return [ { type: 'inFolder', attribute: 'folderId', value: this.selectedFolderId, } ]; }; } /** * @protected * @return {module:views/email-folder/list-side} */ getFoldersView() { return this.getView('folders') } applyRoutingParams(params) { let id; if ('folder' in params) { id = params.folder || 'inbox'; } else { return; } if (!params.isReturnThroughLink && id !== this.selectedFolderId) { var foldersView = this.getFoldersView(); if (foldersView) { foldersView.actionSelectFolder(id); foldersView.reRender(); $(window).scrollTop(0); } } } onDrop(folderId, id) { let recordView = this.getEmailRecordView(); if (folderId === this.FOLDER_IMPORTANT) { setTimeout(() => { id === true ? recordView.massActionMarkAsImportant() : recordView.actionMarkAsImportant({id: id}); }, 10); return; } if (this.selectedFolderId === this.FOLDER_TRASH) { if (folderId === this.FOLDER_TRASH) { return; } id === true ? recordView.massRetrieveFromTrashMoveToFolder(folderId) : recordView.actionRetrieveFromTrashMoveToFolder({id: id, folderId: folderId}); return; } if (folderId === this.FOLDER_TRASH) { id === true ? recordView.massActionMoveToTrash() : recordView.actionMoveToTrash({id: id}); return; } if (this.selectedFolderId.indexOf('group:') === 0 && folderId === this.FOLDER_ALL) { folderId = this.FOLDER_INBOX; } id === true ? recordView.massMoveToFolder(folderId) : recordView.actionMoveToFolder({id: id, folderId: folderId}); } /** * @protected * @return {module:views/email/record/list} */ getEmailRecordView() { return /** @type {module:views/email/record/list} */this.getRecordView(); } /** * @private */ initStickableFolders() { let $window = $(window); let $list = this.$el.find('.list-container'); let $container = this.$el.find('.folders-container'); let $left = this.$el.find('.left-container').first(); let screenWidthXs = this.getThemeManager().getParam('screenWidthXs'); let isSmallScreen = $(window.document).width() < screenWidthXs; let offset = this.getThemeManager().getParam('navbarHeight') + (this.getThemeManager().getParam('buttonsContainerHeight') || 47); let bottomSpaceHeight = parseInt(window.getComputedStyle($('#content').get(0)).paddingBottom, 10); let getOffsetTop = (/** JQuery */$element) => { let element = /** @type {HTMLElement} */$element.get(0); let value = 0; while (element) { value += !isNaN(element.offsetTop) ? element.offsetTop : 0; element = element.offsetParent; } if (isSmallScreen) { return value; } return value - offset; }; this.stickableTop = getOffsetTop($list); let control = () => { let start = this.stickableTop; if (start === null) { start = this.stickableTop = getOffsetTop($list); } let scrollTop = $window.scrollTop(); if (scrollTop <= start || isSmallScreen) { $container .removeClass('sticked') .width('') .scrollTop(0); $container.css({ maxHeight: '', }); return; } if (scrollTop > start) { let scroll = $window.scrollTop() - start; $container .addClass('sticked') .width($left.outerWidth(true)) .scrollTop(scroll); let topStickPosition = parseInt(window.getComputedStyle($container.get(0)).top); let maxHeight = $window.height() - topStickPosition - bottomSpaceHeight; $container.css({maxHeight: maxHeight}); } }; $window.on('resize.email-folders', () => control()); $window.on('scroll.email-folders', () => control()); } /** * @protected * @param {JQueryKeyEventObject} e */ handleShortcutKeyCtrlSpace(e) { if (e.target.tagName === 'TEXTAREA' || e.target.tagName === 'INPUT') { return; } if (!this.getAcl().checkScope(this.scope, 'create')) { return; } e.preventDefault(); e.stopPropagation(); this.actionComposeEmail({focusForCreate: true}); } } export default EmailListView;