Source: products/argos-saleslogix/src/Views/Contact/Edit.js

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

const resource = getResource('contactEdit');

/**
 * @class crm.Views.Contact.Edit
 *
 * @extends argos.Edit
 *
 * @requires argos.Utility
 *
 * @requires crm.Format
 * @requires crm.Template
 * @requires crm.Validator
 */
const __class = declare('crm.Views.Contact.Edit', [Edit], {
  // Localization
  titleText: resource.titleText,
  nameText: resource.nameText,
  workText: resource.workText,
  mobileText: resource.mobileText,
  emailText: resource.emailText,
  webText: resource.webText,
  acctMgrText: resource.acctMgrText,
  accountNameText: resource.accountNameText,
  homePhoneText: resource.homePhoneText,
  faxText: resource.faxText,
  addressText: resource.addressText,
  contactTitleText: resource.contactTitleText,
  titleTitleText: resource.titleTitleText,
  addressTitleText: resource.addressTitleText,
  ownerText: resource.ownerText,
  cuisinePreferenceText: resource.cuisinePreferenceText,

  // View Properties
  entityName: 'Contact',
  id: 'contact_edit',
  insertSecurity: 'Entities/Contact/Add',
  updateSecurity: 'Entities/Contact/Edit',
  querySelect: [
    'Account/AccountName',
    'AccountManager/UserInfo/FirstName',
    'AccountManager/UserInfo/LastName',
    'AccountName',
    'Address/*',
    'CuisinePreference',
    'CreateDate',
    'CreateUser',
    'Email',
    'Fax',
    'FirstName',
    'HomePhone',
    'LastName',
    'MiddleName',
    'Mobile',
    'Name',
    'NameLF',
    'Owner/OwnerDescription',
    'Prefix',
    'Suffix',
    'Title',
    'WebAddress',
    'WorkPhone',
  ],
  queryInclude: [
    '$permissions',
  ],
  resourceKind: 'contacts',

  startup: function startup() {
    this.inherited(arguments);
    this.connect(this.fields.Account, 'onChange', this.onAccountChange);
  },
  beforeTransitionTo: function beforeTransitionTo() {
    this.inherited(arguments);
    if (this.options.insert) {
      this.fields.Account.enable();
    } else {
      this.fields.Account.disable();
    }
  },
  onAccountChange: function onAccountChange(value) {
    if (value && value.text) {
      this.fields.AccountName.setValue(value.text);
    }
    this.requestAccount(value.key);
  },
  applyContext: function applyContext() {
    const found = App.queryNavigationContext((o) => {
      const ob = (o.options && o.options.source) || o;
      return (/^(accounts|opportunities)$/).test(ob.resourceKind) && ob.key;
    });

    const lookup = {
      accounts: this.applyAccountContext,
      opportunities: this.applyOpportunityContext,
    };

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

    if (found && lookup[found.resourceKind]) {
      lookup[found.resourceKind].call(this, found);
    }
  },
  applyAccountContext: function applyAccountContext(context) {
    const view = App.getView(context.id);
    const entry = view && view.entry;

    if (!entry && context.options && context.options.source && context.options.source.entry) {
      this.requestAccount(context.options.source.entry.$key);
    }

    this.processAccount(entry);
  },
  requestAccount: function requestAccount(accountId) {
    const request = new Sage.SData.Client.SDataSingleResourceRequest(this.getService())
      .setResourceKind('accounts')
      .setResourceSelector(`'${accountId}'`)
      .setQueryArg('select', [
        'AccountName',
        'Address/*',
        'Fax',
        'MainPhone',
        'WebAddress',
      ].join(','));

    request.allowCacheUse = true;
    request.read({
      success: this.processAccount,
      failure: this.requestAccountFailure,
      scope: this,
    });
  },
  requestAccountFailure: function requestAccountFailure() {},
  processAccount: function processAccount(entry) {
    const account = entry;
    const accountName = utility.getValue(entry, 'AccountName');
    const webAddress = utility.getValue(entry, 'WebAddress');
    const mainPhone = utility.getValue(entry, 'MainPhone');
    const address = utility.getValue(entry, 'Address');
    const fax = utility.getValue(entry, 'Fax');

    if (account) {
      this.fields.Account.setValue(account);
    }
    if (accountName) {
      this.fields.AccountName.setValue(accountName);
    }
    if (webAddress) {
      this.fields.WebAddress.setValue(webAddress);
    }
    if (mainPhone) {
      this.fields.WorkPhone.setValue(mainPhone);
    }
    if (address) {
      this.fields.Address.setValue(this.cleanAddressEntry(address));
    }
    if (fax) {
      this.fields.Fax.setValue(fax);
    }
  },
  applyOpportunityContext: function applyOpportunityContext(context) {
    const view = App.getView(context.id);
    const entry = view && view.entry;
    const opportunityId = utility.getValue(entry, '$key');
    const account = utility.getValue(entry, 'Account');
    const accountName = utility.getValue(entry, 'Account.AccountName');
    const webAddress = utility.getValue(entry, 'Account.WebAddress');
    const mainPhone = utility.getValue(entry, 'Account.MainPhone');
    const address = utility.getValue(entry, 'Account.Address');
    const fax = utility.getValue(entry, 'Account.Fax');

    if (opportunityId) {
      this.fields['Opportunities.$resources[0].Opportunity.$key'].setValue(opportunityId);
    }
    if (account) {
      this.fields.Account.setValue(account);
    }
    if (accountName) {
      this.fields.AccountName.setValue(accountName);
    }
    if (webAddress) {
      this.fields.WebAddress.setValue(webAddress);
    }
    if (mainPhone) {
      this.fields.WorkPhone.setValue(mainPhone);
    }
    if (address) {
      this.fields.Address.setValue(this.cleanAddressEntry(address));
    }
    if (fax) {
      this.fields.Fax.setValue(fax);
    }
  },
  cleanAddressEntry: function cleanAddressEntry(address) {
    if (address) {
      const clean = {};
      const skip = {
        $key: true,
        $lookup: true,
        $url: true,
        EntityId: true,
        ModifyDate: true,
        ModifyUser: true,
        CreateDate: true,
        CreateUser: true,
      };

      for (const name in address) {
        if (address.hasOwnProperty(name)) {
          if (!skip[name]) {
            clean[name] = address[name];
          }
        }
      }
      return clean;
    }
    return null;
  },
  createLayout: function createLayout() {
    return this.layout || (this.layout = [{
      applyTo: '.',
      formatValue: format.nameLF,
      label: this.nameText,
      name: 'ContactName',
      property: 'ContactName',
      type: 'name',
      validator: validator.name,
      view: 'name_edit',
    }, {
      label: this.accountNameText,
      name: 'Account',
      property: 'Account',
      textProperty: 'AccountName',
      type: 'lookup',
      validator: validator.exists,
      view: 'account_related',
    }, {
      name: 'AccountName',
      property: 'AccountName',
      type: 'hidden',
    }, {
      name: 'WebAddress',
      property: 'WebAddress',
      label: this.webText,
      type: 'text',
      inputType: 'url',
      maxTextLength: 128,
      validator: validator.exceedsMaxTextLength,
    }, {
      name: 'WorkPhone',
      property: 'WorkPhone',
      label: this.workText,
      type: 'phone',
      maxTextLength: 32,
      validator: validator.exceedsMaxTextLength,
    }, {
      name: 'Email',
      property: 'Email',
      label: this.emailText,
      type: 'text',
      inputType: 'email',
    }, {
      label: this.contactTitleText,
      name: 'Title',
      property: 'Title',
      picklist: 'Title',
      title: this.titleTitleText,
      type: 'picklist',
    }, {
      formatValue: format.address.bindDelegate(this, true),
      label: this.addressText,
      name: 'Address',
      property: 'Address',
      type: 'address',
      view: 'address_edit',
    }, {
      name: 'HomePhone',
      property: 'HomePhone',
      label: this.homePhoneText,
      type: 'phone',
      maxTextLength: 32,
      validator: validator.exceedsMaxTextLength,
    }, {
      name: 'Mobile',
      property: 'Mobile',
      label: this.mobileText,
      type: 'phone',
      maxTextLength: 32,
      validator: validator.exceedsMaxTextLength,
    }, {
      name: 'Fax',
      property: 'Fax',
      label: this.faxText,
      type: 'phone',
      maxTextLength: 32,
      validator: validator.exceedsMaxTextLength,
    }, {
      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',
    }, {
      name: 'Opportunities.$resources[0].Opportunity.$key',
      property: 'Opportunities.$resources[0].Opportunity.$key',
      type: 'hidden',
    }, {
      label: this.cuisinePreferenceText,
      name: 'CuisinePreference',
      property: 'CuisinePreference',
      type: 'picklist',
      picklist: 'CuisinePrefs',
      singleSelect: false,
      title: this.cuisinePreferenceTitleText,
    }]);
  },
});

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