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

import declare from 'dojo/_base/declare';
import lang from 'dojo/_base/lang';
import action from '../../Action';
import List from 'argos/List';
import _GroupListMixin from '../_GroupListMixin';
import _MetricListMixin from '../_MetricListMixin';
import _RightDrawerListMixin from '../_RightDrawerListMixin';
import getResource from 'argos/I18n';
import MODEL_NAMES from '../../Models/Names';
import format from 'crm/Format';

const resource = getResource('ticketList');

/**
 * @class crm.Views.Ticket.List
 *
 * @extends argos.List
 * @mixins crm.Views._RightDrawerListMixin
 * @mixins crm.Views._MetricListMixin
 * @mixins crm.Views._GroupListMixin
 *
 * @requires crm.Action
 * @requires crm.Format
 */
const __class = declare('crm.Views.Ticket.List', [List, _RightDrawerListMixin, _MetricListMixin, _GroupListMixin], {
  format,
  // Templates
  itemTemplate: new Simplate([
    '<p class="micro-text">{%: $.Subject %}</p>',
    '{% if(($.Account) && (!$.Contact)) { %}',
    '<p class="micro-text">{%: $$.viewContactActionText + ": " + $.Account.AccountName %}</p>',
    '{% } %}',
    '{% if(($.Account) && ($.Contact)) { %}',
    '<p class="micro-text">{%: $$.viewContactActionText + ": " + $.Contact.NameLF + " | " + $.Account.AccountName %}</p>',
    '{% } %}',
    '<p class="micro-text"> {%: $.AssignedTo ? ($$.assignedToText + $.AssignedTo.OwnerDescription) : this.notAssignedText %}</p>',
    '{% if($.Urgency) { %}',
    '<p class="micro-text">{%: $$.urgencyText + $.Urgency.Description %}</p>',
    '{% } %}',
    '{% if($.Area) { %}',
    '<p class="micro-text">{%: $$._areaCategoryIssueText($) %}</p>',
    '{% } %}',
    '{% if($.CreateDate) { %}',
    '<p class="micro-text">{%: $$.createdOnText %}  {%: $$.format.relativeDate($.CreateDate) %}</p>',
    '{% } %}',
    '{% if($.ModifyDate) { %}',
    '<p class="micro-text">{%: $$.modifiedText %}  {%: $$.format.relativeDate($.ModifyDate) %}</p>',
    '{% } %}',
    '{% if($.NeededByDate) { %}',
    '<p class="micro-text">{%: $$.neededByText %}  {%: $$.format.relativeDate($.NeededByDate) %}</p>',
    '{% } %}',
  ]),

  _areaCategoryIssueText: function _areaCategoryIssueText(feedItem) {
    const results = [feedItem.Area, feedItem.Category, feedItem.Issue];
    return results.filter((item) => {
      return item !== '' && typeof item !== 'undefined' && item !== null;
    }).join(' > ');
  },

  // Localization
  titleText: resource.titleText,
  activitiesText: resource.activitiesText,
  scheduleText: resource.scheduleText,
  notAssignedText: resource.notAssignedText,
  editActionText: resource.editActionText,
  viewAccountActionText: resource.viewAccountActionText,
  viewContactActionText: resource.viewContactActionText,
  addNoteActionText: resource.addNoteActionText,
  addActivityActionText: resource.addActivityActionText,
  addAttachmentActionText: resource.addAttachmentActionText,
  assignedToText: resource.assignedToText,
  urgencyText: resource.urgencyText,
  createdOnText: resource.createdOnText,
  modifiedText: resource.modifiedText,
  neededByText: resource.neededByText,

  // View Properties
  detailView: 'ticket_detail',
  itemIconClass: 'expense-report',
  id: 'ticket_list',
  security: 'Entities/Ticket/View',
  insertView: 'ticket_edit',
  queryOrderBy: null,
  querySelect: [],
  modelName: MODEL_NAMES.TICKET,
  resourceKind: 'tickets',
  entityName: 'Ticket',
  groupsEnabled: true,
  allowSelection: true,
  enableActions: true,

  createActionLayout: function createActionLayout() {
    return this.actions || (this.actions = [{
      id: 'edit',
      cls: 'edit',
      label: this.editActionText,
      action: 'navigateToEditView',
      security: 'Entities/Ticket/Edit',
    }, {
      id: 'viewAccount',
      label: this.viewAccountActionText,
      enabled: action.hasProperty.bindDelegate(this, 'Account.$key'),
      fn: action.navigateToEntity.bindDelegate(this, {
        view: 'account_detail',
        keyProperty: 'Account.$key',
        textProperty: 'Account.AccountName',
      }),
    }, {
      id: 'viewContact',
      label: this.viewContactActionText,
      enabled: action.hasProperty.bindDelegate(this, 'Contact.$key'),
      fn: action.navigateToEntity.bindDelegate(this, {
        view: 'contact_detail',
        keyProperty: 'Contact.$key',
        textProperty: 'Contact.NameLF',
      }),
    }, {
      id: 'addNote',
      cls: 'edit',
      label: this.addNoteActionText,
      fn: action.addNote.bindDelegate(this),
    }, {
      id: 'addActivity',
      cls: 'calendar',
      label: this.addActivityActionText,
      fn: action.addActivity.bindDelegate(this),
    }, {
      id: 'addAttachment',
      cls: 'attach',
      label: this.addAttachmentActionText,
      fn: action.addAttachment.bindDelegate(this),
    }]);
  },

  formatSearchQuery: function formatSearchQuery(searchQuery) {
    const q = this.escapeSearchQuery(searchQuery.toUpperCase());
    return `TicketNumber like "${q}%" or AlternateKeySuffix like "${q}%" or upper(Subject) like "${q}%" or Account.AccountNameUpper like "${q}%"`;
  },
});

lang.setObject('Mobile.SalesLogix.Views.Ticket.List', __class);
export default __class;