name: flows
icon: environment_hub
label: Workflow
hidden: true
enable_files: true
enable_dataloader: false
version: 2
fields:
  name:
    type: text
    label: Name
    required: false
    searchable: true
    # readonly: true
    name: name
    filterable: true
  api_name:
    type: text
    label: Api Name
    required: false
    inlineHelpText: "配置了Api Name 的流程才能同步为元数据"
    searchable: true
    name: api_name
    filterable: true
  form:
    label: Form
    type: lookup
    reference_to: forms
    readonly: true
    visible_on: "{{global.mode !='read' ? false : true}}"
    name: form
  category:
    label: Category
    type: lookup
    reference_to: categories
    name: category
    filterable: true
    required: true
  state:
    label: State
    type: select
    options:
      - label: Enabled
        value: enabled
      - label: Disabled
        value: disabled
    readonly: true
    visible_on: "{{global.mode !='read' ? false : true}}"
    name: state
    filterable: true
  is_valid:
    label: Valid
    type: boolean
    readonly: true
    visible_on: "{{global.mode !='read' ? false : true}}"
    name: is_valid
  current_no:
    label: Current Number
    type: number
    readonly: true
    visible_on: "{{global.mode !='read' ? false : true}}"
    name: current_no
  description:
    label: Description
    type: textarea
    is_wide: true
    name: description
  enable_amisform:
    label: 启用amis表单
    type: boolean
    is_wide: false
    name: description
    visible_on: "{{false}}"
  help_text:
    label: Help
    type: textarea
    is_wide: true
    name: help_text
  company_id:
    label: Main Division
  created_by:
    label: Created by
    sort_no: 9999
  modified_by:
    label: Modified by
    sort_no: 9999
  current:
    label: Current
    type: object
    is_wide: true
    blackbox: true
    visible_on: "{{global.mode ==='read' ? true : false}}"
    readonly: true
    name: current
  current.modified:
    label: Modification Time of Current
    type: datetime
    readonly: true
    visible_on: "{{global.mode ==='read' ? true : false}}"
    hidden: true
    name: current.modified
  current.modified_by:
    label: Modified Currently by
    type: lookup
    reference_to: users
    readonly: true
    visible_on: "{{global.mode ==='read' ? true : false}}"
    hidden: true
    name: current.modified_by
    filterable: true
  current.created:
    label: Creation Time of Current
    type: datetime
    readonly: true
    visible_on: "{{global.mode ==='read' ? true : false}}"
    hidden: true
    name: current.created
  current.created_by:
    label: Created Currently by
    type: lookup
    reference_to: users
    readonly: true
    visible_on: "{{global.mode !='read' ? false : true}}"
    hidden: true
    name: current.created_by
    filterable: true
  current.steps:
    label: Current Steps
    type: table
    readonly: true
    visible_on: "{{global.mode !='read' ? false : true}}"
    is_wide: true
    name: current.steps
  current.steps.$._id:
    type: text
    visible_on: "{{global.mode !='read' ? false : true}}"
    readonly: true
    hidden: true
    name: current.steps.$._id
  current.steps.$.name:
    label: Name
    readonly: true
    visible_on: "{{global.mode !='read' ? false : true}}"
    type: text
    name: current.steps.$.name
  current.steps.$.disableCC:
    label: Disable CC
    type: boolean
    visible_on: "{{global.mode !='read' ? false : true}}"
    readonly: true
    name: current.steps.$.disableCC
  current.steps.$.allowDistribute:
    label: Can Distribute Instance
    type: boolean
    readonly: true
    visible_on: "{{global.mode !='read' ? false : true}}"
    name: current.steps.$.allowDistribute
  current.steps.$.can_edit_main_attach:
    label: Can Edit Main Attach
    type: boolean
    readonly: true
    visible_on: "{{global.mode !='read' ? false : true}}"
    name: current.steps.$.can_edit_main_attach
  current.steps.$.can_edit_normal_attach:
    label: Can Edit Normal Attach
    type: boolean
    readonly: true
    visible_on: "{{global.mode !='read' ? false : true}}"
    name: current.steps.$.can_edit_normal_attach
  current.steps.$.distribute_optional_flows:
    label: Workflows of Distribution
    type: lookup
    reference_to: flows
    multiple: true
    readonly: true
    visible_on: "{{global.mode !='read' ? false : true}}"
    hidden: true
    name: current.steps.$.distribute_optional_flows
    filterable: true
  current.steps.$.cc_must_finished:
    label: Must Wait for CC finished
    type: boolean
    readonly: true
    visible_on: "{{global.mode !='read' ? false : true}}"
    name: current.steps.$.cc_must_finished
  current.steps.$.cc_alert:
    label: Pop up CC Alert
    type: boolean
    readonly: true
    visible_on: "{{global.mode !='read' ? false : true}}"
    name: current.steps.$.cc_alert
  current.steps.$.allowBatch:
    label: Batch Processing
    type: boolean
    readonly: true
    visible_on: "{{global.mode !='read' ? false : true}}"
    name: current.steps.$.allowBatch
  current.steps.$.oneClickApproval:
    label: One Click Approval
    type: boolean
    readonly: true
    visible_on: "{{global.mode !='read' ? false : true}}"
    name: current.steps.$.oneClickApproval
  current.steps.$.oneClickRejection:
    label: One Click Rejection
    type: boolean
    readonly: true
    visible_on: "{{global.mode !='read' ? false : true}}"
    name: current.steps.$.oneClickRejection
  perms:
    label: Permissions
    type: object
    is_wide: true
    blackbox: true
    name: perms
    group: Permissions
  perms.users_can_add:
    label: Users that Can Initiate New Request
    type: lookup
    reference_to: users
    multiple: true
    is_wide: true
    name: perms.users_can_add
    filterable: true
    group: Permissions
  perms.orgs_can_add:
    label: 'Departments that Can Initiate New Request'
    type: lookup
    reference_to: organizations
    multiple: true
    is_wide: true
    name: perms.orgs_can_add
    filterable: true
    group: Permissions
  perms.users_can_monitor:
    label: Users that Can Read All the Reqests
    type: lookup
    reference_to: users
    multiple: true
    is_wide: true
    name: perms.users_can_monitor
    filterable: true
    group: Permissions
  perms.orgs_can_monitor:
    label: Departments that Can Read All the Reqests
    type: lookup
    reference_to: organizations
    multiple: true
    is_wide: true
    name: perms.orgs_can_monitor
    filterable: true
    group: Permissions
  perms.users_can_admin:
    label: Users that Can Read , Relocat, Reassign or Delete  All the Reqests
    type: lookup
    reference_to: users
    multiple: true
    is_wide: true
    name: perms.users_can_admin
    filterable: true
    group: Permissions
  perms.orgs_can_admin:
    label: Departments that Can Read , Relocat, Reassign or Delete  All the Reqests
    type: lookup
    reference_to: organizations
    multiple: true
    is_wide: true
    name: perms.orgs_can_admin
    filterable: true
    group: Permissions
  app:
    label: App
    type: text
    omit: true
    hidden: true
    name: app
  historys:
    label: History Workflows
    type: grid
    blackbox: true
    omit: true
    hidden: true
    name: historys
  object_name:
    type: lookup
    label: Object
    reference_to: objects
    reference_to_field: name
    required: false
    filters: ['enable_workflow', '=', true]
    group: FlowBindObject
  instance_fields:
    type: grid
    is_wide: true
    required: false
    depend_on:
      - object_name
    group: FlowBindObject
    visible_on: "{{ (formData.object_name && global.mode ==='read') ? true : false}}"
    readonly: true
  instance_fields.$:
    label: Field
    blackbox: true
    type: object
  instance_fields.$.name:
    label: Field
    type: lookup
    multiple: false
    is_wide: false
    required: false
    reference_to: object_fields
    reference_to_field: name
    depend_on:
      - object_name
    filtersFunction: !<tag:yaml.org,2002:js/function> |-
      function (filters, values) {
        const objectName = _.isObject(values.object_name) ? values.object_name.name : values.object_name;
        if(objectName){
          if(values._grid_row_id){
            var selected = _.find(values.instance_fields, function(item){return item._id==values._grid_row_id});
            var selectedAll = _.pluck(values.instance_fields, 'name');
            if(selected){
              selectedAll = _.difference(selectedAll, [selected.name]);
            }
            if(selectedAll && selectedAll.length > 0){
              return [['object', '=', objectName], ['name', '!=', selectedAll]]
            }
          }
          return ['object', '=', objectName]
        }else{
          return ['_id', '=', 'no']
        }
      }
  instance_fields.$.required:
    label: Required
    type: boolean
  instance_table_fields:
    type: grid
    blackbox: true
    is_wide: true
    depend_on:
      - object_name
    group: FlowBindObject
    visible_on: "{{(formData.object_name && global.mode ==='read') ? true : false}}"
    readonly: true
  instance_table_fields.$.detail_field_fullname:
    type: lookup
    optionsFunction: !!js/function |
      function(values) {
        if (!(values != null ? values.object_name : void 0)) {
          return [];
        }
        const objectName = _.isObject(values.object_name) ? values.object_name.name : values.object_name;

        const options = [];
        const { detailsInfo } = Steedos.authRequest('/am/forms/getDetailsInfo', {
            type: 'post',
            async: false,
            data: JSON.stringify({
                objectName
            })
        });

        _.each(detailsInfo, function(related){
          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;
      }
  instance_table_fields.$.label:
    label: Label
    type: text
    inlineHelpText: default is the object name
  instance_table_fields.$.field_names:
    type: lookup
    create: false
    multiple: true
    reference_to: object_fields
    reference_to_field: name
    depend_on:
      - object_name
      - instance_table_fields
    filtersFunction: !<tag:yaml.org,2002:js/function> |-
      function (filters, values) {
        let relatedFieldFullname = null;
        const rowValue = _.find(values.instance_table_fields, function(item){
          return item._id === values._grid_row_id
        })
        if(rowValue){
          relatedFieldFullname = rowValue.detail_field_fullname
        }
        if(relatedFieldFullname){
          const objectName = relatedFieldFullname.substring(0, relatedFieldFullname.indexOf("."))
          return ['object', '=', objectName]
        }else{
          return ['_id', '=', 'no']
        }
      }
  instance_template:
    label: Instance Template
    type: code
    language: handlebars
    is_wide: true
    group: Template
    name: instance_template
    visible_on: "this.enable_amisform ? false : true"
  print_template:
    label: Print Template
    type: code
    language: handlebars
    is_wide: true
    group: Template
    name: print_template
    visible_on: "this.enable_amisform ? false : true"
  field_map:
    label: Mapping
    type: code
    language: json
    is_wide: true
    group: Synchronization
    name: field_map
  events:
    label: Events
    type: code
    language: javascript
    is_wide: true
    group: Develop
    name: events
    visible_on: "this.enable_amisform ? false : true"
  distribute_optional_users:
    type: object
    label: Users to be Distributed
    reference_to: users
    multiple: true
    is_wide: true
    group: Distribution
    blackbox: true
    omit: true
    hidden: true
    name: distribute_optional_users
    filterable: true
  distribute_to_self:
    label: Distribute to myself
    type: boolean
    group: Distribution
    omit: true
    hidden: true
    name: distribute_to_self
  distribute_end_notification:
    label: Distribute to myself
    type: boolean
    group: Distribution
    omit: true
    hidden: true
    name: distribute_to_self
  upload_after_being_distributed:
    label: Allow upload after being distributed
    type: boolean
    group: Distribution
    omit: true
    hidden: true
  enable_distribute_instance_to_attachment:
    type: boolean
    label: 分发时允许将原表单存储为附件
    group: Distribution
  enable_distribute_instance_related:
    type: boolean
    label: 分发时允许自动创建关联文件
    group: Distribution
  name_formula:
    label: Formula of Title
    type: text
    group: Others
    name: name_formula
    omit: true
    hidden: true
  code_formula:
    label: Formula of Code
    type: text
    group: Others
    name: code_formula
    omit: true
    hidden: true
  auto_remind:
    label: Auto Remind
    type: boolean
    group: Others
    name: auto_remind
  sort_no:
    type: number
    label: Sort Number
    group: Others
    sortable: true
    name: sort_no
  timeout_auto_submit:
    label: Auto Commit if Time Out
    type: boolean
    group: Others
    name: timeout_auto_submit
  allow_select_step:
    label: Applicant can Select Steps and Handlers
    inlineHelpText: Allow the applicant to specify the flow steps and step handlers when submitting the application form. You need to modify the properties on the step through the Workflow Designer.
    type: boolean
    group: Others
  forbid_initiate_instance:
    label: 审批王端禁止发起流程
    type: boolean
    group: Others
list_views:
  all:
    label: All Workflows
    filter_scope: space
    columns:
      - name
      - state
      - category
      - sort_no
      - modified
    extra_columns:
      - form
      - object_name
      - enable_amisform
    filter_fields:
      - state
      - category
      - company_id
    sort:
      - - modified
        - desc
  customize:
    label: 自定义
    filters:
      - ["is_system","<>",true]
    filter_scope: space
    columns:
      - name
      - state
      - category
      - sort_no
      - modified
    sort:
      - - modified
        - desc
actions:
  standard_new:
    label: New
    visible: !<tag:yaml.org,2002:js/function> |-
      function () {
              var permissions;
              permissions = Creator.getPermissions();

              if (permissions) {
                return permissions["allowCreate"];
              }
            }
    'on': list
    amis_schema: |-
      {
          "type": "service",
          "body": [
              {
                  "type": "button",
                  "label": "${'flows.standard_new.new' | t}",
                  "id": "u:new_flow",
                  "onEvent": {
                      "click": {
                          "actions": [
                              {
                                  "actionType": "dialog",
                                  "dialog": {
                                      "type": "dialog",
                                      "data": {
                                        "&": "$$",
                                        "spaceId": "${context.tenantId}"
                                      },
                                      "title": "${'flows.standard_new.new_flow' | t}",
                                      "body": [
                                          {
                                              "type": "form",
                                              "id": "u:81f0d8165f54",
                                              "title": "表单",
                                              "body": [
                                                {
                                                  "type": "uuid",
                                                  "name": "id",
                                                  "length": 32
                                                },
                                                  {
                                                  "type": "select",
                                                  "name": "category",
                                                  "label": "${'flows.standard_new.category' | t}",
                                                  "required": true,
                                                  "joinValues": false,
                                                  "extractValue": true,
                                                  "autoComplete": {
                                                    "method": "post",
                                                    "url": "${context.rootUrl}/graphql",
                                                    "data": {
                                                      "orderBy": "${orderBy}",
                                                      "orderDir": "${orderDir}",
                                                      "pageNo": "${page}",
                                                      "pageSize": "${perPage}",
                                                      "query": "{options:categories(filters: {__filters}, top: {__top}){_id label:name value:_id},count:categories__count(filters:{__filters})}",
                                                      "$term": "$term",
                                                      "$value": "$category._id",
                                                      "$": "$$",
                                                      "rfield": "${object_name}"
                                                    },
                                                    "headers": {
                                                      "Authorization": "Bearer ${context.tenantId},${context.authToken}"
                                                    },
                                                    "requestAdaptor": "\n        var filters = '[]';\n        var top = 10;\n        if(api.data.$term){\n            filters = '[\"name\", \"contains\", \"'+ api.data.$term +'\"]';\n        }else if(api.data.$value){\n            filters = '[\"_id\", \"=\", \"'+ api.data.$value +'\"]';\n        }\n        api.data.query = api.data.query.replace(/{__filters}/g, filters).replace('{__top}', top);\n        return api;\n    "
                                                  },
                                                  "labelClassName": "text-left",
                                                  "clearValueOnHidden": true,
                                                  "fieldName": "category",
                                                  "id": "u:ebbbc41d58b8"
                                                },
                                                  {
                                                      "type": "input-text",
                                                      "label": "${'flows.standard_new.flow_name' | t}",
                                                      "name": "name",
                                                      "id": "u:4af5bdaa813a",
                                                      "required": true,
                                                      "labelClassName": "text-left"
                                                  },
                                                  {
                                                    "type": "steedos-field",
                                                    "className": "mb-3",
                                                    "config": {
                                                      "name": "company_id",
                                                      "type": "lookup",
                                                      "reference_to": "company",
                                                      "label": "${'flows.standard_new.division' | t}"
                                                    }
                                                  },
                                                  {
                                                      "label": "${'flows.standard_new.binding_objects' | t}",
                                                      "type": "select",
                                                      "name": "object_name2",
                                                      "clearable": true,
                                                      "id": "u:4e769995f638",
                                                      "required": false,
                                                      "joinValues": false,
                                                      "extractValue": true,
                                                      "labelField": "label",
                                                      "valueField": "value",
                                                      "className": "",
                                                      "labelClassName": "text-left",
                                                      "en-US": {
                                                          "label": "Object"
                                                      },
                                                      "checkAll": false,
                                                      "searchable": true,
                                                      "source": {
                                                          "method": "post",
                                                          "url": "${context.rootUrl}/graphql",
                                                          "data": {
                                                              "orderBy": "${orderBy}",
                                                              "orderDir": "${orderDir}",
                                                              "pageNo": "${page}",
                                                              "pageSize": "${perPage}",
                                                              "query": "{options:objects(filters: {__filters}, top: {__top}, sort: \"{__sort}\"){_id label:label value:name},count:objects__count(filters:{__filters}),defaultValueOptions:objects(filters:{__options_filters}){_id label:label value:name}}",
                                                              "$term": "$term",
                                                              "rfield": "${object_name}"
                                                          },
                                                          "headers": {
                                                              "Authorization": "Bearer ${context.tenantId},${context.authToken}"
                                                          },
                                                          "adaptor": "\n            const data = payload.data;\n            var defaultValueOptions = data.defaultValueOptions;\n            // 字段值下拉选项合并到options中\n            data.options = _.unionWith(defaultValueOptions, data.options, function(a,b){\n                return a[\"value\"]=== b[\"value\"];\n            });\n            delete data.defaultValueOptions;\n            payload.data.options = data.options;\n            return payload;\n        ",
                                                          "requestAdaptor": "\n        var filters = [];\n        var top = 1000;\n        if(api.data.$term){\n            filters = [[\"label\", \"contains\", api.data.$term]];\n        }\n        // else if(api.data.$value){\n        //     filters = [[\"_id\", \"=\", api.data.$value]];\n        // }\n\n        var fieldFilters = [\"enable_workflow\",\"=\",true];\n        if(fieldFilters && fieldFilters.length){\n            filters.push(fieldFilters);\n        }\n\n        const filtersFunction = undefined;\n\n        if(filtersFunction){\n            const _filters = filtersFunction(filters, api.data.$);\n            if(_filters && _filters.length > 0){\n                filters.push(_filters);\n            }\n        }\n        var sort = \"\";\n        api.data.query = api.data.query.replace(/{__filters}/g, JSON.stringify(filters)).replace('{__top}', top).replace('{__sort}', sort.trim());\n\n        var defaultValue = api.data.$value;\n        var optionsFiltersOp = \"=\";\n        var optionsFilters = [[\"name\", optionsFiltersOp, []]];\n        if (defaultValue && !api.data.$term) { \n            // 字段值单独请求，没值的时候在请求中返回空\n            optionsFilters = [[\"name\", optionsFiltersOp, defaultValue]];\n        }\n        api.data.query = api.data.query.replace(/{__options_filters}/g, JSON.stringify(optionsFilters));\n        return api;\n    "
                                                      },
                                                      "multiple": false
                                                  },{"type": "checkbox","option": "","name": "enable_amisform","id": "u:f581950a606a","label": "${'flows.standard_new.enable_amis_forms' | t}"}
                                              ],
                                              "api": {
                                                  "method": "post",
                                                  "url": "${context.rootUrl}/am/forms?sync_token=",
                                                  "data": {
                                                      "&": "$$",
                                                      "space": "${spaceId}"
                                                  },
                                                  "requestAdaptor": "const {id, name, space, enable_amisform} = api.body;var form = {\n  id,\n  name,\n  space,\n  enable_amisform,\n  is_valid: true,\n  app: 'workflow',\n  current: {\n    id\n  }\n\n};\nvar body = api.body;\nif (body.category) {\n  form.category = body.category\n}\n\nlet companyId = body.company_id\nif (companyId) {\n  form.company_id = companyId\n}\n\nif (body.object_name2) {\n  form.object_name = body.object_name2\n}\n\napi.data = {\n  Forms: [form]\n};\n\nconsole.log(`api`, api)\nreturn api;"
                                              },
                                              "onEvent": {
                                              "submitSucc": {
                                                "weight": 0,
                                                "actions": [
                                                  {
                                                    "actionType": "broadcast",
                                                    "args": {
                                                      "eventName": "@data.changed.flows",
                                                      "recordId": "newFlow"
                                                    },
                                                    "data": {
                                                      "objectName": "flows"
                                                    }
                                                  }
                                                ]
                                              }
                                            }
                                          }
                                      ],
                                      "id": "u:85b77731ab26"
                                  }
                              }
                          ],
                          "weight": 0
                      }
                  }
              }
          ],
          "regions": [
              "body"
          ],
          "data": {
              "context": {
                  "rootUrl": "http://127.0.0.1:5300"
              },
              "app_id": "",
              "tab_id": "",
              "object_name": "",
              "dataComponentId": "",
              "record_id": "",
              "record": {},
              "permissions": {}
          },
          "bodyClassName": "p-0",
          "id": "u:35a8389e43b3"
      }
    is_enable: true
    type: amis_button
  design:
    label: Designer
    visible: !<tag:yaml.org,2002:js/function> |-
      function () {
              return true;
            }
    'on': list
    todo: !<tag:yaml.org,2002:js/function> |-
      function (object_name, record_id, fields) {
              return WorkflowCore.openFlowDesign(Steedos.locale().toLocaleLowerCase(), Steedos.spaceId(), null, Creator.getUserCompanyId());
            }
  standard_edit:
    visible: true
    'on': record
  standard_delete:
    visible: false
    'on': record_more
  standard_delete_many:
    visible: false
    'on': list
  designFlow:
    label: Flow Designer
    visible: !<tag:yaml.org,2002:js/function> |-
      function (object_name, record_id, record_permissions) {
              return true;
            }
    'on': record
    todo: !<tag:yaml.org,2002:js/function> |-
      function (object_name, record_id, fields) {
              return WorkflowCore.openFlowDesign(Steedos.locale().toLocaleLowerCase(), Steedos.spaceId(), record_id, Creator.getUserCompanyId());
            }
  designForm:
    label: Form Designer
    visible: !<tag:yaml.org,2002:js/function> |-
      function (object_name, record_id, record_permissions, data) {
              var record = data && data.record;
              if(record.object_name || record.enable_amisform){
                return false;
              };
              return true;
            }
    'on': record
    todo: !<tag:yaml.org,2002:js/function> |-
      function (object_name, record_id, fields) {
              return WorkflowCore.openFormDesign(Steedos.locale(), Steedos.spaceId(), this.record.record.form, Creator.getUserCompanyId());
      }
  enableFlow:
    label: Enable Flow
    visible: !<tag:yaml.org,2002:js/function> |-
      function (object_name, record_id, record_permissions, data) {
        var record = data && data.record;
        if (record && record.state == 'disabled') {
          return true;
        }
        return false;
      }
    'on': record
    todo: !<tag:yaml.org,2002:js/function> |-
      function (object_name, record_id, fields) {
        window.$("body").addClass("loading");
        var record = Creator.getObjectRecord(object_name, record_id, 'space,form,state');
        var userSession = Creator.USER_CONTEXT;
        var authorization = "Bearer " + userSession.spaceId + "," + userSession.user.authToken;
        var formId = _.isObject(record.form) ? record.form._id : record.form;
        window.$.ajax({
          type: "POST",
          url: Steedos.absoluteUrl("/am/flows/state?methodOverride=PUT"),
          data: JSON.stringify({ 'Flows': [{id: record._id, space: _.isObject(record.space) ? record.space._id : record.space, state: 'enabled', form: formId }] }),
          dataType: "json",
          contentType: 'application/json',
          beforeSend: function (XHR) {
            XHR.setRequestHeader('Content-Type', 'application/json');
            XHR.setRequestHeader('Authorization', authorization);
          },
          success: function (data) {
            window.$("body").removeClass("loading");
            toastr.success("操作已成功！");
            SteedosUI.reloadRecord(object_name, record_id);
            FlowRouter.reload();
          },
          error: function (XMLHttpRequest, textStatus, errorThrown) {
            window.$("body").removeClass("loading");
            toastr.error(XMLHttpRequest.responseJSON);
          }
        });
      }
  disableFlow:
    label: Disable Flow
    visible: !<tag:yaml.org,2002:js/function> |-
      function (object_name, record_id, record_permissions, data) {
        var record = data && data.record;
        if (record && record.state == 'enabled') {
          return true;
        }
        return false;
      }
    'on': record
    todo: !<tag:yaml.org,2002:js/function> |-
      function (object_name, record_id, fields) {
        window.$("body").addClass("loading");
        var record = Creator.getObjectRecord(object_name, record_id, 'space,form,state');
        var userSession = Creator.USER_CONTEXT;
        var authorization = "Bearer " + userSession.spaceId + "," + userSession.user.authToken;
        var formId = _.isObject(record.form) ? record.form._id : record.form;
        window.$.ajax({
          type: "POST",
          url: Steedos.absoluteUrl("/am/flows/state?methodOverride=PUT"),
          data: JSON.stringify({ 'Flows': [{id: record._id, space: _.isObject(record.space) ? record.space._id : record.space, state: 'disabled', form: formId }] }),
          dataType: "json",
          contentType: 'application/json',
          beforeSend: function (XHR) {
            XHR.setRequestHeader('Content-Type', 'application/json');
            XHR.setRequestHeader('Authorization', authorization);
          },
          success: function (data) {
            window.$("body").removeClass("loading");
            toastr.success("操作已成功！");
            SteedosUI.reloadRecord(object_name, record_id);
            FlowRouter.reload();
          },
          error: function (XMLHttpRequest, textStatus, errorThrown) {
            window.$("body").removeClass("loading");
            toastr.error(XMLHttpRequest.responseJSON);
          }
        });
      }
  export_default_template:
    label: Export Default Template
    'on': record_more
    visible: !<tag:yaml.org,2002:js/function> |-
      function () {
              return true;
            }
    todo: !<tag:yaml.org,2002:js/function> |-
      function (object_name, record_id, fields) {
              var url = Steedos.absoluteUrl("/api/workflow/export/talbe_template?flow=" + record_id);
              return window.open(url, '_blank');
            }
  exportFlow:
    label: Export Workflow
    visible: true
    'on': record_more
    todo: !<tag:yaml.org,2002:js/function> |-
      function (object_name, record_id, fields) {
              var flow, form_id, ref2, ref3, ref4;
              console.log("exportFlow", object_name, record_id, fields);

              if (_.isString((ref2 = this.record) != null ? ref2.form : void 0)) {
                form_id = this.record.form;
              } else if ((ref3 = this.record) != null ? (ref4 = ref3.form) != null ? ref4._id : void 0 : void 0) {
                form_id = this.record.form._id;
              }

              if (form_id) {
                return window.open(Steedos.absoluteUrl("/api/workflow/export/form?form=" + form_id), '_blank');
              } else {
                flow = Creator.getCollection(object_name).findOne(record_id);
                if (flow) {
                  return window.open(Steedos.absoluteUrl("/api/workflow/export/form?form=" + flow.form), '_blank');
                }
              }
            }
  # importFlow:
  #   label: Import Workflow
  #   visible: true
  #   'on': list
  #   todo: !<tag:yaml.org,2002:js/function> |-
  #     function () {
  #             return Modal.show("admin_import_flow_modal", {
  #               onSuccess: function (flows) {
  #                 if (flows.length > 0) {
  #                   return FlowRouter.go("/app/admin/flows/view/" + flows[0]);
  #                 }
  #               }
  #             });
  #           }
  # exportFlows:
  #   label: Export Workflows
  #   visible: true
  #   'on': list
  #   todo: !<tag:yaml.org,2002:js/function> |-
  #     function () {
  #             let selectedRows = SteedosUI.getTableSelectedRows(`listview_flows_${Session.get("list_view_id")}`);
  #             let ids = _.pluck(selectedRows, '_id');
  #             if(ids && ids.length > 0){
  #               window.open(Steedos.absoluteUrl("/api/workflow/export/form?flows=" + ids.join(',')), '_blank');
  #             }else{
  #               toastr.warning("请选择要导出的流程");
  #             }
  #           }
  upgradeFlow:
    label: Upgrade Workflow
    visible: true
    'on': record_more
    todo: !<tag:yaml.org,2002:js/function> |-
      function (object_name, record_id, fields) {
              return Modal.show("admin_import_flow_modal", {
                flowId: record_id,
                onSuccess: function () {
                  toastr.success("流程升级成功")
                }
              });
            }
  copyFlow:
    label: Copy Workflow
    visible: true
    'on': record_more
    todo: !<tag:yaml.org,2002:js/function> |-
      function (object_name, record_id, fields) {
              return Modal.show("copy_flow_modal", {
                record_id: record_id,
                onSuccess: function (flows) {
                  if (flows.length > 0) {
                    return FlowRouter.go("/app/admin/flows/view/" + flows[0]);
                  }
                }
              });
            }
  distributeAdmin:
    label: Set Distribution Options
    visible: true
    'on': record_more
    todo: !<tag:yaml.org,2002:js/function> |-
      function (object_name, record_id, fields, props) {
        var queryResult = Steedos.authRequest("/graphql", {
            type: 'POST',
            async: false,
            data: JSON.stringify({
                query: `{record:${object_name}__findOne(id: "${record_id}"){_id, name, distribute_optional_users, current, distribute_to_self, distribute_end_notification, upload_after_being_distributed}}`
            }),
            contentType: 'application/json',
            error: function () { }
        });
        var recordDoc = queryResult && queryResult.data && queryResult.data.record;
        return Modal.show("distribute_edit_flow_modal", {
          flow: recordDoc
        });
      }
  removeFlow:
    label: Delete
    visible: true
    'on': record
    todo: !<tag:yaml.org,2002:js/function> |-
      function (object_name, record_id, fields) {
        var record = Creator.getObjectRecord(object_name, record_id, 'name,form');
        var formId = _.isObject(record.form) ? record.form._id : record.form;
        var flowName = record.name;
        swal({
          title: '为了确保安全，请输入您要删除的流程名(同时会删除相关的申请单)',
          inputPlaceholder: '流程名',
          type: "input",
          confirmButtonText: t('OK'),
          cancelButtonText: t('Cancel'),
          showCancelButton: true,
          closeOnConfirm: false
        }, function (inputText) {
          if (inputText == false) {
            return false;
          }

          if (inputText != flowName) {
            swal.showInputError('您输入的名称不正确');
            return false;
          }
          window.$("body").addClass("loading");
          var userSession = Creator.USER_CONTEXT;
          var authorization = "Bearer " + userSession.spaceId + "," + userSession.user.authToken;
          window.$.ajax({
            type: "POST",
            url: Steedos.absoluteUrl("/am/forms?methodOverride=DELETE"),
            data: JSON.stringify({ 'Forms': [{ 'id': formId }] }),
            dataType: "json",
            contentType: 'application/json',
            beforeSend: function (XHR) {
              XHR.setRequestHeader('Content-Type', 'application/json');
              XHR.setRequestHeader('Authorization', authorization);
            },
            success: function (data) {
              window.$("body").removeClass("loading");
              toastr.success("操作已成功！");
              var gridObjectNameClass = object_name.replace(/\./g,"-");
              var gridContainer = window.$(`.gridContainer.${gridObjectNameClass}`);
              var dxDataGridInstance, isOpenerRemove;
              if (!(gridContainer != null ? gridContainer.length : void 0)) {
                if (window.opener) {
                  isOpenerRemove = true;
                  gridContainer = window.opener.$(`.gridContainer.${gridObjectNameClass}`);
                }
              }
              if (gridContainer != null ? gridContainer.length : void 0) {
                dxDataGridInstance = gridContainer.dxDataGrid().dxDataGrid('instance');
              }
              if (dxDataGridInstance) {
                Template.creator_grid.refresh(dxDataGridInstance);
              }
              if (isOpenerRemove || !dxDataGridInstance) {
                if (isOpenerRemove) {
                  window.close();
                } else if (record_id === Session.get("record_id") && !Steedos.isMobile() && list_view_id !== 'calendar' && object_name !== "cms_posts") {
                  var appid = Session.get("app_id");
                  var list_view_id = Session.get("list_view_id");
                  if (!list_view_id) {
                    list_view_id = "all";
                  }
                  FlowRouter.go(`/app/${appid}/${object_name}/grid/${list_view_id}`);
                }
              }
              window.refreshGrid();
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
              window.$("body").removeClass("loading");
              toastr.error(XMLHttpRequest.responseJSON);
            }
          });
          sweetAlert.close();
        })
      }
relatedList:
  - cms_files
  - object_workflows
permission_set:
  user:
    allowCreate: false
    allowDelete: false
    allowEdit: false
    allowRead: true
    modifyAllRecords: false
    viewAllRecords: true
  admin:
    allowCreate: true
    allowDelete: false
    allowEdit: true
    allowRead: true
    modifyAllRecords: true
    viewAllRecords: true
  workflow_admin:
    allowCreate: true
    allowDelete: false
    allowEdit: true
    allowRead: true
    modifyAllRecords: false
    viewAllRecords: false
    modifyCompanyRecords: true
    viewCompanyRecords: true
    disabled_list_views: []
    disabled_actions: []
    unreadable_fields: []
    uneditable_fields: []
    unrelated_objects: []
