name: object_layouts
label: Object Layouts
icon: dashboard_ea
hidden: true
version: 2
enable_dataloader: false
form:
  initialValues: !<tag:yaml.org,2002:js/function> |-
    function anonymous(
    ) {


      const objectApiName = this.doc.object_name;
      const res = Steedos.authRequest("/service/api/@" + objectApiName +"/uiSchemaTemplate", { type: 'get', async: false});
      return res || {}


    }
fields:
  buttons.$.button_name:
    name: buttons.$.button_name
    type: lookup
    reference_to: object_actions
    reference_to_field: name
    depend_on:
      - object_name
    amis:
      autoComplete:
        method: get
        url: '${context.rootUrl}/service/api/amis-metadata-objects/objects/${object_name}/actions/options'
        sendOn: '!!this.object_name'
        headers:
          Authorization: 'Bearer ${context.tenantId},${context.authToken}'
        cache: 120000
      source:
        method: get
        url: '${context.rootUrl}/service/api/amis-metadata-objects/objects/${object_name}/actions/options'
        sendOn: '!!this.object_name'
        headers:
          Authorization: 'Bearer ${context.tenantId},${context.authToken}'
        cache: 120000
    sort_no: 160
  buttons.$.visible_on:
    name: buttons.$.visible_on
    label: Visible on
    type: textarea
    rows: 1
    sort_no: 170
  buttons:
    name: buttons
    type: table
    blackbox: true
    is_wide: true
    depend_on:
      - object_name
    group: buttons
    sort_no: 150
  field_groups.$.collapsed:
    name: field_groups.$.collapsed
    type: boolean
    label: 默认折叠
    sort_no: 210
  field_groups.$.group_name:
    name: field_groups.$.group_name
    type: text
    label: 名称
    sort_no: 190
  field_groups.$.visible_on:
    name: field_groups.$.visible_on
    type: text
    label: 显示条件
    sort_no: 200
  field_groups:
    name: field_groups
    type: grid
    blackbox: true
    is_wide: true
    hidden: false
    label: 字段分组
    sort_no: 180
  fields.$:
    name: fields.$
    label: Field
    blackbox: true
    type: object
    sort_no: 230
  fields.$.field_name:
    name: fields.$.field_name
    label: Field
    type: lookup
    multiple: false
    is_wide: false
    required: true
    reference_to: object_fields
    reference_to_field: name
    depend_on:
      - object_name
    sort_no: 240
  fields.$.group:
    name: fields.$.group
    label: Group
    type: text
    sort_no: 270
  fields.$.is_readonly:
    name: fields.$.is_readonly
    label: Readonly
    type: boolean
    sort_no: 250
  fields.$.is_required:
    name: fields.$.is_required
    label: Required
    type: boolean
    sort_no: 260
  fields.$.visible_on:
    name: fields.$.visible_on
    label: Visible on
    type: textarea
    rows: 1
    sort_no: 280
  fields:
    name: fields
    type: grid
    is_wide: true
    required: true
    depend_on:
      - object_name
    group: fields
    sort_no: 220
  is_system:
    name: is_system
    type: boolean
    label: System
    readonly: true
    visible_on: '{{global.mode ===''read'' ? true : false}}'
    disabled: true
    sort_no: 380
  label:
    name: label
    type: text
    required: true
    label: Label
    is_wide: true
    is_name: true
    group: general_information
    sort_no: 110
  name:
    name: name
    type: text
    required: true
    label: Api Name
    is_wide: true
    group: general_information
    sort_no: 100
  object_name:
    name: object_name
    label: Object
    type: master_detail
    required: true
    reference_to: objects
    reference_to_field: name
    is_wide: true
    write_requires_master_read: true
    group: general_information
    sort_no: 120
  profiles:
    name: profiles
    type: lookup
    label: Profile
    showIcon: false
    multiple: true
    required: true
    create: false
    reference_to: permission_set
    reference_to_field: name
    is_wide: true
    defaultValue:
      - admin
      - user
    optionsFunction: !<tag:yaml.org,2002:js/function> |-
      function anonymous(
      ) {


        var profiles = Creator.odata.query('permission_set', {$filter: "(type eq 'profile')"}, true);
        var result = [];
        profiles.forEach(function (item) {
          result.push({
            label: item.label,
            value: item.name
          });
        });
        return result;


      }
    group: general_information
    sort_no: 140
  related_lists.$.field_names:
    name: related_lists.$.field_names
    type: lookup
    create: false
    multiple: true
    reference_to: object_fields
    reference_to_field: name
    depend_on:
      - object_name
      - related_lists
    filtersFunction: !<tag:yaml.org,2002:js/function> |-
      function anonymous(filters,values
      ) {


        let relatedFieldFullname = null;
        const rowValue = _.find(values.related_lists, function(item){
          return item._id === values._grid_row_id
        })
        if(rowValue){
          relatedFieldFullname = rowValue.related_field_fullname
        }
        if(relatedFieldFullname){
          const objectName = relatedFieldFullname.substring(0, relatedFieldFullname.indexOf("."))
          return ['object', '=', objectName]
        }else{
          return ['_id', '=', 'no']
        }


      }
    sort_no: 320
  related_lists.$.filters:
    name: related_lists.$.filters
    label: Filters
    type: textarea
    rows: 1
    is_wide: true
    sort_no: 350
  related_lists.$.label:
    name: related_lists.$.label
    label: Label
    type: text
    inlineHelpText: default is the object name
    sort_no: 310
  related_lists.$.page_size:
    name: related_lists.$.page_size
    label: Page Size
    type: number
    scale: 0
    defaultValue: 5
    sort_no: 370
  related_lists.$.related_field_fullname:
    name: related_lists.$.related_field_fullname
    type: lookup
    amis:
      tpl: '${related_field_fullname.label}'
    optionsFunction: !<tag:yaml.org,2002:js/function> |-
      function anonymous(values
      ) {


        if (!(values != null ? values.object_name : void 0)) {
          values.object_name = Session.get("object_name");
        }
        if(values.object_name && !_.isString(values.object_name)){
          values.object_name = values.object_name.name
        }
        const options = [];
        const object = Creator.getObject(values.object_name);

        let relatedLists = []
        if(object.enable_files){
            relatedLists.push("cms_files.parent")
        }
        /*
        object.details是一个字符串，形如：testb__c.testa__c
        object.lookup_details是一个对象，格式如下：
        {
          key: "testd__c.testa__c",
          objectName: "testa__c",
          type: "detail",
        }
        */
        relatedLists = relatedLists.concat(_.union(object.details, object.lookup_details));

        if(object.enable_tasks){
            relatedLists.push("tasks.related_to")
        }
        if(object.enable_notes){
            relatedLists.push("notes.related_to")
        }
        if(object.enable_events){
            relatedLists.push("events.related_to")
        }
        if(object.enable_instances){
            relatedLists.push("instances.record_ids")
        }
        if(object.enable_approvals){
            relatedLists.push("approvals.related_to")
        }
        if(object.enable_process){
            relatedLists.push("process_instance_history.target_object")
        }
        if(object.enable_audit){
            relatedLists.push("audit_records.related_to")
        }

        _.each(relatedLists, function(related){
          if (!related) return;
          /*related可能是一个lookup_details，它是对象而不是字符串，从中取出key值*/
          if(typeof related !== "string"){
            related = related.key;
          }
          if (!related) return;
          let foo = related.split('.');
          let rObjectName = foo[0];
          let rFieldName = foo[1];
          let rObjectLable = Creator.getObject(rObjectName).label;
          let rObjectFieldLable = (_.find(Creator.getObject(rObjectName).fields, function(field){return field.name === rFieldName}) || {}).label;
          options.push({label: `${rObjectLable}.${rObjectFieldLable}`, value: related})
        })
        return options;


      }
    sort_no: 300
  related_lists.$.sort_field_name:
    name: related_lists.$.sort_field_name
    label: Sort field
    type: lookup
    create: false
    multiple: true
    reference_to: object_fields
    reference_to_field: name
    depend_on:
      - object_name
      - related_lists
    filtersFunction: !<tag:yaml.org,2002:js/function> |-
      function anonymous(filters,values
      ) {


        let relatedFieldFullname = null;
        const rowValue = _.find(values.related_lists, function(item){
          return item._id === values._grid_row_id
        })
        if(rowValue){
          relatedFieldFullname = rowValue.related_field_fullname
        }
        if(relatedFieldFullname){
          const objectName = relatedFieldFullname.substring(0, relatedFieldFullname.indexOf("."))
          return ['object', '=', objectName]
        }else{
          return ['_id', '=', 'no']
        }


      }
    sort_no: 330
  related_lists.$.sort_order:
    name: related_lists.$.sort_order
    label: Sort Order
    type: select
    defaultValue: '"asc"'
    options:
      - label: ASC
        value: asc
      - label: DESC
        value: desc
    sort_no: 340
  related_lists.$.visible_on:
    name: related_lists.$.visible_on
    label: Visible on
    type: textarea
    rows: 1
    sort_no: 360
  related_lists:
    name: related_lists
    type: grid
    blackbox: true
    is_wide: true
    depend_on:
      - object_name
    group: related_lists
    sort_no: 290
  type:
    name: type
    type: select
    options:
      - label: Record
        value: record
      - label: Page
        value: page
    defaultValue: '"record"'
    hidden: true
    sort_no: 130
