Source: products/argos-saleslogix/src/Views/AddAccountContact.js

import declare from 'dojo/_base/declare';
import lang from 'dojo/_base/lang';
import string from 'dojo/string';
import format from '../Format';
import validator from '../Validator';
import template from '../Template';
import utility from 'argos/Utility';
import Edit from 'argos/Edit';
import getResource from 'argos/I18n';

const resource = getResource('addAccountContact');

/**
 * @class crm.Views.AddAccountContact
 *
 *
 * @extends argos.Edit
 *
 */
const __class = declare('crm.Views.AddAccountContact', [Edit], {
  // Localization
  accountNameText: resource.accountNameText,
  accountStatusTitleText: resource.accountStatusTitleText,
  accountSubTypeTitleText: resource.accountSubTypeTitleText,
  accountText: resource.accountText,
  accountTypeTitleText: resource.accountTypeTitleText,
  acctMgrText: resource.acctMgrText,
  addressText: resource.addressText,
  contactTitleText: resource.contactTitleText,
  descriptionText: resource.descriptionText,
  detailsAccountText: resource.detailsAccountText,
  detailsContactText: resource.detailsContactText,
  detailsText: resource.detailsText,
  emailText: resource.emailText,
  faxText: resource.faxText,
  homePhoneText: resource.homePhoneText,
  industryText: resource.industryText,
  ownerText: resource.ownerText,
  lastNameText: resource.lastNameText,
  mobileText: resource.mobileText,
  nameText: resource.nameText,
  statusText: resource.statusText,
  subTypeText: resource.subTypeText,
  titleText: resource.titleText,
  typeText: resource.typeText,
  webText: resource.webText,
  phoneText: resource.phoneText,
  workText: resource.workText,
  industryTitleText: resource.industryTitleText,

  // View Properties
  id: 'add_account_contact',
  resourceKind: 'accounts',
  insertSecurity: 'Entities/Account/Add',
  updateSecurity: 'Entities/Account/Edit',
  entityName: 'Account',
  querySelect: [
    'AccountManager/UserInfo/FirstName',
    'AccountManager/UserInfo/LastName',
    'AccountName',
    'Address',
    'BusinessDescription',
    'Contact/AccountName',
    'Contact/Address',
    'Contact/Email',
    'Contact/Fax',
    'Contact/FirstName',
    'Contact/HomePhone',
    'Contact/LastName',
    'Contact/Mobile',
    'Contact/Title',
    'Contact/WebAddress',
    'Contact/WorkPhone',
    'Fax',
    'Industry',
    'Owner/OwnerDescription',
    'Status',
    'SubType',
    'Type',
  ],
  init: function init() {
    this.inherited(arguments);

    this.connect(this.fields['Contacts.$resources[0].Address'], 'onChange', this.onContactAddressChange);
  },
  getValues: function getValues() {
    const values = this.inherited(arguments);

    utility.setValue(values, 'Contacts.$resources[0].$name', 'Contact');
    utility.setValue(values, 'Contacts.$resources[0].AccountName', values.AccountName);

    return values;
  },
  formatDependentPicklist: function formatDependentPicklist(dependentValue, fmt) {
    let dependValue = dependentValue;
    if (!lang.isArray(dependValue)) {
      dependValue = [dependValue];
    }
    return string.substitute(fmt, [dependValue]);
  },
  onInsertCompleted: function onInsertCompleted(entry) {
    const view = App.getView('account_detail');
    if (view) {
      view.show({
        descriptor: entry.$descriptor,
        key: entry.$key,
      }, {
        returnTo: -1,
      });
    } else {
      this.inherited(arguments);
    }
  },
  onContactAddressChange: function onContactAddressChange(value) {
    let address;
    let address1;
    // Copy contact address down into the account address if the account address is not set
    if (this.fields.Address) {
      address = this.fields.Address.getValue();
      address1 = address && address.Address1;
    }

    if (!address || !address1) {
      this.fields.Address.setValue(value);
    }
  },
  applyContext: function applyContext(templateEntry) {
    this.inherited(arguments);

    this.fields.AccountManager.setValue(App.context.user);
    this.fields.Owner.setValue(App.context.defaultOwner);

    this.fields.Type.setValue(templateEntry.Type);
    this.fields.Status.setValue(templateEntry.Status);
  },
  convertEntry: function convertEntry(entry) {
    // Fix so that Name Prefix and Suffix picklists function correctly
    if (entry && !entry.Contacts) {
      entry.Contacts = {
        $resources: [{
          FirstName: null,
          LastName: null,
          NameLF: null,
        }],
      };
    }
    this.inherited(arguments);
    return entry;
  },
  createLayout: function createLayout() {
    return this.layout || (this.layout = [{
      emptyText: '',
      formatValue: format.nameLF,
      label: this.nameText,
      name: 'Contacts.$resources[0]',
      property: 'Contacts.$resources[0]',
      type: 'name',
      validator: validator.name,
      view: 'name_edit',
    }, {
      label: this.accountNameText,
      name: 'AccountName',
      property: 'AccountName',
      type: 'text',
      validator: validator.notEmpty,
    }, {
      label: this.emailText,
      name: 'Contacts.$resources[0].Email',
      property: 'Contacts.$resources[0].Email',
      type: 'text',
      inputType: 'email',
    }, {
      label: this.webText,
      name: 'WebAddress',
      property: 'WebAddress',
      type: 'text',
      inputType: 'url',
      maxTextLength: 128,
      validator: validator.exceedsMaxTextLength,
    }, {
      label: this.phoneText,
      name: 'MainPhone',
      property: 'MainPhone',
      type: 'phone',
      maxTextLength: 32,
      validator: validator.exceedsMaxTextLength,
    }, {
      title: this.detailsContactText,
      name: 'ContactInfoSection',
      children: [{
        label: this.contactTitleText,
        name: 'Contacts.$resources[0].Title',
        property: 'Contacts.$resources[0].Title',
        picklist: 'Title',
        title: this.contactTitleText,
        type: 'picklist',
        orderBy: 'text asc',
      }, {
        label: this.homePhoneText,
        name: 'Contacts.$resources[0].HomePhone',
        property: 'Contacts.$resources[0].HomePhone',
        type: 'phone',
        maxTextLength: 32,
        validator: validator.exceedsMaxTextLength,
      }, {
        name: 'Contacts.$resources[0].Mobile',
        property: 'Contacts.$resources[0].Mobile',
        label: this.mobileText,
        type: 'phone',
        maxTextLength: 32,
        validator: validator.exceedsMaxTextLength,
      }, {
        name: 'Contacts.$resources[0].WorkPhone',
        property: 'Contacts.$resources[0].WorkPhone',
        label: this.workText,
        type: 'phone',
        maxTextLength: 32,
        validator: validator.exceedsMaxTextLength,
      }, {
        name: 'Contacts.$resources[0].Fax',
        property: 'Contacts.$resources[0].Fax',
        label: this.faxText,
        type: 'phone',
        maxTextLength: 32,
        validator: validator.exceedsMaxTextLength,
      }, {
        emptyText: '',
        formatValue: format.address.bindDelegate(this, true, true),
        label: this.addressText,
        name: 'Contacts.$resources[0].Address',
        property: 'Contacts.$resources[0].Address',
        type: 'address',
        view: 'address_edit',
        entityName: 'Contact',
      }],
    }, {
      title: this.detailsAccountText,
      name: 'AccountInfoSection',
      children: [{
        name: 'Fax',
        property: 'Fax',
        label: this.faxText,
        type: 'phone',
        maxTextLength: 32,
        validator: validator.exceedsMaxTextLength,
      }, {
        name: 'Type',
        property: 'Type',
        label: this.typeText,
        type: 'picklist',
        picklist: 'Account Type',
        title: this.accountTypeTitleText,
      }, {
        name: 'SubType',
        property: 'SubType',
        label: this.subTypeText,
        type: 'picklist',
        requireSelection: false,
        picklist: this.formatDependentPicklist.bindDelegate(
          this, 'Account ${0}', true
        ),
        title: this.accountSubTypeTitleText,
        dependsOn: 'Type',
      }, {
        name: 'Status',
        property: 'Status',
        label: this.statusText,
        type: 'picklist',
        picklist: 'Account Status',
        title: this.accountStatusTitleText,
      }, {
        name: 'Industry',
        property: 'Industry',
        label: this.industryText,
        type: 'picklist',
        picklist: 'Industry',
        title: this.industryTitleText,
      }, {
        name: 'BusinessDescription',
        property: 'BusinessDescription',
        label: this.descriptionText,
        type: 'text',
      }, {
        label: this.acctMgrText,
        name: 'AccountManager',
        property: 'AccountManager',
        textProperty: 'UserInfo',
        textTemplate: template.nameLF,
        type: 'lookup',
        view: 'user_list',
      }, {
        label: this.ownerText,
        name: 'Owner',
        property: 'Owner',
        textProperty: 'OwnerDescription',
        type: 'lookup',
        view: 'owner_list',
      }, {
        emptyText: '',
        formatValue: format.address.bindDelegate(this, true, true),
        label: this.addressText,
        name: 'Address',
        property: 'Address',
        type: 'address',
        view: 'address_edit',
        entityName: 'Account',
      }],
    }]);
  },
});

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