/**
* @class crm.Views.RecentlyViewed.List
*
* @extends argos._ListBase
* @requires argos._ListBase
*
*
*/
import declare from 'dojo/_base/declare';
import _ListBase from 'argos/_ListBase';
import _RightDrawerListMixin from './_RightDrawerListMixin';
import _MetricListMixin from '../_MetricListMixin';
import TotalMetricWidget from './TotalMetricWidget';
import lang from 'dojo/_base/lang';
import format from '../../Format';
import MODEL_TYPES from 'argos/Models/Types';
import OfflineDetail from '../Offline/Detail';
import getResource from 'argos/I18n';
const resource = getResource('recentlyViewedList');
const accountResource = getResource('accountModel');
const contactResource = getResource('contactModel');
const activityResource = getResource('activityModel');
const historyResource = getResource('historyModel');
const oppResource = getResource('opportunityModel');
const ticketResource = getResource('ticketModel');
const leadResource = getResource('leadModel');
export default declare('crm.Views.RecentlyViewed.List', [_ListBase, _RightDrawerListMixin, _MetricListMixin], {
id: 'recently_viewed_list',
idProperty: 'id',
detailView: 'offline_detail',
enableSearch: false,
enableActions: true,
enableOfflineSupport: true,
resourceKind: 'offline',
entityName: 'RecentlyViewed',
titleText: resource.titleText,
metricWidgetCtor: TotalMetricWidget,
pageSize: 1000,
itemTemplate: new Simplate([
'<p class="micro-text">{%: $$.getOfflineDate($) %}</p>',
]),
refreshRequiredFor: function refreshRequiredFor() {
return true;
},
getModel: function getModel() {
const model = App.ModelManager.getModel('RecentlyViewed', MODEL_TYPES.OFFLINE);
return model;
},
getTitle: function getTitle(entry) {
return entry && entry.description;
},
getOfflineDate: function getOfflineDate(entry) {
if (entry && entry.modifyDate) {
return format.relativeDate(entry.modifyDate);
}
return '';
},
_hasValidOptions: function _hasValidOptions(options) {
return options;
},
_applyStateToWidgetOptions: function _applyStateToWidgetOptions(widgetOptions) {
const options = widgetOptions;
options.activeEntityFilters = this.getActiveEntityFilters();
return options;
},
_applyStateToQueryOptions: function _applyStateToQueryOptions(queryOptions) {
delete queryOptions.count;
delete queryOptions.start;
queryOptions.include_docs = true;
queryOptions.descending = true;
return queryOptions;
},
createIndicatorLayout: function createIndicatorLayout() {
return [];
},
getItemIconClass: function getItemIconClass(entry) {
let iconClass;
iconClass = entry.iconClass;
if (!iconClass) {
iconClass = 'url';
}
return iconClass;
},
navigateToDetailView: function navigateToDetailView(key, descriptor, additionalOptions) {
const entry = this.entries && this.entries[key];
if (App.onLine) {
this.navigateToOnlineDetailView(entry, additionalOptions);
} else {
this.navigateToOfflineDetailView(entry, additionalOptions);
}
},
navigateToOnlineDetailView: function navigateToDetailView(entry, additionalOptions) {
const view = this.app.getView(entry.viewId);
let options = {
descriptor: entry.description, // keep for backwards compat
title: entry.description,
key: entry.entityId,
fromContext: this,
};
if (additionalOptions) {
options = lang.mixin(options, additionalOptions);
}
if (view) {
view.show(options);
}
},
navigateToOfflineDetailView: function navigateToOfflineDetailView(entry, additionalOptions) {
const view = this.getDetailView(entry.entityName);
let options = {
descriptor: entry.description, // keep for backwards compat
title: entry.description,
key: entry.entityId,
fromContext: this,
offlineContext: {
entityId: entry.entityId,
entityName: entry.entityName,
viewId: entry.viewId,
source: entry,
},
};
if (additionalOptions) {
options = lang.mixin(options, additionalOptions);
}
if (view) {
view.show(options);
}
},
getDetailView: function getDetailView(entityName) {
const viewId = `${this.detailView}_${entityName}`;
let view = this.app.getView(viewId);
if (view) {
return view;
}
this.app.registerView(new OfflineDetail({ id: viewId }));
view = this.app.getView(viewId);
return view;
},
_buildQueryExpression: function _buildQueryExpression() {
const filters = this.getActiveEntityFilters();
return function queryFn(doc, emit) {
// If the user has entity filters stored in preferences, filter based on that
if (App.preferences && App.preferences.recentlyViewedEntityFilters) {
filters.forEach((f) => {
if (doc.entity.entityName === f.name) {
emit(doc.modifyDate);
}
});
} else {
emit(doc.modifyDate);
}
};
},
getActiveEntityFilters: function getActiveEntityFilters() {
return Object.keys(this.entityMappings)
.map((entityName) => {
const prefs = App.preferences && App.preferences.recentlyViewedEntityFilters || [];
const entityPref = prefs.filter((pref) => {
return pref.name === entityName;
});
return entityPref[0];
})
.filter(f => f && f.enabled);
},
// Localization
entityText: {
Contact: contactResource.entityDisplayNamePlural,
Account: accountResource.entityDisplayNamePlural,
Opportunity: oppResource.entityDisplayNamePlural,
Ticket: ticketResource.entityDisplayNamePlural,
Lead: leadResource.entityDisplayNamePlural,
Activity: activityResource.entityDisplayNamePlural,
History: historyResource.entityDisplayNamePlural,
},
entityMappings: {
Contact: {
iconClass: 'user',
},
Account: {
iconClass: 'spreadsheet',
},
Opportunity: {
iconClass: 'finance',
},
Ticket: {
iconClass: 'expense-report',
},
Lead: {
iconClass: 'agent',
},
Activity: {
iconClass: 'calendar',
},
History: {
iconClass: 'search-results-history',
},
},
createToolLayout: function createToolLayout() {
return this.tools || (this.tools = {
tbar: [],
});
},
isDisabled: function isDisabled() {
return !App.enableOfflineSupport;
},
});