Source: products/argos-saleslogix/src/Views/Account/Detail.js

import declare from 'dojo/_base/declare';
import string from 'dojo/string';
import lang from 'dojo/_base/lang';
import action from '../../Action';
import format from '../../Format';
import template from '../../Template';
import MODEL_NAMES from '../../Models/Names';
import Detail from 'argos/Detail';
import getResource from 'argos/I18n';

const resource = getResource('accountDetail');

/**
 * @class crm.Views.Account.Detail
 *
 *
 * @extends argos.Detail
 * @requires argos.Detail
 * @requires crm.Format
 * @requires crm.Template
 *
 */
const __class = declare('crm.Views.Account.Detail', [Detail], {
  // Localization
  accountText: resource.accountText,
  acctMgrText: resource.acctMgrText,
  addressText: resource.addressText,
  businessDescriptionText: resource.businessDescriptionText,
  createDateText: resource.createDateText,
  createUserText: resource.createUserText,
  faxText: resource.faxText,
  importSourceText: resource.importSourceText,
  industryText: resource.industryText,
  notesText: resource.notesText,
  ownerText: resource.ownerText,
  phoneText: resource.phoneText,
  actionsText: resource.actionsText,
  relatedActivitiesText: resource.relatedActivitiesText,
  relatedContactsText: resource.relatedContactsText,
  relatedHistoriesText: resource.relatedHistoriesText,
  relatedItemsText: resource.relatedItemsText,
  relatedNotesText: resource.relatedNotesText,
  relatedOpportunitiesText: resource.relatedOpportunitiesText,
  relatedTicketsText: resource.relatedTicketsText,
  relatedAddressesText: resource.relatedAddressesText,
  relatedAttachmentText: resource.relatedAttachmentText,
  relatedAttachmentTitleText: resource.relatedAttachmentTitleText,
  statusText: resource.statusText,
  subTypeText: resource.subTypeText,
  titleText: resource.titleText,
  typeText: resource.typeText,
  webText: resource.webText,
  scheduleActivityText: resource.scheduleActivityText,
  addNoteText: resource.addNoteText,
  calledText: resource.calledText,
  entityText: resource.entityText,

  // View Properties
  id: 'account_detail',
  editView: 'account_edit',
  historyEditView: 'history_edit',
  noteEditView: 'history_edit',
  enableOffline: true,
  resourceKind: 'accounts',
  modelName: MODEL_NAMES.ACCOUNT,

  navigateToHistoryInsert: function navigateToHistoryInsert(type, entry) {
    action.navigateToHistoryInsert(entry);
  },
  recordCallToHistory: function recordCallToHistory(phoneNumber) {
    const entry = {
      Type: 'atPhoneCall',
      AccountId: this.entry.$key,
      AccountName: this.entry.AccountName,
      Description: string.substitute(this.calledText, [this.entry.AccountName]),
      UserId: App.context && App.context.user.$key,
      UserName: App.context && App.context.user.UserName,
      Duration: 15,
      CompletedDate: (new Date()),
    };

    this.navigateToHistoryInsert('atPhoneCall', entry);
    App.initiateCall(phoneNumber);
  },
  callMainPhone: function callMainPhone() {
    this.recordCallToHistory(this.entry.MainPhone);
  },
  scheduleActivity: function scheduleActivity() {
    App.navigateToActivityInsertView();
  },
  addNote: function addNote() {
    const view = App.getView(this.noteEditView);
    if (view) {
      view.show({
        template: {},
        insert: true,
      });
    }
  },
  formatPicklist: function formatPicklist(property) {
    return format.picklist(this.app.picklistService, this._model, property);
  },
  createLayout: function createLayout() {
    return this.layout || (this.layout = [{
      title: this.actionsText,
      list: true,
      cls: 'action-list',
      name: 'QuickActionsSection',
      children: [{
        name: 'ScheduleActivityAction',
        property: 'AccountName',
        label: this.scheduleActivityText,
        iconClass: 'calendar',
        action: 'scheduleActivity',
      }, {
        name: 'AddNoteAction',
        property: 'AccountName',
        label: this.addNoteText,
        iconClass: 'edit',
        action: 'addNote',
      }],
    }, {
      title: this.detailsText,
      name: 'DetailsSection',
      children: [{
        name: 'AccountName',
        property: 'AccountName',
        label: this.accountText,
      }, {
        name: 'MainPhone',
        property: 'MainPhone',
        label: this.phoneText,
        renderer: format.phone.bindDelegate(this, false),
        action: 'callMainPhone',
      }, {
        name: 'Status',
        property: 'Status',
        label: this.statusText,
        renderer: this.formatPicklist('Status'),
      }, {
        name: 'AccountManager.UserInfo',
        property: 'AccountManager.UserInfo',
        label: this.acctMgrText,
        tpl: template.nameLF,
      }, {
        name: 'WebAddress',
        property: 'WebAddress',
        label: this.webText,
        renderer: format.link,
      }, {
        name: 'Address',
        property: 'Address',
        label: this.addressText,
        renderer: format.address.bindDelegate(this, false),
      }, {
        name: 'Fax',
        property: 'Fax',
        label: this.faxText,
        renderer: format.phone.bindDelegate(this, true),
      }, {
        name: 'Type',
        property: 'Type',
        label: this.typeText,
        renderer: this.formatPicklist('Type'),
      }, {
        name: 'SubType',
        property: 'SubType',
        label: this.subTypeText,
        renderer: format.picklist(this.app.picklistService, null, null, `Account ${this.entry.Type}`),
      }, {
        name: 'Industry',
        property: 'Industry',
        label: this.industryText,
        type: 'text',
        renderer: this.formatPicklist('Industry'),
      }, {
        name: 'BusinessDescription',
        property: 'BusinessDescription',
        label: this.businessDescriptionText,
        type: 'text',
      }, {
        name: 'LeadSource.Description',
        property: 'LeadSource.Description',
        label: this.importSourceText,
      }, {
        name: 'Owner.OwnerDescription',
        property: 'Owner.OwnerDescription',
        label: this.ownerText,
      }],
    }, {
      title: this.relatedItemsText,
      list: true,
      name: 'RelatedItemsSection',
      children: [{
        name: 'ActivityRelated',
        label: this.relatedActivitiesText,
        where: this.formatRelatedQuery.bindDelegate(this, 'AccountId eq "${0}"'),
        view: 'activity_related',
      }, {
        name: 'ContactRelated',
        label: this.relatedContactsText,
        where: this.formatRelatedQuery.bindDelegate(this, 'Account.id eq "${0}"'),
        view: 'contact_related',
      }, {
        name: 'OpportunityRelated',
        label: this.relatedOpportunitiesText,
        where: this.formatRelatedQuery.bindDelegate(this, 'Account.id eq "${0}"'),
        view: 'opportunity_related',
      }, {
        name: 'TicketRelated',
        label: this.relatedTicketsText,
        where: this.formatRelatedQuery.bindDelegate(this, 'Account.id eq "${0}"'),
        view: 'ticket_related',
      }, {
        name: 'HistoryRelated',
        label: this.relatedHistoriesText,
        where: this.formatRelatedQuery.bindDelegate(this, 'AccountId eq "${0}" and Type ne "atDatabaseChange"'),
        view: 'history_related',
      }, {
        name: 'AddressesRelated',
        label: this.relatedAddressesText,
        where: this.formatRelatedQuery.bindDelegate(this, 'EntityId eq "${0}"', 'Address.EntityId'),
        view: 'address_related',
      }, {
        name: 'AttachmentRelated',
        label: this.relatedAttachmentText,
        where: this.formatRelatedQuery.bindDelegate(this, 'accountId eq "${0}"'), // must be lower case because of feed
        view: 'account_attachment_related',
        title: this.relatedAttachmentTitleText,
      }],
    }]);
  },
});

lang.setObject('Mobile.SalesLogix.Views.Account.Detail', __class);
export default __class;