芝麻web文件管理V1.00
编辑当前文件:/home/pulsehostuk9/www/cloud.pulsehost.co.uk/modules/MailWebclient/js/views/CMessageListView.js
'use strict'; var _ = require('underscore'), $ = require('jquery'), ko = require('knockout'), moment = require('moment'), Utils = require('%PathToCoreWebclientModule%/js/utils/Common.js'), CoreDateUtils = require('%PathToCoreWebclientModule%/js/utils/Date.js'), TextUtils = require('%PathToCoreWebclientModule%/js/utils/Text.js'), Types = require('%PathToCoreWebclientModule%/js/utils/Types.js'), Api = require('%PathToCoreWebclientModule%/js/Api.js'), App = require('%PathToCoreWebclientModule%/js/App.js'), Browser = require('%PathToCoreWebclientModule%/js/Browser.js'), CJua = require('%PathToCoreWebclientModule%/js/CJua.js'), CSelector = require('%PathToCoreWebclientModule%/js/CSelector.js'), ModulesManager = require('%PathToCoreWebclientModule%/js/ModulesManager.js'), Routing = require('%PathToCoreWebclientModule%/js/Routing.js'), Screens = require('%PathToCoreWebclientModule%/js/Screens.js'), UserSettings = require('%PathToCoreWebclientModule%/js/Settings.js'), CDateModel = require('%PathToCoreWebclientModule%/js/models/CDateModel.js'), CPageSwitcherView = require('%PathToCoreWebclientModule%/js/views/CPageSwitcherView.js'), ComposeUtils = require('modules/%ModuleName%/js/utils/Compose.js'), LinksUtils = require('modules/%ModuleName%/js/utils/Links.js'), MailUtils = require('modules/%ModuleName%/js/utils/Mail.js'), DateUtils = require('modules/%ModuleName%/js/utils/Date.js'), AccountList = require('modules/%ModuleName%/js/AccountList.js'), MailCache = require('modules/%ModuleName%/js/Cache.js'), Settings = require('modules/%ModuleName%/js/Settings.js'), CalendarUtils = require('%PathToCoreWebclientModule%/js/utils/Calendar.js') ; require("jquery-ui/ui/widgets/datepicker"); /** * @constructor * * @param {Function} fOpenMessageInNewWindowBound */ function CMessageListView(fOpenMessageInNewWindowBound) { this.disableMoveMessages = ko.computed(function () { var oFolder = MailCache.getCurrentFolder(); return oFolder ? oFolder.disableMoveFrom() : true; }, this); this.bVisibleSortByTool = Settings.MessagesSortBy.Allow && Settings.MessagesSortBy.List.length > 0; this.sSortBy = Settings.MessagesSortBy.DefaultSortBy; this.iSortOrder = Settings.MessagesSortBy.DefaultSortOrder; this.sortBy = ko.observable(Settings.MessagesSortBy.DefaultSortBy); this.sortOrder = ko.observable(Settings.MessagesSortBy.DefaultSortOrder); this.aSortList = []; _.each(Settings.MessagesSortBy.List, function (oItem) { this.aSortList.push({ sText: TextUtils.i18n('%MODULENAME%/' + oItem.LangConst), sSortBy: oItem.SortBy }); }.bind(this)); this.uploaderArea = ko.observable(null); this.bDragActive = ko.observable(false); this.bDragActiveComp = ko.computed(function () { return this.bDragActive(); }, this); this.openMessageInNewWindowBound = fOpenMessageInNewWindowBound; this.isFocused = ko.observable(false); this.messagesContainer = ko.observable(null); this.currentMessage = MailCache.currentMessage; this.currentMessage.subscribe(function () { this.isFocused(false); this.selector.itemSelected(this.currentMessage()); }, this); this.folderList = MailCache.folderList; this.folderList.subscribe(function () { setTimeout(this.onFolderListSubscribe.bind(this)); }, this); this.folderFullName = ko.observable(''); this.folderType = ko.observable(Enums.FolderTypes.User); this.filters = ko.observable(''); this.isStarredFolder = ko.computed(() => { return this.filters() === Enums.FolderFilter.Flagged; }); this.isStarredInAllFolders = ko.computed(() => { return this.isStarredFolder() && Settings.AllowChangeStarredMessagesSource && Settings.StarredMessagesSource === Enums.StarredMessagesSource.AllFolders; }); this.isStarredFolder.subscribe(() => { if (this.isStarredFolder()) { this.selectedSearchFoldersMode(this.isStarredInAllFolders() ? 'all' : ''); } }); this.allowAdvancedSearch = ko.computed(function () { return !ModulesManager.isModuleIncluded('MailNotesPlugin') || this.folderFullName() !== 'Notes'; }, this); this.searchHighlightedInputFormatted = ko.observable(''); this.searchHighlightedInput = ko.observable(''); this.searchHighlightedInput.subscribe(() => { this.searchHighlightedInputFormatted(DateUtils.formattedDateSearchHighlightedInput(this.searchHighlightedInput())) }) this.searchInput = ko.computed({ read: () => { if (this.isStarredInAllFolders()) { return `${this.searchHighlightedInputFormatted()} folders:all`; } return this.searchHighlightedInputFormatted(); }, write: (value) => { if (this.isStarredInAllFolders()) { this.searchHighlightedInput(value.replace('folders:all', '')); } else { this.searchHighlightedInput(value); } } }); this.searchInputFrom = ko.observable(''); this.searchInputTo = ko.observable(''); this.searchInputSubject = ko.observable(''); this.searchInputText = ko.observable(''); this.searchSpan = ko.observable(''); this.highlightTrigger = ko.observable(''); this.selectedSearchFoldersMode = ko.observable(''); this.selectedSearchFoldersModeText = ko.computed(function () { if (this.selectedSearchFoldersMode() === Enums.SearchFoldersMode.Sub) { return TextUtils.i18n('%MODULENAME%/LABEL_SEARCH_CURRENT_FOLDER_AND_SUBFOLDERS'); } if (this.selectedSearchFoldersMode() === Enums.SearchFoldersMode.All) { return TextUtils.i18n('%MODULENAME%/LABEL_SEARCH_ALL_FOLDERS'); } return TextUtils.i18n('%MODULENAME%/LABEL_SEARCH_CURRENT_FOLDER'); }, this); this.uidList = MailCache.uidList; this.uidList.subscribe(function () { if (this.uidList().searchCountSubscription) { this.uidList().searchCountSubscription.dispose(); this.uidList().searchCountSubscription = undefined; } this.uidList().searchCountSubscription = this.uidList().resultCount.subscribe(function () { if (this.uidList().resultCount() >= 0) { this.oPageSwitcher.setCount(this.uidList().resultCount()); } }, this); if (this.uidList().resultCount() >= 0) { this.oPageSwitcher.setCount(this.uidList().resultCount()); } }, this); this.useThreading = ko.computed(function () { var oAccount = AccountList.getCurrent(), oFolder = MailCache.getCurrentFolder(), bFolderWithoutThreads = oFolder && oFolder.withoutThreads(), bNotSearchOrFilters = this.uidList().search() === '' && this.uidList().filters() === '' ; return oAccount && oAccount.threadingIsAvailable() && !bFolderWithoutThreads && bNotSearchOrFilters; }, this); this.collection = MailCache.messages; this._search = ko.observable(''); this.search = ko.computed({ 'read': function () { return $.trim(this._search()); }, 'write': this._search, 'owner': this }); this.searchFoldersMode = ko.observable(''); this.messageListParamsChanged = ko.observable(false).extend({'autoResetToFalse': 100}); this.isEmptyList = ko.computed(function () { return this.collection().length === 0; }, this); this.isNotEmptyList = ko.computed(function () { return this.collection().length !== 0; }, this); this.isSearch = ko.computed(function () { return this.search().length > 0; }, this); this.isUnseenFilter = ko.computed(function () { return this.filters() === Enums.FolderFilter.Unseen; }, this); this.isLoading = MailCache.messagesLoading; this.isError = MailCache.messagesLoadingError; this.visibleInfoLoading = ko.computed(function () { return !this.isSearch() && this.isLoading(); }, this); this.visibleInfoSearchLoading = ko.computed(function () { return this.isSearch() && this.isLoading(); }, this); this.visibleInfoSearchList = ko.computed(function () { return this.isSearch() && !this.isUnseenFilter() && !this.isLoading() && !this.isEmptyList(); }, this); this.visibleInfoMessageListEmpty = ko.computed(function () { return !this.isLoading() && !this.isSearch() && (this.filters() === '') && this.isEmptyList() && !this.isError(); }, this); this.visibleInfoStarredFolderEmpty = ko.computed(function () { return !this.isLoading() && !this.isSearch() && this.isStarredFolder() && this.isEmptyList() && !this.isError(); }, this); this.visibleInfoSearchEmpty = ko.computed(function () { return this.isSearch() && !this.isUnseenFilter() && this.isEmptyList() && !this.isError() && !this.isLoading(); }, this); this.visibleInfoMessageListError = ko.computed(function () { return !this.isSearch() && this.isError(); }, this); this.visibleInfoSearchError = ko.computed(function () { return this.isSearch() && this.isError(); }, this); this.visibleInfoUnseenFilterList = ko.computed(function () { return this.isUnseenFilter() && (this.isLoading() || !this.isEmptyList()); }, this); this.visibleInfoUnseenFilterEmpty = ko.computed(function () { return this.isUnseenFilter() && this.isEmptyList() && !this.isError() && !this.isLoading(); }, this); this.allowClearSearch = ko.observable(true); this.searchText = ko.computed(function () { const textOptions = { 'SEARCH': this.calculateSearchStringForDescription(), 'FOLDER': MailCache.getCurrentFolder() ? TextUtils.encodeHtml(MailCache.getCurrentFolder().displayName()) : '' } ; this.allowClearSearch(true); if (this.searchFoldersMode() === Enums.SearchFoldersMode.Sub) { if (MailCache.oUnifiedInbox.selected()) { return TextUtils.i18n('%MODULENAME%/INFO_SEARCH_UNIFIED_SUBFOLDERS_RESULT', textOptions); } if ($.trim(this.search()) === 'folders:sub') { return TextUtils.i18n('%MODULENAME%/INFO_MESSAGES_FROM_SUBFOLDERS', textOptions); } return TextUtils.i18n('%MODULENAME%/INFO_SEARCH_SUBFOLDERS_RESULT', textOptions); } if (this.searchFoldersMode() === Enums.SearchFoldersMode.All) { if (MailCache.oUnifiedInbox.selected()) { return TextUtils.i18n('%MODULENAME%/INFO_SEARCH_UNIFIED_ALL_FOLDERS_RESULT', textOptions); } if ($.trim(this.search()) === 'folders:all') { if (this.isStarredFolder()) { this.allowClearSearch(false); } return TextUtils.i18n('%MODULENAME%/INFO_MESSAGES_FROM_ALL_FOLDERS', textOptions); } return TextUtils.i18n('%MODULENAME%/INFO_SEARCH_ALL_FOLDERS_RESULT', textOptions); } return TextUtils.i18n('%MODULENAME%/INFO_SEARCH_RESULT', textOptions); }, this); this.unseenFilterText = ko.computed(function () { if (this.search() === '') { return TextUtils.i18n('%MODULENAME%/INFO_UNREAD_MESSAGES', { 'FOLDER': MailCache.getCurrentFolder() ? TextUtils.encodeHtml(MailCache.getCurrentFolder().displayName()) : '' }); } else { return TextUtils.i18n('%MODULENAME%/INFO_UNREAD_MESSAGES_SEARCH_RESULT', { 'SEARCH': this.calculateSearchStringForDescription(), 'FOLDER': MailCache.getCurrentFolder() ? TextUtils.encodeHtml(MailCache.getCurrentFolder().displayName()) : '' }); } }, this); this.unseenFilterEmptyText = ko.computed(function () { if (this.search() === '') { return TextUtils.i18n('%MODULENAME%/INFO_NO_UNREAD_MESSAGES'); } else { return TextUtils.i18n('%MODULENAME%/INFO_NO_UNREAD_MESSAGES_FOUND'); } }, this); this.isEnableGroupOperations = ko.observable(false).extend({'throttle': 250}); this.selector = new CSelector( this.collection, _.bind(this.routeForMessage, this), _.bind(this.onDeletePress, this), _.bind(this.onMessageDblClick, this), _.bind(this.onEnterPress, this), null, false, false, false, false, false // don't select new item before routing executed ); this.checkedUids = ko.computed(function () { var aChecked = this.selector.listChecked(), aCheckedUids = _.map(aChecked, function (oMessage) { return oMessage.longUid(); }), oFolder = MailCache.getCurrentFolder(), aThreadCheckedUids = oFolder ? oFolder.getThreadCheckedUidsFromList(aChecked) : [], aUids = _.union(aCheckedUids, aThreadCheckedUids) ; return aUids; }, this); this.checkedOrSelectedUids = ko.computed(function () { var aChecked = this.checkedUids(); if (aChecked.length === 0 && MailCache.currentMessage() && _.isFunction(MailCache.currentMessage().deleted) && !MailCache.currentMessage().deleted()) { aChecked = [MailCache.currentMessage().longUid()]; } return aChecked; }, this); ko.computed(function () { this.isEnableGroupOperations(0 < this.selector.listCheckedOrSelected().length); }, this); this.checkAll = this.selector.koCheckAll(); this.checkAllIncomplite = this.selector.koCheckAllIncomplete(); this.pageSwitcherLocked = ko.observable(false); this.oPageSwitcher = new CPageSwitcherView(0, Settings.MailsPerPage); this.oPageSwitcher.currentPage.subscribe(function (iPage) { var sFolder = MailCache.getCurrentFolderFullname(), sUid = !App.isMobile() && this.currentMessage() ? this.currentMessage().longUid() : '', sSearch = this.search() ; if (!this.pageSwitcherLocked()) { this.changeRoutingForMessageList(sFolder, iPage, sUid, sSearch, this.filters(), this.sortBy(), this.sortOrder()); } }, this); this.currentPage = ko.observable(0); // to the message list does not twitch if (Browser.firefox || Browser.ie) { this.listChangedThrottle = ko.observable(false).extend({'throttle': 10}); } else { this.listChangedThrottle = ko.observable(false); } this.firstCompleteCollection = ko.observable(true); this.collection.subscribe(function () { if (this.collection().length > 0) { if (Types.isNonEmptyArray(this.aRouteParams)) { this.onRoute(this.aRouteParams); this.aRouteParams = []; } else { this.firstCompleteCollection(false); } } }, this); this.listChanged = ko.computed(function () { return [ this.firstCompleteCollection(), MailCache.currentAccountId(), this.folderFullName(), this.filters(), this.search(), this.oPageSwitcher.currentPage() ]; }, this); this.listChanged.subscribe(function() { this.listChangedThrottle(!this.listChangedThrottle()); }, this); this.bAdvancedSearch = ko.observable(false); this.searchAttachmentsCheckbox = ko.observable(false); this.searchAttachments = ko.observable(''); this.searchAttachments.subscribe(function(sText) { this.searchAttachmentsCheckbox(!!sText); }, this); this.searchAttachmentsFocus = ko.observable(false); this.searchFromFocus = ko.observable(false); this.searchSubjectFocus = ko.observable(false); this.searchToFocus = ko.observable(false); this.searchTextFocus = ko.observable(false); this.searchTrigger = ko.observable(null); this.searchDateStartFocus = ko.observable(false); this.searchDateEndFocus = ko.observable(false); this.searchDateStartDom = ko.observable(null); this.searchDateStartTimestamp = ko.observable(''); this.searchDateStart = ko.observable(''); this.searchDateStart.subscribe((v) => { if (v) { this.searchDateStartTimestamp(moment(v, Utils.getDateFormatForMoment(UserSettings.dateFormat())).toDate().getTime() / 1000) } }) this.searchDateEndDom = ko.observable(null); this.searchDateEndTimestamp = ko.observable(''); this.searchDateEnd = ko.observable(''); this.searchDateEnd.subscribe((v) => { if (v) { this.searchDateEndTimestamp(moment(v, Utils.getDateFormatForMoment(UserSettings.dateFormat())).toDate().getTime() / 1000) } }) this.dateFormatDatePicker = ko.computed(() => CalendarUtils.getDateFormatForDatePicker(UserSettings.dateFormat())); UserSettings.dateFormat.subscribe(() => { const dateModelStart = new CDateModel() const dateModelEnd = new CDateModel() if (this.searchDateStartTimestamp()) { dateModelStart.parse(this.searchDateStartTimestamp()) this.searchDateStart(dateModelStart.getShortDate()) } if (this.searchDateEndTimestamp()) { dateModelEnd.parse(this.searchDateEndTimestamp()) this.searchDateEnd(dateModelEnd.getShortDate()) } this.createDatePickerObject(this.searchDateStartDom(), this.searchDateStart); this.createDatePickerObject(this.searchDateEndDom(), this.searchDateEnd); this.searchHighlightedInputFormatted(DateUtils.formattedDateSearchHighlightedInput(this.searchHighlightedInput())) }); this.attachmentsPlaceholder = ko.computed(function () { return TextUtils.i18n('%MODULENAME%/LABEL_HAS_ATTACHMENTS'); }, this); this.customMessageItemViewTemplate = ko.observable('');; App.broadcastEvent('%ModuleName%::ConstructView::after', {'Name': this.ViewConstructorName, 'View': this, 'MailCache': MailCache}); } CMessageListView.prototype.ViewTemplate = '%ModuleName%_MessagesView'; CMessageListView.prototype.ViewConstructorName = 'CMessageListView'; CMessageListView.prototype.addNewAccount = function () { App.Api.createMailAccount(AccountList.getEmail()); }; CMessageListView.prototype.createDatePickerObject = function (oElement, value) { $(oElement).datepicker("destroy"); $(oElement).datepicker({ showOtherMonths: true, selectOtherMonths: true, monthNames: CoreDateUtils.getMonthNamesArray(), dayNamesMin: TextUtils.i18n('COREWEBCLIENT/LIST_DAY_NAMES_MIN').split(' '), nextText: '', prevText: '', firstDay: Types.pInt(ModulesManager.run('CalendarWebclient', 'getWeekStartsOn')), showOn: 'focus', dateFormat: this.dateFormatDatePicker(), onClose: function (sValue) { if (ko.isObservable(value)) { value(sValue); } } }); $(oElement).mousedown(function() { $('#ui-datepicker-div').toggle(); }); }; /** * @param {string} sFolder * @param {number} iPage * @param {string} sUid * @param {string} sSearch * @param {string} sFilters * @param {string} sSortBy * @param {number} iSortOrder */ CMessageListView.prototype.changeRoutingForMessageList = function (sFolder, iPage, sUid, sSearch, sFilters, sSortBy, iSortOrder) { var bSame = Routing.setHash(LinksUtils.getMailbox(sFolder, iPage, sUid, sSearch, sFilters, sSortBy, iSortOrder)); if (bSame && sSearch.length > 0 && this.search() === sSearch) { this.listChangedThrottle(!this.listChangedThrottle()); } }; /** * @param {CMessageModel} oMessage */ CMessageListView.prototype.onEnterPress = function (oMessage) { if (oMessage.threadNextLoadingVisible()) { oMessage.loadNextMessages(); } else { oMessage.openThread(); } }; /** * @param {CMessageModel} oMessage */ CMessageListView.prototype.onMessageDblClick = function (oMessage) { if (!this.isSavingDraft(oMessage)) { var oFolder = this.folderList().getFolderByFullName(oMessage.folder()), oParams = { Message: oMessage, Cancel: false } ; App.broadcastEvent('%ModuleName%::MessageDblClick::before', oParams); if (!oParams.Cancel) { if (oFolder.type() === Enums.FolderTypes.Drafts || MailCache.isTemplateFolder(oMessage.folder())) { ComposeUtils.composeMessageFromDrafts(oMessage.accountId(), oMessage.folder(), oMessage.longUid()); } else { this.openMessageInNewWindowBound(oMessage); } } } }; CMessageListView.prototype.onFolderListSubscribe = function () { this.setCurrentFolder(); this.requestMessageList(); }; /** * @param {Array} aParams */ CMessageListView.prototype.onShow = function (aParams) { this.selector.useKeyboardKeys(true); this.oPageSwitcher.show(); if (this.oJua) { this.oJua.setDragAndDropEnabledStatus(true); } }; /** * @param {Array} aParams */ CMessageListView.prototype.onHide = function (aParams) { this.selector.useKeyboardKeys(false); this.oPageSwitcher.hide(); if (this.oJua) { this.oJua.setDragAndDropEnabledStatus(false); } }; function correctSearchFromParams(filtersFromParams, searchFromParams) { if (filtersFromParams === Enums.FolderFilter.Flagged && Settings.AllowChangeStarredMessagesSource) { if ((/(^|\s)folders:all(\s|$)/).test(searchFromParams)) { if (Settings.StarredMessagesSource === Enums.StarredMessagesSource.InboxOnly) { return searchFromParams.replace('folders:all', ''); } } else { if (Settings.StarredMessagesSource === Enums.StarredMessagesSource.AllFolders) { return `${searchFromParams} folders:all`; } } } return searchFromParams; }; /** * @param {Array} aParams */ CMessageListView.prototype.onRoute = function (aParams) { var oParams = LinksUtils.parseMailbox(aParams), sCurrentFolder = this.folderFullName() || this.folderList().inboxFolderFullName(), searchFromParams = correctSearchFromParams(oParams.Filters, oParams.Search), bRouteChanged = this.currentPage() !== oParams.Page || sCurrentFolder !== oParams.Folder || this.filters() !== oParams.Filters || (oParams.Filters === Enums.FolderFilter.Unseen && MailCache.waitForUnseenMessages()) || this.search() !== searchFromParams || this.sSortBy !== oParams.SortBy || this.iSortOrder !== oParams.SortOrder, bMailsPerPageChanged = Settings.MailsPerPage !== this.oPageSwitcher.perPage() ; this.pageSwitcherLocked(true); if (sCurrentFolder !== oParams.Folder || this.search() !== searchFromParams || this.filters() !== oParams.Filters) { this.oPageSwitcher.clear(); } else { this.oPageSwitcher.setPage(oParams.Page, Settings.MailsPerPage); } this.pageSwitcherLocked(false); if (searchFromParams !== oParams.Search) { Routing.replaceHash(LinksUtils.getMailbox(oParams.Folder, this.oPageSwitcher.currentPage(), oParams.Uid, searchFromParams, oParams.Filters)); } else if (oParams.Page !== this.oPageSwitcher.currentPage()) { if (this.folderList().iAccountId === 0) { this.aRouteParams = aParams; } else { Routing.replaceHash(LinksUtils.getMailbox(oParams.Folder, this.oPageSwitcher.currentPage(), oParams.Uid, searchFromParams, oParams.Filters)); } } this.currentPage(this.oPageSwitcher.currentPage()); this.folderFullName(oParams.Folder); this.filters(oParams.Filters); this.search(searchFromParams); this.searchInput(this.search()); this.setSearchFolderMode(); this.searchSpan.notifySubscribers(); this.sSortBy = oParams.SortBy; this.iSortOrder = oParams.SortOrder; this.sortBy(oParams.SortBy); this.sortOrder(oParams.SortOrder); this.setCurrentFolder(); if (bRouteChanged || bMailsPerPageChanged || this.collection().length === 0) { if (oParams.Filters === Enums.FolderFilter.Unseen) { MailCache.waitForUnseenMessages(true); } this.requestMessageList(); this.messageListParamsChanged(true); } this.highlightTrigger.notifySubscribers(true); }; CMessageListView.prototype.setSearchFolderMode = function () { if ((/(^|\s)folders:all(\s|$)/).test(this.search())) { this.searchFoldersMode(Enums.SearchFoldersMode.All); } else if ((/(^|\s)folders:sub(\s|$)/).test(this.search())) { this.searchFoldersMode(Enums.SearchFoldersMode.Sub); } else { this.searchFoldersMode(Enums.SearchFoldersMode.Current); } }; CMessageListView.prototype.setCurrentFolder = function () { MailCache.setCurrentFolder(this.folderFullName(), this.filters()); this.folderType(MailCache.getCurrentFolderType()); }; CMessageListView.prototype.requestMessageList = function () { var sFullName = MailCache.getCurrentFolderFullname(), iPage = this.oPageSwitcher.currentPage() ; if (sFullName.length > 0) { MailCache.changeCurrentMessageList(sFullName, iPage, this.search(), this.filters(), this.sortBy(), this.sortOrder()); } else { MailCache.checkCurrentFolderList(); } }; CMessageListView.prototype.calculateSearchStringFromAdvancedForm = function () { var sFrom = this.searchInputFrom(), sTo = this.searchInputTo(), sSubject = this.searchInputSubject(), sText = this.searchInputText(), bAttachmentsCheckbox = this.searchAttachmentsCheckbox(), [dateStartServerFormat, dateEndServerFormat] = DateUtils.changeDateStartAndDateEndformatForSend(this.searchDateStart(), this.searchDateEnd()), aOutput = [], fEsc = function (sText) { sText = $.trim(sText).replace(/"/g, '\\"'); if (-1 < sText.indexOf(' ') || -1 < sText.indexOf('"')) { sText = '"' + sText + '"'; } return sText; } ; if (sFrom !== '') { aOutput.push('from:' + fEsc(sFrom)); } if (sTo !== '') { aOutput.push('to:' + fEsc(sTo)); } if (sSubject !== '') { aOutput.push('subject:' + fEsc(sSubject)); } if (sText !== '') { aOutput.push('text:' + fEsc(sText)); } if (bAttachmentsCheckbox) { aOutput.push('has:attachments'); } if (dateStartServerFormat !== '' || dateEndServerFormat !== '') { aOutput.push('date:' + fEsc(dateStartServerFormat) + '/' + fEsc(dateEndServerFormat)); } if (this.selectedSearchFoldersMode() === Enums.SearchFoldersMode.Sub || this.selectedSearchFoldersMode() === Enums.SearchFoldersMode.All) { aOutput.push('folders:' + this.selectedSearchFoldersMode()); } return aOutput.join(' '); }; CMessageListView.prototype.manualChangeSearchString = function (searchInput) { const searchKeywords = ['date:', 'subject:', 'text:', 'from:', 'to:', 'has:', 'folders:']; const regex = new RegExp('\\s(' + searchKeywords.join('|') + ')', 'g'); const searchInputArr = (' ' + searchInput).split(regex); let newSearchInput = ''; if (searchInputArr.length > 1) { //there are keywords in the search string for (let i = 1; i < searchInputArr.length; i = i + 2) { const keyword = searchInputArr[i]; const value = searchInputArr[i + 1]; if (keyword === searchKeywords[0]) { const [dateStartClientFormat, dateEndClientFormat] = value.split(' - '); const [dateStartServerFormat, dateEndServerFormat] = DateUtils.changeDateStartAndDateEndformatForSend(dateStartClientFormat, dateEndClientFormat); if (dateStartServerFormat || dateEndServerFormat) { newSearchInput += keyword + dateStartServerFormat + '/' + dateEndServerFormat + ' '; } } else { newSearchInput += keyword + value + ' '; } } } else { newSearchInput = searchInput; //search string is just a text an has no any keywords } return newSearchInput; }; CMessageListView.prototype.onSearchClick = function () { var sFolder = MailCache.getCurrentFolderFullname(), iPage = 1, searchInput = this.searchInput() ; if (this.allowAdvancedSearch() && this.bAdvancedSearch()) { searchInput = this.calculateSearchStringFromAdvancedForm(); this.bAdvancedSearch(false); } else { searchInput = this.manualChangeSearchString(searchInput) } this.changeRoutingForMessageList(sFolder, iPage, '', searchInput, this.filters()); }; CMessageListView.prototype.onRetryClick = function () { this.requestMessageList(); }; CMessageListView.prototype.onClearSearchClick = function () { var sFolder = MailCache.getCurrentFolderFullname(), sUid = this.currentMessage() ? this.currentMessage().longUid() : '', sSearch = '', iPage = 1 ; this.clearAdvancedSearch(); this.changeRoutingForMessageList(sFolder, iPage, sUid, sSearch, this.filters(), this.sortBy(), this.sortOrder()); }; CMessageListView.prototype.onClearFilterClick = function () { var sFolder = MailCache.getCurrentFolderFullname(), sUid = this.currentMessage() ? this.currentMessage().longUid() : '', sSearch = '', iPage = 1, sFilters = '' ; this.clearAdvancedSearch(); this.changeRoutingForMessageList(sFolder, iPage, sUid, sSearch, sFilters, this.sortBy(), this.sortOrder()); }; CMessageListView.prototype.onStopSearchClick = function () { this.onClearSearchClick(); }; /** * @param {Object} oMessage */ CMessageListView.prototype.isSavingDraft = function (oMessage) { var oFolder = MailCache.getCurrentFolder(); return (oFolder.type() === Enums.FolderTypes.Drafts) && (oMessage.longUid() === MailCache.savingDraftUid()); }; /** * @param {Object} oMessage */ CMessageListView.prototype.routeForMessage = function (oMessage) { if (oMessage && oMessage.longUid && !this.isSavingDraft(oMessage)) { var oFolder = MailCache.getCurrentFolder(), sFolder = MailCache.getCurrentFolderFullname(), iPage = this.oPageSwitcher.currentPage(), sUid = oMessage.longUid(), sCurrentUid = this.currentMessage() ? this.currentMessage().longUid() : '', sSearch = this.search() ; if (sUid !== '' && sUid !== sCurrentUid) { if (App.isMobile() && oFolder.type() === Enums.FolderTypes.Drafts) { Routing.setHash(LinksUtils.getComposeFromMessage('drafts', oMessage.accountId(), oMessage.folder(), oMessage.longUid())); } else { this.changeRoutingForMessageList(sFolder, iPage, sUid, sSearch, this.filters(), this.sortBy(), this.sortOrder()); if (App.isMobile() && MailCache.currentMessage() && sUid === MailCache.currentMessage().longUid()) { MailCache.currentMessage.valueHasMutated(); } } } } }; CMessageListView.prototype.unbind = function () { this.selector.unbind(); }; /** * @param {Object} $viewDom */ CMessageListView.prototype.onBind = function ($viewDom) { var self = this, fStopPopagation = _.bind(function (oEvent) { if (oEvent && oEvent.stopPropagation) { oEvent.stopPropagation(); } }, this) ; $('.message_list', $viewDom) .on('click', function () { self.isFocused(false); }) .on('click', '.message_sub_list .item .flag', function (oEvent) { self.onFlagClick(ko.dataFor(this)); if (oEvent && oEvent.stopPropagation) { oEvent.stopPropagation(); } }) .on('dblclick', '.message_sub_list .item .flag', fStopPopagation) .on('click', '.message_sub_list .item .thread-pin', fStopPopagation) .on('dblclick', '.message_sub_list .item .thread-pin', fStopPopagation) ; this.selector.initOnApplyBindings( '.message_sub_list .item', '.message_sub_list .item.selected', '.message_sub_list .item .custom_checkbox', $('.message_list', $viewDom), $('.message_list_scroll.scroll-inner', $viewDom) ); _.delay(_.bind(function(){ this.createDatePickerObject(this.searchDateStartDom(), this.searchDateStart); this.createDatePickerObject(this.searchDateEndDom(), this.searchDateEnd); }, this), 1000); this.initUploader(); }; /** * Puts / removes the message flag by clicking on it. * * @param {Object} oMessage */ CMessageListView.prototype.onFlagClick = function (oMessage) { if (!this.isSavingDraft(oMessage)) { MailCache.executeGroupOperation('SetMessageFlagged', [oMessage.longUid()], 'flagged', !oMessage.flagged()); } }; /** * Marks the selected messages read. */ CMessageListView.prototype.executeMarkAsRead = function () { MailCache.executeGroupOperation('SetMessagesSeen', this.checkedOrSelectedUids(), 'seen', true); }; /** * Marks the selected messages unread. */ CMessageListView.prototype.executeMarkAsUnread = function () { MailCache.executeGroupOperation('SetMessagesSeen', this.checkedOrSelectedUids(), 'seen', false); }; /** * Marks Read all messages in a folder. */ CMessageListView.prototype.executeMarkAllRead = function () { MailCache.executeGroupOperation('SetAllMessagesSeen', [], 'seen', true); }; /** * Moves the selected messages in the current folder in the specified. * * @param {string} sToFolder */ CMessageListView.prototype.executeMoveToFolder = function (sToFolder) { var oToFolder = MailCache.getFolderByFullName(MailCache.currentAccountId(), sToFolder), aLongUids = this.checkedOrSelectedUids(), oUidsByFolders = MailCache.getUidsSeparatedByFolders(aLongUids) ; if (oToFolder) { _.each(oUidsByFolders, function (oData) { if (MailCache.currentAccountId() === oData.iAccountId) { var oFromFolder = MailCache.getFolderByFullName(MailCache.currentAccountId(), oData.sFolder); if (oFromFolder) { MailCache.moveMessagesToFolder(oFromFolder, oToFolder, oData.aUids); } } }); } }; CMessageListView.prototype.executeCopyToFolder = function (toFolderName) { var toFolder = MailCache.getFolderByFullName(MailCache.currentAccountId(), toFolderName), longUids = this.checkedOrSelectedUids(), uidsByFolders = MailCache.getUidsSeparatedByFolders(longUids) ; if (toFolder) { _.each(uidsByFolders, function (data) { if (MailCache.currentAccountId() === data.iAccountId) { var fromFolder = MailCache.getFolderByFullName(MailCache.currentAccountId(), data.sFolder); if (fromFolder) { MailCache.copyMessagesToFolder(fromFolder, toFolder, data.aUids); } } }); } }; /** * Calls for the selected messages delete operation. Called from the keyboard. * * @param {Array} aMessages */ CMessageListView.prototype.onDeletePress = function (aMessages) { var aUids = _.map(aMessages, function (oMessage) { return oMessage.longUid(); }); if (aUids.length > 0) { this.deleteMessages(aUids); } }; /** * Calls for the selected messages delete operation. Called by the mouse click on the delete button. */ CMessageListView.prototype.executeDelete = function () { this.deleteMessages(this.checkedOrSelectedUids()); }; /** * @param {Array} aUids */ CMessageListView.prototype.deleteMessages = function (aUids) { var sUidToOpenAfter = '', oMessageToOpenAfter = null ; if (MailCache.uidList().filters() !== Enums.FolderFilter.Unseen && aUids.length === 1 && MailCache.currentMessage() && aUids[0] === MailCache.currentMessage().longUid()) { sUidToOpenAfter = MailCache.prevMessageUid(); if (sUidToOpenAfter === '') { sUidToOpenAfter = MailCache.nextMessageUid(); } } if (aUids.length > 0) { MailUtils.deleteMessages(aUids, function () { if (sUidToOpenAfter !== '') { oMessageToOpenAfter = _.find(this.collection(), function (oMessage) { return oMessage && _.isFunction(oMessage.longUid) && (oMessage.longUid() === sUidToOpenAfter || oMessage.uid() === sUidToOpenAfter); }); if (oMessageToOpenAfter) { this.routeForMessage(oMessageToOpenAfter); } } }.bind(this)); } }; /** * Moves the selected messages from the current folder to the folder Spam. */ CMessageListView.prototype.executeSpam = function () { var aLongUids = this.checkedOrSelectedUids(), oUidsByFolders = MailCache.getUidsSeparatedByFolders(aLongUids) ; _.each(oUidsByFolders, function (oData) { var oFolderList = MailCache.oFolderListItems[oData.iAccountId], oAccSpam = oFolderList ? oFolderList.spamFolder() : null, oAccFolder = oFolderList ? oFolderList.getFolderByFullName(oData.sFolder) : null; ; if (oAccFolder && oAccSpam && oAccFolder.fullName() !== oAccSpam.fullName()) { MailCache.moveMessagesToFolder(oAccFolder, oAccSpam, oData.aUids); } }); }; /** * Moves the selected messages from the Spam folder to folder Inbox. */ CMessageListView.prototype.executeNotSpam = function () { var oCurrentFolder = MailCache.getCurrentFolder(), oInbox = this.folderList().inboxFolder(), aLongUids = this.checkedOrSelectedUids(), oUidsByFolders = MailCache.getUidsSeparatedByFolders(aLongUids) ; if (oInbox && oCurrentFolder && oCurrentFolder.fullName() !== oInbox.fullName()) { _.each(oUidsByFolders, function (oData) { if (oCurrentFolder.iAccountId === oData.iAccountId && oCurrentFolder.fullName() === oData.sFolder) { MailCache.moveMessagesToFolder(oCurrentFolder, oInbox, oData.aUids); } }); } }; CMessageListView.prototype.executeSort = function (sSortBy) { const sCurrentSort = this.sortBy(); this.sortBy(sSortBy); if (sCurrentSort === sSortBy) { this.sortOrder(this.sortOrder() === Enums.SortOrder.Asc ? Enums.SortOrder.Desc : Enums.SortOrder.Asc); // Asc: 0, Desc: 1 } else { this.sortOrder(Settings.MessagesSortBy.DefaultSortOrder); } const sFolder = MailCache.getCurrentFolderFullname(), iPage = this.oPageSwitcher.currentPage(), sUid = '' ; this.changeRoutingForMessageList(sFolder, iPage, sUid, this.search(), this.filters(), this.sortBy(), this.sortOrder()); }; CMessageListView.prototype.clearAdvancedSearch = function () { this.searchInputFrom(''); this.searchInputTo(''); this.searchInputSubject(''); this.searchInputText(''); this.bAdvancedSearch(false); this.searchAttachmentsCheckbox(false); this.searchAttachments(''); this.searchDateStart(''); this.searchDateEnd(''); this.selectedSearchFoldersMode(this.isStarredInAllFolders() ? 'all' : ''); }; CMessageListView.prototype.onAdvancedSearchClick = function () { this.bAdvancedSearch(!this.bAdvancedSearch()); }; CMessageListView.prototype.calculateSearchStringForDescription = function () { return TextUtils.encodeHtml(this.searchHighlightedInputFormatted().replace(/(^|\s)folders:(all|sub)(\s|$)/, '')); }; CMessageListView.prototype.initUploader = function () { var self = this; if (this.uploaderArea()) { this.oJua = new CJua({ 'action': '?/Api/', 'name': 'jua-uploader', 'queueSize': 2, 'dragAndDropElement': this.uploaderArea(), 'disableAjaxUpload': false, 'disableFolderDragAndDrop': false, 'disableDragAndDrop': false, 'hidden': _.extendOwn({ 'Module': Settings.ServerModuleName, 'Method': 'UploadMessage', 'Parameters': function () { return JSON.stringify({ 'AccountID': MailCache.currentAccountId(), 'Folder': self.folderFullName() }); } }, App.getCommonRequestParameters()) }); this.oJua .on('onDrop', _.bind(this.onFileDrop, this)) .on('onComplete', _.bind(this.onFileUploadComplete, this)) .on('onBodyDragEnter', _.bind(this.bDragActive, this, true)) .on('onBodyDragLeave', _.bind(this.bDragActive, this, false)) ; } }; CMessageListView.prototype.onFileDrop = function (oData) { if (!(oData && oData.File && oData.File.type && oData.File.type.indexOf('message/') === 0)) { Screens.showError(TextUtils.i18n('%MODULENAME%/ERROR_FILE_NOT_EML')); } }; CMessageListView.prototype.onFileUploadComplete = function (sFileUid, bResponseReceived, oResponse) { var bSuccess = bResponseReceived && oResponse && !oResponse.ErrorCode; if (bSuccess) { MailCache.executeCheckMail(true); } else { Api.showErrorByCode(oResponse || {}, TextUtils.i18n('COREWEBCLIENT/ERROR_UPLOAD_FILE')); } }; CMessageListView.prototype.selectFolderSearch = function (sSearchFoldersMode) { this.selectedSearchFoldersMode(sSearchFoldersMode); }; module.exports = CMessageListView;