Source: products/argos-saleslogix/src/Views/Briefcase/List.js

/**
 * @class crm.Views.Offline.List
 *
 * @extends argos._ListBase
 * @requires argos._ListBase
 *
 *
 */
import declare from 'dojo/_base/declare';
import _ListBase from 'argos/_ListBase';
import lang from 'dojo/_base/lang';
import format from '../../Format';
import MODEL_TYPES from 'argos/Models/Types';
import OfflineManager from 'argos/Offline/Manager';
import OfflineDetail from '../Offline/Detail';
import _ListOfflineMixin from 'argos/Offline/_ListOfflineMixin';
import getResource from 'argos/I18n';

const resource = getResource('briefcaseList');

export default declare('crm.Views.Briefcase', [_ListBase, _ListOfflineMixin], {
  id: 'briefcase_list',
  idProperty: 'id',
  detailView: 'offline_detail',
  enableSearch: false,
  enableActions: true,
  enableOfflineSupport: true,
  resourceKind: '',
  entityName: 'Briefcase',
  titleText: resource.titleText,
  resyncTooltipText: resource.resyncTooltipText,
  pageSize: 1000,
  autoNavigateToBriefcase: true,
  itemTemplate: new Simplate([
    '<p class="micro-text">{%: $$.getOfflineDate($) %}</p>',
  ]),
  refreshRequiredFor: function refreshRequiredFor() {
    return true;
  },
  getModel: function getModel() {
    const model = App.ModelManager.getModel('Briefcase', 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;
  },
  createToolLayout: function createToolLayout() {
    const tools = {
      tbar: [{
        id: 'resync',
        svg: 'roles',
        title: this.resyncTooltipText,
        action: 'briefCaseList',
        security: '',
      }],
    };
    return tools;
  },
  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];
    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;
  },
  createActionLayout: function createActionLayout() {
    return this.actions || (this.actions = [{
      id: 'remove',
      cls: 'fa fa-remove fa-2x',
      label: resource.removeText,
      action: 'removeItemAction',
    }, {
      id: 'resync',
      cls: 'fa fa-suitcase fa-2x',
      label: resource.reBriefcaseText,
      action: 'reBriefcaseItemAction',
    }, {
      id: 'navToOnline',
      cls: 'fa fa-level-down fa-2x',
      label: resource.goToOnlineText,
      action: 'navToOnlineView',
    }, {
      id: 'navToOffline',
      cls: 'fa fa-level-down fa-2x',
      label: resource.goToOfflineText,
      action: 'navToOfflineView',
    }]);
  },
  navToOnlineView: function navToOnlineVie(action, selection) {
    const briefcaseId = selection.tag.attributes['data-key'].value;
    const briefcase = this.entries[briefcaseId];
    this.navigateToOnlineDetailView(briefcase);
  },
  navToOfflineView: function navToOfflineView(action, selection) {
    const briefcaseId = selection.tag.attributes['data-key'].value;
    const briefcase = this.entries[briefcaseId];
    this.navigateToOfflineDetailView(briefcase);
  },
  removeItemAction: function removeItemAction(action, selection) { // eslint-disable-line
    const briefcaseId = selection.tag.attributes['data-key'].value;
    OfflineManager.removeBriefcase(briefcaseId).then(() => {
      this.clear();
      this.refreshRequired = true;
      this.refresh();
    }, (error) => {
      console.error(error);// eslint-disable-line
    });
  },
  reBriefcaseItemAction: function reBriefcase(action, selection) { // eslint-disable-line
    const briefcaseId = selection.tag.attributes['data-key'].value;
    const briefcase = this.entries[briefcaseId];
    if (briefcase) {
      this.briefCaseItem(briefcase);
    }
  },
  onListBriefcased: function onListBriefcased() {
    this.clear();
    this.refreshRequired = true;
    this.refresh();
  },
  createBriefcaseEntity: function createBriefcaseEntity(entry) {
    const entity = {
      entityId: entry.entityId,
      entityName: entry.entityName,
      options: {
        includeRelated: true,
        viewId: entry.viewId,
        iconClass: entry.iconClass,
      },
    };
    return entity;
  },
  isDisabled: function isDisabled() {
    return !App.enableOfflineSupport;
  },
});