@steedos-widgets/amis-lib 1.0.18 → 1.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/index.cjs.js +22 -9
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +22 -9
- package/dist/index.esm.js.map +1 -1
- package/dist/index.umd.js +40 -27
- package/dist/index.umd.js.map +1 -1
- package/dist/types/lib/converter/amis/fields/index.d.ts +1 -1
- package/dist/types/lib/converter/amis/fields/lookup.d.ts +1 -0
- package/dist/types/lib/converter/amis/fields/table.d.ts +1 -0
- package/dist/types/lib/converter/amis/header.d.ts +39 -43
- package/dist/types/lib/objects.d.ts +40 -53
- package/dist/types/schema/standard_import_data.amis.d.ts +1 -1
- package/dist/types/standard/button.d.ts +1 -1
- package/package.json +2 -2
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../src/lib/amis.js","../src/lib/steedos.client.js","../src/lib/converter/amis/graphql.js","../src/lib/router.js","../src/lib/converter/amis/tpl.js","../src/lib/converter/amis/api.js","../src/lib/converter/amis/fields/sections.js","../src/lib/converter/amis/form.js","../src/lib/converter/amis/fields/list.js","../src/lib/expression.js","../src/lib/defaultsDeep.js","../src/config/index.js","../src/lib/page.js","../src/schema/standard_new.amis.js","../src/standard/button.js","../src/schema/standard_edit.amis.js","../src/schema/standard_delete.amis.js","../src/schema/standard_import_data.amis.js","../src/schema/standard_open_view.amis.js","../src/lib/buttons.js","../src/lib/converter/amis/header.js","../src/lib/converter/amis/toolbar.js","../src/lib/converter/amis/index.js","../src/lib/converter/amis/fields/type.js","../src/lib/converter/amis/fields/file.js","../src/lib/converter/amis/fields/table.js","../src/lib/converter/amis/fields/user.js","../src/lib/converter/amis/fields/lookup.js","../src/lib/converter/amis/fields/editor.js","../src/lib/converter/amis/fields/index.js","../src/lib/converter/amis/fields_filter.js","../src/lib/converter/amis/calendar.js","../src/lib/record.js","../src/lib/objects.js","../src/lib/objectsRelated.js","../src/lib/public.env.js","../src/lib/space_users.js","../src/lib/converter/amis/filters.js","../src/lib/workflow/flow.js","../../src/utils/keyToPath.ts","../../../../node_modules/tslib/tslib.es6.js","../../src/utils/object.ts","../src/lib/apps.js","../../src/render.ts","../src/lib/page_init.js","../src/lib/notification.js","../src/lib/assets.js"],"sourcesContent":["/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-07-13 11:31:12\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-09-27 10:34:59\n * @Description:\n */\nimport { each, find, isArray, isEmpty } from 'lodash';\n\nconst RegisterRenders = [];\n\nconst normalizeLink = (to, location = window.location) => {\n to = to || \"\";\n\n if (to && to[0] === \"#\") {\n to = location.pathname + location.search + to;\n } else if (to && to[0] === \"?\") {\n to = location.pathname + to;\n }\n\n const idx = to.indexOf(\"?\");\n const idx2 = to.indexOf(\"#\");\n let pathname = ~idx\n ? to.substring(0, idx)\n : ~idx2\n ? to.substring(0, idx2)\n : to;\n let search = ~idx ? to.substring(idx, ~idx2 ? idx2 : undefined) : \"\";\n let hash = ~idx2 ? to.substring(idx2) : location.hash;\n\n if (!pathname) {\n pathname = location.pathname;\n } else if (pathname[0] != \"/\" && !/^https?\\:\\/\\//.test(pathname)) {\n let relativeBase = location.pathname;\n const paths = relativeBase.split(\"/\");\n paths.pop();\n let m;\n while ((m = /^\\.\\.?\\//.exec(pathname))) {\n if (m[0] === \"../\") {\n paths.pop();\n }\n pathname = pathname.substring(m[0].length);\n }\n pathname = paths.concat(pathname).join(\"/\");\n }\n\n return pathname + search + hash;\n};\n\nexport const amisRootClick = (router, e) => {\n if (e.target.nodeName.toLocaleLowerCase() === \"a\" && e.target.href) {\n e.preventDefault();\n router.push(e.target.href);\n }\n};\n\nexport const getEvn = (router)=>{\n return {\n theme: \"antd\",\n notify: (type, msg)=>{\n if(msg.props?.schema.tpl){\n SteedosUI.message[type](msg.props?.schema.tpl)\n }else if(typeof msg == 'string'){\n SteedosUI.message[type](msg)\n }else{\n console.warn('notify', type, msg)\n }\n },\n confirm: (msg)=>{\n return new Promise((resolve, reject)=>{\n return SteedosUI.Modal.confirm({\n title: msg,\n onOk: ()=>{\n resolve(true);\n },\n okText: \"确认\",\n cancelText: \"取消\"\n })\n })\n },\n jumpTo: (to, action) => {\n if (to === \"goBack\") {\n return window.history.back();\n }\n\n to = normalizeLink(to);\n\n if (action && action.actionType === \"url\") {\n action.blank === false ? router.push(to) : window.open(to);\n return;\n }\n\n // 主要是支持 nav 中的跳转\n if (action && to && action.target) {\n window.open(to, action.target);\n return;\n }\n if (/^https?:\\/\\//.test(to)) {\n window.location.replace(to);\n } else {\n router.push(to);\n }\n }\n }\n}\n\nexport const registerRenders = (assets)=>{\n if(!isEmpty(assets) && isArray(assets)){\n let amisLib = amisRequire('amis');\n\n const registerMap = {\n renderer: amisLib.Renderer,\n formitem: amisLib.FormItem,\n options: amisLib.OptionsControl,\n };\n \n let amisReact = amisRequire('react');\n each(assets, (asset)=>{\n // 防止组件重复注册\n if(!find(RegisterRenders, (componentName)=>{ return componentName === asset.componentName})){\n let Component = Builder.components.find(item => item.name === asset.componentName);\n let AmisWrapper = Component.class\n if(asset.componentType === 'amisSchema'){\n AmisWrapper = (props)=>{\n const { body, render } = props\n const [schema, setSchema] = amisReact.useState(null);\n amisReact.useEffect(()=>{\n const result = Component.class(props);\n if(result && result.then && typeof result.then === 'function'){\n result.then((data)=>{\n setSchema(data);\n })\n }else{\n setSchema(result)\n }\n }, [])\n return amisReact.createElement(amisReact.Fragment, null, amisReact.createElement(amisReact.Fragment, null, schema && render ? render('body', schema) : ''), amisReact.createElement(amisReact.Fragment, null, render ? render('body', body) : ''));\n }\n }\n\n // 注册amis渲染器\n if (!registerMap[asset.usage]) {\n console.error(\n `${consoleTag}自定义组件注册失败,不存在${asset.usage}自定义组件类型。`,\n );\n } else {\n registerMap[asset.usage]({\n test: new RegExp(`(^|\\/)${asset.type}`),\n type: asset.type,\n weight: asset.weight,\n autoVar: true,\n })(AmisWrapper);\n // 记录当前创建的amis自定义组件\n console.info('注册了一个自定义amis组件:', {\n type: asset.type,\n weight: asset.weight,\n component: AmisWrapper,\n framework: asset.framework,\n usage: asset.usage,\n });\n }\n // amisLib.Renderer({\n // test: new RegExp(`(^|\\/)${asset.type}`)\n // })(AmisWrapper);\n RegisterRenders.push(asset.componentName)\n }\n })\n }\n}\n\nexport const amisRender = (root, schema, data = {}, env = {}, options) => {\n let amis = amisRequire(\"amis/embed\");\n const { router, assets } = options;\n registerRenders(assets);\n return amis.embed(root, schema, data, Object.assign(getEvn(router), env));\n};\n","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-07-04 11:24:28\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2023-01-11 11:35:01\n * @Description: \n */\nimport { endsWith, isEmpty, cloneDeep } from \"lodash\";\n\nconst STEEDOS_AUTH = {};\n\nconst getBuilderContext = ()=>{\n if(typeof window === \"undefined\"){\n return {};\n }\n return Builder.settings.context ? Builder.settings.context : Builder.settings\n}\n\nexport const setSteedosAuth = (steedosSession) => {\n Object.assign(STEEDOS_AUTH, steedosSession);\n}\n\nexport async function fetchAPI(api, options = { credentials: 'include' }) {\n const headers = { 'Content-Type': 'application/json' }\n const AUTHORIZATION = getAuthorization()\n if (AUTHORIZATION) {\n headers[\n 'Authorization'\n ] = AUTHORIZATION\n // } else {\n // throw new Error(401)\n }\n\n options.headers = Object.assign({}, headers, options.headers);\n options.credentials = 'include'\n\n const res = await fetch(`${getRootUrl()}${api}`, options)\n \n if(res.status === 401){\n throw new Error(401)\n }\n\n const json = await res.json()\n if (json.errors) {\n console.error(json.errors)\n throw new Error('Failed to fetch API')\n }\n return json\n}\n\nexport function getFileSrc(fileId){\n return `${getRootUrl()}/api/files/files/${fileId}`\n}\n\nexport function getImageSrc(fileId){\n return `${getRootUrl()}/api/files/images/${fileId}`\n}\n\n\nexport function getTenantId(){\n try {\n let spaceId = getBuilderContext().tenantId\n\n if (window.location.search && !spaceId) {\n var searchParams = new URLSearchParams(window.location.search);\n spaceId = searchParams.get('X-Space-Id');\n }\n if (!spaceId) {\n return null;\n }\n return spaceId;\n } catch (error) {\n console.error(error)\n }\n}\n\nexport function getAuthToken(){\n try {\n const context = getBuilderContext()\n let token = context.authToken;\n if (!token) {\n return null;\n }\n return token;\n } catch (error) {\n console.error(error)\n }\n}\n\nexport function getAuthorization(){\n try {\n const context = getBuilderContext()\n let spaceId = context.tenantId;\n let token = context.authToken;\n \n if (!spaceId || !token) {\n return null;\n }\n return `Bearer ${spaceId},${token}`;\n } catch (error) {\n console.error(error)\n }\n}\n\nexport function getUserId(){\n try {\n const context = getBuilderContext()\n let userId = context.userId;\n if (!userId) {\n return null;\n }\n return userId;\n } catch (error) {\n console.error(error)\n } \n}\n\nexport function absoluteUrl(url){\n return `${getRootUrl()}${url}`\n}\n\nexport function getRootUrl(defaultRootUrl){\n const context = getBuilderContext()\n if(context.rootUrl){\n return context.rootUrl;\n }\n const rootUrl = typeof window != 'undefined' ? window.localStorage.getItem(\"steedos:rootUrl\") : '';\n if(rootUrl){\n return rootUrl\n }\n return defaultRootUrl;\n}\n\nexport function setRootUrl(rootUrl){\n if(endsWith(rootUrl, '/')){\n rootUrl = rootUrl.substring(0, rootUrl.length-1)\n }\n localStorage.setItem(\"steedos:rootUrl\", rootUrl)\n}\n\nexport const getSteedosAuth = () => {\n // if(isEmpty(STEEDOS_AUTH)){\n // return {\n // space: localStorage.getItem(\"steedos:spaceId\"),\n // token: localStorage.getItem(\"steedos:token\"), \n // userId: localStorage.getItem(\"steedos:userId\"),\n // name: Meteor.user().name //TODO: 使用steedos 函数. 此属性在上传附件时使用\n // }\n // }\n return cloneDeep(STEEDOS_AUTH);\n}","import * as _ from 'lodash';\nimport { includes } from 'lodash';\nimport { getUISchema } from '../../objects';\n\nexport async function getFieldsTemplate(fields, expand){\n if(expand != false){\n expand = true;\n }\n let fieldsName = ['_id'];\n let displayFields = [];\n let fieldsArr = [];\n if(_.isArray(fields)){\n fieldsArr = fields;\n }else{\n fieldsArr = _.values(fields);\n }\n for (const field of fieldsArr) {\n if(field.name.indexOf('.') < 0){\n if(expand && (field.type == 'lookup' || field.type == 'master_detail')){\n fieldsName.push(`${field.name}`)\n displayFields.push(`${field.name}`)\n }else{\n fieldsName.push( field.alias ? `${field.alias}:${field.name}` : field.name)\n }\n if(includes(['time','date','datetime','boolean','number','currency'], field.type)){\n fieldsName.push(`${field.name}`)\n }\n if(includes(['time','filesize','date','datetime','boolean','number','currency', 'select', 'file', 'image', 'avatar', 'formula', 'summary'], field.type)){\n displayFields.push(`${field.name}`)\n }\n }\n }\n\n displayFields = _.uniq(displayFields);\n fieldsName = _.uniq(fieldsName);\n\n if(displayFields.length > 0){\n return `${fieldsName.join(',')},_display:_ui{${displayFields.join(',')}}`;\n }\n return `${fieldsName.join(' ')}`\n}\n\nexport function getRecordPermissionsTemplate(){\n return `\n recordPermissions: _permissions{\n allowCreate,\n allowCreateFiles,\n allowDelete,\n allowDeleteFiles,\n allowEdit,\n allowEditFiles,\n allowRead,\n allowReadFiles,\n disabled_actions,\n disabled_list_views,\n field_permissions,\n modifyAllFiles,\n modifyAllRecords,\n modifyAssignCompanysRecords,\n modifyCompanyRecords,\n uneditable_fields,\n unreadable_fields,\n unrelated_objects,\n viewAllFiles,\n viewAllRecords,\n viewAssignCompanysRecords,\n viewCompanyRecords,\n }\n `\n}\n\nexport async function getFindOneQuery(object, recordId, fields, options){\n let queryOptions = \"\";\n \n if(recordId){\n queryOptions = `(filters:[\"${object.idFieldName}\", \"=\", \"${recordId}\"])`;\n }\n let alias = \"data\";\n if(options){\n if(options.alias){\n alias = options.alias;\n }\n\n if(options.filters){\n queryOptions = `(filters:${options.filters})`;\n }\n if(options.queryOptions){\n queryOptions = `(${options.queryOptions})`;\n }\n }\n return {\n query: `{${alias}:${object.name}${queryOptions}{${await getFieldsTemplate(fields)}, ${getRecordPermissionsTemplate()}}}`\n }\n}\n\nexport function getSaveQuery(object, recordId, fields, options){\n return {\n objectName: object.name,\n $: \"$$\",\n recordId: recordId,\n modalName: \"${modalName}\"\n }\n}\n\n/*\n readonly字段应该移除掉不提交到服务端。\n*/\nexport function getScriptForReadonlyFields(fields){\n var scripts = [];\n fields.forEach((item)=>{\n if(item.readonly){\n scripts.push(`delete formData.${item.name};`);\n }\n });\n return scripts.join(\"\\r\\n\");\n}\n\n/*\n img/avatar字段值移除URL前缀使其保存时正常保存id,而不是url。\n*/\nexport function getScriptForRemoveUrlPrefixForImgFields(fields){\n let imgFieldsKeys = [];\n let imgFields = {};\n fields.forEach((item)=>{\n if(includes(['image','avatar'], item.type)){\n imgFieldsKeys.push(item.name);\n imgFields[item.name] = {\n name: item.name,\n multiple: item.multiple\n };\n }\n })\n if(!imgFieldsKeys.length){\n return '';\n }\n return `\n let imgFieldsKeys = ${JSON.stringify(imgFieldsKeys)};\n let imgFields = ${JSON.stringify(imgFields)};\n imgFieldsKeys.forEach((item)=>{\n let imgFieldValue = formData[item];\n if(imgFieldValue && imgFieldValue.length){\n // 因为表单初始化接口的接收适配器中为image字段值添加了url前缀(为了字段编辑时正常显示图片),所以保存时移除(为了字段值保存时正常保存id,而不是url)。\n if(imgFields[item].multiple){\n if(imgFieldValue instanceof Array){\n formData[item] = imgFieldValue.map((value)=>{ \n let itemValue = value?.split('/');\n return itemValue[itemValue.length - 1];\n });\n }\n }else{\n let imgValue = imgFieldValue.split('/');\n formData[item] = imgValue[imgValue.length - 1];\n }\n }\n })\n `\n}\n\n/*\n file字段值重写使其保存时正常保存id。\n*/\nexport function getScriptForSimplifiedValueForFileFields(fields){\n let fileFieldsKeys = [];\n let fileFields = {};\n fields.forEach((item)=>{\n if(item.type === 'file'){\n fileFieldsKeys.push(item.name);\n fileFields[item.name] = {\n name: item.name,\n multiple: item.multiple\n };\n }\n })\n if(!fileFieldsKeys.length){\n return '';\n }\n return `\n let fileFieldsKeys = ${JSON.stringify(fileFieldsKeys)};\n let fileFields = ${JSON.stringify(fileFields)};\n fileFieldsKeys.forEach((item)=>{\n let fileFieldValue = formData[item];\n if(fileFieldValue){\n // 因为表单初始化接口的接收适配器中为file字段值重写了值及格式(为了字段编辑时正常显示附件名、点击附件名正常下载),所以保存时还原(为了字段值保存时正常保存id)。\n if(fileFields[item].multiple){\n if(fileFieldValue instanceof Array && fileFieldValue.length){\n formData[item] = fileFieldValue.map((value)=>{ \n if(typeof value === 'object'){\n return value.value;\n }else{\n return value;\n }\n });\n }\n }else{\n formData[item] = typeof fileFieldValue === 'object' ? fileFieldValue.value : fileFieldValue;\n }\n }\n })\n `\n}\n\nexport function getSaveDataTpl(fields){\n\n return `\n const formData = api.data.$;\n for (key in formData){\n // image、select等字段清空值后保存的空字符串转换为null。\n if(formData[key] === ''){\n formData[key] = null;\n }\n }\n const objectName = api.data.objectName;\n const fieldsName = Object.keys(formData);\n delete formData.created;\n delete formData.created_by;\n delete formData.modified;\n delete formData.modified_by;\n delete formData._display;\n ${getScriptForReadonlyFields(fields)}\n ${getScriptForRemoveUrlPrefixForImgFields(fields)}\n ${getScriptForSimplifiedValueForFileFields(fields)}\n let query = \\`mutation{record: \\${objectName}__insert(doc: {__saveData}){_id}}\\`;\n if(formData.recordId && formData.recordId !='new'){\n query = \\`mutation{record: \\${objectName}__update(id: \"\\${formData._id}\", doc: {__saveData}){_id}}\\`;\n };\n delete formData._id;\n delete formData.__selectUserLoaded__;//选人控件加载标志不应该保存到数据库中\n let __saveData = JSON.stringify(JSON.stringify(formData));\n `\n}\n\nexport function getSaveRequestAdaptor(fields){\n return `\n ${getSaveDataTpl(fields)}\n api.data = {query: query.replace('{__saveData}', __saveData)};\n return api;\n `\n}\n\nexport async function getFindQuery(object, recordId, fields, options){\n let limit = options.limit || 10;\n let queryOptions = `(top: ${limit})`;\n if(recordId){\n queryOptions = `(filters:[\"_id\", \"=\", \"${recordId}\"], top: ${limit})`;\n }\n let alias = \"data\";\n if(options){\n if(options.alias){\n alias = options.alias;\n }\n\n if(options.filters){\n queryOptions = `(filters:${options.filters})`;\n }\n if(options.queryOptions){\n queryOptions = `(${options.queryOptions})`;\n }\n }\n var treeFields = '';\n if(object.enable_tree && _.includes(_.keys(object.fields), 'parent') && _.includes(_.keys(object.fields), 'children')){\n treeFields = ',parent,children';\n }\n\n var cfsFields = '';\n if(object.name === 'cms_files'){\n cfsFields = ',versions'\n }\n\n return {\n orderBy: \"${orderBy}\",\n orderDir: \"${orderDir}\",\n pageNo: \"${page}\",\n pageSize: \"${perPage}\",\n query: `{${alias}:${object.name}${queryOptions}{${await getFieldsTemplate(fields, options.expand)}${treeFields}${cfsFields}},count:${object.name}__count(filters:{__filters})}`\n }\n}\n\nexport function getRecordPermissionsQuery(object, recordId, options){\n let queryOptions = \"\";\n\n if(recordId){\n queryOptions = `(filters:[\"${object.idFieldName}\", \"=\", \"${recordId}\"])`;\n }\n let alias = \"data\";\n if(options){\n if(options.alias){\n alias = options.alias;\n }\n\n if(options.filters){\n queryOptions = `(filters:${options.filters})`;\n }\n if(options.queryOptions){\n queryOptions = `(${options.queryOptions})`;\n }\n }\n\n let recordPermissionsTemplate = getRecordPermissionsTemplate();\n if(options?.fields && options.fields.length){\n recordPermissionsTemplate = `\n recordPermissions: _permissions{\n ${options.fields.join(\",\")}\n }\n `;\n }\n return {\n query: `{${alias}:${object.name}${queryOptions}{${object.idFieldName},${recordPermissionsTemplate}}}`\n }\n}\n\nexport function getApi (isMobile){\n if(isMobile){\n //TODO 返回 绝对路径\n }else{\n // return __meteor_runtime_config__.ROOT_URL_PATH_PREFIX + \"/graphql\"\n return `\\${context.rootUrl}/graphql`\n }\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-08-16 17:02:08\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-12-30 13:57:19\n * @Description:\n */\n\n\nexport const Router = {\n getAppPath({formFactor, appId}){\n return `/app/${appId}`;\n },\n getPagePath(){\n //TODO\n },\n getObjectListViewPath({formFactor, appId, objectName, listViewName}){\n return `/app/${appId}/${objectName}/grid/${listViewName}`;\n },\n getObjectDetailPath(props){\n const {formFactor, appId, objectName, recordId, listViewName} = props;\n if(objectName === 'instances'){\n return `/workflow/space/\\${context.tenantId}/\\${listName}/${recordId}`;\n }\n return `/app/${appId}/${objectName}/view/${recordId}`;\n },\n getObjectRelatedViewPath({formFactor, appId, masterObjectName, masterRecordId, objectName, foreignKey}){\n return `/app/${appId}/${masterObjectName}/${masterRecordId}/${objectName}/grid?related_field_name=${foreignKey}`;\n }\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-05-23 09:53:08\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-12-30 13:38:56\n * @Description: \n */\nimport { Router } from '../../router'\n import { getUISchema } from '../../objects'\n\nexport function getCreatedInfoTpl(formFactor){\n const href = Router.getObjectDetailPath({\n formFactor, appId: \"admin\", objectName: 'users', recordId: '${created_by._id}'\n })\n return `<div><a href='${href}'>\\${_display.created_by.label}</a>\\${_display.created}</div>`\n}\n\nexport function getModifiedInfoTpl(formFactor){\n const href = Router.getObjectDetailPath({\n formFactor, appId: \"admin\", objectName: 'users', recordId: '${modified_by._id}'\n })\n return `<div><a href='${href}'>\\${_display.modified_by.label}</a>\\${_display.modified}</div>`\n}\n\nexport function getNumberTpl(field){\n return `<div>\\${_display.${field.name}}</div>`\n}\n\nexport function getTimeTpl(field){\n return `<div>\\${_display.${field.name}}</div>`\n}\n\nexport function getDateTpl(field){\n return `<div>\\${_display.${field.name}}</div>`\n}\n\n\nexport function getDateTimeTpl(field){\n return `<div>\\${_display.${field.name}}</div>`\n}\n\nexport function getUiFieldTpl(field){\n return `<div>\\${_display.${field.name}}</div>`\n}\n\nexport function getUiFileSizeTpl(field){\n return `<div>\\${_display.${field.name}}</div>`\n}\n\n//TODO 处理name字段\nexport async function getRefObjectNameFieldName(field){\n const refUiSchema = await getUISchema(field.reference_to)\n const NAME_FIELD_KEY = refUiSchema.NAME_FIELD_KEY || 'name';\n return NAME_FIELD_KEY;\n}\n\nexport function getSelectTpl(field){\n return `<div>\\${_display.${field.name}}</div>`\n}\n\nexport function getNameTplUrl(field, ctx){\n if(ctx.objectName === 'cms_files'){\n return `\\${context.rootUrl}/api/files/files/\\${versions[0]}?download=true`\n }\n const href = Router.getObjectDetailPath({\n ...ctx, formFactor: ctx.formFactor, appId: \"${appId}\", objectName: ctx.objectName || \"${objectName}\", recordId: `\\${${ctx.idFieldName}}`\n })\n return href;\n}\n\nexport function getNameTpl(field, ctx){\n const href = getNameTplUrl(field, ctx);\n return `<a href=\"${href}\">\\${${field.name}}</a>`\n}\n\nexport function getRelatedFieldTpl(field, ctx){\n let tpl = '';\n const onlyDisplayLabel = ctx.onlyDisplayLabel;\n if(_.isString(field.reference_to) || !field.reference_to){\n if(field.multiple){\n let labelTpl = `<%=item.label%>`;\n if(!onlyDisplayLabel){\n const href = Router.getObjectDetailPath({\n formFactor: ctx.formFactor, appId: ctx.appId, objectName: `<%=item.objectName%>`, recordId: `<%=item.value%>`\n })\n labelTpl = `<a href=\"${href}\"><%=item.label%></a>`;\n }\n tpl = `\n <% if (data._display.${field.name} && data._display.${field.name}.length) { %><% data._display.${field.name}.forEach(function(item) { %> ${labelTpl} <% }); %><% } %>\n `\n }else{\n let labelTpl = `\\${_display.${field.name}.label}`;\n if(!onlyDisplayLabel){\n const href = Router.getObjectDetailPath({\n formFactor: ctx.formFactor, appId: ctx.appId, objectName: `\\${_display.${field.name}.objectName}`, recordId: `\\${_display.${field.name}.value}`\n })\n labelTpl = `<a href=\"${href}\">\\${_display.${field.name}.label}</a>`;\n }\n tpl = labelTpl;\n }\n\n \n }else{\n let labelTpl = `<%=item.label%>`;\n if(!onlyDisplayLabel){\n const href = Router.getObjectDetailPath({\n formFactor: ctx.formFactor, appId: ctx.appId, objectName: `<%=item.objectName%>`, recordId: `<%=item.value%>`\n })\n labelTpl = `<a href=\"${href}\"><%=item.label%></a>`;\n }\n tpl = `\n <% if (data._display.${field.name} && data._display.${field.name}.length) { %><% data._display.${field.name}.forEach(function(item) { %> ${labelTpl} <% }); %><% } %>\n `\n }\n return tpl\n}\n\nexport async function getLookupTpl(field, ctx){\n if(!field.reference_to){\n return getSelectTpl(field)\n }\n const NAME_FIELD_KEY = await getRefObjectNameFieldName(field);\n if(field.multiple){\n const href = Router.getObjectDetailPath({\n formFactor: ctx.formFactor, appId: ctx.appId, objectName: field.reference_to, recordId: `<%=item._id%>`\n })\n return `\n <% if (data.${field.name} && data.${field.name}.length) { %><% data.${field.name}.forEach(function(item) { %> <a href=\"${href}\"><%=item.${NAME_FIELD_KEY}%></a> <% }); %><% } %>\n `\n }else{\n const href = Router.getObjectDetailPath({\n formFactor: ctx.formFactor, appId: ctx.appId, objectName: field.reference_to, recordId: `\\${${field.name}._id}`\n })\n return `<a href=\"${href}\">\\${${field.name}.${NAME_FIELD_KEY}}</a>`\n }\n \n}\n\nexport function getSwitchTpl(field){\n return `<% if (data.${field.name}) { %>\n <span class=\"slds-icon_container slds-icon-utility-check slds-current-color\" title=\"<%=data._display.${field.name}%>\">\n <span ><%= data._display.${field.name} === \"√\" ? \"<svg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='currentColor' class='w-4 h-4'><path stroke-linecap='round' stroke-linejoin='round' d='M4.5 12.75l6 6 9-13.5' /></svg>\" : data._display.${field.name} %></span>\n </span>\n <% } %>`\n}\n\nexport function getPasswordTpl(field){\n return `<% if (data.${field.name}) { %>\n <span>······</span>\n <% } %>`\n}\n\n\nexport async function getFieldTpl (field, options){\n if((field.is_name || field.name === options.labelFieldName) && !options.onlyDisplayLabel){\n return getNameTpl(field, options)\n }\n switch (field.type) {\n case 'password':\n return getPasswordTpl(field);\n case 'boolean':\n return getSwitchTpl(field);\n case 'toggle':\n return getSwitchTpl(field);\n case 'select':\n return getSelectTpl(field);\n case 'time':\n return getTimeTpl(field);\n case 'date':\n return getDateTpl(field);\n case 'datetime':\n return getDateTimeTpl(field);\n case 'lookup':\n return await getRelatedFieldTpl(field, options);\n case 'master_detail':\n return await getRelatedFieldTpl(field, options);\n case 'number':\n case 'currency':\n return await getNumberTpl(field);\n case 'formula':\n case 'summary':\n return getUiFieldTpl(field)\n case 'filesize':\n return getUiFileSizeTpl(field)\n default:\n break;\n }\n};","import { OMIT_FIELDS } from './fields';\nimport { absoluteUrl } from '../../steedos.client'\nimport * as graphql from './graphql'\nimport * as _ from 'lodash';\n\nconst API_CACHE = 100;\n\nfunction getReadonlyFormAdaptor(fields){\n let scriptStr = '';\n const selectFields = _.filter(fields, function(field){return field.name.indexOf('.') < 0 && ((field.type == 'select' && field.options) || ((field.type == 'lookup' || field.type == 'master_detail') && !field.reference_to))});\n _.each(selectFields, function(field){\n if(!_.includes(OMIT_FIELDS, field.name)){\n const valueField = field.name;\n if(field.options){\n const options = JSON.stringify({options: field.options});\n scriptStr = scriptStr + `var ${field.name}Options= (${options}).options;`;\n }else if(field.optionsFunction){\n scriptStr = scriptStr + `var ${field.name}Options = eval(${field.optionsFunction.toString()})(api.data);`\n }else if(field._optionsFunction){\n scriptStr = scriptStr + `var ${field.name}Options = eval(${field._optionsFunction})(api.data);`\n }\n if(field.multiple){\n scriptStr = scriptStr + `data.${field.name}__label = _.map(_.filter(${field.name}Options, function(option){return _.includes(data.${field.name}, option.value)}), 'label');`\n }else{\n scriptStr = scriptStr + `var ${field.name}Selected = _.find(${field.name}Options, function(option){return data.${field.name} == option.value});`\n scriptStr = scriptStr + `data.${field.name}__label = ${field.name}Selected ? ${field.name}Selected.label:null;`\n }\n }\n })\n\n // const refFields = _.filter(fields, function(field){return field.name.indexOf('.') < 0 && (field.type == 'lookup' || field.type == 'master_detail') && !field.reference_to});\n // _.each(refFields, function(field){\n // if(!_.includes(OMIT_FIELDS, field.name)){\n // const valueField = field.reference_to_field || '_id';\n // scriptStr = scriptStr + `var ${field.name}Options = eval(${field.optionsFunction.toString()})(api.data);`\n // if(field.multiple){\n // scriptStr = scriptStr + `data.${field.name}__label = _.map(_.filter(${field.name}Options, function(option){return _.includes(data.${field.name}, option.value)}), 'label');`\n // }else{\n // scriptStr = scriptStr + `var ${field.name}Selected = _.find(${field.name}Options, function(option){return data.${field.name} == option.value});`\n // scriptStr = scriptStr + `data.${field.name}__label = ${field.name}Selected ? ${field.name}Selected.label:null;`\n // }\n // }\n // })\n\n return `\n if(payload.data.data){\n var data = payload.data.data[0];\n try{\n ${scriptStr}\n ${getScriptForAddUrlPrefixForImgFields(fields)}\n ${getScriptForRewriteValueForFileFields(fields)}\n }catch(e){\n console.error(e)\n }\n payload.data = data;\n window.postMessage(Object.assign({type: \"record.loaded\"}, {record: data}), \"*\")\n }\n if(payload.errors){\n payload.status = 2;\n payload.msg = payload.errors[0].message;\n }\n return payload;\n`\n}\n\nexport async function getReadonlyFormInitApi(object, recordId, fields, options){\n return {\n method: \"post\",\n url: graphql.getApi()+\"?rf=\"+ (new Date()).getTime(),\n cache: API_CACHE,\n adaptor: getReadonlyFormAdaptor(fields),\n data: await graphql.getFindOneQuery(object, recordId, fields, options),\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n}\n\nfunction getConvertDataScriptStr(fields){\n const refFields = _.filter(fields, function(field){return field.name.indexOf('.') < 0 && (field.type == 'lookup' || field.type == 'master_detail') && field.reference_to});\n let scriptStr = '';\n _.each(refFields, function(field){\n if(!_.includes(OMIT_FIELDS, field.name)){\n const valueField = field.reference_to_field || '_id';\n if(field.multiple){\n scriptStr = scriptStr + `data.${field.name} = _.map(data.${field.name}, '${valueField}');`\n }else{\n scriptStr = scriptStr + `data.${field.name} = data.${field.name} ? data.${field.name}.${valueField}:null;`\n }\n }\n })\n return scriptStr;\n}\n\n/*\n img/avatar字段值添加URL前缀使其在amis中正常显示图片。\n*/\nfunction getScriptForAddUrlPrefixForImgFields(fields){\n let imgFieldsKeys = [];\n let imgFields = {};\n fields.forEach((item)=>{\n if(_.includes(['image','avatar'], item.type)){\n imgFieldsKeys.push(item.name);\n imgFields[item.name] = {\n name: item.name,\n type: item.type,\n multiple: item.multiple\n };\n }\n })\n if(!imgFieldsKeys.length){\n return '';\n }\n return `\n // image字段值添加URL前缀\n let imgFieldsKeys = ${JSON.stringify(imgFieldsKeys)};\n let imgFields = ${JSON.stringify(imgFields)};\n imgFieldsKeys.forEach((item)=>{\n let imgFieldValue = data[item];\n let imgFieldDisplayValue = data._display && data._display[item];\n if(imgFieldValue && imgFieldValue.length){\n let fieldProps = imgFields[item];\n if(fieldProps.multiple){\n if(imgFieldDisplayValue instanceof Array){\n data[item] = imgFieldDisplayValue.map((i)=>{ return i.url });\n }\n }else{\n data[item] = imgFieldDisplayValue && imgFieldDisplayValue.url;\n }\n }\n })\n `\n}\n\n/*\n file字段值重写使其在amis中正常显示附件名、点击附件名下载文件。\n*/\nfunction getScriptForRewriteValueForFileFields(fields){\n let fileFieldsKeys = [];\n let fileFields = {};\n fields.forEach((item)=>{\n if(item.type === 'file'){\n fileFieldsKeys.push(item.name);\n fileFields[item.name] = {\n name: item.name,\n multiple: item.multiple\n };\n }\n })\n if(!fileFieldsKeys.length){\n return '';\n }\n return `\n // file字段值重写以便编辑时正常显示附件名、点击附件名正常下载附件\n let fileFieldsKeys = ${JSON.stringify(fileFieldsKeys)};\n let fileFields = ${JSON.stringify(fileFields)};\n fileFieldsKeys.forEach((item)=>{\n let fileFieldValue = data[item];\n let fileFieldDisplayValue = data._display && data._display[item];\n if(fileFieldValue && fileFieldValue.length){\n if(fileFields[item].multiple){\n if(fileFieldDisplayValue instanceof Array){\n data[item] = fileFieldDisplayValue.map((item, index)=>{ \n return {\n value: fileFieldValue[index],\n name: item.name,\n url: item.url + \"?download=true\",\n state: \"uploaded\"\n }\n });\n }\n }else{\n data[item] = {\n value: fileFieldValue,\n name: fileFieldDisplayValue.name,\n url: fileFieldDisplayValue.url + \"?download=true\",\n state: \"uploaded\"\n };\n }\n }\n })\n `\n}\n\nexport async function getEditFormInitApi(object, recordId, fields){\n return {\n method: \"post\",\n url: graphql.getApi(),\n sendOn: \"!!this.recordId\",\n cache: API_CACHE,\n adaptor: `\n if(payload.data.data){\n var data = payload.data.data[0];\n if(data){\n ${getScriptForAddUrlPrefixForImgFields(fields)}\n ${getScriptForRewriteValueForFileFields(fields)}\n //初始化接口返回的字段移除字段值为null的字段\n for (key in data){\n if(data[key] === null){\n delete data[key];\n }\n }\n };\n payload.data = data;\n delete payload.extensions;\n }\n return payload;\n `,\n data: await graphql.getFindOneQuery(object, recordId, fields),\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n}\n\n\nexport function getSaveApi(object, recordId, fields, options){\n return {\n method: 'post',\n url: graphql.getApi(),\n data: graphql.getSaveQuery(object, recordId, fields, options),\n requestAdaptor: graphql.getSaveRequestAdaptor(fields),\n responseData: {\n \"recordId\": \"${record._id}\"\n },\n adaptor: `\n if(payload.errors){\n payload.status = 2;\n payload.msg = window.t ? window.t(payload.errors[0].message) : payload.errors[0].message;\n }\n return payload;\n `,\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n}\n\nexport function getBatchDelete(objectName){\n return {\n method: 'post',\n url: graphql.getApi(),\n requestAdaptor: `\n var ids = api.data.ids.split(\",\");\n var deleteArray = [];\n ids.forEach((id,index)=>{\n deleteArray.push(\\`delete__\\${index}:${objectName}__delete(id: \"\\${id}\")\\`);\n })\n api.data = {query: \\`mutation{\\${deleteArray.join(',')}}\\`};\n return api;\n `,\n data: {\n ids: `\\${ids}`\n },\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-05-26 16:02:08\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2023-01-12 14:30:29\n * @Description: \n */\nimport * as Fields from '../fields';\nimport * as lodash from 'lodash';\n\nconst getFieldSchemaArray = (mergedSchema)=>{\n let fieldSchemaArray = [];\n fieldSchemaArray.length = 0\n\n const fieldsArr = [];\n lodash.forEach(mergedSchema.fields, (field, fieldName)=>{\n if(!lodash.has(field, \"name\")){\n field.name = fieldName\n }\n fieldsArr.push(field)\n })\n\n lodash.forEach(lodash.sortBy(mergedSchema.fields, \"sort_no\"), (field) => {\n if (!field.group || field.group == 'null' || field.group == '-')\n field.group = '通用'\n const fieldName = field.name;\n let isObjectField = /\\w+\\.\\w+/.test(fieldName)\n if (field.type == 'grid' || field.type == 'object') {\n // field.group = field.label\n field.is_wide = true;\n }\n \n if (!isObjectField){\n if(!field.hidden){\n fieldSchemaArray.push(Object.assign({name: fieldName}, field, {permission: {allowEdit: true}}))\n }\n }\n })\n return fieldSchemaArray;\n}\n\nconst getSection = async (permissionFields, fieldSchemaArray, sectionName, ctx) => {\n const sectionFields = lodash.filter(fieldSchemaArray, { 'group': sectionName });\n if(sectionFields.length == lodash.filter(sectionFields, ['hidden', true]).length){\n return ;\n }\n\n const fieldSetBody = [];\n\n for (const perField of sectionFields) {\n let field = perField;\n if(perField.type === 'grid'){\n field = await Fields.getGridFieldSubFields(perField, permissionFields);\n }else if(perField.type === 'object'){\n field = await Fields.getObjectFieldSubFields(perField, permissionFields);\n }\n if(field.name.indexOf(\".\") < 0){\n const amisField = await Fields.convertSFieldToAmisField(field, field.readonly, ctx);\n if(amisField){\n fieldSetBody.push(amisField);\n }\n }\n }\n\n // fieldSet 已支持显隐控制\n const sectionFieldsVisibleOn = lodash.map(lodash.compact(lodash.map(fieldSetBody, 'visibleOn')) , (visibleOn)=>{\n return `(${visibleOn.substring(2, visibleOn.length -1)})`;\n });\n const section = {\n \"type\": \"fieldSet\",\n \"title\": sectionName,\n \"collapsable\": true,\n \"body\": fieldSetBody,\n }\n if(sectionFieldsVisibleOn.length > 0 && fieldSetBody.length === sectionFieldsVisibleOn.length){\n section.visibleOn = `\\${${sectionFieldsVisibleOn.join(\" || \")}}`\n }\n return section\n}\n\nexport const getSections = async (permissionFields, mergedSchema, ctx) => {\n const fieldSchemaArray = getFieldSchemaArray(mergedSchema)\n const _sections = lodash.groupBy(fieldSchemaArray, 'group');\n const sections = [];\n for (const key in _sections) {\n const section = await getSection(permissionFields, fieldSchemaArray, key, ctx);\n if(section.body.length > 0){\n sections.push(section)\n }\n }\n return sections;\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-07-07 11:02:29\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-09-01 11:46:15\n * @Description: \n */\nimport { getSections } from './fields/sections';\n\nexport async function getFormBody(permissionFields, objectConfig, ctx){\n return await getSections(permissionFields, objectConfig, ctx);\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-07-23 09:12:14\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-11-25 13:28:35\n * @Description: \n */\n\nimport * as Tpl from '../tpl';\nimport { Router } from '../../../router'\n\nasync function getListBody(fields, options){\n const columns = [];\n for (const field of fields) {\n\n const tpl = await Tpl.getFieldTpl(field, options);\n\n let type = 'text';\n if(tpl){\n type = 'tpl';\n }\n if(!field.hidden && !field.extra){\n columns.push({\n name: field.name,\n label: field.label,\n sortable: field.sortable,\n // searchable: field.searchable,\n width: field.width,\n type: type,\n tpl: tpl,\n toggled: field.toggled\n // toggled: true \n })\n }\n };\n\n return {\n \"type\": \"hbox\",\n \"columns\": columns\n };\n}\n\nfunction getDefaultParams(options){\n return {\n perPage: options.top || options.perPage || 10\n }\n}\n\nexport async function getListSchema(fields, options){\n const listBody = await getListBody(fields, options);\n const columns = listBody.columns;\n return {\n mode: \"list\",\n name: \"thelist\",\n draggable: false,\n headerToolbar: ['reload'],\n defaultParams: getDefaultParams(options),\n syncLocation: false,\n keepItemSelectionOnPageChange: true,\n checkOnItemClick: false,\n labelTpl: `\\${name}`, //TODO 获取name字段\n listItem: {\n body: [...columns],\n actions: options.actions === false ? null : [\n {\n icon: \"fa fa-eye\",\n label: \"查看\",\n type: \"button\",\n actionType: \"link\",\n link: Router.getObjectDetailPath({\n formFactor: options.formFactor, \n appId: options.appId, \n objectName: options.tabId, \n listView: options.listView,\n recordId: `\\${_id}`\n })\n }\n ]\n }\n }\n}\n\n\nexport async function getCardSchema(fields, options){\n let title = null;\n const titleField = _.find(fields, (f)=>{\n return f.name === options.labelFieldName;\n });\n if(titleField){\n title = await Tpl.getFieldTpl(titleField, options)\n }\n const listBody = await getListBody(_.filter(fields, (f)=>{\n return f.name != options.labelFieldName\n }), options);\n return {\n mode: \"cards\",\n name: \"cards\",\n draggable: false,\n headerToolbar: ['statistics', 'pagination'],\n defaultParams: getDefaultParams(options),\n syncLocation: false,\n keepItemSelectionOnPageChange: false,\n checkOnItemClick: false,\n labelTpl: `\\${${options.labelFieldName}}`,\n card: {\n \"type\": \"card\",\n \"header\": {\n \"title\": title\n },\n \"body\": [...listBody.columns]\n }\n }\n}","import {get} from 'lodash'\n\nconst globalTag = '__G_L_O_B_A_L__';\n\nconst getParentPath = function (path) {\n var pathArr;\n if (typeof path === 'string') {\n pathArr = path.split('.');\n if (pathArr.length === 1) {\n return '#';\n }\n pathArr.pop();\n return pathArr.join('.');\n }\n return '#';\n}\n\nconst getValueByPath = function (formData, path) {\n if (path === '#' || !path) {\n return formData || {};\n } else if (typeof path === 'string') {\n return get(formData, path);\n } else {\n console.error('path has to be a string');\n }\n};\n\nexport const isExpression = function (func) {\n var pattern, reg1, reg2;\n if (typeof func !== 'string') {\n return false;\n }\n pattern = /^{{(.+)}}$/;\n reg1 = /^{{(function.+)}}$/;\n reg2 = /^{{(.+=>.+)}}$/;\n if (typeof func === 'string' && func.match(pattern) && !func.match(reg1) && !func.match(reg2)) {\n return true;\n }\n return false;\n};\n\nexport const parseSingleExpression = function (func, formData, dataPath, global, userSession = {}) {\n var error, funcBody, parent, parentPath, str;\n\n if (formData === void 0) {\n formData = {};\n }\n parentPath = getParentPath(dataPath);\n parent = getValueByPath(formData, parentPath) || {};\n if (typeof func === 'string') {\n funcBody = func.substring(2, func.length - 2);\n str = `\\n var $user=${JSON.stringify(userSession)}; return ` + funcBody.replace(/\\bformData\\b/g, JSON.stringify(formData).replace(/\\bglobal\\b/g, globalTag)).replace(/\\bglobal\\b/g, JSON.stringify(global)).replace(new RegExp('\\\\b' + globalTag + '\\\\b', 'g'), 'global').replace(/rootValue/g, JSON.stringify(parent));\n try {\n return Function(str)();\n } catch (_error) {\n error = _error;\n console.log(error, func, dataPath);\n return func;\n }\n } else {\n return func;\n }\n};","\nimport { toArray, mergeWith, isArray } from 'lodash';\n\n// lodash的defaultsDeep函数有bug,无法正确合并值为数值的节点,重写修正该函数\n// 源码出处:https://github.com/nodeutils/defaults-deep\nexport const defaultsDeep = (...args)=>{\n let output = {};\n toArray(args).reverse().forEach(item=> {\n mergeWith(output, item, (objectValue, sourceValue) => {\n return isArray(sourceValue) ? sourceValue : undefined;\n });\n });\n return output;\n};","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-08-04 10:42:49\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-08-25 10:28:47\n * @Description: \n */\nexport default {\n listView: {\n newRecordMode: 'modal',\n editRecordMode: 'modal',\n perPage: 20\n }\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-07-13 15:18:03\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-11-08 09:35:03\n * @Description: \n */\nimport { fetchAPI } from './steedos.client';\n\nexport async function getPage({type, pageId, appId, objectName = '', recordId, formFactor = 'LARGE'}){\n if(!objectName){\n objectName = ''\n }\n if(!recordId){\n recordId = ''\n }\n if(!pageId){\n pageId = ''\n }\n const api = `/api/pageSchema/${type}?app=${appId}&objectApiName=${objectName}&recordId=${recordId}&pageId=${pageId}&formFactor=${formFactor}`;\n const page = await fetchAPI(api);\n if (page && page.schema) {\n return page;\n }\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-11-01 15:51:00\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2023-01-12 18:15:27\n * @Description: \n */\n\nimport { getPage } from '../lib/page'\n\nexport const getSchema = async (uiSchema, ctx)=>{\n const title = \"新建 \" + uiSchema.label;\n const defaultFormSchema = {\n \"type\": \"steedos-object-form\",\n \"label\": \"对象表单\",\n \"objectApiName\": \"${objectName}\",\n \"recordId\": \"\",\n \"id\": \"u:f8ad8ddf153a\",\n \"mode\": \"edit\",\n \"layout\": \"normal\"\n };\n\n let formSchema = defaultFormSchema;\n const page = await getPage({type: 'form', appId: ctx.appId, objectName: ctx.objectName, formFactor: ctx.formFactor});\n\n if(page){\n formSchema = _.isString(page.schema) ? JSON.parse(page.schema) : page.schema;\n }\n // console.log(`standard_new getSchema`, uiSchema, ctx)\n return {\n \"type\": \"service\",\n \"body\": [\n {\n \"type\": \"button\",\n \"label\": \"新建\",\n \"id\": \"u:standard_new\",\n \"level\": \"default\",\n \"onEvent\": {\n \"click\": {\n \"actions\": [\n {\n \"actionType\": \"dialog\",\n \"dialog\": {\n \"type\": \"dialog\",\n \"data\": {\n \"$master\": \"$$\",\n \"&\": \"${defaultData}\",\n \"appId\": \"${appId}\",\n \"objectName\": \"${objectName}\",\n \"context\": \"${context}\",\n \"global\": \"${global}\",\n \"listViewId\": \"${listViewId}\"\n },\n \"title\": title,\n \"bodyClassName\": \"\",\n \"body\": [\n formSchema\n ],\n \"id\": \"u:0b96577db93c\",\n \"closeOnEsc\": false,\n \"closeOnOutside\": false,\n \"showCloseButton\": true,\n \"size\": \"lg\"\n }\n }\n ],\n \"weight\": 0\n }\n }\n }\n ],\n \"regions\": [\n \"body\"\n ],\n \"className\": \"p-0 border-0\",\n \"id\": \"u:aef99d937b10\"\n }\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-11-01 15:53:07\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-12-05 10:49:23\n * @Description: \n */\n\nimport * as standardNew from '../schema/standard_new.amis.js'\nimport * as standardEdit from '../schema/standard_edit.amis.js'\nimport * as standardDelete from '../schema/standard_delete.amis.js'\nimport * as standardImportData from '../schema/standard_import_data.amis.js'\nimport * as standardOpenView from '../schema/standard_open_view.amis.js'\n\nexport const StandardButtons = {\n getStandardNew: async (uiSchema, ctx)=>{\n return {\n type: 'amis_button',\n amis_schema: await standardNew.getSchema(uiSchema, ctx)\n }\n },\n getStandardEdit: async (uiSchema, ctx)=>{\n return {\n type: 'amis_button',\n amis_schema: await standardEdit.getSchema(uiSchema, ctx)\n }\n },\n getStandardDelete: async (uiSchema, ctx)=>{\n return {\n type: 'amis_button',\n amis_schema: await standardDelete.getSchema(uiSchema, ctx)\n }\n },\n getStandardDeleteMany: async (uiSchema, ctx)=>{\n return {\n type: 'script',\n todo: function(){\n const {\n appId,\n objectName,\n uiSchema\n } = this;\n const scopeId = this.scopeId || `amis-${appId}-${objectName}-listview`;\n const scope = this.scope || SteedosUI?.getRef(scopeId);\n const listViewRef = scope.getComponentById(`listview_${uiSchema.name}`);\n console.log(`listViewRef`, listViewRef)\n if(_.isEmpty(listViewRef.props.store.toJSON().selectedItems)){\n listViewRef.handleAction({}, {\n \"actionType\": \"toast\",\n \"toast\": {\n \"items\": [\n {\n \"position\": \"top-right\",\n \"body\": \"请选择要删除的项\"\n }\n ]\n }\n })\n }else{\n listViewRef.handleBulkAction(listViewRef.props.store.toJSON().selectedItems,[],{},listViewRef.props.bulkActions[0]);\n }\n }\n }\n },\n getStandardImportData: async (uiSchema, ctx)=>{\n return {\n type: 'amis_button',\n amis_schema: await standardImportData.getSchema(uiSchema, ctx)\n }\n },\n getStandardOpenView: async (uiSchema, ctx)=>{\n return {\n type: 'amis_button',\n amis_schema: await standardOpenView.getSchema(uiSchema, ctx)\n }\n }\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-11-01 15:49:58\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-11-08 16:39:40\n * @Description:\n */\n\nimport { getPage } from '../lib/page'\n\nexport const getSchema = async (uiSchema, ctx) => {\n const title = \"编辑 \" + uiSchema.label;\n\n const defaultFormSchema = {\n type: \"steedos-object-form\",\n label: \"对象表单\",\n objectApiName: \"${objectName}\",\n recordId: \"${recordId}\",\n id: \"u:d2b0c083c38f\",\n mode: \"edit\",\n };\n\n let formSchema = defaultFormSchema;\n const page = await getPage({\n type: \"form\",\n appId: ctx.appId,\n objectName: ctx.objectName,\n formFactor: ctx.formFactor,\n });\n\n if (page) {\n formSchema = _.isString(page.schema)\n ? JSON.parse(page.schema)\n : page.schema;\n }\n\n return {\n type: \"service\",\n body: [\n {\n type: \"button\",\n label: \"编辑\",\n id: \"u:standard_edit\",\n onEvent: {\n click: {\n actions: [\n {\n actionType: \"dialog\",\n dialog: {\n type: \"dialog\",\n title: title,\n bodyClassName: \"\",\n body: [formSchema],\n id: \"u:ee95697baa4f\",\n closeOnEsc: false,\n closeOnOutside: false,\n showCloseButton: true,\n size: \"lg\",\n },\n },\n ],\n weight: 0,\n },\n },\n },\n ],\n regions: [\"body\"],\n className: \"\",\n id: \"u:3c5cbc0429bb\",\n };\n};\n","export const getSchema = (uiSchema)=>{\n return {\n \"type\": \"service\",\n \"className\": \"p-0\",\n \"body\": [\n {\n \"type\": \"button\",\n \"label\": \"删除\",\n \"confirmText\": \"确定要删除此项目?\",\n \"onEvent\": {\n \"click\": {\n \"actions\": [\n {\n \"args\": {\n \"api\": {\n \"method\": \"post\",\n \"url\": \"${context.rootUrl}/graphql\",\n \"data\": {\n \"&\": \"$$\",\n \"recordId\": \"${recordId}\",\n \"objectName\": \"${objectName}\"\n },\n \"requestAdaptor\": \"const {recordId, objectName} = api.body; var deleteArray = []; deleteArray.push(`delete:${objectName}__delete(id: \\\"${recordId}\\\")`); api.data = {query: `mutation{${deleteArray.join(',')}}`}; return api;\",\n \"headers\": {\n \"Authorization\": \"Bearer ${context.tenantId},${context.authToken}\"\n },\n \"adaptor\": `\n if(payload.errors){\n payload.status = 2;\n payload.msg = payload.errors[0].message;\n }\n return payload;\n `,\n },\n \"messages\": {\n \"success\": \"删除成功\",\n \"failed\": \"删除失败\"\n }\n },\n \"actionType\": \"ajax\"\n },\n {\n \"componentId\": \"\",\n \"args\": {\n \"url\": \"/app/${app_id}/${objectName}/grid/all\",\n \"blank\": false\n },\n \"actionType\": \"link\",\n \"expression\": \"!!!listViewId\"\n },\n {\n \"componentId\": `listview_${uiSchema.name}`,\n \"actionType\": \"reload\",\n \"expression\": \"!!listViewId\"\n },\n ]\n }\n }\n }\n ],\n \"regions\": [\n \"body\"\n ]\n }\n}","export const getSchema = (uiSchema) => {\n return {\n type: \"service\",\n body: [\n {\n type: \"button\",\n label: \"导入数据\",\n id: \"u:import_data\",\n onEvent: {\n click: {\n actions: [\n {\n actionType: \"dialog\",\n dialog: {\n data: {\n \"&\": \"$$\",\n \"object_name\": \"${objectName}\"\n },\n type: \"dialog\",\n title: \"导入数据\",\n body: [\n {\n type: \"form\",\n mode: \"edit\",\n persistData: false,\n promptPageLeave: true,\n name: \"form_edit_data_import\",\n debug: false,\n title: \"\",\n submitText: \"\",\n api: {\n method: \"post\",\n url: \"${context.rootUrl}/graphql\",\n data: {\n objectName: \"queue_import_history\",\n $: \"$$\",\n },\n requestAdaptor:\n \"\\n const formData = api.data.$;\\n for (key in formData){\\n // image、select等字段清空值后保存的空字符串转换为null。\\n if(formData[key] === ''){\\n formData[key] = null;\\n }\\n }\\n const objectName = api.data.objectName;\\n const fieldsName = Object.keys(formData);\\n delete formData.created;\\n delete formData.created_by;\\n delete formData.modified;\\n delete formData.modified_by;\\n delete formData._display;\\n delete formData.success_count;\\ndelete formData.failure_count;\\ndelete formData.total_count;\\ndelete formData.start_time;\\ndelete formData.end_time;\\ndelete formData.state;\\ndelete formData.error;\\ndelete formData.created;\\ndelete formData.created_by;\\ndelete formData.modified;\\ndelete formData.modified_by;\\n \\n \\n let fileFieldsKeys = [\\\"file\\\"];\\n let fileFields = {\\\"file\\\":{\\\"name\\\":\\\"file\\\"}};\\n fileFieldsKeys.forEach((item)=>{\\n let fileFieldValue = formData[item];\\n if(fileFieldValue){\\n // 因为表单初始化接口的接收适配器中为file字段值重写了值及格式(为了字段编辑时正常显示附件名、点击附件名正常下载),所以保存时还原(为了字段值保存时正常保存id)。\\n if(fileFields[item].multiple){\\n if(fileFieldValue instanceof Array && fileFieldValue.length){\\n formData[item] = fileFieldValue.map((value)=>{ \\n if(typeof value === 'object'){\\n return value.value;\\n }else{\\n return value;\\n }\\n });\\n }\\n }else{\\n formData[item] = typeof fileFieldValue === 'object' ? fileFieldValue.value : fileFieldValue;\\n }\\n }\\n })\\n \\n let query = `mutation{record: ${objectName}__insert(doc: {__saveData}){_id}}`;\\n if(formData.recordId && formData.recordId !='new'){\\n query = `mutation{record: ${objectName}__update(id: \\\"${formData._id}\\\", doc: {__saveData}){_id}}`;\\n };\\n delete formData._id;\\n let __saveData = JSON.stringify(JSON.stringify(formData));\\n \\n api.data = {query: query.replace('{__saveData}', __saveData)};\\n return api;\\n \",\n responseData: {\n recordId: \"${record._id}\",\n },\n adaptor:\n \"console.log('payload', payload)\\n return payload;\\n \",\n headers: {\n Authorization:\n \"Bearer ${context.tenantId},${context.authToken}\",\n },\n dataType: \"json\",\n },\n initFetch: true,\n body: [\n {\n type: \"fieldSet\",\n title: \"通用\",\n collapsable: true,\n body: [\n {\n name: \"object_name\",\n label: \"导入对象\",\n required: false,\n type: \"select\",\n joinValues: false,\n extractValue: true,\n autoComplete: {\n method: \"post\",\n url: \"${context.rootUrl}/graphql\",\n data: {\n orderBy: \"${orderBy}\",\n orderDir: \"${orderDir}\",\n pageNo: \"${page}\",\n pageSize: \"${perPage}\",\n query:\n \"{options:objects(filters: {__filters}, top: {__top}){_id label:label value:name},count:objects__count(filters:{__filters})}\",\n $term: \"$term\",\n $value: \"$object_name.name\",\n $: \"$$\",\n rfield: \"${object_name}\",\n },\n headers: {\n Authorization:\n \"Bearer ${context.tenantId},${context.authToken}\",\n },\n requestAdaptor:\n \"\\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 \",\n },\n className: \"m-1\",\n labelClassName: \"text-left\",\n clearValueOnHidden: false,\n id: \"u:04295fee3896\",\n multiple: false,\n hidden: true,\n },\n {\n name: \"queue_import\",\n label: \"数据导入\",\n required: true,\n type: \"picker\",\n labelField: \"description\",\n valueField: \"_id\",\n modalMode: \"dialog\",\n source: {\n method: \"post\",\n url: \"${context.rootUrl}/graphql\",\n data: {\n orderBy: \"${orderBy}\",\n orderDir: \"${orderDir}\",\n pageNo: \"${page}\",\n pageSize: \"${perPage}\",\n query:\n '{rows:queue_import(filters: {__filters}, top: {__top}, skip: {__skip}, sort: \"{__sort}\"){_id,description,object_name,encoding,template_url,_display:_ui{object_name,encoding}},count:queue_import__count(filters:{__filters})}',\n $term: \"$term\",\n $self: \"$$\",\n },\n headers: {\n Authorization:\n \"Bearer ${context.tenantId},${context.authToken}\",\n },\n requestAdaptor:\n \"\\n const selfData = JSON.parse(JSON.stringify(api.data.$self));\\n var filters = [];\\n var pageSize = api.data.pageSize || 10;\\n var pageNo = api.data.pageNo || 1;\\n var skip = (pageNo - 1) * pageSize;\\n var orderBy = api.data.orderBy || '';\\n var orderDir = api.data.orderDir || '';\\n var sort = orderBy + ' ' + orderDir;\\n var allowSearchFields = [\\\"description\\\"];\\n if(api.data.$term){\\n filters = [[\\\"name\\\", \\\"contains\\\", \\\"'+ api.data.$term +'\\\"]];\\n }else if(selfData.op === 'loadOptions' && selfData.value){\\n if(selfData.value?.indexOf(',') > 0){\\n filters = [[\\\"_id\\\", \\\"=\\\", selfData.value.split(',')]];\\n }else{\\n filters = [[\\\"_id\\\", \\\"=\\\", selfData.value]];\\n }\\n }\\n if(allowSearchFields){\\n allowSearchFields.forEach(function(key){\\n const keyValue = selfData[key];\\n if(keyValue){\\n filters.push([key, \\\"contains\\\", keyValue]);\\n }\\n })\\n }\\n\\n const filtersFunction = function(filters, values){return ['object_name', '=', values.object_name]};\\n\\n if(filtersFunction){\\n const _filters = filtersFunction(filters, api.data.$self.__super.__super);\\n if(_filters && _filters.length > 0){\\n filters.push(_filters);\\n }\\n }\\n\\n api.data.query = api.data.query.replace(/{__filters}/g, JSON.stringify(filters)).replace('{__top}', pageSize).replace('{__skip}', skip).replace('{__sort}', sort.trim());\\n return api;\\n \",\n adaptor:\n \"\\n const enable_tree = undefined;\\n if(enable_tree){\\n const records = payload.data.rows;\\n const treeRecords = [];\\n const getChildren = (records, childrenIds)=>{\\n if(!childrenIds){\\n return;\\n }\\n const children = _.filter(records, (record)=>{\\n return _.includes(childrenIds, record._id)\\n });\\n _.each(children, (item)=>{\\n if(item.children){\\n item.children = getChildren(records, item.children)\\n }\\n })\\n return children;\\n }\\n\\n _.each(records, (record)=>{\\n if(!record.parent){\\n treeRecords.push(Object.assign({}, record, {children: getChildren(records, record.children)}));\\n }\\n });\\n payload.data.rows = treeRecords;\\n }\\n return payload;\\n \",\n },\n size: \"lg\",\n pickerSchema: {\n mode: \"table\",\n name: \"thelist\",\n draggable: false,\n headerToolbar: [\"reload\"],\n defaultParams: {\n perPage: 20,\n },\n columns: [\n {\n name: \"_index\",\n type: \"text\",\n width: 32,\n placeholder: \"\",\n },\n {\n name: \"description\",\n label: \"导入描述\",\n type: \"tpl\",\n tpl: '<a href=\"/app/undefined/undefined/view/${undefined}\">${description}</a>',\n className: \"whitespace-nowrap\",\n html: null,\n },\n {\n name: \"object_name\",\n label: \"导入对象\",\n type: \"tpl\",\n tpl: '<a href=\"/app/undefined/${_display.object_name.objectName}/view/${_display.object_name.value}\">${_display.object_name.label}</a>',\n className: \"whitespace-nowrap\",\n html: null,\n },\n {\n name: \"encoding\",\n label: \"字符代码\",\n type: \"tpl\",\n tpl: \"<div>${_display.encoding}</div>\",\n className: \"whitespace-nowrap\",\n html: null,\n },\n {\n name: \"template_url\",\n label: \"导入模板\",\n type: \"markdown\",\n className: \"whitespace-nowrap\",\n html: true,\n },\n null,\n ],\n syncLocation: false,\n keepItemSelectionOnPageChange: true,\n checkOnItemClick: false,\n autoFillHeight: false,\n },\n joinValues: false,\n extractValue: true,\n className: \"m-1\",\n labelClassName: \"text-left\",\n clearValueOnHidden: true,\n id: \"u:401df27113e0\",\n },\n {\n name: \"file\",\n label: \"Excel文件\",\n required: true,\n type: \"input-file\",\n className: \"m-1\",\n labelClassName: \"text-left\",\n clearValueOnHidden: true,\n useChunk: false,\n receiver: {\n method: \"post\",\n url: \"${context.rootUrl}/s3/files\",\n data: {\n $: \"$$\",\n context: \"${context}\",\n },\n adaptor:\n '\\n const { context } = api.body; \\n var rootUrl = context.rootUrl + \"/api/files/files/\";\\n payload = {\\n status: response.status == 200 ? 0 : response.status,\\n msg: response.statusText,\\n data: {\\n value: payload._id,\\n name: payload.original.name,\\n url: rootUrl + payload._id,\\n }\\n }\\n return payload;\\n ',\n headers: {\n Authorization:\n \"Bearer ${context.tenantId},${context.authToken}\",\n },\n },\n id: \"u:0213f2cc365b\",\n },\n ],\n id: \"u:4899c260d667\",\n },\n ],\n panelClassName: \"m-0 sm:rounded-lg shadow-none\",\n bodyClassName: \"p-0\",\n className: \"p-4 sm:p-0 steedos-amis-form\",\n label: \"对象表单\",\n objectApiName: \"queue_import_history\",\n id: \"u:e4ef598eed61\",\n onEvent: {\n submitSucc: {\n weight: 0,\n actions: [\n {\n args: {\n api: {\n url: \"${context.rootUrl}/api/data/initiateImport\",\n method: \"post\",\n data: {\n eventData: \"${event.data}\",\n },\n dataType: \"json\",\n requestAdaptor:\n \"\\napi.data = {\\n importObjectHistoryId: api.body.eventData.result.data.recordId\\n}\\nreturn api;\",\n adaptor:\n \"payload.status = payload.status === 'success' ? 0 : payload.status;\\nconsole.log(\\\"payload ssss==>\\\", payload)\\nreturn payload;\",\n headers: {\n Authorization:\n \"Bearer ${context.tenantId},${context.authToken}\",\n },\n },\n messages: {\n success: \"已开始导入...\",\n failed: \"导入失败\",\n },\n },\n actionType: \"ajax\",\n expression: \"event.data.result\",\n },\n ],\n },\n },\n closeDialogOnSubmit: true,\n },\n ],\n id: \"u:dc05498d3bd4\",\n closeOnEsc: false,\n closeOnOutside: false,\n showCloseButton: true,\n size: \"lg\",\n },\n },\n ],\n weight: 0,\n },\n },\n level: \"default\",\n },\n ],\n regions: [\"body\"],\n className: \"p-0\",\n id: \"u:bd2f9c4e986f\",\n };\n};\n","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-11-07 17:00:38\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-11-07 17:12:20\n * @Description: \n */\nexport const getSchema = (uiSchema)=>{\n return {\n \"type\": \"service\",\n \"className\": \"p-0\",\n \"body\": [\n {\n \"type\": \"button\",\n \"label\": \"查看\",\n \"className\": \"border-none\",\n \"onEvent\": {\n \"click\": {\n \"actions\": [\n {\n \"componentId\": \"\",\n \"args\": {\n \"blank\": false,\n \"url\": \"/app/${app_id}/${objectName}/view/${_id}\"\n },\n \"actionType\": \"link\"\n }\n ]\n }\n },\n \"id\": \"u:ef35c9ae1d19\"\n }\n ],\n \"regions\": [\n \"body\"\n ]\n }\n}","import _ from \"lodash\";\nimport { isExpression, parseSingleExpression } from \"./expression\";\nimport { getApi } from './converter/amis/graphql';\nimport config from \"../config\";\nimport { getUISchema } from \"./objects\";\n\nimport { StandardButtons } from '../standard/button'\n\nconst getGlobalData = () => {\n return {\n now: new Date(),\n };\n};\n\nexport function getButtonVisibleOn(button){\n let visible= button.visible;\n\n if(button._visible){\n visible = button._visible;\n }\n\n if(_.isBoolean(visible)){\n visible = visible.toString();\n }\n\n if(visible){\n // if(visible.indexOf(\"Meteor.\") > 0 || visible.indexOf(\"Creator.\") > 0 || visible.indexOf(\"Session.\") > 0){\n // console.warn('无效的visible', visible)\n // return 'false';\n // }\n if(visible.trim().startsWith('function')){\n return `${visible}.apply({\n object: uiSchema\n }, [objectName, _id, recordPermissions, data])`\n }\n return visible;\n }\n\n if(button.type === 'amis_button'){\n const amisSchema = button.amis_schema;\n if(amisSchema && amisSchema.body && amisSchema.body.length > 0){\n const btn1 = amisSchema.body[0];\n return btn1.visibleOn\n }\n }\n}\n\nexport const getButtonVisible = (button, ctx) => {\n if (button._visible) {\n if (_.startsWith(_.trim(button._visible), \"function\")) {\n window.eval(\"var fun = \" + button._visible);\n button.visible = fun;\n } else if (isExpression(button._visible)) {\n button.visible = (props) => {\n parseSingleExpression(\n button._visible,\n props.record,\n \"#\",\n getGlobalData(),\n props.userSession\n );\n };\n }\n }\n if (_.isFunction(button.visible)) {\n try {\n return button.visible(ctx);\n } catch (error) {\n // console.error(`${button.name} visible error: ${error}`);\n }\n } else {\n return button.visible;\n }\n};\n\n\nexport const standardButtonsTodo = {\n // 批量删除比较特殊, CRUD组件在外部无法触发批量操作action.\n standard_delete_many: function(){\n const {\n listViewId,\n uiSchema,\n scopeId\n } = this;\n const listViewRef = SteedosUI?.getRef(scopeId || listViewId).getComponentById(`listview_${uiSchema.name}`)\n \n if(_.isEmpty(listViewRef.props.store.toJSON().selectedItems)){\n listViewRef.handleAction({}, {\n \"actionType\": \"toast\",\n \"toast\": {\n \"items\": [\n {\n \"position\": \"top-right\",\n \"body\": \"请选择要删除的项\"\n }\n ]\n }\n })\n }else{\n listViewRef.handleBulkAction(listViewRef.props.store.toJSON().selectedItems,[],{},listViewRef.props.bulkActions[0]);\n }\n }\n};\n\n\n/**\n * 按钮显隐规则: 优先使用页面布局上的配置.\n * @param {*} uiSchema \n * @param {*} ctx \n * @returns \n */\nexport const getButtons = (uiSchema, ctx) => {\n const disabledButtons = uiSchema.permissions && uiSchema.permissions.disabled_actions;\n let buttons = _.sortBy(_.values(uiSchema.actions), \"sort\");\n if (_.has(uiSchema, \"allow_customActions\")) {\n buttons = _.filter(buttons, (button) => {\n return _.include(uiSchema.allow_customActions, button.name); // || _.include(_.keys(Creator.getObject('base').actions) || {}, button.name)\n });\n }\n if (_.has(uiSchema, \"exclude_actions\")) {\n buttons = _.filter(buttons, (button) => {\n return !_.include(uiSchema.exclude_actions, button.name);\n });\n }\n\n _.each(buttons, (button) => {\n button.objectName = uiSchema.name;\n if (\n ctx.isMobile &&\n [\"record\", \"record_only\"].indexOf(button.on) > -1 &&\n button.name != \"standard_edit\"\n ) {\n if (button.on == \"record_only\") {\n button.on = \"record_only_more\";\n } else {\n button.on = \"record_more\";\n }\n }\n });\n\n if (\n ctx.isMobile &&\n [\"cms_files\", \"cfs.files.filerecord\"].indexOf(uiSchema.name) > -1\n ) {\n _.map(buttons, (button) => {\n if (button.name === \"standard_edit\") {\n button.on = \"record_more\";\n }\n if (button.name === \"download\") {\n button.on = \"record\";\n }\n });\n }\n\n return _.filter(buttons, (button) => {\n return _.indexOf(disabledButtons, button.name) < 0 && button.name != 'standard_query';\n });\n};\n\nexport const getListViewButtons = (uiSchema, ctx) => {\n const buttons = getButtons(uiSchema, ctx);\n const listButtons = _.filter(buttons, (button) => {\n return button.on == \"list\";\n });\n return listButtons;\n};\n\nexport const getObjectDetailButtons = (uiSchema, ctx) => {\n const buttons = getButtons(uiSchema, ctx);\n const detailButtons = _.filter(buttons, (button) => {\n return button.on == \"record\" || button.on == \"record_only\";\n });\n return _.sortBy(detailButtons, \"sort\");\n};\n\nexport const getObjectDetailMoreButtons = (uiSchema, ctx) => {\n const buttons = getButtons(uiSchema, ctx);\n const moreButtons = _.filter(buttons, (button) => {\n return button.on == \"record_more\" || button.on == \"record_only_more\";\n });\n return _.sortBy(moreButtons, \"sort\");\n};\n\nexport const getListViewItemButtons = async (uiSchema, ctx)=>{\n const buttons = getButtons(uiSchema, ctx);\n const listButtons = _.filter(buttons, (button) => {\n return button.on == \"record\" || button.on == \"list_item\" || button.on === 'record_more';\n });\n return listButtons;\n}\n\nexport const getObjectRelatedListButtons = async (uiSchema, ctx)=>{\n // const buttons = getButtons(uiSchema, ctx);\n // const relatedListButtons = _.filter(buttons, (button) => {\n // if(button.objectName === 'cms_files'){\n // // TODO:附件对象本身没有上传按钮,需要自定义\n // }else{\n // return button.name == \"standard_new\";\n // }\n // });\n // return relatedListButtons;\n const buttons = getButtons(uiSchema, ctx);\n const listButtons = _.filter(buttons, (button) => {\n return button.on == \"list\";\n });\n return listButtons;\n}\n\n/**\n * 由此函数负责内置按钮的转换\n * @param {*} objectName \n * @param {*} buttonName \n * @param {*} ctx \n * @returns \n */\nexport const getButton = async (objectName, buttonName, ctx)=>{\n const uiSchema = await getUISchema(objectName);\n const { props } = ctx;\n if(uiSchema){\n const buttons = await getButtons(uiSchema, ctx);\n const button = _.find(buttons, (button)=>{\n return button.name === buttonName\n });\n\n if(!button){\n return ;\n }\n\n if(button.name == 'standard_edit'){ // && button._visible.indexOf('Steedos.StandardObjects.Base.Actions.standard_edit.visible.apply') > 0\n return {\n label: button.label,\n name: button.name,\n on: button.on,\n ...await StandardButtons.getStandardEdit(uiSchema, ctx)\n };\n }\n if(objectName != 'cms_files' && button.name == 'standard_new' ){ //&& button._visible.indexOf('Steedos.StandardObjects.Base.Actions.standard_new.visible.apply') > 0\n return {\n label: button.label,\n name: button.name,\n on: button.on,\n ...await StandardButtons.getStandardNew(uiSchema, ctx)\n }\n }\n\n // 如果是standard_delete 且 _visible 中调用了 Steedos 函数, 则自动添加标准的删除功能\n if(button.name == 'standard_delete'){ // && button._visible.indexOf('Steedos.StandardObjects.Base.Actions.standard_delete.visible.apply') > 0\n return {\n label: button.label,\n name: button.name,\n on: button.on,\n sort: button.sort,\n ...await StandardButtons.getStandardDelete(uiSchema, ctx)\n }\n }\n\n if(uiSchema.hasImportTemplates && button.name === 'standard_import_data'){\n return {\n label: button.label,\n name: button.name,\n on: button.on,\n sort: button.sort,\n ...await StandardButtons.getStandardImportData(uiSchema, ctx)\n }\n }\n\n if(button.name === 'standard_open_view'){\n return {\n label: button.label,\n name: button.name,\n on: button.on,\n sort: button.sort,\n ...await StandardButtons.getStandardOpenView(uiSchema, ctx)\n }\n }\n\n if(button.name === 'standard_delete_many'){\n return {\n label: button.label,\n name: button.name,\n on: button.on,\n sort: button.sort,\n ...await StandardButtons.getStandardDeleteMany(uiSchema, ctx)\n }\n }\n\n return button;\n\n }\n}\n\nexport const execute = (button, props) => {\n if (!button.todo) {\n return; //TODO 弹出提示未配置todo\n }\n\n if (_.isString(button.todo)) {\n if (_.startsWith(_.trim(button.todo), \"function\")) {\n window.eval(\"var fun = \" + button.todo);\n button.todo = fun;\n }\n }\n if (_.isFunction(button.todo)) {\n const todoThis = {\n objectName: props.objectName, \n object_name: props.objectName, \n object: props.uiSchema, \n record: props.record,\n recordId: props.recordId,\n record_id: props.recordId,\n ...props,\n action: button\n }\n return button.todo.apply(todoThis, [todoThis.objectName, todoThis.recordId]);\n }\n};\n\nexport const executeButton = execute;\n","import { getAuthToken, getTenantId, getRootUrl } from '../../steedos.client.js';\nimport { getListViewButtons, getObjectDetailButtons, getObjectDetailMoreButtons, getObjectRelatedListButtons, getButtonVisibleOn } from '../../buttons'\nimport { getObjectFieldsFilterButtonSchema, getObjectFieldsFilterBarSchema } from './fields_filter';\nimport { map, each, sortBy, compact, keys } from 'lodash';\n\n/**\n * 列表视图顶部第一行amisSchema\n * @param {*} objectSchema 对象UISchema\n * @returns amisSchema\n */\nexport function getObjectListHeaderFirstLine(objectSchema, listViewName, ctx) {\n if (!ctx) {\n ctx = {};\n }\n const { icon, label } = objectSchema;\n const listViewButtonOptions = [];\n // let currentListView;\n each(\n objectSchema.list_views,\n (listView, name) => {\n listViewButtonOptions.push({\n type: \"button\",\n label: listView.label,\n actionType: \"link\",\n // icon: \"fa fa-plus\",\n link: `/app/\\${appId}/${objectSchema.name}/grid/${name}`\n });\n // if(name === listViewName){\n // currentListView = listView;\n // }\n }\n );\n\n // if(!currentListView){\n // return {};\n // }\n\n const buttons = getListViewButtons(objectSchema, {});\n let amisButtonsSchema = map(buttons, (button) => {\n return {\n type: 'steedos-object-button',\n name: button.name,\n objectName: button.objectName,\n visibleOn: getButtonVisibleOn(button),\n className: `button_${button.name}`\n }\n });\n // if(objectSchema.permissions?.allowDelete){\n // const bulkDeleteScript = `\n // const data = event.data;\n // const listViewId = data.listViewId;\n // const uiSchema = data.uiSchema;\n // const scopeId = data.scopeId;\n // BuilderAmisObject.AmisLib.standardButtonsTodo.standard_delete_many.call({\n // listViewId, \n // uiSchema, \n // scopeId\n // })\n // `;\n // amisButtonsSchema.push({\n // type: 'button',\n // label: \"删除\",\n // className: `antd-Button antd-Button--default antd-Button--size-default`,\n // \"onEvent\": {\n // \"click\": {\n // \"actions\": [\n // {\n // \"actionType\": \"custom\",\n // \"script\": bulkDeleteScript\n // }\n // ]\n // }\n // }\n // });\n // }\n const reg = new RegExp('_', 'g');\n const standardIcon = icon && icon.replace(reg, '-');\n return {\n \"type\": \"grid\",\n \"columns\": [\n {\n \"body\": [\n {\n \"type\": \"grid\",\n \"columns\": [\n {\n \"body\": {\n \"type\": \"tpl\",\n \"className\": \"block\",\n \"tpl\": `<img class=\\\"slds-icon slds-icon_container slds-icon-standard-${standardIcon} slds-page-header__icon\\\" src=\\\"\\${context.rootUrl}/unpkg.com/@salesforce-ux/design-system/assets/icons/standard/${icon}.svg\\\" />`\n },\n \"md\": \"auto\",\n \"className\": \"\",\n \"columnClassName\": \"flex justify-center items-center\",\n \"valign\": \"middle\",\n },\n {\n \"body\": [\n {\n \"type\": \"tpl\",\n \"tpl\": `${label}`,\n \"inline\": false,\n \"wrapperComponent\": \"\",\n \"className\": \"text-md leading-none text-black\",\n },\n {\n \"type\": \"dropdown-button\",\n \"className\": \"\",\n \"label\": \"\\${uiSchema.list_views[listName].label}\",\n \"rightIcon\": \"fa fa-caret-down\",\n \"size\": \"sm\",\n \"hideCaret\": true,\n \"btnClassName\": \"!bg-transparent !border-none !hover:border-none text-lg h-5 font-bold p-0 text-black leading-none\",\n \"buttons\": listViewButtonOptions\n }\n ],\n \"md\": \"\",\n \"columnClassName\": \"p-l-xs\"\n }\n ],\n \"className\": \"flex justify-between\"\n }\n ],\n \"md\": \"auto\"\n },\n {\n \"body\": {\n \"type\": \"flex\",\n \"items\": amisButtonsSchema,\n },\n \"md\": \"auto\",\n \"valign\": \"middle\",\n }\n ],\n \"className\": \"flex justify-between\"\n }\n}\n\n/**\n * 列表视图顶部第二行amisSchema\n * @param {*} objectSchema 对象UISchema\n * @returns amisSchema\n */\nexport async function getObjectListHeaderSecordLine(objectSchema, listViewName, ctx) {\n const amisListViewId = `listview_${objectSchema.name}`;\n const fieldsFilterButtonSchema = await getObjectFieldsFilterButtonSchema(objectSchema);\n // const onFilterChangeScript = `\n // const eventData = event.data;\n // const uiSchema = eventData.uiSchema;\n // const listName = eventData.listName;\n // const listViewId = eventData.listViewId;\n // var selectedListView = uiSchema.list_views[listName]\n // var filter = eventData.filter;\n // SteedosUI.ListView.showFilter(uiSchema.name, {\n // listView: selectedListView,\n // data: {\n // filters: SteedosUI.ListView.getVisibleFilter(selectedListView, filter, { listViewId }),\n // },\n // onFilterChange: (filter) => {\n // doAction({\n // componentId: \\`service_listview_\\${uiSchema.name}\\`,\n // actionType: 'setValue',\n // \"args\": {\n // \"value\": {\n // filter: filter\n // }\n // }\n // });\n // doAction({\n // componentId: \\`listview_\\${uiSchema.name}\\`,\n // actionType: 'reload',\n // \"args\": {\n // filter: filter\n // }\n // });\n // }\n // });\n // `;\n let secordLineSchema = {\n \"type\": \"grid\",\n \"columns\": [\n {\n \"body\": [\n {\n \"type\": \"tpl\",\n \"tpl\": \"${$count} 个项目\",\n \"visibleOn\": \"this.$count >= 0\",\n \"inline\": false,\n \"wrapperComponent\": \"\",\n \"className\": \"leading-none\",\n \"style\": {\n \"fontFamily\": \"\",\n \"fontSize\": 14\n },\n \"id\": \"u:1661f8471235\"\n }\n ],\n \"md\": \"auto\",\n \"columnClassName\": \"flex items-center\"\n },\n {\n \"body\": [\n fieldsFilterButtonSchema,\n {\n \"type\": \"button\",\n \"label\": \"\",\n \"icon\": \"fa fa-refresh\",\n \"actionType\": \"reload\",\n \"target\": amisListViewId,\n \"className\": \"bg-white p-2 rounded border-gray-300 text-gray-500\"\n },\n // {\n // \"type\": \"button\",\n // \"label\": \"\",\n // \"icon\": \"fa fa-filter\",\n // \"actionType\": \"custom\",\n // \"className\": \"bg-transparent p-2 rounded border-gray-300 text-gray-500\",\n // \"id\": \"u:c20cb87d96c9\",\n // \"onEvent\": {\n // \"click\": {\n // \"actions\": [\n // {\n // \"actionType\": \"custom\",\n // \"script\": onFilterChangeScript\n // }\n // ],\n // \"weight\": 0\n // }\n // }\n // }\n ],\n \"md\": \"auto\"\n }\n ],\n \"className\": \"flex justify-between\"\n };\n return secordLineSchema;\n}\n\n\n/**\n * 列表视图顶部放大镜过滤条件栏amisSchema\n * @param {*} objectSchema 对象UISchema\n * @returns amisSchema\n */\nexport async function getObjectListHeaderFieldsFilterBar(objectSchema, listViewName, ctx) {\n const searchableFields = keys(objectSchema.fields);\n const fields = sortBy(\n compact(\n map(searchableFields, (fieldName) => {\n return objectSchema.fields[fieldName];\n })\n ),\n \"sort_no\"\n );\n const fieldsFilterBarSchema = await getObjectFieldsFilterBarSchema(objectSchema, fields, ctx);\n return fieldsFilterBarSchema;\n}\n\n/**\n * 列表视图顶部amisSchema\n * @param {*} objectSchema 对象UISchema\n * @returns amisSchema\n */\nexport async function getObjectListHeader(objectSchema, listViewName, ctx) {\n if (!ctx) {\n ctx = {};\n }\n let firstLineSchema = getObjectListHeaderFirstLine(objectSchema, listViewName, ctx);\n // let secordLineSchema = await getObjectListHeaderSecordLine(objectSchema, listViewName, ctx);\n // let body = [firstLineSchema, secordLineSchema];\n let body = [firstLineSchema];\n // let roundedCss = \"\";\n // if (ctx.onlyFirstLine) {\n // body = [firstLineSchema];\n // }\n // else if (ctx.onlySecordLine) {\n // // 列表视图自定义amisSchema时不能加圆角\n // roundedCss = \"\";\n // // body = [secordLineSchema];\n // }\n let headerSchema = [{\n \"type\": \"wrapper\",\n \"body\": body,\n \"className\": `bg-gray-100 sm:rounded-tl sm:rounded-tr p-4 -mb-4`\n }];\n // const fieldsFilterBarSchema = await getObjectListHeaderFieldsFilterBar(objectSchema, listViewName, ctx);\n // headerSchema.push(fieldsFilterBarSchema);\n return headerSchema;\n}\n\n/**\n * 记录详细界面顶部头amisSchema,也是标题面板组件的amisSchema\n * @param {*} objectSchema 对象UISchema\n * @param {*} recordId 记录id\n * @param {*} optioins: {showRecordTitle: true}\n * @returns amisSchema\n */\nexport async function getObjectRecordDetailHeader(objectSchema, recordId, options) {\n const { showRecordTitle = true } = options || {}\n // console.log('amis==>', objectSchema, recordId)\n const { name, label, icon, NAME_FIELD_KEY } = objectSchema;\n const buttons = getObjectDetailButtons(objectSchema, {});\n const moreButtons = getObjectDetailMoreButtons(objectSchema, {\n recordId: recordId,\n objectName: name\n })\n let amisButtonsSchema = map(buttons, (button) => {\n return {\n type: 'steedos-object-button',\n name: button.name,\n objectName: button.objectName,\n visibleOn: getButtonVisibleOn(button),\n className: `button_${button.name}`\n }\n })\n let dropdownButtons = map(moreButtons, (button) => {\n return {\n type: 'steedos-object-button',\n name: button.name,\n objectName: button.objectName,\n visibleOn: getButtonVisibleOn(button),\n }\n })\n const dropdownButtonsSchema = {\n type: \"steedos-dropdown-button\",\n label: \"\",\n buttons: dropdownButtons,\n className: 'slds-icon'\n }\n amisButtonsSchema.push(dropdownButtonsSchema);\n const reg = new RegExp('_', 'g');\n const standardIcon = icon && icon.replace(reg, '-');\n\n const gridBody = [];\n if(showRecordTitle){\n gridBody.push({\n \"body\": [\n {\n \"type\": \"grid\",\n \"columns\": [\n {\n \"body\": {\n \"type\": \"tpl\",\n \"className\": \"block\",\n \"tpl\": `<img class='slds-icon slds-icon_container slds-icon-standard-${standardIcon}' src='\\${context.rootUrl}/unpkg.com/@salesforce-ux/design-system/assets/icons/standard/${icon}.svg'>`\n },\n \"md\": \"auto\",\n \"className\": \"\",\n \"columnClassName\": \"flex justify-center items-center\"\n },\n {\n \"body\": [\n {\n \"type\": \"tpl\",\n \"tpl\": `${label}`,\n \"inline\": false,\n \"wrapperComponent\": \"\",\n \"className\": \"leading-4 text-md\"\n },\n {\n \"type\": \"tpl\",\n \"tpl\": \"${name}\",\n // \"tpl\": \"${(record && uiSchema && record[uiSchema.NAME_FIELD_KEY]) || name}\",\n \"inline\": false,\n \"wrapperComponent\": \"\",\n \"className\": \"leading-5 text-xl font-bold\"\n }\n ],\n \"columnClassName\": \"p-l-xs\"\n }\n ],\n \"className\": \"flex justify-between\"\n }\n ],\n \"md\": \"auto\",\n })\n };\n\n gridBody.push({\n \"body\": {\n \"type\": \"flex\",\n \"items\": amisButtonsSchema,\n },\n \"md\": \"auto\",\n \"hiddenOn\": \"${recordLoaded != true}\"\n })\n\n let body = [\n {\n \"type\": \"service\",\n \"body\": [\n {\n \"type\": \"wrapper\",\n \"className\": \"bg-gray-100 border-b sm:shadow sm:rounded sm:border border-slate-300 p-4\",\n \"body\": [\n {\n \"type\": \"grid\",\n \"columns\": gridBody,\n \"className\": \"flex justify-between\"\n }\n ],\n \"size\": \"xs\"\n }\n ],\n \"messages\": {},\n // \"hiddenOn\": \"${recordLoaded != true}\"\n }\n ];\n\n return {\n type: 'service',\n bodyClassName: '',\n name: `page`,\n data: { \"&\":\"$$\", objectName: name, _id: recordId, recordPermissions: objectSchema.permissions, uiSchema: objectSchema },\n body: body\n }\n\n}\n\n/**\n * 记录详细界面中相关表顶部头amisSchema\n * @param {*} relatedObjectSchema 相关对象UISchema\n * @returns amisSchema\n */\nexport async function getObjectRecordDetailRelatedListHeader(relatedObjectSchema, relatedLabel) {\n const { icon, label } = relatedObjectSchema;\n const buttons = await getObjectRelatedListButtons(relatedObjectSchema, {});\n let amisButtonsSchema = map(buttons, (button) => {\n return {\n type: 'steedos-object-button',\n name: button.name,\n objectName: button.objectName,\n visibleOn: getButtonVisibleOn(button),\n className: `button_${button.name}`\n }\n })\n const reg = new RegExp('_', 'g');\n const standardIcon = icon && icon.replace(reg, '-');\n const recordRelatedListHeader = {\n \"type\": \"wrapper\",\n \"body\": [\n {\n \"type\": \"grid\",\n \"valign\": \"middle\",\n \"columns\": [\n {\n \"body\": [\n {\n \"type\": \"grid\",\n \"valign\": \"middle\",\n \"className\": \"flex justify-between\",\n \"columns\": [\n {\n \"body\": {\n \"type\": \"tpl\",\n \"className\": \"block\",\n \"tpl\": `<img class=\\\"slds-icon_small slds-icon_container slds-icon-standard-${standardIcon}\\\" src=\\\"\\${context.rootUrl}/unpkg.com/@salesforce-ux/design-system/assets/icons/standard/${icon}.svg\\\" />`\n },\n \"md\": \"auto\",\n \"className\": \"\",\n \"columnClassName\": \"flex justify-center items-center\"\n },\n {\n \"body\": [\n {\n \"type\": \"tpl\",\n \"tpl\": `<a class=\"text-black text-base font-bold\" href=\"/app/\\${appId}/\\${masterObjectName}/\\${masterRecordId}/\\${objectName}/grid?related_field_name=\\${relatedKey}\">${relatedLabel}(\\${$count})</a>`,\n \"inline\": false,\n \"wrapperComponent\": \"\",\n \"className\": \"\",\n }\n ],\n \"md\": \"\",\n \"valign\": \"middle\",\n \"columnClassName\": \"p-l-xs\"\n }\n ]\n }\n ],\n \"md\": \"auto\"\n },\n {\n \"body\": {\n \"type\": \"flex\",\n \"items\": amisButtonsSchema,\n },\n \"md\": \"auto\"\n }\n ],\n \"className\": \"flex justify-between\"\n }\n ],\n \"className\": \"border-b border-gray-300 p-3\"\n };\n return recordRelatedListHeader;\n}\n\n/**\n * 点击记录详细界面相关表顶部标题进入的相关表页面的顶部amisSchema\n * @param {*} objectSchema \n * @param {*} recordId \n * @param {*} relatedObjectName \n * @returns amisSchema\n */\nexport async function getObjectRelatedListHeader(objectSchema, recordId, relatedObjectName) {\n}","import { getObjectListHeaderFieldsFilterBar } from './header';\n\nexport function getObjectHeaderToolbar(mainObject, formFactor){\n\n if(formFactor === 'SMALL'){\n return [\n // \"bulkActions\",\n {\n \"type\": \"tpl\",\n \"tpl\": \"${count} 个项目\"\n },\n {\n \"type\": \"reload\",\n \"align\": \"right\",\n \"className\": \"bg-white p-2 rounded border-gray-300 text-gray-500\"\n },\n ]\n }else{\n const onFieldsFilterToggleScript = `\n const scope = event.context.scoped;\n const filterForm = scope.getComponents().find(function(n){\n return n.props.type === \"form\";\n });\n const filterService = filterForm.context.getComponents().find(function(n){\n return n.props.type === \"service\";\n });\n filterService.setData({showFieldsFilter: !!!filterService.props.data.showFieldsFilter});\n `;\n return [\n // \"filter-toggler\",\n \"bulkActions\",\n {\n \"type\": \"columns-toggler\",\n \"className\": \"hidden\"\n },\n // {\n // \"type\": \"columns-toggler\",\n // \"className\": \"mr-2\"\n // },\n // {\n // \"type\": \"export-excel\",\n // \"align\": \"right\"\n // },\n {\n \"type\": \"tpl\",\n \"tpl\": \"${count} 个项目\"\n },\n {\n \"type\": \"reload\",\n \"align\": \"right\",\n \"className\": \"bg-white p-2 rounded border-gray-300 text-gray-500\"\n },\n {\n \"label\": \"\",\n \"icon\": \"fa fa-search\",\n \"type\": \"button\",\n \"align\": \"right\",\n \"className\": \"bg-white p-2 rounded border-gray-300 text-gray-500\",\n \"onEvent\": {\n \"click\": {\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": onFieldsFilterToggleScript\n }\n ]\n }\n }\n }\n // {\n // \"type\": \"search-box\",\n // \"align\": \"right\",\n // \"name\": \"__keywords\",\n // \"placeholder\": \"请输入关键字\",\n // \"mini\": true\n // },\n // {\n // \"type\": \"drag-toggler\",\n // \"align\": \"right\"\n // },\n // {\n // \"type\": \"pagination\",\n // \"align\": \"right\"\n // }\n ]\n }\n\n\n \n}\n\nexport function getObjectFooterToolbar(mainObject, formFactor) {\n if (formFactor === 'SMALL') {\n return [\n \"load-more\",\n ]\n }\n else {\n return [\n \"statistics\",\n // \"switch-per-page\",\n \"pagination\"\n ]\n }\n}\n\nexport async function getObjectFilter(objectSchema, fields, options) {\n const fieldsFilterBarSchema = await getObjectListHeaderFieldsFilterBar(objectSchema, null, options);\n return {\n \"title\": \"\",\n \"submitText\": \"\",\n \"className\": \"\",\n // \"debug\": true,\n \"mode\": \"normal\",\n \"wrapWithPanel\": false,\n \"body\": [\n fieldsFilterBarSchema\n ]\n }\n}\n","import { getAuthToken , getTenantId, getRootUrl, getSteedosAuth } from '../../steedos.client.js';\nimport { getReadonlyFormInitApi, getSaveApi, getEditFormInitApi, getBatchDelete } from './api';\nimport { getTableSchema, getTableApi } from './fields/table';\nimport { getFormBody } from './form';\nimport { getListSchema, getCardSchema } from './fields/list';\nimport _, { map } from 'lodash';\nimport { defaultsDeep } from '../../defaultsDeep';\nimport { getObjectHeaderToolbar, getObjectFooterToolbar, getObjectFilter } from './toolbar';\n\nfunction getBulkActions(objectSchema){\n return [\n {\n \"type\": \"button\",\n \"level\": \"danger\",\n \"label\": \"批量删除\",\n \"actionType\": \"ajax\",\n \"confirmText\": \"确定要删除吗\",\n \"className\": \"hidden\",\n \"id\": \"batchDelete\",\n \"api\": getBatchDelete(objectSchema.name),\n }\n // {\n // \"label\": \"批量修改\",\n // \"actionType\": \"dialog\",\n // \"dialog\": {\n // \"title\": \"批量编辑\",\n // \"name\": \"sample-bulk-edit\",\n // \"body\": {\n // \"type\": \"form\",\n // \"api\": \"https://3xsw4ap8wah59.cfc-execute.bj.baidubce.com/api/amis-mock/sample/bulkUpdate2\",\n // \"controls\": [\n // {\n // \"type\": \"hidden\",\n // \"name\": \"ids\"\n // },\n // {\n // \"type\": \"text\",\n // \"name\": \"name\",\n // \"label\": \"Name\"\n // }\n // ]\n // }\n // }\n // }\n ]\n}\n\nfunction getHeaderToolbar(mainObject, formFactor){\n\n if(formFactor === 'SMALL'){\n return [\n \"bulkActions\",\n {\n \"type\": \"reload\",\n \"align\": \"right\"\n },\n {\n \"type\": \"search-box\",\n \"align\": \"right\",\n \"name\": \"__keywords\",\n \"placeholder\": \"请输入关键字\",\n \"mini\": true\n }\n ]\n }else{\n return [\n \"filter-toggler\",\n \"bulkActions\",\n // {\n // \"type\": \"export-excel\",\n // \"align\": \"right\"\n // },\n // {\n // \"type\": \"reload\",\n // \"align\": \"right\"\n // },\n // {\n // \"type\": \"columns-toggler\",\n // \"align\": \"right\"\n // },\n {\n \"type\": \"search-box\",\n \"align\": \"right\",\n \"name\": \"__keywords\",\n \"placeholder\": \"请输入关键字\",\n \"mini\": true\n },\n // {\n // \"type\": \"drag-toggler\",\n // \"align\": \"right\"\n // },\n // {\n // \"type\": \"pagination\",\n // \"align\": \"right\"\n // }\n ]\n }\n\n\n \n}\n\nfunction getToolbar(){\n return [\n \n ]\n}\n\nfunction footerToolbar(){\n return [\n \"statistics\",\n // \"switch-per-page\",\n \"pagination\"\n ]\n}\n\nfunction getFilter(){\n return {\n \"title\": \"条件搜索\",\n \"submitText\": \"\",\n \"body\": [\n {\n \"type\": \"input-text\",\n \"name\": \"name\",\n \"placeholder\": \"合同名称\",\n \"addOn\": {\n \"label\": \"搜索\",\n \"type\": \"submit\"\n }\n }\n ]\n }\n}\n\nexport async function getObjectList(objectSchema, fields, options){\n const { top, perPage } = options;\n const nonpaged = objectSchema.paging && objectSchema.paging.enabled === false;\n const bulkActions = getBulkActions(objectSchema)\n\n const bodyProps = {\n toolbar: getToolbar(),\n bodyClassName: \"\",\n headerToolbar: getObjectHeaderToolbar(objectSchema, options.formFactor),\n headerToolbarClassName: \"px-4 py-2 border-gray-300 bg-gray-100 border-solid border-b\",\n footerToolbar: getObjectFooterToolbar(objectSchema, options.formFactor), \n className: `${options.className || \"\"}`\n }\n if(options.formFactor !== 'SMALL'){\n Object.assign(bodyProps, {\n filter: !!options.filterVisible && await getObjectFilter(objectSchema, fields, options),\n bulkActions: options.bulkActions != false ? bulkActions : false\n });\n }\n // yml里配置的不分页优先级最高,组件中输入的top次之。\n if(nonpaged){\n options.top = 1000;\n bodyProps.footerToolbar = [];\n }else if(top){\n bodyProps.footerToolbar = [];\n }\n let body = null;\n const id = `listview_${objectSchema.name}`;\n if(options.formFactor === 'SMALL' && false){\n delete bodyProps.bulkActions;\n delete bodyProps.headerToolbar;\n delete bodyProps.footerToolbar;\n const card = await getCardSchema(fields, Object.assign({idFieldName: objectSchema.idFieldName, labelFieldName: objectSchema.NAME_FIELD_KEY || 'name'}, options, {actions: false}));\n body = Object.assign({}, card , {\n type: 'crud', \n primaryField: '_id', \n id: id,\n name: id,\n keepItemSelectionOnPageChange: false, \n api: await getTableApi(objectSchema, fields, options),\n hiddenOn: options.tableHiddenOn,\n }, \n bodyProps\n );\n }else{\n const table = await getTableSchema(fields, Object.assign({idFieldName: objectSchema.idFieldName, labelFieldName: objectSchema.NAME_FIELD_KEY || 'name'}, options));\n delete table.mode;\n body = Object.assign({}, table, {\n type: 'crud', \n primaryField: '_id', \n affixHeader: false,\n id: id,\n name: id,\n keepItemSelectionOnPageChange: true, \n api: await getTableApi(objectSchema, fields, options),\n hiddenOn: options.tableHiddenOn,\n autoFillHeight: false,\n }, \n bodyProps,\n )\n }\n\n const defaults = options.defaults;\n if (defaults) {\n const listSchema = defaults.listSchema || {};\n body = defaultsDeep({}, listSchema, body);\n const headerSchema = defaults.headerSchema;\n const footerSchema = defaults.footerSchema;\n if (headerSchema || footerSchema) {\n let wrappedBody = [body];\n if (headerSchema) {\n if(_.isArray(headerSchema)){\n wrappedBody = _.union(headerSchema,wrappedBody);\n }\n else{\n wrappedBody.unshift(headerSchema);\n }\n }\n if (footerSchema) {\n if(_.isArray(footerSchema)){\n wrappedBody = _.union(wrappedBody,footerSchema);\n }\n else{\n wrappedBody.push(footerSchema);\n }\n }\n body = wrappedBody;\n }\n }\n\n // TODO: data应该只留loaded,其他属性都改为从上层传递下来\n return {\n type: 'service',\n className: '',\n id: `service_${id}`,\n name: `page`,\n data: {\n \"$master\": '$$',\n objectName: objectSchema.name,\n _id: null,\n recordPermissions: objectSchema.permissions,\n uiSchema: objectSchema,\n loaded: false //crud接收适配器中设置为true,否则就是刷新浏览器第一次加载\n },\n body: body\n }\n}\n\nconst getGlobalData = (mode)=>{\n const user = getSteedosAuth();\n return {mode: mode, user: user, spaceId: user.spaceId, userId: user.userId}\n}\n\nexport async function getObjectForm(objectSchema, ctx){\n const { recordId, formFactor, layout = formFactor === 'SMALL' ? 'normal' : \"normal\", labelAlign, tabId, appId, defaults } = ctx;\n const fields = _.values(objectSchema.fields);\n const formSchema = defaults && defaults.formSchema || {};\n const onSubmitSuccCustomScript = `\n const { recordId, listViewId } = context.props.data;\n const data = event.data;\n const appId = data.appId;\n const objectName = data.objectName;\n // 在记录详细界面时isRecordDetail为true\n // TODO: isRecordDetail这个判断需要优化\n const isRecordDetail = !!data.$master && data.$master.$master?.recordId;\n if(recordId){\n // 编辑记录时,刷新主表单\n doAction({\n componentId: \\`detail_\\${recordId}\\`,\n actionType: \"reload\",\n expression: \\`!\\${listViewId}\\`\n });\n }\n else if(!isRecordDetail){\n // 在列表视图界面新建记录时跳转到详细页面\n const listName = event.data.listName;\n const uiSchema = event.data.uiSchema;\n const listView = uiSchema && uiSchema.list_views[listName];\n const newRecordId = data.result.data?.recordId;\n doAction({\n \"args\": {\n \"url\": \"/app/\" + appId + \"/\" + objectName + \"/view/\" + newRecordId,\n \"blank\": false\n },\n \"actionType\": \"link\"\n });\n }\n `;\n const amisSchema = {\n type: 'service',\n className: 'p-0',\n name: `page_edit_${recordId}`,\n api: await getEditFormInitApi(objectSchema, recordId, fields),\n // data: {global: getGlobalData('edit'), recordId: recordId, objectName: objectSchema.name, context: {rootUrl: getRootUrl(), tenantId: getTenantId(), authToken: getAuthToken()}},\n initApi: null,\n initFetch: null ,\n body: [defaultsDeep({}, formSchema, {\n type: \"form\",\n mode: layout,\n labelAlign,\n persistData: false,\n promptPageLeave: true,\n name: `form_edit_${recordId}`,\n debug: false,\n title: \"\",\n submitText: \"\", // amis 表单不显示提交按钮, 表单提交由项目代码接管\n api: await getSaveApi(objectSchema, recordId, fields, {}),\n initFetch: recordId != 'new',\n body: await getFormBody(fields, objectSchema, ctx),\n panelClassName:'m-0 sm:rounded-lg shadow-none',\n bodyClassName: 'p-0',\n className: 'steedos-amis-form',\n onEvent: {\n \"submitSucc\": {\n \"weight\": 0,\n \"actions\": [\n {\n \"componentId\": `steedos-record-related-list-${objectSchema.name}`,\n \"actionType\": \"setValue\",\n \"args\": {\n value: {\n \"$count\": undefined,\n }\n }\n },\n {\n \"componentId\": `listview_${objectSchema.name}`,\n \"actionType\": \"reload\",\n \"expression\": \"!!listViewId\"\n },\n {\n \"actionType\": \"custom\",\n \"script\": onSubmitSuccCustomScript\n }\n ]\n }\n }\n })]\n };\n if(formSchema.id){\n amisSchema.id = `service-${formSchema.id}`;\n }\n return amisSchema;\n}\n\nexport async function getObjectDetail(objectSchema, recordId, ctx){\n const { formFactor, layout = formFactor === 'SMALL' ? 'normal' : \"normal\", labelAlign, formInitProps } = ctx;\n const fields = _.values(objectSchema.fields);\n return {\n type: 'service',\n name: `page_readonly_${recordId}`,\n id: `detail_${recordId}`,\n data: {global: getGlobalData('read'), context: {rootUrl: getRootUrl(), tenantId: getTenantId(), authToken: getAuthToken()}},\n api: await getReadonlyFormInitApi(objectSchema, recordId, fields, formInitProps),\n body: [\n {\n type: \"form\",\n mode: layout,\n labelAlign,\n persistData: false,\n promptPageLeave: false,\n name: `form_readonly_${recordId}`,\n debug: false,\n title: \"\",\n data: {\n \"formData\": \"$$\"\n },\n wrapWithPanel: false, \n body: await getFormBody(map(fields, (field)=>{field.readonly = true; return field;}), objectSchema, Object.assign({}, ctx, {showSystemFields: true})),\n className: 'steedos-amis-form bg-white',\n actions: [], // 不显示表单默认的提交按钮\n hiddenOn: \"${recordLoaded != true}\"\n }\n ],\n onEvent: {\n \"fetchInited\": {\n \"weight\": 0,\n \"actions\": [\n {\n actionType: 'broadcast',\n eventName: \"recordLoaded\",\n args: {\n eventName: \"recordLoaded\"\n },\n data: {\n record: \"${event.data}\"\n }\n },\n {\n \"actionType\": \"setValue\",\n \"args\": {\n value: {\n \"recordLoaded\": true,\n }\n }\n }\n ]\n }\n }\n }\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-10-28 14:52:55\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-10-28 14:53:02\n * @Description: \n */\nimport * as _ from 'lodash';\n\nconst AmisFormInputs = [\n 'text',\n 'date',\n 'file',\n \"avatar\",\n 'image',\n 'datetime',\n 'time',\n 'number',\n 'currency',\n 'percent',\n 'password',\n 'url',\n 'email'\n]\n\nexport function getAmisStaticFieldType(type, readonly, options){\n if(!readonly){\n if(_.includes(AmisFormInputs, type)){\n return `input-${type}`;\n }\n return type;\n }\n if(_.includes(['text','image'], type)){\n if('image' === type && options && options.multiple){\n return `static-images`;\n }\n return `static-${type}`;\n }else{\n return 'static';\n }\n};","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-10-28 14:15:09\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-11-02 18:06:16\n * @Description: \n */\nimport { getAmisStaticFieldType } from './type';\n\nconst getFileTableName = (steedosField)=>{\n switch (steedosField.type ) {\n case 'avatar':\n return 'avatars'\n case 'image':\n return 'images'\n case 'file':\n return 'files'\n default:\n break;\n }\n};\n\nconst getAmisFieldType = (steedosField, readonly)=>{\n return getAmisStaticFieldType(steedosField.type === 'avatar' ? 'image' : steedosField.type, readonly, {multiple: steedosField.multiple});\n}\n\nexport const getAmisFileReadonlySchema = (steedosField)=>{\n const type = steedosField.type;\n const amisFieldType = getAmisFieldType(steedosField, true)\n if(_.includes(['avatar','image'], type)){\n return {\n type: amisFieldType,\n defaultImage: '',\n enlargeAble: true,\n showToolbar: true,\n }\n }\n if(type === 'file'){\n return {\n type: amisFieldType,\n tpl: `\n <% let fileData = data.${steedosField.name}; if (fileData) { %>\n <% if(!Array.isArray(fileData)){ fileData = [fileData]} %>\n <% fileData.forEach(function(item) { %> \n <a href='<%= item.url %>' target='_self' class='block'><%= item.name %></a> \n <% });} %>`\n }\n }\n}\n\nexport const getAmisFileEditSchema = (steedosField)=>{\n const tableName = getFileTableName(steedosField);\n const amisFieldType = getAmisFieldType(steedosField, false)\n let convertData = {\n type: amisFieldType,\n useChunk: false, // 关闭分块上传\n receiver: {\n method: \"post\",\n url: `\\${context.rootUrl}/s3/${tableName}`,\n data: {\n $: \"$$\",\n context: `\\${context}`,\n },\n adaptor: `\n const { context } = api.body; \n var rootUrl = context.rootUrl + \"/api/files/${tableName}/\";\n payload = {\n status: response.status == 200 ? 0 : response.status,\n msg: response.statusText,\n data: {\n value: payload._id,\n name: payload.original.name,\n url: rootUrl + payload._id,\n }\n }\n return payload;\n `,\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n }\n \n if(steedosField.multiple){\n convertData.multiple = true;\n convertData.joinValues = false;\n convertData.extractValue = true;\n }\n return convertData;\n}\n\nexport const getAmisFileSchema = (steedosField, readonly)=>{\n return readonly ? getAmisFileReadonlySchema(steedosField) : getAmisFileEditSchema(steedosField);\n}","import * as _ from 'lodash'\nimport * as Tpl from '../tpl';\nimport * as Fields from '../index';\nimport * as graphql from '../graphql';\nimport config from '../../../../config'\nimport { each, forEach, isBoolean, isEmpty } from 'lodash';\nimport { getAmisFileReadonlySchema } from './file'\n\nfunction getOperation(fields){\n const controls = [];\n _.each(fields, function(field){\n controls.push(Fields.convertSFieldToAmisField(field, true));\n })\n return {\n \"type\": \"operation\",\n \"label\": \"操作\",\n \"width\": 100,\n fixed: \"right\",\n \"buttons\": [\n {\n \"type\": \"button\",\n \"icon\": \"fa fa-eye\",\n \"actionType\": \"dialog\",\n \"tooltip\": \"查看\",\n \"dialog\": {\n \"title\": \"查看\",\n \"body\": {\n \"type\": \"form\",\n \"controls\": controls\n }\n }\n }]\n }\n}\n\n//获取name字段,如果没有,则_index字段添加链接\nfunction getDetailColumn(){}\n\nasync function getTableColumns(fields, options){\n const columns = [{name: '_index',type: 'text', width: 32, placeholder: \"\"}];\n for (const field of fields) {\n if((field.is_name || field.name === options.labelFieldName) && options.objectName === 'cms_files'){\n columns.push({\n \"type\": \"button\",\n className:\"whitespace-nowrap\",\n \"label\": `<%=data.versions ? data.name : \"${field.label}\"%>`,\n \"type\": \"button\",\n \"actionType\": \"ajax\",\n \"api\": {\n \"url\": \"${context.rootUrl}/api/files/files/${versions[0]}?download=true\",\n \"method\": \"get\",\n \"headers\": {\n \"Authorization\": \"Bearer ${context.tenantId},${context.authToken}\"\n },\n \"responseType\": \"blob\",\n \"dataType\": \"form-data\"\n },\n \"id\": \"u:6c8291d1029f\",\n \"level\": \"link\"\n })\n }else if(field.type === 'toggle'){\n columns.push({\n type: \"switch\",\n name: field.name,\n label: field.label,\n width: field.width,\n toggled: field.toggled,\n disabled: true,\n className:\"whitespace-nowrap\",\n })\n }else if(field.type === 'avatar' || field.type === 'image' || field.type === 'file'){\n columns.push({\n type: \"switch\",\n name: field.name,\n label: field.label,\n width: field.width,\n toggled: field.toggled,\n disabled: true,\n className:\"whitespace-nowrap\",\n ...getAmisFileReadonlySchema(field)\n })\n }\n \n else{\n const tpl = await Tpl.getFieldTpl(field, options);\n\n let type = 'text';\n if(tpl){\n type = 'tpl';\n }else if(field.type === 'html'){\n type = 'markdown';\n }\n if(!field.hidden && !field.extra){\n columns.push({\n name: field.name,\n label: field.label,\n sortable: field.sortable,\n // searchable: field.searchable,\n width: field.width,\n type: type,\n tpl: tpl,\n toggled: field.toggled,\n className: field.type === 'textarea' ? 'min-w-56 whitespace-pre-wrap textarea' : \"whitespace-nowrap\",\n html: field.type === 'html' ? true : null\n // toggled: true \n })\n }\n }\n \n };\n\n // columns.push(getOperation(fields));\n\n return columns;\n}\n\n/**\n * 生成移动端列表每行显示的amis行\n * @param {*} tpls 要显示的每个字段的tpl\n * @returns {\n \"type\": \"wrapper\",\n \"body\": [{\n \"type\": \"tpl\",\n \"tpl\": tpls[index].tpl,\n \"className\": \"truncate\"//左侧样式类\n },{\n \"type\": \"tpl\",\n \"tpl\": tpls[index + 1].tpl,\n \"className\": \"truncate ml-2 flex flex-shrink-0\"//右侧样式类\n }],\n \"size\": \"none\",\n \"className\": \"flex items-center justify-between\"//每行样式类\n }\n */\nfunction getMobileLines(tpls){\n let lines = [];\n let maxLineCount = 2;\n let lineChildren = [];\n let isNewLine = false;\n let isLeft = true;\n let lineChildrenClassName = \"\";\n let lineClassName = \"flex items-center justify-between\";\n tpls.forEach(function(item){\n if(isNewLine && lines.length < maxLineCount){\n lines.push({\n \"type\": \"wrapper\",\n \"body\": lineChildren,\n \"size\": \"none\",\n \"className\": lineClassName\n });\n lineChildren = [];\n }\n if(isLeft){\n // 左侧半行\n lineChildrenClassName = \"steedos-listview-item-left truncate\";\n if(item.field.is_wide){\n // 左侧全行样式可以单独写\n lineChildrenClassName = \"steedos-listview-item-wide truncate\";\n }\n }\n else{\n // 右侧半行\n lineChildrenClassName = \"steedos-listview-item-right truncate ml-2 flex flex-shrink-0\";\n }\n lineChildren.push({\n \"type\": \"tpl\",\n \"tpl\": item.tpl,\n \"className\": lineChildrenClassName\n });\n\n if(item.field.is_wide){\n // 宽字段占整行\n isLeft = true;\n isNewLine = true;\n }\n else{\n isLeft = !isLeft;\n isNewLine = isLeft;\n }\n });\n \n if(lineChildren.length && lines.length < maxLineCount){\n lines.push({\n \"type\": \"wrapper\",\n \"body\": lineChildren,\n \"size\": \"none\",\n \"className\": lineClassName\n });\n }\n \n return lines;\n}\n\nasync function getMobileTableColumns(fields, options){\n const columns = [];\n let nameField = {};\n let tpls = [];\n for (const field of fields) {\n let tpl = \"\";\n if(field.is_name || field.name === options.labelFieldName){\n nameField = field;\n options.onlyDisplayLabel = true;\n tpl = await Tpl.getFieldTpl(field, options);\n }\n else if(field.type === 'avatar' || field.type === 'image' || field.type === 'file'){\n // 图片和附件类型字段暂时显示为附件名称,后续需要再优化\n tpl = `\\${_display.${field.name}.name}`;\n }\n else{\n if(field.type === 'lookup' || field.type === 'master_detail'){\n options.onlyDisplayLabel = true;\n }\n tpl = await Tpl.getFieldTpl(field, options);\n }\n if(!tpl){\n tpl = `\\${${field.name}}`;\n }\n if(!field.hidden && !field.extra){\n tpls.push({ field, tpl });\n }\n };\n\n const url = Tpl.getNameTplUrl(nameField, options)\n\n const columnLines = getMobileLines(tpls);\n \n columns.push({\n name: nameField.name,\n label: nameField.label,\n sortable: nameField.sortable,\n type: \"button\",\n level: \"link\",\n actionType: \"link\",\n link: url,\n innerClassName: \"steedos-listview-item block hover:bg-gray-50 text-gray-500\",\n body:{\n \"type\": \"wrapper\",\n \"body\": columnLines,\n \"size\": \"none\",\n \"className\": \"p-2\"\n }\n });\n\n return columns;\n}\n\nfunction getDefaultParams(options){\n return {\n perPage: options.top || options.perPage || config.listView.perPage\n }\n}\n\nfunction getButtonVisibleOn(button){\n let visible= button.visible;\n\n if(button._visible){\n visible = button._visible;\n }\n\n if(isBoolean(visible)){\n visible = visible.toString();\n }\n\n if(visible){\n // if(visible.indexOf(\"Meteor.\") > 0 || visible.indexOf(\"Creator.\") > 0 || visible.indexOf(\"Session.\") > 0){\n // console.warn('无效的visible', visible)\n // return 'false';\n // }\n if(visible.trim().startsWith('function')){\n return `${visible}(objectName, _id, recordPermissions, data)`\n }\n return visible;\n }\n\n if(button.type === 'amis_button'){\n const amisSchema = button.amis_schema;\n if(amisSchema && amisSchema.body && amisSchema.body.length > 0){\n const btn1 = amisSchema.body[0];\n return btn1.visibleOn\n }\n }\n}\n\nasync function getTableOperation(ctx){\n const buttons = ctx.buttons;\n const operationButtons = [];\n each(buttons, (button)=>{\n if(isBoolean(button.visible)){\n button.visible = button.visible.toString();\n }\n // operationButtons.push({\n // type: 'button',\n // label: button.label,\n // visibleOn: button.visible ? `${button.visible}` : (button._visible ? `${button._visible}` : null),\n // onEvent: {\n // click: {\n // actions: []\n // }\n // }\n // })\n\n operationButtons.push({\n type: 'steedos-object-button',\n name: button.name,\n objectName: button.objectName,\n visibleOn: getButtonVisibleOn(button),\n className: 'antd-Button--default'\n })\n })\n if(operationButtons.length < 1){\n return ;\n }\n return {\n type: 'operation',\n label: '操作',\n fixed: 'right',\n labelClassName: 'text-center',\n className: 'text-center steedos-listview-operation w-20',\n buttons: [\n {\n \"type\": \"steedos-dropdown-button\",\n \"label\": \"xxx\",\n \"buttons\": operationButtons,\n \"placement\": \"bottomRight\",\n \"overlayClassName\": \"shadow !min-w-[160px]\",\n \"trigger\": [\"click\"],\n \"id\": \"u:c2140a365019\",\n onOpenApi: {\n url: `\\${context.rootUrl}/service/api/@\\${objectName}/recordPermissions/\\${_id}`,\n method: \"get\",\n data: {\n $: \"$$\",\n objectName: \"${objectName}\",\n listViewId: \"${listViewId}\",\n appId: \"${appId}\",\n formFactor: \"${formFactor}\",\n context: `\\${context}`\n },\n \"responseData\": {\n \"recordPermissions\": \"$$\"\n },\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n },\n adaptor: `\n payload.recordPermissions = payload;\n return payload;\n `,\n }\n }\n ]\n }\n}\n\nexport async function getTableSchema(fields, options){\n if(!options){\n options = {};\n }\n let columns = [];\n if(options.formFactor === 'SMALL'){\n columns = await getMobileTableColumns(fields, options);\n }\n else{\n columns = await getTableColumns(fields, options);\n columns.push(await getTableOperation(options));\n }\n return {\n mode: \"table\",\n name: \"thelist\",\n headerToolbarClassName: \"py-2 px-2 border-gray-300 bg-gray-100 border-solid border-b\",\n className: \"\",\n draggable: false,\n defaultParams: getDefaultParams(options),\n columns: columns,\n syncLocation: false,\n keepItemSelectionOnPageChange: true,\n checkOnItemClick: false,\n labelTpl: `\\${${options.labelFieldName}}`,\n autoFillHeight: false, // 自动高度效果不理想,先关闭\n }\n}\n\n\n\n/**\n * \n * @param {*} mainObject \n * @param {*} fields \n * @param {*} options = {globalFilter: 相关字表过滤条件, filter: listview 过滤条件, ...}\n * @returns \n */\nexport async function getTableApi(mainObject, fields, options){\n const searchableFields = [];\n let { globalFilter, filter, filtersFunction, sort, top, setDataToComponentId = '' } = options;\n\n if(_.isArray(filter)){\n filter = _.map(filter, function(item){\n if(item.operation){\n return [item.field, item.operation, item.value];\n }else{\n return item\n }\n })\n }\n if(!filter){\n filter = [];\n }\n // gloablFilter: 是定义为相关子表的过滤条件, filter 是列表视图自带的过滤条件。\n let baseFilters = null;\n if(!isEmpty(globalFilter) && !isEmpty(filter)){\n baseFilters = [globalFilter, 'and', filter]\n }else if(globalFilter){\n baseFilters = globalFilter;\n }else if(filter){\n baseFilters = filter;\n }\n _.each(fields,function(field){\n if(field.searchable){\n searchableFields.push(field.name);\n }\n })\n\n const fileFields = {};\n const fileFieldsKeys = [];\n fields.forEach((item)=>{\n if(_.includes(['image','avatar','file'], item.type)){\n fileFieldsKeys.push(item.name);\n fileFields[item.name] = {\n name: item.name,\n type: item.type,\n multiple: item.multiple\n };\n }\n })\n\n let valueField = mainObject.key_field || '_id';\n const api = await getApi(mainObject, null, fields, {alias: 'rows', limit: top, queryOptions: `filters: {__filters}, top: {__top}, skip: {__skip}, sort: \"{__sort}\"`});\n api.data.$term = \"$term\";\n api.data.$self = \"$$\";\n api.data.filter = \"$filter\"\n api.data.loaded = \"${loaded}\";\n api.data.listViewId = \"${listViewId}\";\n api.requestAdaptor = `\n let selfData = JSON.parse(JSON.stringify(api.data.$self));\n try{\n // TODO: 不应该直接在这里取localStorage,应该从外面传入\n const listViewId = api.data.listViewId;\n const listViewPropsStoreKey = location.pathname + \"/crud/\" + listViewId ;\n let localListViewProps = localStorage.getItem(listViewPropsStoreKey);\n if(localListViewProps){\n localListViewProps = JSON.parse(localListViewProps);\n selfData = Object.assign({}, localListViewProps, selfData);\n if(!api.data.filter){\n api.data.filter = localListViewProps.filter;\n }\n if(!api.data.loaded){\n // 第一次加载组件,比如刷新浏览器时因为api.data.pageNo有默认值1\n // 所以会把localSearchableFilter中已经存过的页码覆盖\n // 如果是第一次加载组件始终让翻页页码从本地存储中取值\n let formFactor = \"${options.formFactor}\";\n // 移动端不识别本地存储中的翻页页码,否则点击加载更多按钮后无法刷新回第一页\n api.data.pageNo = formFactor === \"SMALL\" ? 1 : (localListViewProps.page || 1);\n }\n }\n }\n catch(ex){\n console.error(\"本地存储中crud参数解析异常:\", ex);\n }\n ${baseFilters ? `var systemFilters = ${JSON.stringify(baseFilters)};` : 'var systemFilters = [];'}\n const filtersFunction = ${filtersFunction};\n if(filtersFunction){\n const _filters = filtersFunction(systemFilters, selfData);\n if(_filters && _filters.length > 0){\n if(_.isEmpty(systemFilters)){\n systemFilters = _filters || [];\n }else{\n systemFilters = [systemFilters, 'and', _filters];\n }\n }\n }\n let userFilters =[];\n \n if(_.isEmpty(systemFilters)){\n systemFilters = api.data.filter || [];\n }else{\n if(!_.isEmpty(api.data.filter)){\n systemFilters = [systemFilters, 'and', api.data.filter];\n }\n }\n var pageSize = api.data.pageSize || 10;\n var pageNo = api.data.pageNo || 1;\n var skip = (pageNo - 1) * pageSize;\n var orderBy = api.data.orderBy || '';\n var orderDir = api.data.orderDir || '';\n var sort = orderBy + ' ' + orderDir;\n sort = orderBy ? sort : \"${sort}\";\n var allowSearchFields = ${JSON.stringify(searchableFields)};\n if(api.data.$term){\n userFilters = [[\"name\", \"contains\", \"'+ api.data.$term +'\"]];\n }else if(selfData.op === 'loadOptions' && selfData.value){\n userFilters = [[\"${valueField.name}\", \"=\", selfData.value]];\n }\n var searchableFilter = [];\n _.each(selfData, (value, key)=>{\n if(!_.isEmpty(value) || _.isBoolean(value)){\n if(_.startsWith(key, '__searchable__between__')){\n searchableFilter.push([\\`\\${key.replace(\"__searchable__between__\", \"\")}\\`, \"between\", value])\n }else if(_.startsWith(key, '__searchable__')){\n if(_.isString(value)){\n searchableFilter.push([\\`\\${key.replace(\"__searchable__\", \"\")}\\`, \"contains\", value])\n }else{\n searchableFilter.push([\\`\\${key.replace(\"__searchable__\", \"\")}\\`, \"=\", value])\n }\n }\n }\n });\n\n if(searchableFilter.length > 0){\n if(userFilters.length > 0 ){\n userFilters = [userFilters, 'and', searchableFilter];\n }else{\n userFilters = searchableFilter;\n }\n }\n\n if(allowSearchFields){\n allowSearchFields.forEach(function(key){\n const keyValue = selfData[key];\n if(_.isString(keyValue)){\n userFilters.push([key, \"contains\", keyValue]);\n }else if(_.isArray(keyValue) || _.isBoolean(keyValue) || keyValue){\n userFilters.push([key, \"=\", keyValue]);\n }\n })\n }\n\n if(selfData.__keywords && allowSearchFields){\n const keywordsFilters = [];\n allowSearchFields.forEach(function(key, index){\n const keyValue = selfData.__keywords;\n if(keyValue){\n keywordsFilters.push([key, \"contains\", keyValue]);\n if(index < allowSearchFields.length - 1){\n keywordsFilters.push('or');\n }\n }\n })\n userFilters.push(keywordsFilters);\n };\n\n let filters = [];\n\n if(!_.isEmpty(systemFilters)){\n filters = systemFilters;\n }\n\n if(!_.isEmpty(userFilters)){\n if(_.isEmpty(filters)){\n filters = userFilters;\n }else{\n filters.push('and');\n filters.push(userFilters)\n }\n }\n api.data = {\n query: api.data.query.replace(/{__filters}/g, JSON.stringify(filters)).replace('{__top}', pageSize).replace('{__skip}', skip).replace('{__sort}', sort.trim())\n }\n return api;\n `\n api.adaptor = `\n const enable_tree = ${mainObject.enable_tree};\n if(!enable_tree){\n _.each(payload.data.rows, function(item, index){\n const {pageNo, pageSize} = api.body;\n const skip = (pageNo - 1) * pageSize;\n item._index = skip + index + 1;\n })\n }\n window.postMessage(Object.assign({type: \"listview.loaded\"}), \"*\");\n let fileFields = ${JSON.stringify(fileFields)};\n _.each(payload.data.rows, function(item, index){\n _.each(fileFields , (field, key)=>{\n if(item[key] && item._display && item._display [key]){\n let value = item._display[key];\n if(!_.isArray(value)){\n value = [value]\n };\n if(field.type === 'file'){\n item[key] = value\n }else{\n item[key] = _.map(value, 'url')\n }\n }\n })\n })\n \n if(enable_tree){\n const records = payload.data.rows;\n const treeRecords = [];\n const getChildren = (records, childrenIds)=>{\n if(!childrenIds){\n return;\n }\n const children = _.filter(records, (record)=>{\n return _.includes(childrenIds, record._id)\n });\n _.each(children, (item)=>{\n if(item.children){\n item.children = getChildren(records, item.children)\n }\n })\n return children;\n }\n\n _.each(records, (record)=>{\n if(!record.parent){\n treeRecords.push(Object.assign({}, record, {children: getChildren(records, record.children)}));\n }\n });\n payload.data.rows = treeRecords;\n }\n\n\n try{\n // TODO: 不应该直接在这里取localStorage,应该从外面传入\n const listViewId = api.body.listViewId;\n const listViewPropsStoreKey = location.pathname + \"/crud/\" + listViewId ;\n /**\n * localListViewProps规范来自crud请求api中api.data.$self参数值的。\n * 比如:{\"perPage\":20,\"page\":1,\"__searchable__name\":\"7\",\"__searchable__between__n1__c\":[null,null],\"filter\":[[\"name\",\"contains\",\"a\"]]}\n * __searchable__...:顶部放大镜搜索条件\n * filter:右侧过滤器\n * perPage:每页条数\n * page:当前页码\n * orderBy:排序字段\n * orderDir:排序方向\n */\n let localListViewProps = localStorage.getItem(listViewPropsStoreKey);\n let selfData = JSON.parse(JSON.stringify(api.body.$self));\n if(localListViewProps){\n localListViewProps = JSON.parse(localListViewProps);\n selfData = Object.assign({}, localListViewProps, selfData, { filter: api.body.filter });\n if(!api.body.loaded){\n // 第一次加载组件,比如刷新浏览器时因为api.data.pageNo有默认值1\n // 所以会把localSearchableFilter中已经存过的页码覆盖\n // 如果是第一次加载组件始终让翻页页码从本地存储中取值\n selfData.page = localListViewProps.page || 1;\n }\n }\n delete selfData.context;\n delete selfData.global;\n localStorage.setItem(listViewPropsStoreKey, JSON.stringify(selfData));\n // 返回页码到UI界面\n payload.data.page= selfData.page;\n }\n catch(ex){\n console.error(\"本地存储中crud参数解析异常:\", ex);\n }\n // 标记加载过,后续优先从本地存储中加载相关参数\n payload.data.loaded= true;\n\n const setDataToComponentId = \"${setDataToComponentId}\";\n if(setDataToComponentId){\n SteedosUI.getRef(api.body.$self.scopeId)?.getComponentById(setDataToComponentId)?.setData({$count: payload.data.count})\n }\n\n return payload;\n `;\n return api;\n}\n\nexport async function getApi(object, recordId, fields, options){\n const data = await graphql.getFindQuery(object, recordId, fields, options);\n return {\n method: \"post\",\n url: graphql.getApi(),\n data: data,\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n}\n\nexport function getRecordPermissionsApi(object, recordId, options){\n const data = graphql.getRecordPermissionsQuery(object, recordId, options);\n return {\n method: \"post\",\n url: graphql.getApi(),\n data: data,\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n}","import * as graphql from '../graphql';\nimport * as Field from './index';\nimport * as Tpl from '../tpl';\nimport * as _ from 'lodash';\nimport { getUISchema, getListViewSort } from '../../../objects';\n\nconst refUsersObjectName = \"space_users\";\nconst refOrgsObjectName = \"organizations\";\n\nasync function getSource(field, ctx) {\n // data.query 最终格式 \"{ \\tleftOptions:organizations(filters: {__filters}){value:_id,label:name,children}, children:organizations(filters: {__filters}){ref:_id,children}, defaultValueOptions:space_users(filters: {__options_filters}){user,name} }\"\n const data = await graphql.getFindQuery({ name: refOrgsObjectName }, null, [{ name: \"_id\", alias: \"value\" }, { name: \"name\", alias: \"label\" }, { name: \"children\" }], {\n alias: \"leftOptions\",\n filters: \"{__filters}\"\n });\n data.query = data.query.replace(/,count\\:.+/, \"}\");\n const childrenData = await graphql.getFindQuery({ name: refOrgsObjectName }, null, [{ name: \"_id\", alias: \"ref\" }], {\n alias: \"children\",\n filters: \"{__filters}\"\n });\n childrenData.query = childrenData.query.replace(/,count\\:.+/, \"}\");\n data.query = data.query.replace(/}$/, \",\" + childrenData.query.replace(/{(.+)}/, \"$1}\"));\n const defaultValueOptionsData = await graphql.getFindQuery({ name: refUsersObjectName }, null, [{ name: \"user\" }, { name: \"name\" }], {\n alias: \"defaultValueOptions\",\n filters: \"{__options_filters}\"\n });\n defaultValueOptionsData.query = defaultValueOptionsData.query.replace(/,count\\:.+/, \"}\");\n data.query = data.query.replace(/}$/, \",\" + defaultValueOptionsData.query.replace(/{(.+)}/, \"$1}\"))\n let valueField = `${field.name}`;\n if(ctx.fieldNamePrefix){\n valueField = `${ctx.fieldNamePrefix}${field.name}`;\n }\n data.$value = `$${valueField}`;\n data.__selectUserLoaded__ = \"${__selectUserLoaded__}\";\n // data[\"&\"] = \"$$\";\n const requestAdaptor = `\n console.log(\"select user field '${field.name}' requestAdaptor api:\", api);\n var filters = [['parent', '=', null]];\n api.data.query = api.data.query.replace(/{__filters}/g, JSON.stringify(filters));\n var defaultValue = api.data.$value;\n var optionsFiltersOp = \"${field.multiple ? \"in\" : \"=\"}\";\n var optionsFilters = [[\"user\", optionsFiltersOp, []]];\n if (defaultValue) { \n optionsFilters = [[\"user\", optionsFiltersOp, defaultValue]];\n }\n api.data.query = api.data.query.replace(/{__options_filters}/g, JSON.stringify(optionsFilters));\n return api;\n `;\n const adaptor = `\n const data = payload.data;\n data.children = data.children.map(function (child) { \n // child.defer = !!(child.children && child.children.length);\n child.defer = true;\n delete child.children;\n return child;\n });\n data.leftOptions = data.leftOptions.map(function (leftOption) {\n leftOption.defer = !!(leftOption.children && leftOption.children.length);\n delete leftOption.children;\n return leftOption;\n });\n var defaultValueOptions = data.defaultValueOptions;\n data.children = _.union(data.children, defaultValueOptions);\n delete data.defaultValueOptions;\n payload.data = { options: [data] };\n return payload;\n `;\n return {\n \"method\": \"post\",\n // \"url\": graphql.getApi() + \"?_id=${_id}\",\n // \"url\": graphql.getApi() + `?value=\\${${valueField}}`,\n // 要加url参数是因为amis select组件人员点选功能有bug,一定要第一次请求才能在requestAdaptor函数中取的form表单字段值\n // 见issue: https://github.com/baidu/amis/issues/6065\n \"url\": graphql.getApi() + `?value=\\${${field.multiple ? valueField + \"|join\" : valueField}}`,\n \"requestAdaptor\": requestAdaptor,\n \"adaptor\": adaptor,\n \"data\": data,\n // \"sendOn\": `!!this._id || !!!this.${valueField}`,\n \"sendOn\": `!this.__selectUserLoaded__`,\n \"headers\": {\n \"Authorization\": \"Bearer ${context.tenantId},${context.authToken}\"\n },\n }\n}\n\nasync function getDeferApi(field, ctx) {\n // data.query 最终格式 \"{ \\toptions:{__object_name}(filters:{__filters}){{__fields}} }\"\n const data = await graphql.getFindQuery({ name: \"{__object_name}\" }, null, [], {\n alias: \"options\",\n // filters: \"{__filters}\",\n queryOptions: `filters: {__filters}, sort: \"{__sort}\"`\n });\n // 传入的默认过滤条件,比如[[\"name\", \"contains\", \"三\"]],将会作为基本过滤条件\n let filters = field.filters;\n if(typeof filters === \"string\"){\n filters = new Function(`return ${filters}`);\n filters = filters();\n }\n if(typeof filters === \"function\"){\n filters = filters(field);\n }\n data.query = data.query.replace(/,count\\:.+/, \"}\");\n // 字段要根据请求参数动态生成,写死为__fields后续在发送适配器中替换\n data.query = data.query.replace(\"{_id}\", \"{{__fields}}\");\n const requestAdaptor = `\n var dep = api.query.dep;\n var ref = api.query.ref;\n var term = api.query.term;\n var filters;\n var objectName;\n var fields;\n var sort = \"\";\n if (dep) {\n objectName = \"${refOrgsObjectName}\";\n fields = \"value:_id,label:name,children\";\n filters = [['parent', '=', dep]];\n sort = \"${ctx.orgsSort}\";\n }\n else if (ref) { \n objectName = \"${refUsersObjectName}\";\n // 这里要额外把字段转为value和label是因为valueField和labelField在deferApi/searchApi中不生效,所以字段要取两次\n fields = \"user,name,value:user,label:name\";\n filters = [['user_accepted', '=', true]];\n var defaultFilters = ${filters && JSON.stringify(filters)};\n if(defaultFilters){\n filters.push(defaultFilters);\n }\n filters.push(['organizations_parents', '=', ref]);\n sort = \"${ctx.usersSort}\";\n }\n api.data.query = api.data.query.replace(/{__object_name}/g, objectName).replace(/{__fields}/g, fields).replace(/{__filters}/g, JSON.stringify(filters)).replace('{__sort}', sort.trim());\n return api;\n `;\n const adaptor = `\n if (api.query.dep) {\n // 展开组织时才需要根据children值设置defer属性\n const data = payload.data;\n data.options = data.options.map(function (option) {\n option.defer = !!(option.children && option.children.length);\n delete option.children;\n return option;\n });\n payload.data = data;\n }\n return payload;\n `;\n return {\n \"method\": \"post\",\n \"url\": graphql.getApi() + \"?ref=${ref}&dep=${value}\",\n \"requestAdaptor\": requestAdaptor,\n \"adaptor\": adaptor,\n \"data\": data,\n \"headers\": {\n \"Authorization\": \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n}\n\nasync function getSearchApi(field, ctx) {\n // data.query 最终格式 \"{ \\toptions:space_users(filters: {__filters}){user,name,value:user,label:name}}\"\n // 这里要额外把字段转为value和label是因为valueField和labelField在deferApi/searchApi中不生效,所以字段要取两次\n const data = await graphql.getFindQuery({ name: refUsersObjectName }, null, [{ name: \"user\" }, { name: \"name\" }, { name: \"user\", alias: \"value\" }, { name: \"name\", alias: \"label\" }], {\n alias: \"options\",\n // filters: \"{__filters}\",\n queryOptions: `filters: {__filters}, sort: \"{__sort}\"`\n });\n data.query = data.query.replace(/,count\\:.+/, \"}\");\n // 传入的默认过滤条件,比如[[\"name\", \"contains\", \"三\"]],将会作为基本过滤条件\n const filters = field.filters;\n const requestAdaptor = `\n var term = api.query.term;\n var filters;\n var sort = \"\";\n if (term) { \n filters = [['user_accepted', '=', true]];\n var defaultFilters = ${filters && JSON.stringify(filters)};\n if(defaultFilters){\n filters.push(defaultFilters);\n }\n var fieldsForSearch = [\"name\", \"username\", \"email\", \"mobile\"];\n var termFilters = [];\n fieldsForSearch.forEach(function (field) {\n termFilters.push([field, 'contains', term]);\n termFilters.push(\"or\");\n });\n termFilters.pop();\n filters.push(termFilters);\n sort = \"${ctx.usersSort}\";\n }\n api.data.query = api.data.query.replace(/{__filters}/g, JSON.stringify(filters)).replace('{__sort}', sort.trim());\n return api;\n `;\n return {\n \"method\": \"post\",\n \"url\": graphql.getApi() + \"?term=${term}\",\n \"requestAdaptor\": requestAdaptor,\n \"data\": data,\n \"headers\": {\n \"Authorization\": \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n}\n\nfunction getRefListViewSort(refObject){\n const listView = _.find(\n refObject.list_views,\n (view, name) => name === \"all\"\n );\n let sort = \"\";\n if(listView){\n sort = getListViewSort(listView);\n }\n return sort;\n}\n\nexport async function getSelectUserSchema(field, readonly, ctx) {\n if (!field) {\n return {}\n }\n\n if (!ctx) {\n ctx = {};\n }\n const amisSchema = {\n \"type\": Field.getAmisStaticFieldType('select', readonly)\n };\n\n if (readonly) {\n amisSchema.tpl = await Tpl.getLookupTpl(field, ctx)\n }\n else{\n const refUsersObjectConfig = await getUISchema(refUsersObjectName);\n ctx.usersSort = getRefListViewSort(refUsersObjectConfig);\n const refOrgsObjectConfig = await getUISchema(refOrgsObjectName);\n ctx.orgsSort = getRefListViewSort(refOrgsObjectConfig);\n Object.assign(amisSchema, {\n \"labelField\": \"name\",\n \"valueField\": \"user\",\n \"multiple\": field.multiple,\n \"searchable\": field.searchable,\n \"selectMode\": \"associated\",\n \"leftMode\": \"tree\",\n \"extractValue\": true,\n \"clearable\": true,\n \"source\": await getSource(field, ctx),\n \"deferApi\": await getDeferApi(field, ctx),\n \"searchApi\": await getSearchApi(field, ctx)\n });\n if(field.multiple){\n // 单选时如果配置joinValues为false,清空字段值会把字段值设置为空数组,这是amis人员单选功能的bug,普通的select没有这个问题\n Object.assign(amisSchema, {\n \"joinValues\": false,\n });\n }\n let defaultValue = field.defaultValue;\n if (_.has(field, 'defaultValue') && !(_.isString(defaultValue) && defaultValue.startsWith(\"{\"))) {\n if(_.isString(defaultValue) && defaultValue.startsWith(\"{{\")){\n defaultValue = `\\$${defaultValue.substring(1, defaultValue.length -1)}`\n }\n amisSchema.value = defaultValue\n }\n if (typeof amisSchema.searchable !== \"boolean\") {\n amisSchema.searchable = true;\n }\n const onEvent = field.onEvent;\n if (onEvent) {\n amisSchema.onEvent = onEvent;\n }\n \n // 这里要加change事件逻辑设置form的__selectUserLoaded__是因为人员字段多选时,每次在界面上操作变量字段值时会重新请求source接口造成选人组件重新初始化\n // 见issue: https://github.com/baidu/amis/issues/6065\n const onChangeScript = `\n // 往上找到form,设置__selectUserLoaded__标记已经加载过选人字段不能再调用source接口初始化选人组件了\n const getClosestAmisComponentByType = function(scope, type){\n const re = scope.getComponents().find(function(n){\n return n.props.type === type;\n });\n if(re){\n return re;\n }\n else{\n return getClosestAmisComponentByType(scope.parent, type);\n }\n }\n const form = getClosestAmisComponentByType(event.context.scoped, \"form\");\n form.setData({\"__selectUserLoaded__\":true});\n `;\n\n const onChangeEvent = {\n \"actionType\": \"custom\",\n \"script\": `${onChangeScript}`\n };\n if(amisSchema.onEvent){\n if(amisSchema.onEvent.change?.actions?.length){\n amisSchema.onEvent.change.actions.unshift(onChangeEvent);\n }\n else{\n amisSchema.onEvent.change = {\n \"weight\": 0,\n \"actions\": [onChangeEvent]\n };\n }\n }\n else{\n Object.assign(amisSchema, {\n \"onEvent\": {\n \"change\": {\n \"weight\": 0,\n \"actions\": [onChangeEvent]\n }\n }\n });\n }\n }\n\n return amisSchema;\n}\n","import { getUISchema } from '../../../objects';\nimport * as _ from 'lodash'\nimport * as graphql from '../graphql'\nimport * as Tpl from '../tpl';\nimport * as Field from './index';\nimport * as Table from './table';\nimport * as List from './list';\nimport { getSelectUserSchema } from './user';\nimport { getObjectHeaderToolbar, getObjectFooterToolbar, getObjectFilter } from './../toolbar';\nimport { getListViewSort } from './../../../objects';\n\nconst getReferenceTo = async (field)=>{\n let referenceTo = field.reference_to;\n if(!referenceTo){\n return ;\n }\n\n if(referenceTo === 'users'){\n referenceTo = 'space_users';\n field.reference_to_field = 'user'\n }\n\n const refObjectConfig = await getUISchema(referenceTo);\n let valueField = null;\n let valueFieldName = field.reference_to_field;\n if(!valueFieldName){\n valueFieldName = refObjectConfig.idFieldName || '_id';\n }\n if(valueFieldName === '_id'){\n valueField = {name: '_id', label: 'ID', type: 'text', toggled: false};\n }else{\n valueField = refObjectConfig.fields[valueFieldName] || {name: valueFieldName};\n }\n return {\n objectName: referenceTo,\n valueField: valueField,\n labelField: refObjectConfig.fields[refObjectConfig.NAME_FIELD_KEY || 'name'],\n NAME_FIELD_KEY: refObjectConfig.NAME_FIELD_KEY || 'name'\n }\n}\n\n\nexport async function lookupToAmisPicker(field, readonly, ctx){\n let referenceTo = await getReferenceTo(field);\n if(!referenceTo){\n return ;\n }\n const refObjectConfig = await getUISchema(referenceTo.objectName);\n const tableFields = [];\n let i = 0;\n const searchableFields = [];\n\n const fieldsArr = [];\n\n const listName = \"all\";\n\n const listView = _.find(\n refObjectConfig.list_views,\n (listView, name) => name === listName\n );\n if (listView && listView.columns) {\n _.each(listView.columns, function (column) {\n if (_.isString(column) && refObjectConfig.fields[column]) {\n fieldsArr.push(refObjectConfig.fields[column]);\n } else if (_.isObject(column) && refObjectConfig.fields[column.field]) {\n fieldsArr.push(\n Object.assign({}, refObjectConfig.fields[column.field], {\n width: column.width,\n wrap: column.wrap,\n })\n );\n }\n });\n }else{\n _.each(refObjectConfig.fields , (field, field_name)=>{\n if(field_name != '_id' && !field.hidden){\n if(!_.has(field, \"name\")){\n field.name = field_name\n }\n fieldsArr.push(field)\n }\n })\n }\n\n _.each(_.sortBy(fieldsArr, \"sort_no\"),function(field){\n if(i < 5){\n if(!_.find(tableFields, function(f){\n return f.name === field.name\n })){\n i++;\n tableFields.push(field)\n if(field.searchable){\n searchableFields.push(field.name);\n }\n }\n }\n });\n\n const fields = {\n [referenceTo.labelField.name]: referenceTo.labelField,\n [referenceTo.valueField.name]: referenceTo.valueField\n };\n\n _.each(tableFields, (tableField)=>{\n if(!tableField.hidden){\n fields[tableField.name] = tableField;\n }\n });\n\n let sort = \"\";\n if(listView){\n sort = getListViewSort(listView);\n }\n\n const source = await getApi(refObjectConfig, null, fields, {expand: true, alias: 'rows', queryOptions: `filters: {__filters}, top: {__top}, skip: {__skip}, sort: \"{__sort}\"`});\n \n if(source.url){\n const depend_on = [];\n const sendOn = [];\n _.each(field.depend_on, (fName)=>{\n depend_on.push(`depend_on_${fName}=\\${${fName}}`)\n sendOn.push(`this.${fName}`)\n })\n if(depend_on.length > 0){\n source.url = `${source.url}?${depend_on.join('&')}`;\n source.sendOn = `${sendOn.join(' && ')}`\n }\n }\n \n source.data.$term = \"$term\";\n source.data.$self = \"$$\";\n \n source.requestAdaptor = `\n const selfData = JSON.parse(JSON.stringify(api.data.$self));\n var filters = [];\n var pageSize = api.data.pageSize || 10;\n var pageNo = api.data.pageNo || 1;\n var skip = (pageNo - 1) * pageSize;\n var orderBy = api.data.orderBy || '';\n var orderDir = api.data.orderDir || '';\n var sort = orderBy + ' ' + orderDir;\n sort = orderBy ? sort : \"${sort}\";\n var allowSearchFields = ${JSON.stringify(searchableFields)};\n if(api.data.$term){\n filters = [[\"name\", \"contains\", \"'+ api.data.$term +'\"]];\n }else if(selfData.op === 'loadOptions' && selfData.value){\n if(selfData.value?.indexOf(',') > 0){\n filters = [[\"${referenceTo.valueField.name}\", \"=\", selfData.value.split(',')]];\n }else{\n filters = [[\"${referenceTo.valueField.name}\", \"=\", selfData.value]];\n }\n }\n\n var searchableFilter = [];\n _.each(selfData, (value, key)=>{\n if(!_.isEmpty(value) || _.isBoolean(value)){\n if(_.startsWith(key, '__searchable__between__')){\n searchableFilter.push([\\`\\${key.replace(\"__searchable__between__\", \"\")}\\`, \"between\", value])\n }else if(_.startsWith(key, '__searchable__')){\n if(_.isString(value)){\n searchableFilter.push([\\`\\${key.replace(\"__searchable__\", \"\")}\\`, \"contains\", value])\n }else{\n searchableFilter.push([\\`\\${key.replace(\"__searchable__\", \"\")}\\`, \"=\", value])\n }\n }\n }\n });\n\n if(searchableFilter.length > 0){\n if(filters.length > 0 ){\n filters = [filters, 'and', searchableFilter];\n }else{\n filters = searchableFilter;\n }\n }\n\n if(allowSearchFields){\n allowSearchFields.forEach(function(key){\n const keyValue = selfData[key];\n if(keyValue){\n filters.push([key, \"contains\", keyValue]);\n }\n })\n }\n\n const filtersFunction = ${field._filtersFunction};\n\n if(filtersFunction){\n const _filters = filtersFunction(filters, api.data.$self.__super.__super);\n if(_filters && _filters.length > 0){\n filters.push(_filters);\n }\n }\n\n api.data.query = api.data.query.replace(/{__filters}/g, JSON.stringify(filters)).replace('{__top}', pageSize).replace('{__skip}', skip).replace('{__sort}', sort.trim());\n return api;\n `\n source.adaptor = `\n const enable_tree = ${refObjectConfig.enable_tree};\n if(enable_tree){\n const records = payload.data.rows;\n const treeRecords = [];\n const getChildren = (records, childrenIds)=>{\n if(!childrenIds){\n return;\n }\n const children = _.filter(records, (record)=>{\n return _.includes(childrenIds, record._id)\n });\n _.each(children, (item)=>{\n if(item.children){\n item.children = getChildren(records, item.children)\n }\n })\n return children;\n }\n\n _.each(records, (record)=>{\n if(!record.parent){\n treeRecords.push(Object.assign({}, record, {children: getChildren(records, record.children)}));\n }\n });\n payload.data.rows = treeRecords;\n }\n return payload;\n `;\n let top = 20;\n\n if(refObjectConfig.paging && refObjectConfig.paging.enabled === false){\n top = 1000;\n };\n\n let pickerSchema = null;\n if(ctx.formFactor === 'SMALL'){\n pickerSchema = await List.getListSchema(tableFields, {\n top: top,\n ...ctx,\n actions: false\n })\n }else{\n pickerSchema = await Table.getTableSchema(tableFields, {\n labelFieldName: refObjectConfig.NAME_FIELD_KEY,\n top: top,\n ...ctx\n })\n\n pickerSchema.headerToolbar = getObjectHeaderToolbar(refObjectConfig, ctx.formFactor);\n pickerSchema.footerToolbar = getObjectFooterToolbar();\n if(ctx.filterVisible !== false){\n let filterLoopCount = ctx.filterLoopCount || 0;\n filterLoopCount++;\n // 可以传入filterVisible为false防止死循环\n pickerSchema.filter = await getObjectFilter(refObjectConfig, fields, {\n isLookup: true,\n ...ctx,\n filterLoopCount,\n });\n }\n pickerSchema.data = Object.assign({}, pickerSchema.data, {\n \"&\": \"$$\",\n \"objectName\": refObjectConfig.name,\n \"uiSchema\": refObjectConfig,\n \"listName\": listName,// 需要按视图取可搜索项\n \"isLookup\": true\n });\n }\n\n const data = {\n type: Field.getAmisStaticFieldType('picker', readonly),\n labelField: referenceTo.labelField.name,\n valueField: referenceTo.valueField.name,\n modalMode: 'dialog', //TODO 设置 dialog 或者 drawer,用来配置弹出方式\n source: source,\n size: \"lg\",\n pickerSchema: pickerSchema,\n joinValues: false,\n extractValue: true\n }\n if(field.multiple){\n data.multiple = true\n data.extractValue = true\n }\n\n if(readonly){\n data.tpl = await Tpl.getLookupTpl(field, ctx)\n }\n\n return data;\n}\n\nexport async function lookupToAmisSelect(field, readonly, ctx){\n let referenceTo = await getReferenceTo(field);\n\n let apiInfo;\n\n if(referenceTo){\n apiInfo = await getApi({\n name: referenceTo.objectName\n }, null, {\n [referenceTo.labelField.name]: Object.assign({}, referenceTo.labelField, {alias: 'label'}),\n [referenceTo.valueField.name]: Object.assign({}, referenceTo.valueField, {alias: 'value'})\n }, {expand: false, alias: 'options', queryOptions: `filters: {__filters}, top: {__top}, sort: \"{__sort}\"`})\n }else{\n apiInfo = {\n method: \"post\",\n url: graphql.getApi(),\n data: {query: '{objects(filters: [\"_id\", \"=\", \"-1\"]){_id}}', $: \"$$\"}\n }\n }\n\n const refObjectConfig = referenceTo && await getUISchema(referenceTo.objectName);\n const listView = refObjectConfig && _.find(\n refObjectConfig.list_views,\n (listView, name) => name === \"all\"\n );\n\n let sort = \"\";\n if(listView){\n sort = getListViewSort(listView);\n }\n\n if(apiInfo.url){\n const depend_on = [];\n const sendOn = [];\n _.each(field.depend_on, (fName)=>{\n depend_on.push(`depend_on_${fName}=\\${${fName}}`)\n sendOn.push(`this.${fName}`)\n })\n if(depend_on.length > 0){\n apiInfo.url = `${apiInfo.url}?${depend_on.join('&')}`;\n apiInfo.sendOn = `${sendOn.join(' && ')}`\n }\n }\n \n apiInfo.data.$term = \"$term\";\n apiInfo.data.$value = `$${field.name}.${referenceTo ? referenceTo.valueField.name : '_id'}`;\n _.each(field.depend_on, function(fName){\n apiInfo.data[fName] = `$${fName}`;\n })\n apiInfo.data['$'] = `$$`;\n apiInfo.data['rfield'] = `\\${object_name}`;\n // [[\"_id\", \"=\", \"$${field.name}._id\"],\"or\",[\"name\", \"contains\", \"$term\"]]\n apiInfo.requestAdaptor = `\n var filters = [];\n var top = 10;\n if(api.data.$term){\n filters = [[\"${referenceTo?.NAME_FIELD_KEY || 'name'}\", \"contains\", api.data.$term]];\n }else if(api.data.$value){\n filters = [[\"_id\", \"=\", api.data.$value]];\n }\n\n const filtersFunction = ${field._filtersFunction};\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 = \"${sort}\";\n api.data.query = api.data.query.replace(/{__filters}/g, JSON.stringify(filters)).replace('{__top}', top).replace('{__sort}', sort.trim());\n return api;\n `\n let labelField = referenceTo ? referenceTo.labelField.name : '';\n let valueField = referenceTo ? referenceTo.valueField.name : '';\n if(field._optionsFunction){\n apiInfo.adaptor = `\n payload.data.options = eval(${field._optionsFunction})(api.data);\n return payload;\n `\n labelField = 'label';\n valueField = 'value';\n }\n\n const data = {\n type: Field.getAmisStaticFieldType('select', readonly),\n joinValues: false,\n extractValue: true,\n // labelField: labelField,\n // valueField: valueField,\n source: apiInfo,\n autoComplete: apiInfo,\n searchable: true,\n }\n let defaultValue = field.defaultValue\n if(_.has(field, 'defaultValue') && !(_.isString(field.defaultValue) && field.defaultValue.startsWith(\"{\"))){\n if(_.isString(defaultValue) && defaultValue.startsWith(\"{{\")){\n defaultValue = `\\$${defaultValue.substring(1, defaultValue.length -1)}`\n }\n data.value = defaultValue\n }\n if(field.multiple){\n data.multiple = true\n data.extractValue = true\n }\n\n if(readonly){\n data.tpl = await Tpl.getLookupTpl(field, ctx)\n }\n return data;\n}\n\nasync function getApi(object, recordId, fields, options){\n const data = await graphql.getFindQuery(object, recordId, fields, options);\n return {\n method: \"post\",\n url: graphql.getApi(),\n data: data,\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n}\n\nexport async function lookupToAmis(field, readonly, ctx){\n if(readonly){\n return {\n type: Field.getAmisStaticFieldType('picker', readonly),\n tpl: Tpl.getRelatedFieldTpl(field, ctx)\n }\n }\n // console.log(`referenceTo.objectName====`, field)\n if(field.reference_to && !_.isString(field.reference_to) && !readonly){\n return {\n type: 'steedos-field-lookup',\n field,\n readonly,\n ctx: {},\n }\n // return await lookupToAmisGroup(field, readonly, ctx);\n }\n\n let referenceTo = await getReferenceTo(field);\n if(!referenceTo){\n return await lookupToAmisSelect(field, readonly, ctx);\n }\n\n const refObject = await getUISchema(referenceTo.objectName);\n\n if(referenceTo.objectName === \"space_users\"){\n return await lookupToAmisSelectUser(field, readonly, ctx);\n }\n\n // 此处不参考 steedos 的 enable_enhanced_lookup 规则. 如果默认是开启弹出选择,用户选择过程操作太繁琐, 所以默认是关闭弹出选择.\n // 由于amis picker 目前不支持联动, 配置了depend_on时, 使用使用select ,以支持联动\n // TODO: 确认 amis picker 支持联动时, 清理field.depend_on判断\n if(refObject.enable_enhanced_lookup == true && _.isEmpty(field.depend_on)){\n return await lookupToAmisPicker(field, readonly, ctx);\n }else{\n return await lookupToAmisSelect(field, readonly, ctx);\n }\n}\n\nexport async function lookupToAmisSelectUser(field, readonly, ctx){\n return getSelectUserSchema(field, readonly, ctx);\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2023-01-13 17:27:54\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2023-01-16 10:36:27\n * @Description: \n */\n\n\nexport const getMarkdownFieldSchema = (field, readonly, ctx)=>{\n if(readonly){\n return {\n \"type\": \"markdown\",\n \"name\": field.name,\n \"options\": {\n \"linkify\": true,\n \"html\": true,\n \"breaks\": true\n }\n }\n }else{\n return {\n \"type\": \"group\",\n \"body\": [\n {\n \"type\": \"editor\",\n \"name\": field.name,\n \"language\": \"markdown\",\n },\n {\n \"type\": \"markdown\",\n \"name\": field.name,\n \"options\": {\n \"linkify\": true,\n \"html\": true,\n \"breaks\": true\n }\n }\n ]\n }\n }\n}\n\nexport const getHtmlFieldSchema = (field, readonly, ctx)=>{\n if(readonly){\n return {\n \"type\": \"html\",\n \"name\": field.name\n }\n }else{\n return {\n \"type\": \"input-rich-text\",\n \"name\": field.name\n }\n // return {\n // \"type\": \"group\",\n // \"body\": [\n // {\n // \"type\": \"editor\",\n // \"name\": field.name,\n // \"language\": \"html\"\n // },\n // {\n // \"type\": \"html\",\n // \"name\": field.name\n // }\n // ]\n // }\n }\n}","import { cloneDeep, includes } from 'lodash';\nimport { lookupToAmis } from './lookup';\nimport { getMarkdownFieldSchema, getHtmlFieldSchema } from './editor';\nimport * as Fields from '../fields';\nimport * as Tpl from '../tpl';\nimport * as File from './file';\nimport { getAmisStaticFieldType } from './type';\nimport * as _ from 'lodash'\nexport const OMIT_FIELDS = ['created', 'created_by', 'modified', 'modified_by'];\nexport { getAmisStaticFieldType } from './type';\n// const Lookup = require('./lookup');\n\nexport function getBaseFields(readonly){\n let calssName = 'm-1';\n if(readonly){\n calssName = `${calssName}`\n }\n return [\n { \n name: \"createdInfo\", \n label: \"创建人\",\n type: \"static\",\n labelClassName: 'text-left',\n className: calssName,\n tpl: Tpl.getCreatedInfoTpl()\n },\n { \n name: \"modifiedInfo\", \n label: \"修改人\",\n type: \"static\",\n labelClassName: 'text-left',\n className: calssName,\n tpl: Tpl.getModifiedInfoTpl()\n }\n ]\n};\n\n\n\nexport function getAmisFieldType(sField){\n switch (sField.type) {\n case 'text':\n return 'text';\n case 'textarea':\n return 'textarea';\n case 'html':\n return 'html';\n case 'markdown':\n return 'markdown';\n case 'select':\n return 'select';\n case 'boolean':\n return 'checkbox';\n case 'date':\n return 'date';\n case 'datetime':\n return 'datetime';\n case 'number':\n return 'number';\n case 'currency':\n return 'number';\n case 'percent':\n return 'number'\n case 'password':\n return 'password';\n case 'lookup':\n // TODO 根据字段配置返回 select || picker\n return 'select';\n case 'master_detail':\n // TODO 根据字段配置返回 select || picker\n return 'picker';\n case 'autonumber':\n return 'text';\n case 'url':\n return 'url'\n case 'email':\n return 'email'\n case 'image':\n return 'image'\n case 'formula':\n //TODO\n break;\n case 'summary':\n //TODO\n break;\n case 'grid':\n return 'table';\n default:\n console.log('convertData default', sField.type);\n // convertData.type = field.type\n break;\n }\n\n};\n\nexport function getObjectFieldSubFields(mainField, fields){\n const newMainField = Object.assign({subFields: []}, mainField);\n const subFields = _.filter(fields, function(field){\n return field.name.startsWith(`${mainField.name}.`)\n });\n newMainField.subFields = subFields;\n return newMainField;\n}\n\nexport function getGridFieldSubFields(mainField, fields){\n const newMainField = Object.assign({subFields: []}, mainField);\n const subFields = _.filter(fields, function(field){\n return field.name.startsWith(`${mainField.name}.`)\n });\n newMainField.subFields = subFields;\n return newMainField;\n}\n\n/**\n * TODO 处理权限\n * @param {*} object steedos object\n * @param {*} userSession \n */\n export function getPermissionFields(object, userSession){\n const permissionFields = [];\n const fieldsArr = [];\n\t_.each(object.fields , (field, field_name)=>{\n\t\tif(!_.has(field, \"name\")){\n\t\t\tfield.name = field_name\n }\n\t\tfieldsArr.push(field)\n })\n _.each(_.sortBy(fieldsArr, \"sort_no\"), function(field){\n if(!field.hidden){\n permissionFields.push( Object.assign({}, field, {permission: {allowEdit: true}}))\n }\n })\n return permissionFields;\n}\n\n\nexport function getSelectFieldOptions(field){\n const dataType = field.data_type || 'text';\n const options = [];\n _.each(field.options, (item)=>{\n switch (dataType) {\n case 'number':\n options.push({label: item.label, value: Number(item.value)});\n break;\n case 'text':\n options.push({label: item.label, value: String(item.value)});\n break;\n case 'boolean':\n options.push({label: item.label, value: item.value === 'false' ? false : true});\n break;\n default:\n break;\n }\n });\n return options;\n}\n\nexport async function convertSFieldToAmisField(field, readonly, ctx) {\n let rootUrl = null;\n // 创建人和修改人、创建时间和修改时间不显示\n if(_.includes(OMIT_FIELDS, field.name) && ctx.showSystemFields != true){\n return;\n }\n const baseData = {name: ctx.fieldNamePrefix ? `${ctx.fieldNamePrefix}${field.name}` : field.name, label: field.label, labelRemark: field.inlineHelpText, required: _.has(ctx, 'required') ? ctx.required : field.required};\n let convertData = {\n };\n // if(_.includes(OMIT_FIELDS, field.name)){\n // readonly = true;\n // }\n switch (field.type) {\n case 'text':\n convertData.type = getAmisStaticFieldType('text', readonly);\n break;\n case 'textarea':\n convertData.type = getAmisStaticFieldType('textarea', readonly);\n // convertData.tpl = `<b><%=data.${field.name}%></b>`;\n convertData.tpl = `<%=(data.${field.name} || \"\").split(\"\\\\n\").join('<br>')%>`;\n break;\n case 'html':\n convertData = getHtmlFieldSchema(field, readonly)\n break;\n // convertData = {\n // type: getAmisStaticFieldType('html', readonly)\n // }\n // break;\n case 'markdown':\n convertData = getMarkdownFieldSchema(field, readonly)\n break;\n // convertData = {\n // type: getAmisStaticFieldType('html', readonly)\n // }\n // break;\n case 'select':\n convertData = {\n type: getAmisStaticFieldType('select', readonly),\n joinValues: false,\n options: getSelectFieldOptions(field),\n extractValue: true,\n clearable: true,\n labelField: 'label',\n valueField: 'value',\n tpl: readonly ? Tpl.getSelectTpl(field) : null\n }\n let defaultValue = field.defaultValue\n if(_.has(field, 'defaultValue') && !(_.isString(field.defaultValue) && field.defaultValue.startsWith(\"{\"))){\n if(_.isString(defaultValue) && defaultValue.startsWith(\"{{\")){\n defaultValue = `\\$${defaultValue.substring(1, defaultValue.length -1)}`\n }\n const dataType = field.data_type || 'text';\n if(defaultValue != null){\n if(dataType === 'text'){\n convertData.value = String(defaultValue);\n }else if(dataType === 'number'){\n convertData.value = Number(defaultValue);\n }else if(dataType === 'boolean'){\n convertData.value = defaultValue === 'false' ? false : true;\n }\n }\n }\n if(field.multiple){\n convertData.multiple = true\n convertData.extractValue = true\n }\n break;\n case 'boolean':\n convertData = {\n type: getAmisStaticFieldType('checkbox', readonly),\n // option: field.inlineHelpText,\n tpl: readonly ? Tpl.getSwitchTpl(field) : null\n }\n break;\n case 'input-date-range':\n convertData = {\n type: \"input-date-range\",\n inputFormat: \"YYYY-MM-DD\",\n format:'YYYY-MM-DDT00:00:00.000[Z]',\n tpl: readonly ? Tpl.getDateTpl(field) : null,\n // utc: true,\n joinValues: false\n }\n break;\n case 'date':\n convertData = {\n type: getAmisStaticFieldType('date', readonly),\n inputFormat: \"YYYY-MM-DD\",\n format:'YYYY-MM-DDT00:00:00.000[Z]',\n tpl: readonly ? Tpl.getDateTpl(field) : null,\n // utc: true\n }\n break;\n case 'input-datetime-range':\n convertData = {\n type: \"input-datetime-range\",\n inputFormat: 'YYYY-MM-DD HH:mm',\n format:'YYYY-MM-DDTHH:mm:ss.SSSZ',\n tpl: readonly ? Tpl.getDateTimeTpl(field) : null,\n utc: true,\n joinValues: false\n }\n break;\n case 'datetime':\n convertData = {\n type: getAmisStaticFieldType('datetime', readonly),\n inputFormat: 'YYYY-MM-DD HH:mm',\n format:'YYYY-MM-DDTHH:mm:ss.SSSZ',\n tpl: readonly ? Tpl.getDateTimeTpl(field) : null,\n utc: true\n }\n break;\n case 'input-time-range':\n convertData = {\n type: 'input-time-range',\n inputFormat: 'HH:mm',\n timeFormat:'HH:mm',\n format:'1970-01-01THH:mm:00.000[Z]',\n tpl: readonly ? Tpl.getDateTimeTpl(field) : null,\n // utc: true,\n joinValues: false\n }\n break;\n case 'time':\n convertData = {\n type: getAmisStaticFieldType('time', readonly),\n inputFormat: 'HH:mm',\n timeFormat:'HH:mm',\n format:'1970-01-01THH:mm:00.000[Z]',\n tpl: readonly ? Tpl.getDateTimeTpl(field) : null,\n // utc: true\n }\n break;\n case 'currency':\n case 'number':\n if(readonly){\n convertData = {\n type: 'static-tpl',\n tpl: Tpl.getNumberTpl(field)\n }\n }else{\n convertData = {\n type: getAmisStaticFieldType('number', readonly),\n min: field.min,\n max: field.max,\n precision: field.scale\n }\n }\n \n break;\n case 'input-array':\n convertData = Object.assign({}, field, baseData);\n break;\n case 'input-range':\n convertData = {\n type: 'input-range',\n min: field.min,\n max: field.max,\n value: [0, 0],\n multiple: true,\n showInput: true\n }\n break;\n case 'percent':\n //TODO\n convertData = {\n type: getAmisStaticFieldType('number', readonly),\n min: field.min,\n max: field.max,\n precision: field.scale\n }\n break;\n case 'password':\n convertData = {\n type: getAmisStaticFieldType('password', readonly),\n tpl: readonly ? Tpl.getPasswordTpl(field) : null\n }\n break;\n case 'lookup':\n convertData = await lookupToAmis(field, readonly, ctx) //TODO\n break;\n case 'master_detail':\n convertData = await lookupToAmis(field, readonly, ctx) //TODO\n break;\n case 'autonumber':\n if(readonly){\n convertData = {\n type: 'static-text'\n }\n }\n break;\n case 'url':\n convertData = {\n type: getAmisStaticFieldType('url', readonly)\n }\n break;\n case 'email':\n convertData = {\n type: getAmisStaticFieldType('email', readonly)\n }\n break;\n case 'avatar':\n convertData = File.getAmisFileSchema(field, readonly);\n break;\n case 'image':\n convertData = File.getAmisFileSchema(field, readonly);\n break;\n case 'file':\n convertData = File.getAmisFileSchema(field, readonly);\n break;\n case 'formula':\n if(readonly){\n convertData.type = getAmisStaticFieldType(field.data_type, readonly);\n }\n break;\n case 'summary':\n if(readonly){\n convertData.type = getAmisStaticFieldType(field.data_type, readonly);\n }\n break;\n case 'code':\n convertData = {\n type: \"editor\",\n language: field.language,\n value: field.defaultValue || ''\n }\n break;\n case 'toggle':\n convertData = {\n type: \"switch\",\n name: field.name,\n label: field.label,\n width: field.width,\n toggled: field.toggled,\n disabled: readonly,\n }\n break;\n case 'grid':\n convertData = {\n type: 'input-table',\n strictMode:false,\n affixHeader: false, // 是否固定表头, 不固定表头, 否则form有y轴滚动条时, 表头会跟随滚动条滚动.\n // needConfirm: true, 此属性设置为false后,导致table不能编辑。\n editable: !readonly,\n addable: !readonly,\n removable: !readonly,\n draggable: !readonly,\n columns: []\n }\n for (const subField of field.subFields) {\n const subFieldName = subField.name.replace(`${field.name}.$.`, '').replace(`${field.name}.`, '');\n const gridSub = await convertSFieldToAmisField(Object.assign({}, subField, {name: subFieldName}), readonly, ctx);\n if(gridSub){\n delete gridSub.name\n delete gridSub.label\n convertData.columns.push({\n name: subFieldName,\n label: subField.label,\n quickEdit: readonly ? false : gridSub\n })\n }\n }\n break;\n default:\n // console.log('convertData default', field.type);\n // convertData.type = field.type\n break;\n }\n if(!_.isEmpty(convertData)){\n if(field.is_wide || convertData.type === 'group'){\n convertData.className = 'col-span-2 m-1';\n }else{\n convertData.className = 'm-1';\n }\n if(readonly){\n convertData.className = `${convertData.className} md:border-b`\n }\n if(readonly){\n convertData.quickEdit = false;\n }\n\n if(field.visible_on){\n // convertData.visibleOn = `\\$${field.visible_on.substring(1, field.visible_on.length -1).replace(/formData./g, '')}`;\n if(field.visible_on.startsWith(\"{{\")){\n convertData.visibleOn = `${field.visible_on.substring(2, field.visible_on.length -2).replace(/formData./g, 'data.')}`\n }else{\n convertData.visibleOn = `${field.visible_on.replace(/formData./g, 'data.')}`\n }\n }\n if(convertData.type === 'group'){\n convertData.body[0] = Object.assign({}, baseData, convertData.body[0], { labelClassName: 'text-left', clearValueOnHidden: true, fieldName: field.name});\n return convertData\n }\n return Object.assign({}, baseData, convertData, { labelClassName: 'text-left', clearValueOnHidden: true, fieldName: field.name});\n }\n \n}\n\nexport async function getFieldSearchable(perField, permissionFields, ctx){\n const filterLoopCount = ctx.filterLoopCount || 0;\n const maxFilterLoopCount = 5;\n let field = perField;\n if(field.type === 'grid'){\n field = await Fields.getGridFieldSubFields(perField, permissionFields);\n }else if(perField.type === 'object'){\n field = await Fields.getObjectFieldSubFields(perField, permissionFields);\n }\n\n \n let fieldNamePrefix = '__searchable__';\n if(field.name.indexOf(\".\") < 0){\n let _field = cloneDeep(field)\n if(includes(['textarea', 'html', 'code', 'autonumber'], field.type)){\n _field.type = 'text'\n }\n\n if(field.type === 'number' || field.type === 'currency'){\n _field.type = 'input-array';\n _field.inline = true;\n _field.addable = false;\n _field.removable = false;\n _field.value = [null,null];\n _field.items = {\n type: \"input-number\"\n }\n _field.is_wide = true;\n fieldNamePrefix = `${fieldNamePrefix}between__`\n }\n\n if(field.type ==='date'){\n _field.type = 'input-date-range';\n _field.is_wide = true;\n fieldNamePrefix = `${fieldNamePrefix}between__`\n }\n if(field.type === 'datetime'){\n _field.type = 'input-datetime-range'\n _field.is_wide = true;\n fieldNamePrefix = `${fieldNamePrefix}between__`\n }\n if(field.type === 'time'){\n _field.type = 'input-time-range'\n _field.is_wide = true;\n fieldNamePrefix = `${fieldNamePrefix}between__`\n }\n if(field.reference_to === 'users'){\n _field.reference_to = 'space_users';\n _field.reference_to_field = 'user';\n }\n _field.readonly = false;\n _field.disabled = false;\n _field.multiple = true;\n _field.is_wide = false;\n _field.defaultValue = undefined;\n // filterVisible: false不再生成lookup字段时的filter,否则会死循环\n const amisField = await Fields.convertSFieldToAmisField(_field, false, Object.assign({}, ctx, {fieldNamePrefix: fieldNamePrefix, required: false, showSystemFields: true, filterVisible: filterLoopCount < maxFilterLoopCount}));\n if(amisField){\n return amisField;\n }\n }\n}","import { getFieldSearchable } from \"./fields/index\";\nimport { includes, map } from \"lodash\";\n\nexport async function getObjectFieldsFilterButtonSchema(objectSchema) {\n // const amisListViewId = `listview_${objectSchema.name}`;\n return {\n \"type\": \"button\",\n \"label\": \"\",\n \"icon\": \"fa fa-search\",\n \"className\": \"bg-white p-2 rounded border-gray-300 text-gray-500\",\n \"onEvent\": {\n \"click\": {\n \"actions\": [\n {\n \"actionType\": \"broadcast\",\n \"args\": {\n \"eventName\": \"broadcast_toggle_fields_filter\"\n }\n }\n ]\n }\n }\n }\n}\n\nexport async function getObjectFieldsFilterFormSchema(objectSchema, fields, ctx) {\n if(!ctx){\n ctx = {};\n }\n const body = [];\n for (let field of fields) {\n if (\n !includes(\n [\n \"grid\",\n \"avatar\",\n \"image\",\n \"object\",\n \"[object]\",\n \"[Object]\",\n \"[grid]\",\n \"[text]\",\n \"audio\",\n \"file\",\n ],\n field.type\n )\n ) {\n delete field.defaultValue\n delete field.required\n delete field.is_wide\n delete field.readonly\n delete field.hidden\n delete field.omit\n const amisField = await getFieldSearchable(field, fields, ctx);\n if (amisField) {\n body.push(amisField);\n }\n }\n }\n let persistDataKeys = map(body, \"name\");\n if(ctx.enableSearchableFieldsVisibleOn){\n body.forEach(function(fieldItem){\n fieldItem.visibleOn = `this.filterFormSearchableFields && this.filterFormSearchableFields.indexOf(\"${fieldItem.fieldName}\") > -1`;\n // fieldItem.clearValueOnHidden = true;//这个属性会把form字段值删除,但是点击搜索时crud还是把值给传递到过滤条件(api.requestAdaptor的data.$self)中了,应该是crud的bug\n });\n }\n\n // const onBroadcastSearchableFieldsChangeScript = `\n // const data = event.data;\n // const listViewId = data.listViewId;\n // const searchableFields = data.fields;\n // const preSearchableFields = data.__super.__super.fields;\n // const removedFields = _.difference(preSearchableFields, searchableFields);\n // const listViewPropsStoreKey = location.pathname + \"/crud/\" + listViewId ;\n // let localListViewProps = localStorage.getItem(listViewPropsStoreKey);\n // if(localListViewProps){\n // // 当变更可搜索字段时,如果被移除的可搜索字段在本地存储中已经存入过滤条件中则应该清除本地存储中相关字段的过滤条件。\n // localListViewProps = JSON.parse(localListViewProps);\n // let removedKeys = [];\n // _.each(localListViewProps, function(n,k){\n // // __searchable__开头的不在searchableFields范围则清除其值\n // let isRemoved = !!removedFields.find(function(fieldName){\n // return new RegExp(\"__searchable__\\.*\" + fieldName + \"$\").test(k);\n // });\n // if(isRemoved){\n // removedKeys.push(k);\n // }\n // });\n // const removedValues = {};\n // removedKeys.forEach(function(key){\n // delete localListViewProps[key];\n // removedValues[key] = \"\";\n // });\n // doAction({\n // actionType: 'setValue',\n // args: {\n // value: removedValues\n // }\n // });\n // localStorage.setItem(listViewPropsStoreKey, JSON.stringify(localListViewProps));\n // }\n // `;\n\n return {\n title: \"\",\n type: \"form\",\n // debug: true,\n name: \"listview-filter-form\",\n id: `listview_filter_form_${objectSchema.name}`,\n mode: \"normal\",\n wrapWithPanel: false,\n className: `sm:grid sm:gap-2 sm:grid-cols-4 mb-2`,\n data: {\n \"&\": \"${filterFormValues || {}}\",\n ...ctx.initData\n },\n // persistData: \"crud:${id}\",\n // persistDataKeys: persistDataKeys,\n body: body,\n // \"onEvent\": {\n // \"broadcastSearchableFieldsChange\": {\n // \"actions\": [\n // {\n // \"actionType\": \"custom\",\n // \"script\": onBroadcastSearchableFieldsChangeScript\n // }\n // ]\n // }\n // }\n };\n}\n\nexport async function getObjectFieldsFilterBarSchema(objectSchema, fields, ctx) {\n if(!ctx){\n ctx = {};\n }\n const filterFormSchema = await getObjectFieldsFilterFormSchema(objectSchema, fields, Object.assign({}, {\n enableSearchableFieldsVisibleOn: true\n }, ctx));\n const onSearchScript = `\n const scope = event.context.scoped;\n var filterForm = scope.getComponents().find(function(n){\n return n.props.type === \"form\";\n });\n var filterFormValues = filterForm.getValues();\n var listView = scope.parent.parent.parent.getComponents().find(function(n){\n return n.props.type === \"crud\";\n });\n const removedValues = {};\n // 设置搜索项中移除搜索项后,filterFormValues未把其字段的空值保存为own property,即hasOwnProperty属性中\n // 这会造成handleFilterSubmit时把移除掉的搜索项字段之前的值加到过滤条件中\n for(var k in filterFormValues){\n if(filterFormValues[k] === \"\" && !filterFormValues.hasOwnProperty(k)){\n removedValues[k] = \"\";\n }\n }\n listView.handleFilterSubmit(Object.assign({}, removedValues, filterFormValues));\n `;\n const dataProviderInited = `\n const objectName = data.objectName;\n const isLookup = data.isLookup;\n const listViewId = data.listViewId;\n let searchableFieldsStoreKey = location.pathname + \"/searchable_fields/\";\n if(isLookup){\n searchableFieldsStoreKey += \"lookup/\" + objectName;\n }\n else{\n searchableFieldsStoreKey += listViewId;\n }\n let defaultSearchableFields = localStorage.getItem(searchableFieldsStoreKey);\n if(!defaultSearchableFields && data.uiSchema){\n let listView = data.uiSchema.list_views[data.listName];\n defaultSearchableFields = listView && listView.searchable_fields;\n if(defaultSearchableFields && defaultSearchableFields.length){\n defaultSearchableFields = _.map(defaultSearchableFields, 'field');\n }\n }\n if(_.isEmpty(defaultSearchableFields) && data.uiSchema){\n defaultSearchableFields = _.map(\n _.filter(_.values(data.uiSchema.fields), (field) => {\n return field.searchable;\n }),\n \"name\"\n );\n }\n setData({ filterFormSearchableFields: defaultSearchableFields });\n if(isLookup){\n // looup字段过滤器不在本地缓存记住过滤条件,所以初始始终隐藏过滤器\n setData({ showFieldsFilter: false });\n }\n else{\n const listViewPropsStoreKey = location.pathname + \"/crud/\" + data.listViewId ;\n let localListViewProps = localStorage.getItem(listViewPropsStoreKey);\n if(localListViewProps){\n localListViewProps = JSON.parse(localListViewProps);\n let filterFormValues = _.pickBy(localListViewProps, function(n,k){\n return /^__searchable__/g.test(k);\n });\n if(!_.isEmpty(filterFormValues)){\n setData({ filterFormValues });\n const omitedEmptyFormValue = _.omitBy(filterFormValues, function(n){\n return _.isNil(n) \n || (_.isObject(n) && _.isEmpty(n)) \n || (_.isArray(n) && _.isEmpty(n.filter(function(item){return !_.isNil(item)})))\n || (_.isString(n) && n.length === 0);\n });\n // 有过滤条件时自动展开搜索栏\n if(!_.isEmpty(omitedEmptyFormValue)){\n setData({ showFieldsFilter: true });\n }\n }\n }\n }\n `;\n const onSearchableFieldsChangeScript = `\n const data = context.props.data;\n const listName = data.listName;\n const objectName = data.objectName;\n const isLookup = data.isLookup;\n const listViewId = data.listViewId;\n const value = data.fields;\n const scope = event.context.scoped;\n // 这里的filterForm不是name为\"listview-filter-form\"的内部form,而是crud自带的filter form\n const filterForm = scope.parent.parent.getComponents().find(function(n){\n return n.props.type === \"form\";\n });\n const filterService = filterForm.context.getComponents().find(function(n){\n return n.props.type === \"service\";\n });\n filterService.setData({ filterFormSearchableFields: value });\n let searchableFieldsStoreKey = location.pathname + \"/searchable_fields/\";\n if(isLookup){\n searchableFieldsStoreKey += \"lookup/\" + objectName;\n }\n else{\n searchableFieldsStoreKey += listViewId;\n }\n localStorage.setItem(searchableFieldsStoreKey, value);\n\n // ===START===:当变更可搜索字段时,如果被移除的可搜索字段在本地存储中已经存入过滤条件中则应该清除本地存储中相关字段的过滤条件。\n const searchableFields = data.fields;\n let preSearchableFields = data.__super.fields;\n if(typeof preSearchableFields === \"string\"){\n preSearchableFields = preSearchableFields.split(\",\");\n }\n const removedFields = _.difference(preSearchableFields, searchableFields);\n\n // const getClosestAmisComponentByType = function (scope, type, name) {\n // // 递归children找到listview-filter-form\n // let re = scope.getComponents().find(function (n) {\n // return n.props.type === type && n.props.name === name;\n // });\n // if (re) {\n // return re;\n // }\n // else {\n // if (scope.children && scope.children.length) {\n // for (let i = 0; i < scope.children.length; i++) {\n // re = getClosestAmisComponentByType(scope.children[i], type, name);\n // if (re) {\n // break;\n // }\n // }\n // return re;\n // }\n \n // }\n // }\n // // 这里第二层form才是真正要提交到crud过滤条件的form\n // filterInnerForm = getClosestAmisComponentByType(filterForm.context, \"form\", \"listview-filter-form\");\n\n const filterFormValues = filterForm.getValues();\n let removedKeys = [];\n _.each(filterFormValues, function(n,k){\n // __searchable__开头的不在searchableFields范围则清除其值\n let isRemoved = !!removedFields.find(function(fieldName){\n return new RegExp(\"__searchable__\\.*\" + fieldName + \"$\").test(k);\n });\n if(isRemoved){\n removedKeys.push(k);\n }\n });\n const removedValues = {};\n removedKeys.forEach(function(key){\n removedValues[key] = \"\";\n });\n filterForm.setValues(removedValues);//这里使用filterInnerForm也可以\n\n if(isLookup){\n return;\n }\n \n // 列表视图crud支持本地缓存,所以需要进一步清除浏览器本地缓存里面用户在可搜索项中移除的字段值\n const listViewPropsStoreKey = location.pathname + \"/crud/\" + listViewId ;\n let localListViewProps = localStorage.getItem(listViewPropsStoreKey);\n if(localListViewProps){\n localListViewProps = JSON.parse(localListViewProps);\n // const removedValues = {};\n removedKeys.forEach(function(key){\n delete localListViewProps[key];\n // removedValues[key] = \"\";\n });\n localStorage.setItem(listViewPropsStoreKey, JSON.stringify(localListViewProps));\n }\n // ===END===\n `;\n return {\n \"type\": \"service\",\n \"name\": \"service_listview_filter_form\",\n \"data\": {\n // \"showFieldsFilter\": false\n // \"filterFormSearchableFields\": [\"name\"],//默认可搜索项\n // \"filterFormValues\": {\"__searchable__name\": \"xxx\"},//搜索项表单值\n // \"listViewId\": \"${listViewId}\"\n },\n \"id\": `service_listview_filter_form_${objectSchema.name}`,\n \"dataProvider\": {\n \"inited\": dataProviderInited\n },\n \"body\": {\n \"type\": \"wrapper\",\n \"body\": {\n \"type\": \"wrapper\",\n \"body\": [{\n \"type\": \"wrapper\",\n \"body\": [\n filterFormSchema\n ],\n \"size\": \"xs\",\n \"visibleOn\": \"this.filterFormSearchableFields && this.filterFormSearchableFields.length\",\n \"className\": \"slds-filters__body p-0\"\n }, {\n \"type\": \"wrapper\",\n \"body\": {\n \"type\": \"wrapper\",\n \"body\": [\n {\n \"type\": \"button\",\n \"label\": \"搜索\",\n \"icon\": \"fa fa-search\",\n \"visibleOn\": \"this.filterFormSearchableFields && this.filterFormSearchableFields.length\",\n \"onEvent\": {\n \"click\": {\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": onSearchScript\n }\n ]\n }\n }\n },\n {\n \"type\": \"button\",\n \"label\": \"设置搜索项\",\n \"onEvent\": {\n \"click\": {\n \"actions\": [\n {\n \"actionType\": \"dialog\",\n \"dialog\": {\n \"type\": \"dialog\",\n \"size\": \"md\",\n \"title\": \"设置搜索项\",\n \"body\": [\n {\n \"type\": \"form\",\n \"title\": \"\",\n \"body\": [\n {\n \"label\": \"\",\n \"type\": \"transfer\",\n \"name\": \"fields\",\n \"id\": \"u:92c0b3cccca0\",\n \"source\": {\n \"method\": \"get\",\n \"url\": \"${context.rootUrl}/service/api/amis-metadata-objects/objects/${objectName}/fields/options\",\n \"dataType\": \"json\",\n \"headers\": {\n \"Authorization\": \"Bearer ${context.tenantId},${context.authToken}\"\n },\n \"data\": null,\n \"requestAdaptor\": \"\",\n \"adaptor\": \"\"\n },\n \"options\": [],\n \"required\": true,\n \"placeholder\": \"-\",\n \"className\": \"col-span-2 m-0\",\n \"checkAll\": false,\n \"searchable\": true,\n \"sortable\": true,\n \"joinValues\": false,\n \"extractValue\": true,\n \"multiple\": true\n }\n ],\n \"id\": \"u:e5ac506d5683\",\n \"mode\": \"normal\",\n \"persistData\": false,\n \"promptPageLeave\": true,\n \"name\": \"form\",\n \"debug\": false,\n \"actions\": [],\n \"panelClassName\": \"m-0\",\n \"bodyClassName\": \"p-4\",\n \"className\": \"steedos-amis-form\"\n }\n ],\n \"id\": \"u:ca99fa9fe1b1\",\n \"actions\": [\n {\n \"type\": \"button\",\n \"label\": \"取消\",\n \"onEvent\": {\n \"click\": {\n \"actions\": [\n {\n \"componentId\": \"\",\n \"args\": {},\n \"actionType\": \"closeDialog\"\n }\n ]\n }\n },\n \"id\": \"u:4e447b5ca72a\"\n },\n {\n \"type\": \"button\",\n \"label\": \"确认\",\n \"onEvent\": {\n \"click\": {\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": onSearchableFieldsChangeScript\n },\n // {\n // \"actionType\": \"broadcast\",\n // \"eventName\": \"broadcastSearchableFieldsChange\",\n // \"args\": {\n // \"eventName\": \"broadcastSearchableFieldsChange\"\n // },\n // \"data\": {\n // \"fields\": \"${event.data.fields}\"\n // }\n // },\n {\n \"componentId\": \"\",\n \"args\": {},\n \"actionType\": \"closeDrawer\"\n }\n ]\n }\n },\n \"id\": \"u:14e7388fecd3\",\n \"level\": \"primary\"\n }\n ],\n \"closeOnEsc\": false,\n \"closeOnOutside\": false,\n \"showCloseButton\": true,\n \"data\": {\n \"&\": \"$$\",\n \"objectName\": \"${objectName}\",\n \"listName\": \"${listName}\",\n \"listViewId\": \"${listViewId}\",\n \"uiSchema\": \"${uiSchema}\",\n \"isLookup\": \"${isLookup}\",\n \"context\": \"${context}\",\n \"fields\": \"${filterFormSearchableFields}\"\n }\n }\n }\n ]\n }\n },\n \"id\": \"u:b96d84868a5a\",\n \"level\": \"link\"\n }\n ],\n \"size\": \"xs\",\n \"className\": \"space-x-4\"\n },\n \"size\": \"xs\",\n \"className\": \"slds-filters__footer slds-grid slds-shrink-none flex justify-between p-0\"\n }],\n \"size\": \"xs\",\n \"className\": \"slds-filters\"\n },\n \"size\": \"xs\",\n \"className\": `border-gray-300 border-y slds-grid slds-grid_vertical slds-nowrap ${!ctx.isLookup && \"mt-2\"}`,\n \"visibleOn\": \"this.showFieldsFilter\",\n },\n \"className\": \"bg-white\"\n };\n}\n\n","import { getApi, getRecordPermissionsApi } from './fields/table';\nimport { getSaveApi } from './api';\nimport { each, values } from 'lodash';\nimport * as graphql from './graphql'\nimport _, { isEmpty, omitBy, isNil } from 'lodash';\n\nexport const DEFAULT_CALENDAR_OPTIONS = {\n startDateExpr: \"start\",\n endDateExpr: \"end\",\n allDayExpr: \"is_all_day\",\n textExpr: \"name\"\n};\n\nexport async function getCalendarApi(mainObject, fields, options) {\n if (!options) {\n options = {};\n }\n const calendarOptions = options.calendarOptions;\n const searchableFields = [];\n let { globalFilter, filter, sort, top, setDataToComponentId = '' } = options;\n\n if(!top){\n // 日历请求不翻页\n top = 200;\n }\n\n if (_.isArray(filter)) {\n filter = _.map(filter, function (item) {\n if (item.operation) {\n return [item.field, item.operation, item.value];\n } else {\n return item\n }\n })\n }\n if (!filter) {\n filter = [];\n }\n\n _.each(fields, function (field) {\n if (field.searchable) {\n searchableFields.push(field.name);\n }\n })\n\n const idFieldName = mainObject.idFieldName || \"_id\";\n let valueField = mainObject.key_field || '_id';\n const api = await getApi(mainObject, null, fields, { alias: 'rows', limit: top, queryOptions: `filters: {__filters}, top: {__top}, skip: {__skip}, sort: \"{__sort}\"` });\n api.data.$term = \"$term\";\n api.data.$self = \"$$\";\n api.data.filter = \"$filter\";\n api.data.pageSize = top || 10;\n api.requestAdaptor = `\n let selfData = JSON.parse(JSON.stringify(api.data.$self));\n ${globalFilter ? `var filters = ${JSON.stringify(globalFilter)};` : 'var filters = [];'}\n if(_.isEmpty(filters)){\n filters = api.data.filter || ${JSON.stringify(filter)};\n }else{\n filters = [filters, 'and', api.data.filter || ${JSON.stringify(filter)}]\n }\n const eventFetchInfo = selfData.fetchInfo;\n const startDateExpr = \"${calendarOptions.startDateExpr}\";\n const endDateExpr = \"${calendarOptions.endDateExpr}\";\n const eventDurationFilters = [[endDateExpr, \">=\", eventFetchInfo.start], [startDateExpr, \"<=\", eventFetchInfo.end]];\n if(_.isEmpty(filters)){\n filters = eventDurationFilters;\n }else{\n filters = [filters, 'and', eventDurationFilters]\n }\n var pageSize = api.data.pageSize || 10;\n var pageNo = api.data.pageNo || 1;\n var skip = (pageNo - 1) * pageSize;\n var orderBy = api.data.orderBy || '';\n var orderDir = api.data.orderDir || '';\n var sort = orderBy + ' ' + orderDir;\n sort = orderBy ? sort : \"${sort}\";\n var allowSearchFields = ${JSON.stringify(searchableFields)};\n if(api.data.$term){\n filters = [[\"name\", \"contains\", \"'+ api.data.$term +'\"]];\n }else if(selfData.op === 'loadOptions' && selfData.value){\n filters = [[\"${valueField.name}\", \"=\", selfData.value]];\n }\n var searchableFilter = [];\n _.each(selfData, (value, key)=>{\n if(!_.isEmpty(value) || _.isBoolean(value)){\n if(_.startsWith(key, '__searchable__between__')){\n searchableFilter.push([\\`\\${key.replace(\"__searchable__between__\", \"\")}\\`, \"between\", value])\n }else if(_.startsWith(key, '__searchable__')){\n if(_.isString(value)){\n searchableFilter.push([\\`\\${key.replace(\"__searchable__\", \"\")}\\`, \"contains\", value])\n }else{\n searchableFilter.push([\\`\\${key.replace(\"__searchable__\", \"\")}\\`, \"=\", value])\n }\n }\n }\n });\n\n if(searchableFilter.length > 0){\n if(filters.length > 0 ){\n filters = [filters, 'and', searchableFilter];\n }else{\n filters = searchableFilter;\n }\n }\n\n if(allowSearchFields){\n allowSearchFields.forEach(function(key){\n const keyValue = selfData[key];\n if(_.isString(keyValue)){\n filters.push([key, \"contains\", keyValue]);\n }else if(_.isArray(keyValue) || _.isBoolean(keyValue) || keyValue){\n filters.push([key, \"=\", keyValue]);\n }\n })\n }\n\n if(selfData.__keywords && allowSearchFields){\n const keywordsFilters = [];\n allowSearchFields.forEach(function(key, index){\n const keyValue = selfData.__keywords;\n if(keyValue){\n keywordsFilters.push([key, \"contains\", keyValue]);\n if(index < allowSearchFields.length - 1){\n keywordsFilters.push('or');\n }\n }\n })\n filters.push(keywordsFilters);\n }\n api.data.query = api.data.query.replace(/{__filters}/g, JSON.stringify(filters)).replace('{__top}', pageSize).replace('{__skip}', skip).replace('{__sort}', sort.trim());\n delete api.data.$term;\n delete api.data.filter;\n delete api.data.pageSize;\n delete api.data.pageNo;\n delete api.data.orderBy;\n delete api.data.orderDir;\n return api;\n `\n api.adaptor = `\n window.postMessage(Object.assign({type: \"listview.loaded\"}), \"*\");\n const setDataToComponentId = \"${setDataToComponentId}\";\n if(setDataToComponentId){\n SteedosUI.getRef(api.body.$self.scopeId)?.getComponentById(setDataToComponentId)?.setData({$count: payload.data.count})\n }\n const rows = payload.data.rows || [];\n const selfData = api.data.$self;\n const events = rows.map(function(n){\n return {\n id: n[\"${idFieldName}\"],\n title: n[\"${calendarOptions.textExpr}\"],\n start: n[\"${calendarOptions.startDateExpr}\"],\n end: n[\"${calendarOptions.endDateExpr}\"],\n allDay: n[\"${calendarOptions.allDayExpr}\"]\n }\n });\n const successCallback = selfData.successCallback;\n const failureCallback = selfData.failureCallback;\n successCallback(events);\n return payload;\n `;\n return api;\n}\n\nexport function getCalendarRecordPermissionsApi(mainObject, recordId) {\n const api = getRecordPermissionsApi(mainObject, recordId, { alias: 'rows', limit: 1, fields: [\"allowEdit\"] });\n api.data.$self = \"$$\";\n api.adaptor = `\n const rows = payload.data.rows || [];\n const selfData = api.data.$self;\n const revert = selfData.revert;\n const recordPermissions = rows[0] && rows[0].recordPermissions;\n const editable = !!(recordPermissions && recordPermissions.allowEdit);\n if(!editable){\n // 没有权限时还原\n revert && revert();\n }\n payload.data.editable = editable;\n return payload;\n `;\n return api;\n}\n\nexport function getCalendarRecordSaveApi(object, calendarOptions) {\n const formData = {};\n const idFieldName = object.idFieldName || \"_id\";\n formData[idFieldName] = \"${event.data.event.id}\";\n const nameFieldKey = object.NAME_FIELD_KEY || \"name\";\n formData[nameFieldKey] = \"${event.data.event.title}\";\n formData[calendarOptions.startDateExpr] = \"${event.data.event.start}\";\n formData[calendarOptions.endDateExpr] = \"${event.data.event.end}\";\n formData[calendarOptions.allDayExpr] = \"${event.data.event.allDay}\";\n // formData[calendarOptions.textExpr] = \"${event.data.event.title}\";\n const apiData = {\n objectName: \"${objectName}\",\n $: formData,\n $self: \"$$\"\n };\n const saveDataTpl = `\n const formData = api.data.$;\n const objectName = api.data.objectName;\n let query = \\`mutation{record: \\${objectName}__update(id: \"\\${formData.${idFieldName}}\", doc: {__saveData}){${idFieldName}}}\\`;\n delete formData.${idFieldName};\n let __saveData = JSON.stringify(JSON.stringify(formData));\n `;\n const requestAdaptor = `\n ${saveDataTpl}\n api.data.query = query.replace('{__saveData}', __saveData);\n return api;\n `;\n\n return {\n method: 'post',\n url: graphql.getApi(),\n data: apiData,\n requestAdaptor: requestAdaptor,\n adaptor: `\n if(payload.errors){\n payload.status = 2;\n payload.msg = payload.errors[0].message;\n const revert = api.data.$self.event.data.revert;\n revert && revert();\n }\n return payload;\n `,\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n };\n}\n\n/**\n * 列表视图Calendar amisSchema\n * @param {*} objectSchema 对象UISchema\n * @returns amisSchema\n */\nexport async function getObjectCalendar(objectSchema, calendarOptions, options) {\n const permissions = objectSchema.permissions;\n if (!options) {\n options = {};\n }\n\n calendarOptions = Object.assign({}, DEFAULT_CALENDAR_OPTIONS, omitBy(calendarOptions, isNil));\n\n const titleFields = calendarOptions.title || [\n calendarOptions.startDateExpr, \n calendarOptions.endDateExpr, \n calendarOptions.allDayExpr, \n calendarOptions.textExpr\n ];\n let fields = [];\n each(titleFields, function (n) {\n if (objectSchema.fields[n]) {\n fields.push(objectSchema.fields[n]);\n }\n });\n\n if (objectSchema.fields[calendarOptions.allDayExpr]) {\n fields.push(objectSchema.fields[calendarOptions.allDayExpr]);\n }\n\n let sort = options.sort;\n if (!sort) {\n const sortField = options.sortField;\n const sortOrder = options.sortOrder;\n if (sortField) {\n let sortStr = sortField + ' ' + sortOrder || 'asc';\n sort = sortStr;\n }\n }\n let initialView = calendarOptions.currentView;\n if(initialView){\n // day, week, month, agenda\n switch(initialView){\n case \"day\":\n initialView = \"timeGridDay\"\n break;\n case \"week\":\n initialView = \"timeGridWeek\"\n break;\n case \"month\":\n initialView = \"dayGridMonth\"\n break;\n case \"agenda\":\n initialView = \"timeGridDay\"\n break;\n }\n }\n else{\n initialView = \"timeGridWeek\";\n }\n\n options.calendarOptions = calendarOptions;\n const api = await getCalendarApi(objectSchema, fields, options);\n\n const onGetEventsScript = `\n const api = ${JSON.stringify(api)};\n event.data.calendarOptions = ${JSON.stringify(calendarOptions)};\n doAction({\n \"actionType\": 'ajax',\n \"args\": {\n \"api\": api\n },\n });\n `;\n\n const onSelectScript = `\n const data = event.data;\n const doc = {};\n doc[\"${calendarOptions.startDateExpr}\"] = data.start;\n doc[\"${calendarOptions.endDateExpr}\"] = data.end;\n doc[\"${calendarOptions.allDayExpr}\"] = data.allDay;\n doc[\"${calendarOptions.textExpr}\"] = data.title;\n // ObjectForm会认作用域下的变量值\n // TODO: 待组件支持initValues属性后应该改掉,不应该通过data直接传值\n // TODO: 全天事件属性传入doc了但是没有生效,需要手动在ObjectForm中勾选全天事件\n event.data = doc;\n const title = \"新建 ${objectSchema.label}\";\n doAction(\n {\n \"actionType\": \"dialog\",\n \"dialog\": {\n \"type\": \"dialog\",\n \"title\": title,\n \"body\": [\n {\n \"type\": \"steedos-object-form\",\n \"objectApiName\": \"\\${objectName}\",\n \"mode\": \"edit\",\n \"onEvent\": {\n \"submitSucc\": {\n \"weight\": 0,\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": \"event.data.view?.calendar.refetchEvents();\"\n }\n ]\n }\n }\n }\n ],\n \"closeOnEsc\": false,\n \"closeOnOutside\": false,\n \"showCloseButton\": true,\n \"size\": \"lg\"\n }\n });\n `;\n\n const onEventClickScript = `\n const data = event.data;\n const eventData = data.event;\n const appId = data.appId;\n const objectName = data.objectName;\n const eventId = data.event && data.event.id;\n doAction({\n \"actionType\": \"dialog\",\n \"dialog\": {\n \"type\": \"dialog\",\n \"title\": \"\",\n \"body\": [\n {\n \"type\": \"steedos-record-detail\",\n \"objectApiName\": \"\\${objectName}\",\n \"recordId\": data.event && data.event.id\n }\n ],\n \"closeOnEsc\": false,\n \"closeOnOutside\": false,\n \"showCloseButton\": true,\n \"size\": \"lg\",\n \"actions\": []\n }\n });\n `;\n\n const recordId = \"${event.id}\";\n const recordPermissionsApi = getCalendarRecordPermissionsApi(objectSchema, recordId);\n const recordSaveApi = getCalendarRecordSaveApi(objectSchema, calendarOptions);\n \n const businessHours = {\n daysOfWeek: [ 1, 2, 3, 4, 5 ],\n startTime: '08:00',\n endTime: '18:00',\n };\n if(!isEmpty(calendarOptions.startDayHour)){\n businessHours.startTime = `${calendarOptions.startDayHour}:00`;\n }\n if(!isEmpty(calendarOptions.endDayHour)){\n businessHours.endTime = `${calendarOptions.endDayHour}:00`;\n }\n \n const amisSchema = {\n \"type\": \"steedos-fullcalendar\",\n \"label\": \"\",\n \"name\": \"fullcalendar\",\n \"editable\": permissions.allowEdit,\n \"selectable\": permissions.allowCreate,\n \"selectMirror\": permissions.allowCreate,\n \"initialView\": initialView,\n \"businessHours\": businessHours,\n \"onEvent\": {\n \"getEvents\": {\n \"weight\": 0,\n \"actions\": [\n {\n \"componentId\": \"\",\n \"args\": {\n },\n \"actionType\": \"custom\",\n \"script\": onGetEventsScript\n }\n ]\n },\n \"select\": {\n \"weight\": 0,\n \"actions\": [\n {\n \"componentId\": \"\",\n \"args\": {\n },\n \"actionType\": \"custom\",\n \"script\": onSelectScript\n }\n ]\n },\n \"eventClick\": {\n \"weight\": 0,\n \"actions\": [\n {\n \"componentId\": \"\",\n \"args\": {\n },\n \"actionType\": \"custom\",\n \"script\": onEventClickScript\n }\n ]\n },\n \"eventAdd\": {\n \"weight\": 0,\n \"actions\": [\n {\n \"componentId\": \"\",\n \"args\": {\n },\n \"actionType\": \"custom\",\n \"script\": \"console.log('eventAdd'); console.log(event);\"\n }\n ]\n },\n \"eventChange\": {\n \"weight\": 0,\n \"actions\": [\n {\n \"actionType\": 'ajax',\n \"args\": {\n \"api\": recordPermissionsApi\n }\n },\n {\n \"actionType\": \"toast\",\n \"expression\": \"!event.data.editable\",\n \"args\": {\n \"msgType\": \"error\",\n \"msg\": \"您没有编辑该记录的权限!\",\n \"position\": \"top-center\"\n }\n },\n {\n \"actionType\": 'ajax',\n \"expression\": \"event.data.editable\",\n \"args\": {\n \"api\": recordSaveApi,\n \"messages\": {\n \"success\": objectSchema.label + \"修改成功\",\n \"failed\": objectSchema.label + \"修改失败!\"\n }\n }\n }\n ]\n },\n \"eventRemove\": {\n \"weight\": 0,\n \"actions\": [\n {\n \"componentId\": \"\",\n \"args\": {\n },\n \"actionType\": \"custom\",\n \"script\": \"console.log('eventRemove'); console.log(event);\"\n }\n ]\n },\n \"eventsSet\": {\n \"weight\": 0,\n \"actions\": [\n {\n \"componentId\": \"\",\n \"args\": {\n },\n \"actionType\": \"custom\",\n \"script\": \"console.log('eventsSet'); console.log(event);\"\n }\n ]\n },\n }\n };\n return amisSchema;\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-09-01 09:00:26\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-09-03 13:21:38\n * @Description: \n */\nimport { fetchAPI, getSteedosAuth } from \"./steedos.client\"\nimport { each } from \"lodash\";\n\nconst getGraphqlFieldsQuery = (fields)=>{\n const fieldsName = ['_id'];\n fields.push('record_permissions');\n //TODO 此处需要考虑相关对象查询\n each(fields, (fieldName)=>{\n if(fieldName.indexOf('.') > -1){\n fieldName = fieldName.split('.')[0]\n }\n fieldsName.push(`${fieldName}`)\n })\n return `${fieldsName.join(' ')}`;\n}\n\nconst getFindOneQuery = (objectName, id, fields)=>{\n objectName = objectName.replace(/\\./g, '_');\n const queryFields = getGraphqlFieldsQuery(fields);\n let queryOptions = ''\n let alias = \"record\";\n \n const queryOptionsArray = [`id: \"${id}\"`];\n \n if(queryOptionsArray.length > 0){\n queryOptions = `(${queryOptionsArray.join(',')})`\n }\n\n return `{${alias}:${objectName}__findOne${queryOptions}{${queryFields}}}`\n}\n\nexport const getRecord = async (objectName, recordId, fields)=>{\n const result = await fetchAPI('/graphql', {\n method: 'post',\n body: JSON.stringify({\n query: getFindOneQuery(objectName, recordId, fields)\n })\n })\n return result.data.record;\n}\n\nexport const getRelatedsCount = async (masterRecordId, relateds) => {\n const relatedQuery = [];\n\n each(relateds, (relate)=>{\n relatedQuery.push(`${relate.object_name}: ${relate.object_name}__count(filters: [[\"${relate.foreign_key}\",\"=\",\"${masterRecordId}\"]])`);\n })\n\n const query = `\n {\n ${relatedQuery.join(',')}\n }\n `;\n const result = await fetchAPI('/graphql', {\n method: 'POST',\n body: JSON.stringify({ query })\n })\n\n return result.data\n}\n\nexport const getRecordPermissions = async (objectName, recordId)=>{\n const result = await fetchAPI(`/service/api/@${objectName}/recordPermissions/${recordId}`, {\n method: 'GET'\n })\n return result;\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-07-05 15:55:39\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2023-01-11 14:07:02\n * @Description:\n */\nimport { fetchAPI, getUserId } from \"./steedos.client\";\nimport { getObjectFieldsFilterFormSchema } from './converter/amis/fields_filter';\nimport { getObjectCalendar } from './converter/amis/calendar';\n\nimport {\n getObjectList,\n getObjectDetail,\n getObjectForm,\n} from \"./converter/amis/index\";\nimport { getObjectListHeader, getObjectListHeaderFirstLine, getObjectRecordDetailHeader, getObjectRecordDetailRelatedListHeader } from './converter/amis/header';\nimport _, { cloneDeep, slice, isEmpty, each, has, findKey, find, isString, isObject, keys, includes, isArray, isFunction, map, forEach, defaultsDeep } from \"lodash\";\nimport { getRecord } from './record';\nimport { getListViewItemButtons } from './buttons'\n\nlet UI_SCHEMA_CACHE = {};\n\nlet UISchemaFunction;\nexport const setUISchemaFunction = function(fun){\n UISchemaFunction = fun;\n};\n\nif('undefined' != typeof window){\n if(!window.UI_SCHEMA_CACHE){\n window.UI_SCHEMA_CACHE = UI_SCHEMA_CACHE;\n }\n UI_SCHEMA_CACHE = window.UI_SCHEMA_CACHE;\n}\n\nconst setUISchemaCache = (key, value) => {\n UI_SCHEMA_CACHE[key] = value;\n};\n\nconst getUISchemaCache = (key) => {\n return cloneDeep(UI_SCHEMA_CACHE[key]);\n};\n\nconst hasUISchemaCache = (key) => {\n return has(UI_SCHEMA_CACHE, key);\n};\n\nexport function getListViewColumns(listView, formFactor) {\n let listViewColumns = [];\n if (formFactor === \"SMALL\") {\n listViewColumns = !isEmpty(listView.mobile_columns)\n ? listView.mobile_columns\n : slice(listView.columns, 0, 4);\n } else {\n listViewColumns = listView.columns;\n }\n return listViewColumns;\n};\n\nexport function getListViewSort(listView) {\n let sort = '';\n if(listView && listView.sort && listView.sort.length){\n each(listView.sort,function(item,index){\n if(isArray(item)){\n const field_name = item[0];\n const order = item[1] || '';\n let sortStr = field_name + ' ' + order;\n sortStr = index > 0 ? ','+sortStr : sortStr\n sort += sortStr;\n }else{\n let sortStr = item.field_name + ' ' + item.order;\n sortStr = index > 0 ? ','+sortStr : sortStr\n sort += sortStr;\n }\n })\n }\n return sort;\n};\n\nexport function getListViewFilter(listView){\n if(!listView){\n return ;\n }\n const userId = getUserId();\n let filters = listView.filters;\n if(listView.filter_scope === 'mine'){\n if(_.isEmpty(filters)){\n filters = [[\"owner\", \"=\", userId]]\n }else{\n filters.push([\"owner\", \"=\", userId])\n }\n };\n return filters;\n}\n\n\nexport async function getUISchema(objectName, force) {\n if (!objectName) {\n return;\n }\n if (hasUISchemaCache(objectName) && !force) {\n return getUISchemaCache(objectName);\n }\n let uiSchema = null;\n try {\n if(UISchemaFunction){\n uiSchema = await UISchemaFunction(objectName, force);\n }\n else {\n const url = `/service/api/@${objectName.replace(/\\./g, \"_\")}/uiSchema`;\n uiSchema = await fetchAPI(url, { method: \"get\" });\n }\n if(!uiSchema){\n return ;\n }\n setUISchemaCache(objectName, uiSchema);\n // for (const fieldName in uiSchema.fields) {\n // if (uiSchema.fields) {\n // const field = uiSchema.fields[fieldName];\n\n // if (\n // (field.type === \"lookup\" || field.type === \"master_detail\") &&\n // field.reference_to\n // ) {\n // let refTo = null;\n // if(isFunction(field.reference_to)){\n // try {\n // refTo = eval(field.reference_to)();\n // } catch (error) {\n // console.error(error)\n // }\n // }\n // if(isString(field.reference_to)){\n // refTo = [field.reference_to]\n // }else if(isArray(field.reference_to)){\n // refTo = field.reference_to\n // }\n // for (const item of refTo) {\n // const refUiSchema = await getUISchema(item);\n // if (!refUiSchema) {\n // delete uiSchema.fields[fieldName];\n // }\n // }\n \n // }\n // }\n // }\n each(uiSchema.list_views, (v, k)=>{\n v.name = k;\n if(!has(v, 'columns')){\n v.columns = uiSchema.list_views.all.columns;\n }\n })\n } catch (error) {\n console.error(`getUISchema`, objectName, error);\n setUISchemaCache(objectName, null);\n }\n return getUISchemaCache(objectName);\n}\n\nexport async function getField(objectName, fieldName) {\n const uiSchema = await getUISchema(objectName);\n return uiSchema?.fields[fieldName];\n}\n\n// 获取表单页面\nexport async function getFormSchema(objectName, ctx) {\n const uiSchema = await getUISchema(objectName);\n const amisSchema = await getObjectForm(uiSchema, ctx);\n return {\n uiSchema,\n amisSchema,\n };\n}\n\n// 获取只读页面\nexport async function getViewSchema(objectName, recordId, ctx) {\n const uiSchema = await getUISchema(objectName);\n const amisSchema = await getObjectDetail(uiSchema, recordId, ctx);\n return {\n uiSchema,\n amisSchema,\n };\n}\n\n// 获取列表视图\nexport async function getListSchema(\n appName,\n objectName,\n listViewName,\n ctx = {}\n) {\n const uiSchema = await getUISchema(objectName);\n const listView = find(\n uiSchema.list_views,\n (listView, name) => {\n // 传入listViewName空值则取第一个\n if(!listViewName){\n listViewName = name;\n }\n return name === listViewName || listView._id === listViewName;\n }\n );\n\n if (!listView) {\n return { uiSchema };\n }\n\n if(listView.enable_amis_schema && listView.amis_schema){\n const amisSchema = isString(listView.amis_schema) ? JSON.parse(listView.amis_schema) : listView.amis_schema;\n return {\n uiSchema,\n isCustomAmisSchema: true,\n amisSchema\n };\n }\n\n let listViewColumns = getListViewColumns(listView, ctx.formFactor);\n let sort = getListViewSort(listView);\n let listviewFilter = getListViewFilter(listView, ctx);\n let listview_filters = listView && listView._filters;\n if(listView.type === \"calendar\"){\n const amisSchema = {\n \"type\": \"steedos-object-calendar\",\n \"objectApiName\": objectName,\n \"filters\": listviewFilter,\n \"filtersFunction\": listview_filters,\n \"sort\": sort,\n ...listView.options\n };\n return {\n uiSchema,\n isCalendar: true,\n amisSchema\n };\n }\n\n const defaults = ctx.defaults || {};\n\n if(!defaults.headerSchema && ctx.showHeader){\n defaults.headerSchema = await getObjectListHeader(uiSchema, listViewName);\n }\n\n if(!ctx.showHeader){\n defaults.headerSchema = null;\n }\n\n try {\n const listViewPropsStoreKey = location.pathname + \"/crud/\" + ctx.listViewId;\n let localListViewProps = localStorage.getItem(listViewPropsStoreKey);\n /**\n * localListViewProps规范来自crud请求api中api.data.$self参数值的。\n * 比如:{\"perPage\":20,\"page\":1,\"__searchable__name\":\"7\",\"__searchable__between__n1__c\":[null,null],\"filter\":[[\"name\",\"contains\",\"a\"]]}\n * __searchable__...:顶部放大镜搜索条件\n * filter:右侧过滤器\n * perPage:每页条数\n * page:当前页码\n * orderBy:排序字段\n * orderDir:排序方向\n */\n if (localListViewProps) {\n localListViewProps = JSON.parse(localListViewProps);\n // localListViewProps.perPage = 3;\n let listSchema = {};\n if(localListViewProps.orderBy){\n listSchema.orderBy = localListViewProps.orderBy;\n }\n if(localListViewProps.orderDir){\n listSchema.orderDir = localListViewProps.orderDir;\n }\n if(localListViewProps.perPage){\n listSchema.defaultParams = {\n perPage: localListViewProps.perPage\n }\n }\n defaults.listSchema = defaultsDeep({}, listSchema, defaults.listSchema || {});\n }\n }\n catch (ex) {\n console.error(\"本地存储中crud参数解析异常:\", ex);\n }\n\n ctx.defaults = defaults;\n\n const amisSchema = {\n \"type\": \"steedos-object-table\",\n \"objectApiName\": objectName,\n \"columns\": listViewColumns,\n \"extraColumns\": listView.extra_columns,\n \"filters\": listviewFilter,\n \"filtersFunction\": listview_filters,\n \"sort\": sort,\n \"ctx\": ctx\n };\n\n return {\n uiSchema,\n amisSchema,\n };\n}\n\n// 获取对象表格\nexport async function getTableSchema(\n appName,\n objectName,\n columns,\n ctx = {}\n) {\n const uiSchema = await getUISchema(objectName);\n\n let sort = ctx.sort;\n if(!sort){\n const sortField = ctx.sortField;\n const sortOrder = ctx.sortOrder;\n if(sortField){\n let sortStr = sortField + ' ' + sortOrder || 'asc';\n sort = sortStr;\n }\n }\n\n let fields = [];\n each(columns, function (column) {\n if (isString(column) && uiSchema.fields[column]) {\n fields.push(uiSchema.fields[column]);\n } else if (isObject(column) && uiSchema.fields[column.field]) {\n fields.push(\n Object.assign({}, uiSchema.fields[column.field], {\n width: column.width,\n wrap: column.wrap,\n })\n );\n }\n });\n\n const extraColumns = ctx.extraColumns;\n\n if (extraColumns) {\n each(extraColumns, function (column) {\n if (isString(column)) {\n fields.push({ extra: true, name: column });\n } else if (isObject(column)) {\n fields.push({ extra: true, name: column.field });\n }\n });\n }\n \n const amisSchema = await getObjectList(uiSchema, fields, {\n tabId: objectName,\n appId: appName,\n objectName: objectName,\n ...ctx,\n filter: ctx.filters,\n sort,\n buttons: await getListViewItemButtons(uiSchema, ctx)\n });\n\n return {\n uiSchema,\n amisSchema,\n };\n}\n\n// 获取对象日历\nexport async function getCalendarSchema(\n appName,\n objectName,\n calendarOptions,\n ctx = {}\n) {\n const uiSchema = await getUISchema(objectName);\n const amisSchema = await getObjectCalendar(uiSchema, calendarOptions, {\n tabId: objectName,\n appId: appName,\n objectName: objectName,\n ...ctx\n });\n return {\n uiSchema,\n amisSchema\n };\n}\n\nexport async function getRecordDetailHeaderSchema(objectName,recordId, options){\n const uiSchema = await getUISchema(objectName);\n const amisSchema = await getObjectRecordDetailHeader(uiSchema, recordId, options);\n return {\n uiSchema,\n amisSchema,\n };\n}\n\nexport async function getRecordDetailSchema(objectName, appId){\n const uiSchema = await getUISchema(objectName);\n return {\n uiSchema,\n amisSchema: {\n \"type\": \"service\",\n \"body\": [\n {\n \"type\": \"steedos-record-detail-header\",\n \"label\": \"标题面板\",\n \"objectApiName\": \"${objectName}\",\n \"recordId\": \"${recordId}\",\n \"id\": \"u:48d2c28eb755\",\n onEvent: {\n \"recordLoaded\": {\n \"actions\": [\n {\n \"actionType\": \"reload\",\n \"data\": {\n \"name\": `\\${record.${uiSchema?.NAME_FIELD_KEY || 'name'}}`,\n \"record\": `\\${record}`,\n \"recordLoaded\": true\n }\n }\n ]\n }\n },\n },\n {\n \"type\": \"tabs\",\n \"className\": \"sm:mt-3 bg-white sm:shadow sm:rounded sm:border border-slate-300 p-4\",\n \"tabs\": [\n {\n \"title\": \"详细\",\n \"className\": \"px-0 py-4\",\n \"body\": [\n {\n \"type\": \"steedos-object-form\",\n \"label\": \"对象表单\",\n \"objectApiName\": \"${objectName}\",\n \"recordId\": \"${recordId}\",\n \"id\": \"u:d4a495811d57\", \n appId: appId\n }\n ],\n \"id\": \"u:5d4e7e3f6ecc\"\n },\n {\n \"title\": \"相关\",\n \"className\": \"px-0 pt-4\",\n \"body\": [\n {\n \"type\": \"steedos-object-related-lists\",\n \"label\": \"相关列表\",\n \"objectApiName\": \"${objectName}\",\n \"recordId\": \"${recordId}\",\n \"id\": \"u:3b85b7b7a7f6\", \n appId: appId\n }\n ],\n \"id\": \"u:1a0326aeec2b\"\n }\n ],\n \"id\": \"u:a649e4094a12\"\n }\n ],\n }\n }\n}\n\n// export async function getRecordDetailRelatedListSchema(objectName,recordId,relatedObjectName){\n// // console.log('b==>',objectName,recordId,relatedObjectName)\n// const relatedObjectUiSchema = await getUISchema(relatedObjectName);\n// const { list_views, label , icon, fields } = relatedObjectUiSchema;\n// const firstListViewName = keys(list_views)[0];\n// const relatedKey = findKey(fields, function(field) { \n// return [\"lookup\",\"master_detail\"].indexOf(field.type) > -1 && field.reference_to === objectName; \n// });\n// const globalFilter = [relatedKey,'=',recordId];\n// const recordRelatedListHeader = await getObjectRecordDetailRelatedListHeader(relatedObjectUiSchema);\n// const options = {\n// globalFilter,\n// defaults: {\n// listSchema: { headerToolbar:[],columnsTogglable:false },\n// headerSchema: recordRelatedListHeader\n// },\n// showHeader: true\n// }\n// const amisSchema= (await getListSchema(null, relatedObjectName, firstListViewName, options)).amisSchema;\n// return {\n// uiSchema: relatedObjectUiSchema,\n// amisSchema: {\n// type: \"service\",\n// data: {\n// masterObjectName: objectName,\n// masterRecordId: \"${recordId}\",\n// relatedKey: relatedKey, \n// objectName: relatedObjectName,\n// listViewId: `amis-\\${appId}-${relatedObjectName}-listview`,\n// },\n// body:[\n// {\n// ...amisSchema,\n// data: {\n// filter: [\"${relatedKey}\", \"=\", \"${masterRecordId}\"],\n// objectName: \"${objectName}\",\n// recordId: \"${masterRecordId}\",\n// ...{[relatedKey]: getRelatedFieldValue(objectName, \"${recordId}\", relatedSchema.uiSchema, relatedKey)}\n// }\n// }\n// ]\n// }\n// };\n// }\n\n// 获取所有相关表\nexport async function getObjectRelatedList(\n appName,\n objectName,\n recordId,\n formFactor\n) {\n const uiSchema = await getUISchema(objectName);\n\n const related = [];\n\n const relatedLists = [].concat(uiSchema.related_lists || []);\n\n if(!isEmpty(relatedLists)){\n for (const relatedList of relatedLists) {\n const arr = relatedList.related_field_fullname.split(\".\");\n let filter = null;\n const refField = await getField(arr[0], arr[1]);\n if(refField){\n if (\n refField._reference_to ||\n (refField.reference_to && !isString(refField.reference_to))\n ) {\n filter = [\n [`${arr[1]}/o`, \"=\", objectName],\n [`${arr[1]}/ids`, \"=\", recordId],\n ];\n } else {\n filter = [`${arr[1]}`, \"=\", recordId];\n }\n const relatedUiSchema = await getUISchema(arr[0]);\n if(relatedUiSchema){\n let fields = [];\n forEach(relatedList.field_names , (fName)=>{\n const field = find(relatedUiSchema.fields, (item)=>{\n return item.name === fName\n })\n if(field){\n fields.push(field);\n }\n })\n related.push({\n masterObjectName: objectName,\n object_name: arr[0],\n foreign_key: arr[1],\n label: relatedList.label,\n schema: {\n uiSchema: relatedUiSchema,\n amisSchema: await getObjectList(relatedUiSchema, fields, {\n tabId: objectName,\n appId: appName,\n objectName: arr[0],\n formFactor: formFactor,\n globalFilter: filter,\n buttons: await getListViewItemButtons(relatedUiSchema, {isMobile: false})\n })\n }\n });\n }\n }\n }\n\n }else{\n const details = [].concat(uiSchema.details || []);\n\n for (const detail of details) {\n const arr = detail.split(\".\");\n const relatedUiSchema = await getUISchema(arr[0]);\n if(relatedUiSchema){\n let filter = null;\n const refField = await getField(arr[0], arr[1]);\n if (\n refField._reference_to ||\n (refField.reference_to && !isString(refField.reference_to))\n ) {\n filter = [\n [`${arr[1]}/o`, \"=\", objectName],\n [`${arr[1]}/ids`, \"=\", recordId],\n ];\n } else {\n filter = [`${arr[1]}`, \"=\", recordId];\n }\n \n related.push({\n masterObjectName: objectName,\n object_name: arr[0],\n foreign_key: arr[1],\n schema: await getListSchema(appName, arr[0], \"all\", {\n globalFilter: filter,\n formFactor: formFactor,\n buttons: await getListViewItemButtons(relatedUiSchema, {isMobile: false})\n }),\n });\n }\n }\n }\n\n return related;\n}\n\n// 获取单个相关表\nexport async function getObjectRelated(\n {appName,\n masterObjectName,\n objectName,\n relatedFieldName,\n recordId,\n formFactor}\n) {\n let filter = null;\n const refField = await getField(objectName, relatedFieldName);\n if (\n refField._reference_to ||\n (refField.reference_to && !isString(refField.reference_to))\n ) {\n filter = [\n [`${relatedFieldName}/o`, \"=\", masterObjectName],\n [`${relatedFieldName}/ids`, \"=\", recordId],\n ];\n } else {\n filter = [`${relatedFieldName}`, \"=\", recordId];\n }\n const masterObjectUISchema = await getUISchema(masterObjectName);\n return {\n masterObjectName: masterObjectName,\n object_name: objectName,\n foreign_key: relatedFieldName,\n schema: await getListSchema(appName, objectName, \"all\", {\n globalFilter: filter,\n formFactor: formFactor,\n }),\n record: await getRecord(masterObjectName, recordId, [\n masterObjectUISchema.NAME_FIELD_KEY,\n ]),\n masterObjectUISchema: masterObjectUISchema,\n };\n}\n\nexport async function getSearchableFieldsFilterSchema(objectSchema, fields, ctx) {\n return await getObjectFieldsFilterFormSchema(objectSchema, fields, ctx);\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-07-05 15:55:39\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2023-01-11 14:08:49\n * @Description:\n */\n\nimport {\n getObjectList\n} from \"./converter/amis/index\";\nimport { getObjectRecordDetailRelatedListHeader } from './converter/amis/header';\nimport { isEmpty, find, isString, forEach, keys, findKey } from \"lodash\";\nimport { getListViewItemButtons } from './buttons'\nimport { getUISchema, getListSchema, getField } from './objects'\nimport { getRecord } from './record';\n\nexport const getRelatedFieldValue = (masterObjectName, record_id, uiSchema, foreign_key) => {\n const relatedField = find(uiSchema.fields, (field) => {\n return foreign_key === field?.name\n });\n // console.log(`getRelatedFieldValue`, relatedField, uiSchema, foreign_key)\n if (!isString(relatedField.reference_to)) {\n return { o: masterObjectName, ids: [record_id] }\n } else if (relatedField.multiple) {\n return [record_id]\n } else {\n return record_id\n }\n}\n\n// 获取所有相关表\nexport async function getAmisObjectRelatedList(\n appName,\n objectName,\n recordId,\n formFactor\n) {\n const uiSchema = await getUISchema(objectName);\n const related = [];\n const relatedLists = [].concat(uiSchema.related_lists || []);\n if(!isEmpty(relatedLists)){\n for (const relatedList of relatedLists) {\n const arr = relatedList.related_field_fullname.split(\".\");\n let filter = null;\n const refField = await getField(arr[0], arr[1]);\n if(refField){\n if (\n refField._reference_to ||\n (refField.reference_to && !isString(refField.reference_to))\n ) {\n filter = [\n [`${arr[1]}/o`, \"=\", objectName],\n [`${arr[1]}/ids`, \"=\", recordId],\n ];\n } else {\n filter = [`${arr[1]}`, \"=\", recordId];\n }\n const relatedUiSchema = await getUISchema(arr[0]);\n if(relatedUiSchema){\n let fields = [];\n forEach(relatedList.field_names , (fName)=>{\n const field = find(relatedUiSchema.fields, (item)=>{\n return item.name === fName\n })\n if(field){\n fields.push(field);\n }\n })\n // TODO: 也需在amisSchema上再添加一层service\n related.push({\n masterObjectName: objectName,\n object_name: arr[0],\n foreign_key: arr[1],\n schema: {\n uiSchema: relatedUiSchema,\n amisSchema: await getObjectList(relatedUiSchema, fields, {\n tabId: objectName,\n appId: appName,\n objectName: arr[0],\n formFactor: formFactor,\n globalFilter: filter,\n buttons: await getListViewItemButtons(relatedUiSchema, {isMobile: false})\n })\n }\n });\n }\n }\n }\n\n }else{\n const details = [].concat(uiSchema.details || []);\n\n for (const detail of details) {\n const arr = detail.split(\".\");\n const relatedUiSchema = await getUISchema(arr[0]);\n if(relatedUiSchema){\n let filter = null;\n const refField = await getField(arr[0], arr[1]);\n if (\n refField._reference_to ||\n (refField.reference_to && !isString(refField.reference_to))\n ) {\n filter = [\n [`${arr[1]}/o`, \"=\", objectName],\n [`${arr[1]}/ids`, \"=\", recordId],\n ];\n } else {\n filter = [`${arr[1]}`, \"=\", recordId];\n }\n const relatedSchema = await getListSchema(appName, arr[0], \"all\", {\n // globalFilter: filter,\n formFactor: formFactor,\n buttons: await getListViewItemButtons(relatedUiSchema, {isMobile: false})\n });\n\n const relatedAmisSchema = relatedSchema.amisSchema;\n const recordRelatedListHeader = await getObjectRecordDetailRelatedListHeader(relatedUiSchema);\n relatedAmisSchema.headerSchema = recordRelatedListHeader;\n // relatedAmisSchema.listSchema = { headerToolbar:[],columnsTogglable:false };\n relatedAmisSchema.headerToolbar = [];\n relatedAmisSchema.columnsTogglable = false ;\n delete relatedAmisSchema.ctx;\n relatedSchema.amisSchema = {\n type: \"service\",\n className: \"b-a m-b\",\n data: {\n masterObjectName: objectName,\n masterRecordId: \"${recordId}\",\n relatedKey: arr[1], \n objectName: arr[0],\n listViewId: `amis-\\${appId}-${arr[0]}-listview`,\n },\n body:[\n {\n ...relatedAmisSchema,\n data: {\n filter: [\"${relatedKey}\", \"=\", \"${masterRecordId}\"],\n objectName: \"${objectName}\",\n recordId: \"${masterRecordId}\",\n defaultData: {\n ...{[arr[1]]: getRelatedFieldValue(objectName, recordId, relatedSchema.uiSchema, arr[1])}\n }\n }\n }\n ]\n }\n\n related.push({\n masterObjectName: objectName,\n object_name: arr[0],\n foreign_key: arr[1],\n schema: relatedSchema,\n });\n }\n }\n }\n\n return related;\n}\n\n// 获取单个相关表\nexport async function getRecordDetailRelatedListSchema(objectName, recordId, relatedObjectName, relatedKey, top, perPage, hiddenEmptyTable, appId, relatedLabel, className){\n // console.log('b==>',objectName,recordId,relatedObjectName)\n const relatedObjectUiSchema = await getUISchema(relatedObjectName);\n const { list_views, label , icon, fields } = relatedObjectUiSchema;\n if(!relatedLabel){\n relatedLabel = label;\n }\n const firstListViewName = keys(list_views)[0];\n if(!relatedKey){\n relatedKey = findKey(fields, function(field) { \n return [\"lookup\",\"master_detail\"].indexOf(field.type) > -1 && field.reference_to === objectName; \n });\n }\n let globalFilter = null;\n const refField = await getField(relatedObjectName, relatedKey);\n\n let relatedValue = recordId;\n if(refField.reference_to_field && refField.reference_to_field != '_id'){\n const masterRecord = await getRecord(objectName, recordId, [refField.reference_to_field]);\n relatedValue = masterRecord[refField.reference_to_field]\n }\n \n if (\n refField._reference_to ||\n (refField.reference_to && !isString(refField.reference_to))\n ) {\n globalFilter = [\n [`${relatedKey}/o`, \"=\", objectName],\n [`${relatedKey}/ids`, \"=\", relatedValue],\n ];\n } else {\n globalFilter = [`${relatedKey}`, \"=\", relatedValue];\n }\n const recordRelatedListHeader = await getObjectRecordDetailRelatedListHeader(relatedObjectUiSchema, relatedLabel);\n const componentId = `steedos-record-related-list-${relatedObjectName}`;\n const options = {\n globalFilter,\n defaults: {\n listSchema: { headerToolbar:[],columnsTogglable:false },\n headerSchema: recordRelatedListHeader\n },\n showHeader: true,\n top: top,\n perPage: perPage,\n setDataToComponentId: componentId,\n tableHiddenOn: hiddenEmptyTable ? \"this.$count === 0\" : null,\n appId: appId\n }\n const amisSchema= (await getListSchema(null, relatedObjectName, firstListViewName, options)).amisSchema;\n return {\n uiSchema: relatedObjectUiSchema,\n amisSchema: {\n type: \"service\",\n id: componentId,\n className: `steedos-record-related-list sm:rounded sm:border border-slate-300 bg-gray-100 mb-4 ${className}`,\n data: {\n \"&\": \"$$\",\n appId: \"${appId}\",\n app_id: \"${appId}\",\n masterObjectName: objectName,\n masterRecordId: \"${recordId}\",\n relatedKey: relatedKey, \n objectName: relatedObjectName,\n listViewId: `amis-\\${appId}-${relatedObjectName}-listview`,\n },\n body:[\n {\n ...amisSchema,\n data: {\n \"&\": \"$$\",\n appId: \"${appId}\",\n app_id: \"${appId}\",\n // filter: [\"${relatedKey}\", \"=\", \"${masterRecordId}\"], 此语法不符合amis 数据映射规范\n relatedKey: relatedKey,\n objectName: \"${objectName}\",\n recordId: \"${masterRecordId}\",\n defaultData: {\n ...{[relatedKey]: getRelatedFieldValue(objectName, relatedValue, relatedObjectUiSchema, relatedKey)}\n }\n }\n }\n ]\n }\n };\n}","import { map } from 'lodash';\n\nconst PUBLIC_ENV = {};\n\nexport const setEnv = (k, v)=>{\n PUBLIC_ENV[k] = v;\n}\n\nexport const getEnv = (k) =>{\n return PUBLIC_ENV[k];\n}\n\nexport const setEnvs = (data) =>{\n map(data, (v, k)=>{\n PUBLIC_ENV[k] = v;\n });\n}\n\nexport const getEnvs = () =>{\n return PUBLIC_ENV;\n}","import { getUISchema } from './objects';\n\nexport async function getSpaceUsersPickerAmisSchema(spaceUserSchema, name, options) {\n return {\n \"type\": \"picker\",\n \"label\": \"人员\",\n \"name\": name,\n \"id\": options.id,\n \"modalMode\": \"dialog\",\n \"joinValues\": false,\n \"source\": {\n \"method\": \"post\",\n \"url\": \"${context.rootUrl}/graphql\",\n \"data\": {\n \"orderBy\": \"${orderBy}\",\n \"orderDir\": \"${orderDir}\",\n \"pageNo\": \"${page}\",\n \"pageSize\": \"${perPage}\",\n \"query\": \"{rows:space_users(filters: {__filters}, top: {__top}, skip: {__skip}, sort: \\\"{__sort}\\\"){_id,name,email,mobile},count:space_users__count(filters:{__filters})}\",\n \"$term\": \"$term\",\n \"$self\": \"$$\"\n },\n \"requestAdaptor\": \"\\n const selfData = JSON.parse(JSON.stringify(api.data.$self));\\n var filters = [];\\n var pageSize = api.data.pageSize || 10;\\n var pageNo = api.data.pageNo || 1;\\n var skip = (pageNo - 1) * pageSize;\\n var orderBy = api.data.orderBy || '';\\n var orderDir = api.data.orderDir || '';\\n var sort = orderBy + ' ' + orderDir;\\n var allowSearchFields = [\\\"name\\\"];\\n if(api.data.$term){\\n filters = [[\\\"name\\\", \\\"contains\\\", \\\"'+ api.data.$term +'\\\"]];\\n }else if(selfData.op === 'loadOptions' && selfData.value){\\n filters = [[\\\"_id\\\", \\\"=\\\", selfData.value]];\\n }\\n if(allowSearchFields){\\n allowSearchFields.forEach(function(key){\\n const keyValue = selfData[key];\\n if(keyValue){\\n filters.push([key, \\\"contains\\\", keyValue]);\\n }\\n })\\n }\\n api.data.query = api.data.query.replace(/{__filters}/g, JSON.stringify(filters)).replace('{__top}', pageSize).replace('{__skip}', skip).replace('{__sort}', sort.trim());\\n return api;\\n \"\n },\n \"pickerSchema\": {\n \"mode\": \"table\",\n \"name\": \"thelist\",\n \"draggable\": false,\n \"headerToolbar\": [\n \"switch-per-page\",\n \"pagination\"\n ],\n \"defaultParams\": {\n \"perPage\": 50\n },\n \"columns\": [\n {\n \"name\": \"_index\",\n \"type\": \"text\",\n \"width\": 32,\n \"placeholder\": \"\"\n },\n {\n \"name\": \"_id\",\n \"label\": \"ID\",\n \"type\": \"text\",\n \"toggled\": false\n },\n {\n \"name\": \"name\",\n \"label\": \"姓名\",\n \"sortable\": true,\n \"searchable\": true,\n \"type\": \"text\"\n },\n {\n \"name\": \"email\",\n \"label\": \"邮件\",\n \"sortable\": true,\n \"type\": \"text\",\n \"searchable\": true\n },\n {\n \"name\": \"mobile\",\n \"label\": \"手机\",\n \"type\": \"text\",\n \"sortable\": true,\n \"searchable\": true\n }\n ],\n \"syncLocation\": false,\n \"keepItemSelectionOnPageChange\": true\n },\n \"labelField\": \"name\",\n \"valueField\": \"_id\",\n \"size\": \"lg\",\n \"extractValue\": true,\n \"className\": \"m-0\",\n \"labelClassName\": \"text-left\"\n }\n}\n\nexport async function getSpaceUsersPickerSchema(name, options) {\n const uiSchema = await getUISchema(\"space_users\");\n const amisSchema = await getSpaceUsersPickerAmisSchema(uiSchema, name, options);\n return {\n uiSchema,\n amisSchema,\n };\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-08-02 11:19:09\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-08-05 11:15:42\n * @Description:\n */\n// # 日期类型: date, datetime 支持操作符: \"=\", \"<>\", \"<\", \">\", \"<=\", \">=\"\n// # 文本类型: text, textarea, html 支持操作符: \"=\", \"<>\", \"contains\", \"notcontains\", \"startswith\"\n// # 选择类型: lookup, master_detail, select 支持操作符: \"=\", \"<>\"\n// # 数值类型: currency, number 支持操作符: \"=\", \"<>\", \"<\", \">\", \"<=\", \">=\"\n// # 布尔类型: boolean 支持操作符: \"=\", \"<>\"\n// # 数组类型: checkbox, [text] 支持操作符: \"=\", \"<>\"\nimport lodash from 'lodash';\n\nconst DATE_DATETIME_BETWEEN_VALUES = [\n \"last_year\",\n \"this_year\",\n \"next_year\",\n \"last_quarter\",\n \"this_quarter\",\n \"next_quarter\",\n \"last_month\",\n \"this_month\",\n \"next_month\",\n \"last_week\",\n \"this_week\",\n \"next_week\",\n \"yestday\",\n \"today\",\n \"tomorrow\",\n \"last_7_days\",\n \"last_30_days\",\n \"last_60_days\",\n \"last_90_days\",\n \"last_120_days\",\n \"next_7_days\",\n \"next_30_days\",\n \"next_60_days\",\n \"next_90_days\",\n \"next_120_days\",\n];\n\n/**\n *\n */\n\nconst opMaps = {\n equal: \"=\",\n not_equal: \"!=\",\n less: \"<\",\n less_or_equal: \"<=\",\n greater: \">\",\n greater_or_equal: \">=\",\n between: \"between\",\n not_between: \"not_between\", // TODO 不支持待@steedos/filters 增强\n is_empty: \"is_empty\", // TODO 不支持待@steedos/filters 增强\n is_not_empty: \"is_not_empty\", // TODO 不支持待@steedos/filters 增强\n select_equals: \"=\",\n select_not_equals: \"!=\",\n select_any_in: \"in\",\n select_not_any_in: \"<>\",\n like: \"contains\",\n not_like: \"notcontains\",\n starts_with: \"startswith\",\n ends_with: \"endswith\",\n};\n\nconst isGroup = (item) => {\n return _.has(item, \"conjunction\");\n};\n\nconst conditionGroupToFilters = (group) => {\n const filters = [];\n const { conjunction, children } = group;\n if (conjunction && children) {\n children.forEach((item) => {\n if (filters.length > 0) {\n filters.push(conjunction);\n }\n if (isGroup(item)) {\n const filter = conditionGroupToFilters(item);\n if (filter && filter.length > 0) {\n filters.push(filter);\n }\n } else {\n const filter = conditionItemToFilters(item);\n if (filter) {\n filters.push(filter);\n }\n }\n });\n }\n return filters;\n};\n\nconst conditionItemToFilters = (item) => {\n const { left, op, right } = item;\n if (left && left.type === \"field\") {\n if (op) {\n if (op.startsWith(\"between:\")) {\n const array = op.split(\":\");\n return [left.field, array[0], array[1]];\n } else {\n if (right != null) {\n return [left.field, opMaps[op], right];\n }\n }\n }\n }\n};\n\n// const conditionChildrenToFilters = (children)=>{\n\n// }\nconst filterToConditionItem = (filter) => {\n if (filter.length === 3) {\n const op = lodash.findKey(opMaps, (value) => {\n return value === filter[1];\n });\n if (\n op === \"between\" &&\n lodash.includes(DATE_DATETIME_BETWEEN_VALUES, filter[2])\n ) {\n return {\n left: {\n type: \"field\",\n field: filter[0],\n },\n op: `${op}:${filter[2]}`,\n };\n } else {\n return {\n left: {\n type: \"field\",\n field: filter[0],\n },\n op: op,\n right: filter[2],\n };\n }\n } else {\n console.warn(`无效的filter:${JSON.stringify(filter)}`);\n }\n};\n\nconst filterObjectToArray = (filter) => {\n if (!lodash.isArray(filter) && lodash.isObject(filter)) {\n return [filter.field, filter.operation, filter.value];\n }\n return filter;\n};\n\nconst filtersToConditionGroup = (filters) => {\n filters = filterObjectToArray(filters);\n\n const conditions = {\n conjunction: \"and\",\n children: [],\n };\n if (!filters || filters.length == 0) {\n return conditions;\n }\n filters.forEach((filter) => {\n filter = filterObjectToArray(filter);\n if (filter === \"or\" || filter === \"and\") {\n conditions.conjunction = filter;\n } else {\n if (\n filter.length === 3 &&\n filter.indexOf(\"and\") == -1 &&\n filter.indexOf(\"or\") == -1\n ) {\n conditions.children.push(filterToConditionItem(filter));\n } else {\n conditions.children.push(filtersToConditionGroup(filter));\n }\n }\n });\n return conditions;\n};\n\nexport const conditionsToFilters = (conditions) => {\n return conditionGroupToFilters(conditions);\n};\n\nexport const filtersToConditions = (filters) => {\n return filtersToConditionGroup(filters);\n};\n","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-09-07 16:20:45\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-09-14 16:31:47\n * @Description:\n */\nimport { lookupToAmisPicker } from '../converter/amis/fields/lookup'\n\nimport { each, startsWith } from 'lodash';\n\nconst getSelectOptions = (field)=>{\n const options = [];\n each(field.options.split(\"\\n\"), (item)=>{\n var foo = item.split(':');\n if(foo.length == 2){\n options.push({label: foo[0], value: foo[1]})\n }else{\n options.push({label: item, value: item})\n }\n })\n return options;\n}\n\nconst getTdInputTpl = (field, label) => {\n const tpl = {\n label: label === true ? field.name : false,\n name: field.code,\n mode: \"horizontal\",\n className: \"m-none p-none\",\n disabled: field.permission === \"readonly\",\n };\n switch (field.type) {\n case \"input\":\n if (field.is_textarea) {\n tpl.type = \"textarea\";\n } else {\n tpl.type = \"input-text\";\n }\n break;\n case \"number\":\n tpl.type = \"input-number\";\n break;\n case \"date\":\n tpl.type = \"input-date\";\n break;\n case \"dateTime\":\n tpl.type = \"input-datetime\";\n break;\n case \"checkbox\":\n tpl.type = \"checkbox\";\n break;\n case \"email\":\n tpl.type = \"input-email\";\n tpl.validations = {\n isEmail: true\n }\n break;\n case \"url\":\n tpl.type = \"input-url\";\n tpl.validations = {\n isUrl: true\n }\n break;\n case \"password\":\n tpl.type = \"input-password\";\n tpl.showCounter = true;\n break;\n case \"select\":\n tpl.type = \"select\";\n tpl.options = getSelectOptions(field)\n break;\n case \"user\":\n tpl.type = \"input-text\"; //TODO\n break;\n case \"group\":\n tpl.type = \"input-text\"; //TODO\n break;\n case \"radio\":\n tpl.type = \"radios\";\n tpl.options = getSelectOptions(field)\n break;\n case \"multiSelect\":\n tpl.type = \"checkboxes\";\n tpl.options = getSelectOptions(field)\n break;\n case \"odata\":\n var labelField = field.formula.substr(1, field.formula.length - 2);\n tpl.type = \"select\";\n tpl.multiple = field.is_multiselect\n tpl.labelField = labelField;\n tpl.valueField = \"$$\"\n tpl.source = {\n \"url\": startsWith(field.url, 'http') ? field.url : `\\${context.rootUrl}${field.url}`,\n \"method\": \"get\",\n \"dataType\": \"json\",\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n break;\n case \"html\":\n tpl.type = \"html\";\n break;\n case \"table\":\n tpl.type = \"input-table\"; //TODO\n tpl.addable = field.permission != \"readonly\";\n tpl.editable = tpl.addable;\n tpl.copyable = tpl.addable;\n tpl.columns = [];\n each(field.sfields, (sField)=>{\n if(sField.type != 'hidden'){\n tpl.columns.push(getTdInputTpl(sField, true))\n }\n })\n break;\n case \"section\":\n tpl.type = \"input-text\";\n break;\n default:\n break;\n }\n\n return tpl;\n};\n\nconst getTdField = (field, fieldsCount) => {\n return {\n background: field.permission === \"readonly\" ? \"\" : \"rgba(255,255,0,.1)\",\n colspan: field.type === 'table' ? 4 : 3 - (fieldsCount - 1) * 2,\n align: \"left\",\n className: \"td-field\",\n body: [\n getTdInputTpl(field)\n ],\n style: {\n marginTop: \"0\",\n paddingTop: \"0\",\n paddingRight: \"0\",\n paddingBottom: \"0\",\n paddingLeft: \"0\",\n marginRight: \"0\",\n marginBottom: \"0\",\n marginLeft: \"0\",\n },\n // \"id\": \"u:9b001b7ff92d\"\n };\n};\n\nconst getTdTitle = (field) => {\n return {\n className: \"td-title\",\n align: field.type != 'section' ? \"center\" : \"left\",\n width: field.type != 'section' ? \"16%\" : \"\",\n colspan: field.type == 'section' ? 4 : \"\",\n body: [\n {\n type: \"tpl\",\n tpl: `<div style='font-size:20px'>${field.name}</div>`,\n },\n ],\n // \"id\": \"u:9b001b7ff92d\"\n };\n};\n\nconst getTds = (tdFields) => {\n const tds = [];\n each(tdFields, (field) => {\n if(field.type != 'table'){\n tds.push(getTdTitle(field));\n }\n if(field.type != 'section'){\n tds.push(getTdField(field, tdFields.length));\n }\n });\n return tds;\n};\n\nconst getFormTrs = (form) => {\n const trsSchema = [];\n const trs = [];\n let tdFields = [];\n each(form.fields, (field, index) => {\n if (field.is_wide) {\n if (tdFields.length != 0) {\n trs.push(tdFields);\n }\n if(field.type == 'table'){\n trs.push([Object.assign({}, field, {type: 'section'})])\n }\n tdFields = [];\n tdFields.push(field);\n trs.push(tdFields);\n tdFields = [];\n } else {\n tdFields.push(field);\n if (tdFields.length == 2 || index === form.fields.length - 1) {\n trs.push(tdFields);\n tdFields = [];\n }\n }\n });\n\n each(trs, (tdFields) => {\n trsSchema.push({\n background: \"#F7F7F7\",\n tds: getTds(tdFields),\n });\n });\n\n return trsSchema;\n};\n\nconst getFormTableView = (form) => {\n return {\n type: \"table-view\",\n trs: getFormTrs(form),\n id: \"u:047f3669468b\",\n };\n};\n\nexport const getFlowFormSchema = (form) => {\n return {\n type: \"page\",\n body: [\n {\n type: \"service\",\n data: {\n beijing: \"20\",\n tianjing: \"19\",\n },\n body: [\n {\n type: \"tpl\",\n id: \"u:f5bb0ad602a6\",\n tpl: `<div style='font-size:20px'>${form.title}</div>`,\n inline: true,\n wrapperComponent: \"\",\n style: {\n fontFamily: \"\",\n fontSize: 12,\n textAlign: \"center\",\n },\n },\n getFormTableView(form),\n ],\n id: \"u:a381684e042b\",\n },\n ],\n id: \"u:63849ea39e12\",\n messages: {},\n pullRefresh: {},\n regions: [\"body\"],\n };\n};\n","/**\n * 将例如像 a.b.c 或 a[1].b 的字符串转换为路径数组\n *\n * @param string 要转换的字符串\n */\n export const keyToPath = (string: string) => {\n const result = [];\n \n if (string.charCodeAt(0) === '.'.charCodeAt(0)) {\n result.push('');\n }\n \n string.replace(\n new RegExp(\n '[^.[\\\\]]+|\\\\[(?:([^\"\\'][^[]*)|([\"\\'])((?:(?!\\\\2)[^\\\\\\\\]|\\\\\\\\.)*?)\\\\2)\\\\]|(?=(?:\\\\.|\\\\[\\\\])(?:\\\\.|\\\\[\\\\]|$))',\n 'g'\n ),\n (match, expression, quote, subString) => {\n let key = match;\n if (quote) {\n key = subString.replace(/\\\\(\\\\)?/g, '$1');\n } else if (expression) {\n key = expression.trim();\n }\n result.push(key);\n return '';\n }\n );\n \n return result;\n };\n ","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import isPlainObject from 'lodash/isPlainObject';\nimport {keyToPath} from './keyToPath';\n\n// 方便取值的时候能够把上层的取到,但是获取的时候不会全部把所有的数据获取到。\nexport function createObject(\n superProps?: {[propName: string]: any},\n props?: {[propName: string]: any},\n properties?: any\n): object {\n if (superProps && Object.isFrozen(superProps)) {\n superProps = cloneObject(superProps);\n }\n\n const obj = superProps\n ? Object.create(superProps, {\n ...properties,\n __super: {\n value: superProps,\n writable: false,\n enumerable: false\n }\n })\n : Object.create(Object.prototype, properties);\n\n props &&\n isObject(props) &&\n Object.keys(props).forEach(key => (obj[key] = props[key]));\n\n return obj;\n}\n\nexport function cloneObject(target: any, persistOwnProps: boolean = true) {\n const obj =\n target && target.__super\n ? Object.create(target.__super, {\n __super: {\n value: target.__super,\n writable: false,\n enumerable: false\n }\n })\n : Object.create(Object.prototype);\n persistOwnProps &&\n target &&\n Object.keys(target).forEach(key => (obj[key] = target[key]));\n return obj;\n}\n\nexport function extendObject(\n target: any,\n src?: any,\n persistOwnProps: boolean = true\n) {\n const obj = cloneObject(target, persistOwnProps);\n src && Object.keys(src).forEach(key => (obj[key] = src[key]));\n return obj;\n}\n\nexport function isObject(obj: any) {\n const typename = typeof obj;\n return (\n obj &&\n typename !== 'string' &&\n typename !== 'number' &&\n typename !== 'boolean' &&\n typename !== 'function' &&\n !Array.isArray(obj)\n );\n}\n\nexport function setVariable(\n data: {[propName: string]: any},\n key: string,\n value: any,\n convertKeyToPath?: boolean\n) {\n data = data || {};\n\n if (key in data) {\n data[key] = value;\n return;\n }\n\n const parts = convertKeyToPath !== false ? keyToPath(key) : [key];\n const last = parts.pop() as string;\n\n while (parts.length) {\n let key = parts.shift() as string;\n if (isPlainObject(data[key])) {\n data = data[key] = {\n ...data[key]\n };\n } else if (Array.isArray(data[key])) {\n data[key] = data[key].concat();\n data = data[key];\n } else if (data[key]) {\n // throw new Error(`目标路径不是纯对象,不能覆盖`);\n // 强行转成对象\n data[key] = {};\n data = data[key];\n } else {\n data[key] = {};\n data = data[key];\n }\n }\n\n data[last] = value;\n}\n\nexport function deleteVariable(data: {[propName: string]: any}, key: string) {\n if (!data) {\n return;\n } else if (data.hasOwnProperty(key)) {\n delete data[key];\n return;\n }\n\n const parts = keyToPath(key);\n const last = parts.pop() as string;\n\n while (parts.length) {\n let key = parts.shift() as string;\n if (isPlainObject(data[key])) {\n data = data[key] = {\n ...data[key]\n };\n } else if (data[key]) {\n throw new Error(`目标路径不是纯对象,不能修改`);\n } else {\n break;\n }\n }\n\n if (data && data.hasOwnProperty && data.hasOwnProperty(last)) {\n delete data[last];\n }\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-07-05 15:54:17\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-07-05 16:30:29\n * @Description: \n */\nimport { fetchAPI } from './steedos.client';\n\nexport async function getApps(){\n const APPS_API = '/service/api/apps/menus';\n const apps = await fetchAPI(APPS_API);\n return apps;\n}\n\nexport async function getApp(appName){\n const appApi = `/service/api/apps/${appName}/menus`;\n const app = await fetchAPI(appApi);\n return app;\n}","import { getRootUrl, getSteedosAuth } from \"./lib/steedos.client\";\n\n/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-12-17 17:03:40\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-12-17 17:03:42\n * @Description: \n */\nexport const getDefaultRenderData = ()=>{\n const steedosAuth = getSteedosAuth();\n return {\n context: {\n rootUrl: getRootUrl(),\n userId: steedosAuth.userId,\n tenantId: steedosAuth.spaceId,\n authToken: steedosAuth.authToken,\n user: steedosAuth\n },\n global: {\n userId: steedosAuth.userId,\n spaceId: steedosAuth.spaceId,\n user: steedosAuth, \n now: new Date(),\n // mode: mode //由表单提供\n }\n }\n }","import { first, keys, map, find } from 'lodash';\nimport { getUISchema, getObjectRelatedList,getRecordDetailHeaderSchema, getFormSchema, getViewSchema, getListViewColumns, getListViewSort, getTableSchema } from './objects';\nimport { getAmisObjectRelatedList } from './objectsRelated';\n\nimport { getObjectListHeader,getObjectRecordDetailRelatedListHeader } from './converter/amis/header';\n// import { getListSchema } from './objects';\n\n// 获取表单初始化amisSchema\nexport async function getFormPageInitSchema(objectApiName) {\n const schema = await getFormSchema(objectApiName, {recordId: '${recordId}'});\n return {\n type: 'page',\n bodyClassName: '',\n regions: [\n \"body\"\n ],\n body:[\n schema.amisSchema\n ]\n }\n}\n\n// 获取列表页面初始化amisSchema\nexport async function getListPageInitSchema(objectApiName, formFactor, userSession) {\n // let schema = await getListSchema(null, objectApiName, null, { showHeader: true });\n // let amisSchema = schema && schema.amisSchema;\n // if (amisSchema) {\n // return {\n // type: 'page',\n // bodyClassName: 'p-0',\n // regions: [\n // \"body\"\n // ],\n // // name: `page_${readonly ? 'readonly':'edit'}_${recordId}`\n // body: amisSchema\n // }\n // }\n\n // const uiSchema = await getUISchema(objectApiName);\n // const listViewName = first(keys(uiSchema.list_views));\n // const headerSchema = await getObjectListHeader(uiSchema, listViewName);\n\n return {\n type: 'page',\n bodyClassName: '',\n regions: [\n \"body\"\n ],\n // name: `page_${readonly ? 'readonly':'edit'}_${recordId}`\n body: [{\n \"type\": \"steedos-object-listview\",\n \"objectApiName\": objectApiName,\n // \"listName\": \"${listName}\",\n // \"headerToolbar\": [],\n \"columnsTogglable\": false,\n \"showHeader\": true,\n // \"headerSchema\": headerSchema\n }]\n }\n}\n\n// 获取\nexport async function getRecordPageInitSchema(objectApiName){\n // console.log('getRecordPageSchema==>', objectApiName, ctx, formFactor, userSession);\n // const detailHeaderAmisSchema = (await getRecordDetailHeaderSchema(objectApiName, \"${recordId}\")).amisSchema;\n // const objectFormAmisSchema = (await getViewSchema(objectApiName, \"${recordId}\", {labelAlign:\"left\"})).amisSchema;\n \n const recordId = '${recordId}';\n const relatedList = await getAmisObjectRelatedList(null, objectApiName, recordId, null);\n const uiSchema = await getUISchema(objectApiName);\n let body = [\n // detailHeaderAmisSchema,\n {\n \"type\": \"steedos-record-detail-header\",\n \"label\": \"标题面板\",\n \"objectApiName\": \"${objectName}\",\n \"recordId\": \"${recordId}\",\n \"onEvent\": {\n \"recordLoaded\": {\n \"actions\": [\n {\n \"actionType\": \"setValue\",\n \"args\": {\n \"value\": {\n \"recordLoaded\": true,\n }\n }\n },\n {\n \"actionType\": \"reload\",\n \"data\": {\n \"name\": `\\${record.${uiSchema?.NAME_FIELD_KEY || 'name'}}`,\n \"record\": `\\${record}`,\n \"recordLoaded\": true,\n }\n }\n ]\n }\n }\n }\n ];\n let contentBody = {\n \"type\": \"tabs\",\n \"tabs\": [\n {\n \"title\": \"详情\",\n \"body\": [\n // objectFormAmisSchema\n {\n \"type\": \"steedos-object-form\",\n \"label\": \"对象表单\",\n \"mode\": \"read\",\n \"objectApiName\": \"${objectName}\",\n \"recordId\": \"${recordId}\",\n \"labelAlign\": \"left\"\n }\n ]\n }\n ],\n \"className\": \"sm:mt-3 flex flex-col region-main bg-white sm:shadow sm:rounded sm:border border-slate-300\",\n \"linksClassName\": \"pl-4 pt-2\"\n };\n const relatedListSchema = map(relatedList,(item)=>{\n return item.schema.amisSchema;\n })\n if(relatedListSchema.length){\n contentBody.tabs.push({\n \"title\": \"相关\",\n \"body\": relatedListSchema\n })\n }\n body.push(contentBody);\n return {\n type: 'page',\n id: `page_${objectApiName}_record_detail`,\n bodyClassName: '',\n regions: [\n \"body\"\n ],\n body\n }\n}\n\n// 获取对象的某个列表视图初始化amisSchema\nexport async function getListviewInitSchema(objectApiName, listViewName, ctx) {\n if(!ctx){\n ctx = {};\n }\n const uiSchema = await getUISchema(objectApiName);\n const listView = find(\n uiSchema.list_views,\n (listView, name) => {\n return name === listViewName;\n }\n );\n\n let amisSchema = {};\n\n if (listView) {\n const listViewColumns = getListViewColumns(listView, ctx.formFactor);\n const sort = getListViewSort(listView);\n \n // amisSchema = {\n // \"type\": \"steedos-object-table\",\n // \"objectApiName\": objectApiName,\n // \"columns\": listViewColumns,\n // \"extraColumns\": listView.extra_columns,\n // \"filters\": listView.filters,\n // \"sort\": sort,\n // \"headerSchema\": headerSchema\n // };\n\n const defaults = ctx.defaults || {};\n if(!defaults.headerSchema){\n //传入isListviewInit是区别于对象列表类型的微页面,即getListPageInitSchema函数中该属性为false\n const headerSchema = await getObjectListHeader(uiSchema, listViewName, {\n onlySecordLine: true,\n isListviewInit: true\n });\n defaults.headerSchema = headerSchema;\n }\n ctx.defaults = defaults;\n let setDataToComponentId = ctx.setDataToComponentId;\n if(!setDataToComponentId){\n setDataToComponentId = `service_listview_${objectApiName}`;\n }\n const schema = await getTableSchema(null, objectApiName, listViewColumns, {\n sort,\n ...ctx,\n setDataToComponentId\n });\n amisSchema = schema.amisSchema;\n // TODO: 下面这些data下的无用属性在底层代码中就不应该加,待底层移除后下面的删除语句就可以去掉了\n delete amisSchema.data.$master;\n delete amisSchema.data._id;\n delete amisSchema.data.recordPermissions;\n delete amisSchema.data.uiSchema;\n }\n // 不可以外面包一层page,否则列表视图渲染时的data无法传入顶部第一行造成按钮显示异常\n return amisSchema;\n\n // return {\n // type: 'page',\n // bodyClassName: 'p-0',\n // regions: [\n // \"body\"\n // ],\n // // name: `page_${readonly ? 'readonly':'edit'}_${recordId}`\n // body: [amisSchema],\n // data:{\n // listName: listViewName\n // }\n // }\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-08-15 11:53:28\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-08-27 16:54:21\n * @Description: \n */\nimport { fetchAPI, getSteedosAuth } from \"./steedos.client\"\n\nexport const getNotifications = async () => {\n const auth = getSteedosAuth();\n const query = `\n {\n notifications(filters: [\"owner\",\"=\",\"${auth.userId}\"], sort: \"created desc,name\", top : 10){\n _id,name,body,related_to,related_name,url,owner,is_read,from,created\n },\n unReadCount: notifications__count(filters: [[\"owner\",\"=\",\"${auth.userId}\"], [\"is_read\", \"!=\", true]])\n }\n `;\n const result = await fetchAPI('/graphql', {\n method: 'POST',\n body: JSON.stringify({ query })\n })\n\n return result.data\n}\n\nexport const markReadAll = async ()=>{\n return await fetchAPI('/api/v4/notifications/all/markReadAll', {\n method: 'POST'\n });\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-09-13 14:34:18\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-09-13 14:59:00\n * @Description: 加载资产包,并返回所有可用资产\n */\nimport { isString, filter, map } from 'lodash';\n\nexport const registerRemoteAssets = async (assetUrls)=>{\n if(assetUrls && assetUrls.length > 0){\n let assetUrlsArray = assetUrls;\n if(isString(assetUrlsArray)){\n assetUrlsArray = assetUrlsArray.split(',');\n }\n await Builder.registerRemoteAssets(assetUrlsArray);\n const amisComps = filter(Builder.registry['meta-components'], function(item){ return item.componentName && item.amis?.render});\n return map(amisComps, (item)=>{\n return { componentType: item.componentType, componentName: item.componentName, ...item.amis.render}\n })\n }else{\n return []\n }\n}"],"names":["RegisterRenders","normalizeLink","to","location","window","pathname","search","idx","indexOf","idx2","let","substring","undefined","hash","test","m","paths","split","pop","exec","length","concat","join","getEvn","theme","notify","type","msg","props","schema","tpl","SteedosUI","message","console","warn","confirm","Promise","resolve","reject","Modal","title","onOk","okText","cancelText","jumpTo","action","history","back","actionType","blank","router","push","open","target","replace","registerRenders","isEmpty","assets","isArray","amisLib","amisRequire","registerMap","renderer","Renderer","formitem","FormItem","options","OptionsControl","amisReact","each","find","componentName","asset","Component","Builder","components","item","name","AmisWrapper","class","componentType","body","render","setSchema","useState","useEffect","result","then","data","createElement","Fragment","usage","RegExp","weight","autoVar","info","component","framework","error","consoleTag","STEEDOS_AUTH","getBuilderContext","settings","context","async","fetchAPI","api","credentials","headers","Content-Type","AUTHORIZATION","getAuthorization","res","Object","assign","await","fetch","getRootUrl","status","Error","json","errors","getTenantId","spaceId","tenantId","searchParams","URLSearchParams","get","getAuthToken","token","authToken","getUserId","userId","defaultRootUrl","rootUrl","localStorage","getItem","getSteedosAuth","cloneDeep","getFieldsTemplate","fields","expand","fieldsName","displayFields","fieldsArr","field","_","values","alias","includes","uniq","getRecordPermissionsTemplate","getFindOneQuery","object","recordId","queryOptions","idFieldName","filters","query","getSaveDataTpl","scripts","forEach","readonly","imgFieldsKeys","imgFields","multiple","JSON","stringify","fileFieldsKeys","fileFields","getFindQuery","limit","treeFields","enable_tree","keys","cfsFields","orderBy","orderDir","pageNo","pageSize","getApi","isMobile","Router","getAppPath","appId","getPagePath","getObjectListViewPath","objectName","listViewName","getObjectDetailPath","getObjectRelatedViewPath","masterObjectName","masterRecordId","foreignKey","getNumberTpl","getDateTpl","getDateTimeTpl","getSelectTpl","getNameTplUrl","ctx","formFactor","getRelatedFieldTpl","href","onlyDisplayLabel","isString","reference_to","labelTpl","getLookupTpl","NAME_FIELD_KEY","getUISchema","getSwitchTpl","getPasswordTpl","getFieldTpl","is_name","labelFieldName","API_CACHE","getReadonlyFormInitApi","method","url","graphql.getApi","Date","getTime","cache","adaptor","scriptStr","selectFields","filter","OMIT_FIELDS","optionsFunction","toString","_optionsFunction","getScriptForAddUrlPrefixForImgFields","getScriptForRewriteValueForFileFields","graphql.getFindOneQuery","Authorization","getSaveApi","$","modalName","requestAdaptor","responseData","getFieldSchemaArray","fieldSchemaArray","lodash","mergedSchema","fieldName","has","sortBy","group","isObjectField","is_wide","hidden","permission","allowEdit","getSection","permissionFields","sectionName","sectionFields","amisField","fieldSetBody","perField","Fields.getGridFieldSubFields","Fields.getObjectFieldSubFields","Fields.convertSFieldToAmisField","sectionFieldsVisibleOn","map","compact","visibleOn","section","collapsable","getSections","sections","key","groupBy","getFormBody","objectConfig","getListBody","columns","Tpl.getFieldTpl","extra","label","sortable","width","toggled","getDefaultParams","perPage","top","isExpression","func","reg1","reg2","match","parseSingleExpression","formData","dataPath","global","userSession","funcBody","parentPath","getParentPath","parent","getValueByPath","str","globalTag","Function","_error","log","defaultsDeep","args","output","toArray","reverse","mergeWith","objectValue","sourceValue","path","pathArr","config","listView","newRecordMode","editRecordMode","getPage","pageId","page","StandardButtons","getStandardNew","uiSchema","amis_schema","formSchema","objectApiName","id","mode","layout","level","onEvent","click","actions","dialog","$master","&","listViewId","bodyClassName","parse","closeOnEsc","closeOnOutside","showCloseButton","size","regions","className","getStandardEdit","getStandardDelete","confirmText","messages","success","failed","componentId","expression","getStandardDeleteMany","todo","this","scopeId","listViewRef","scope","getRef","getComponentById","store","toJSON","selectedItems","handleAction","toast","items","position","handleBulkAction","bulkActions","getStandardImportData","object_name","persistData","promptPageLeave","debug","submitText","dataType","initFetch","required","joinValues","extractValue","autoComplete","$term","$value","rfield","labelClassName","clearValueOnHidden","labelField","valueField","modalMode","source","$self","pickerSchema","draggable","headerToolbar","defaultParams","placeholder","html","syncLocation","keepItemSelectionOnPageChange","checkOnItemClick","autoFillHeight","useChunk","receiver","panelClassName","submitSucc","eventData","closeDialogOnSubmit","getStandardOpenView","getButtonVisibleOn","button","visible","_visible","isBoolean","trim","startsWith","amisSchema","standardButtonsTodo","standard_delete_many","getButtons","disabledButtons","permissions","disabled_actions","buttons","include","allow_customActions","exclude_actions","on","getListViewButtons","getObjectDetailButtons","detailButtons","getObjectDetailMoreButtons","moreButtons","getListViewItemButtons","getObjectRelatedListButtons","execute","eval","fun","isFunction","todoThis","record","record_id","apply","executeButton","getObjectListHeaderFirstLine","objectSchema","icon","listViewButtonOptions","list_views","link","amisButtonsSchema","reg","md","columnClassName","valign","inline","wrapperComponent","rightIcon","hideCaret","btnClassName","getObjectListHeaderFieldsFilterBar","searchableFields","getObjectFieldsFilterBarSchema","getObjectListHeader","getObjectRecordDetailHeader","showRecordTitle","dropdownButtons","standardIcon","gridBody","hiddenOn","_id","recordPermissions","getObjectRecordDetailRelatedListHeader","relatedObjectSchema","relatedLabel","getObjectHeaderToolbar","mainObject","align","script","getObjectFooterToolbar","getObjectFilter","wrapWithPanel","getBulkActions","ids","getObjectList","nonpaged","paging","enabled","bodyProps","toolbar","headerToolbarClassName","footerToolbar","filterVisible","table","getTableSchema","primaryField","affixHeader","getTableApi","tableHiddenOn","defaults","listSchema","headerSchema","footerSchema","wrappedBody","union","unshift","loaded","getGlobalData","user","getObjectForm","labelAlign","sendOn","initApi","value","$count","AmisFormInputs","getAmisStaticFieldType","getAmisFieldType","steedosField","getAmisFileReadonlySchema","amisFieldType","defaultImage","enlargeAble","showToolbar","getAmisFileEditSchema","tableName","convertData","getAmisFileSchema","getMobileTableColumns","nameField","tpls","Tpl.getNameTplUrl","columnLines","lines","lineChildren","isNewLine","isLeft","lineChildrenClassName","lineClassName","innerClassName","getTableOperation","operationButtons","fixed","placement","overlayClassName","trigger","onOpenApi","disabled","responseType","globalFilter","filtersFunction","sort","setDataToComponentId","baseFilters","operation","searchable","key_field","graphql.getFindQuery","getRecordPermissionsApi","recordPermissionsTemplate","refUsersObjectName","refOrgsObjectName","getRefListViewSort","refObject","view","getListViewSort","getSelectUserSchema","Field.getAmisStaticFieldType","Tpl.getLookupTpl","refUsersObjectConfig","refOrgsObjectConfig","usersSort","orgsSort","selectMode","leftMode","clearable","childrenData","defaultValueOptionsData","fieldNamePrefix","__selectUserLoaded__","deferApi","searchApi","defaultValue","onChangeEvent","change","getReferenceTo","referenceTo","reference_to_field","refObjectConfig","valueFieldName","lookupToAmisPicker","tableFields","i","column","isObject","wrap","field_name","f","tableField","depend_on","fName","_filtersFunction","listItem","tabId","Table.getTableSchema","filterLoopCount","isLookup","listName","lookupToAmisSelect","apiInfo","lookupToAmis","Tpl.getRelatedFieldTpl","lookupToAmisSelectUser","enable_enhanced_lookup","getObjectFieldSubFields","mainField","newMainField","subFields","getGridFieldSubFields","getSelectFieldOptions","data_type","Number","String","convertSFieldToAmisField","showSystemFields","baseData","labelRemark","inlineHelpText","linkify","breaks","language","Tpl.getSelectTpl","Tpl.getSwitchTpl","inputFormat","format","Tpl.getDateTpl","Tpl.getDateTimeTpl","utc","timeFormat","Tpl.getNumberTpl","min","max","precision","scale","showInput","Tpl.getPasswordTpl","File.getAmisFileSchema","strictMode","editable","addable","removable","subField","subFieldName","gridSub","quickEdit","visible_on","getFieldSearchable","_field","calssName","sField","getObjectFieldsFilterButtonSchema","eventName","getObjectFieldsFilterFormSchema","omit","enableSearchableFieldsVisibleOn","fieldItem","initData","filterFormSchema","dataProvider","inited","checkAll","DEFAULT_CALENDAR_OPTIONS","startDateExpr","endDateExpr","allDayExpr","textExpr","getObjectCalendar","calendarOptions","titleFields","omitBy","isNil","initialView","n","sortField","sortOrder","currentView","recordPermissionsApi","onGetEventsScript","onSelectScript","recordSaveApi","nameFieldKey","apiData","businessHours","daysOfWeek","startTime","endTime","startDayHour","endDayHour","selectable","allowCreate","selectMirror","getEvents","select","eventClick","eventAdd","eventChange","msgType","eventRemove","eventsSet","queryFields","queryOptionsArray","getRecord","UI_SCHEMA_CACHE","UISchemaFunction","setUISchemaCache","getUISchemaCache","hasUISchemaCache","getListViewColumns","listViewColumns","mobile_columns","slice","index","sortStr","order","getListViewFilter","filter_scope","force","v","k","all","getField","getFormSchema","getListSchema","appName","enable_amis_schema","isCustomAmisSchema","listviewFilter","listview_filters","_filters","isCalendar","showHeader","listViewPropsStoreKey","localListViewProps","ex","extraColumns","extra_columns","getRelatedFieldValue","foreign_key","relatedField","o","getAmisObjectRelatedList","related","relatedLists","related_lists","detail","details","relatedSchema","relatedAmisSchema","arr","relatedUiSchema","refField","_reference_to","recordRelatedListHeader","columnsTogglable","relatedKey","defaultData","relatedList","related_field_fullname","field_names","PUBLIC_ENV","getSpaceUsersPickerAmisSchema","spaceUserSchema","DATE_DATETIME_BETWEEN_VALUES","opMaps","equal","not_equal","less","less_or_equal","greater","greater_or_equal","between","not_between","is_empty","is_not_empty","select_equals","select_not_equals","select_any_in","select_not_any_in","like","not_like","starts_with","ends_with","isGroup","conditionGroupToFilters","conjunction","children","conditionItemToFilters","array","left","op","right","filterToConditionItem","findKey","filterObjectToArray","filtersToConditionGroup","conditions","getSelectOptions","foo","getTdInputTpl","code","is_textarea","validations","isEmail","isUrl","showCounter","formula","substr","is_multiselect","copyable","sfields","getTds","tds","tdFields","fieldsCount","colspan","background","style","marginTop","paddingTop","paddingRight","paddingBottom","paddingLeft","marginRight","marginBottom","marginLeft","getFormTrs","trsSchema","trs","form","keyToPath","string","charCodeAt","quote","subString","__assign","t","s","arguments","p","prototype","hasOwnProperty","call","cloneObject","persistOwnProps","obj","__super","create","writable","enumerable","typename","Array","root","env","amis","embed","e","nodeName","toLocaleLowerCase","preventDefault","superProps","properties","isFrozen","parts","last","key_2","shift","isPlainObject","src","buttonName","hasImportTemplates","now","steedosAuth","fileId","beijing","tianjing","fontFamily","fontSize","textAlign","pullRefresh","auth","amisListViewId","relatedFieldName","masterObjectUISchema","relatedObjectName","hiddenEmptyTable","relatedObjectUiSchema","firstListViewName","relatedValue","masterRecord","app_id","recordLoaded","tabs","contentBody","linksClassName","relatedListSchema","relateds","relatedQuery","relate","formInitProps","fetchInited","assetUrls","assetUrlsArray","registerRemoteAssets","amisComps","registry","endsWith","setItem","steedosSession","convertKeyToPath","key_1"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../src/lib/amis.js","../src/lib/steedos.client.js","../src/lib/converter/amis/graphql.js","../src/lib/router.js","../src/lib/converter/amis/tpl.js","../src/lib/converter/amis/api.js","../src/lib/converter/amis/fields/sections.js","../src/lib/converter/amis/form.js","../src/lib/converter/amis/fields/list.js","../src/lib/expression.js","../src/lib/defaultsDeep.js","../src/config/index.js","../src/lib/page.js","../src/schema/standard_new.amis.js","../src/standard/button.js","../src/schema/standard_edit.amis.js","../src/schema/standard_delete.amis.js","../src/schema/standard_import_data.amis.js","../src/schema/standard_open_view.amis.js","../src/lib/buttons.js","../src/lib/converter/amis/header.js","../src/lib/converter/amis/toolbar.js","../src/lib/converter/amis/index.js","../src/lib/converter/amis/fields/type.js","../src/lib/converter/amis/fields/file.js","../src/lib/converter/amis/fields/table.js","../src/lib/converter/amis/fields/user.js","../src/lib/converter/amis/fields/lookup.js","../src/lib/converter/amis/fields/editor.js","../src/lib/converter/amis/fields/index.js","../src/lib/converter/amis/fields_filter.js","../src/lib/converter/amis/calendar.js","../src/lib/record.js","../src/lib/objects.js","../src/lib/objectsRelated.js","../src/lib/public.env.js","../src/lib/space_users.js","../src/lib/converter/amis/filters.js","../src/lib/workflow/flow.js","../../src/utils/keyToPath.ts","../../../../node_modules/tslib/tslib.es6.js","../../src/utils/object.ts","../src/lib/apps.js","../../src/render.ts","../src/lib/page_init.js","../src/lib/notification.js","../src/lib/assets.js"],"sourcesContent":["/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-07-13 11:31:12\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-09-27 10:34:59\n * @Description:\n */\nimport { each, find, isArray, isEmpty } from 'lodash';\n\nconst RegisterRenders = [];\n\nconst normalizeLink = (to, location = window.location) => {\n to = to || \"\";\n\n if (to && to[0] === \"#\") {\n to = location.pathname + location.search + to;\n } else if (to && to[0] === \"?\") {\n to = location.pathname + to;\n }\n\n const idx = to.indexOf(\"?\");\n const idx2 = to.indexOf(\"#\");\n let pathname = ~idx\n ? to.substring(0, idx)\n : ~idx2\n ? to.substring(0, idx2)\n : to;\n let search = ~idx ? to.substring(idx, ~idx2 ? idx2 : undefined) : \"\";\n let hash = ~idx2 ? to.substring(idx2) : location.hash;\n\n if (!pathname) {\n pathname = location.pathname;\n } else if (pathname[0] != \"/\" && !/^https?\\:\\/\\//.test(pathname)) {\n let relativeBase = location.pathname;\n const paths = relativeBase.split(\"/\");\n paths.pop();\n let m;\n while ((m = /^\\.\\.?\\//.exec(pathname))) {\n if (m[0] === \"../\") {\n paths.pop();\n }\n pathname = pathname.substring(m[0].length);\n }\n pathname = paths.concat(pathname).join(\"/\");\n }\n\n return pathname + search + hash;\n};\n\nexport const amisRootClick = (router, e) => {\n if (e.target.nodeName.toLocaleLowerCase() === \"a\" && e.target.href) {\n e.preventDefault();\n router.push(e.target.href);\n }\n};\n\nexport const getEvn = (router)=>{\n return {\n theme: \"antd\",\n notify: (type, msg)=>{\n if(msg.props?.schema.tpl){\n SteedosUI.message[type](msg.props?.schema.tpl)\n }else if(typeof msg == 'string'){\n SteedosUI.message[type](msg)\n }else{\n console.warn('notify', type, msg)\n }\n },\n confirm: (msg)=>{\n return new Promise((resolve, reject)=>{\n return SteedosUI.Modal.confirm({\n title: msg,\n onOk: ()=>{\n resolve(true);\n },\n okText: \"确认\",\n cancelText: \"取消\"\n })\n })\n },\n jumpTo: (to, action) => {\n if (to === \"goBack\") {\n return window.history.back();\n }\n\n to = normalizeLink(to);\n\n if (action && action.actionType === \"url\") {\n action.blank === false ? router.push(to) : window.open(to);\n return;\n }\n\n // 主要是支持 nav 中的跳转\n if (action && to && action.target) {\n window.open(to, action.target);\n return;\n }\n if (/^https?:\\/\\//.test(to)) {\n window.location.replace(to);\n } else {\n router.push(to);\n }\n }\n }\n}\n\nexport const registerRenders = (assets)=>{\n if(!isEmpty(assets) && isArray(assets)){\n let amisLib = amisRequire('amis');\n\n const registerMap = {\n renderer: amisLib.Renderer,\n formitem: amisLib.FormItem,\n options: amisLib.OptionsControl,\n };\n \n let amisReact = amisRequire('react');\n each(assets, (asset)=>{\n // 防止组件重复注册\n if(!find(RegisterRenders, (componentName)=>{ return componentName === asset.componentName})){\n let Component = Builder.components.find(item => item.name === asset.componentName);\n let AmisWrapper = Component.class\n if(asset.componentType === 'amisSchema'){\n AmisWrapper = (props)=>{\n const { body, render } = props\n const [schema, setSchema] = amisReact.useState(null);\n amisReact.useEffect(()=>{\n const result = Component.class(props);\n if(result && result.then && typeof result.then === 'function'){\n result.then((data)=>{\n setSchema(data);\n })\n }else{\n setSchema(result)\n }\n }, [])\n return amisReact.createElement(amisReact.Fragment, null, amisReact.createElement(amisReact.Fragment, null, schema && render ? render('body', schema) : ''), amisReact.createElement(amisReact.Fragment, null, render ? render('body', body) : ''));\n }\n }\n\n // 注册amis渲染器\n if (!registerMap[asset.usage]) {\n console.error(\n `${consoleTag}自定义组件注册失败,不存在${asset.usage}自定义组件类型。`,\n );\n } else {\n registerMap[asset.usage]({\n test: new RegExp(`(^|\\/)${asset.type}`),\n type: asset.type,\n weight: asset.weight,\n autoVar: true,\n })(AmisWrapper);\n // 记录当前创建的amis自定义组件\n console.info('注册了一个自定义amis组件:', {\n type: asset.type,\n weight: asset.weight,\n component: AmisWrapper,\n framework: asset.framework,\n usage: asset.usage,\n });\n }\n // amisLib.Renderer({\n // test: new RegExp(`(^|\\/)${asset.type}`)\n // })(AmisWrapper);\n RegisterRenders.push(asset.componentName)\n }\n })\n }\n}\n\nexport const amisRender = (root, schema, data = {}, env = {}, options) => {\n let amis = amisRequire(\"amis/embed\");\n const { router, assets } = options;\n registerRenders(assets);\n return amis.embed(root, schema, data, Object.assign(getEvn(router), env));\n};\n","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-07-04 11:24:28\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2023-01-11 11:35:01\n * @Description: \n */\nimport { endsWith, isEmpty, cloneDeep } from \"lodash\";\n\nconst STEEDOS_AUTH = {};\n\nconst getBuilderContext = ()=>{\n if(typeof window === \"undefined\"){\n return {};\n }\n return Builder.settings.context ? Builder.settings.context : Builder.settings\n}\n\nexport const setSteedosAuth = (steedosSession) => {\n Object.assign(STEEDOS_AUTH, steedosSession);\n}\n\nexport async function fetchAPI(api, options = { credentials: 'include' }) {\n const headers = { 'Content-Type': 'application/json' }\n const AUTHORIZATION = getAuthorization()\n if (AUTHORIZATION) {\n headers[\n 'Authorization'\n ] = AUTHORIZATION\n // } else {\n // throw new Error(401)\n }\n\n options.headers = Object.assign({}, headers, options.headers);\n options.credentials = 'include'\n\n const res = await fetch(`${getRootUrl()}${api}`, options)\n \n if(res.status === 401){\n throw new Error(401)\n }\n\n const json = await res.json()\n if (json.errors) {\n console.error(json.errors)\n throw new Error('Failed to fetch API')\n }\n return json\n}\n\nexport function getFileSrc(fileId){\n return `${getRootUrl()}/api/files/files/${fileId}`\n}\n\nexport function getImageSrc(fileId){\n return `${getRootUrl()}/api/files/images/${fileId}`\n}\n\n\nexport function getTenantId(){\n try {\n let spaceId = getBuilderContext().tenantId\n\n if (window.location.search && !spaceId) {\n var searchParams = new URLSearchParams(window.location.search);\n spaceId = searchParams.get('X-Space-Id');\n }\n if (!spaceId) {\n return null;\n }\n return spaceId;\n } catch (error) {\n console.error(error)\n }\n}\n\nexport function getAuthToken(){\n try {\n const context = getBuilderContext()\n let token = context.authToken;\n if (!token) {\n return null;\n }\n return token;\n } catch (error) {\n console.error(error)\n }\n}\n\nexport function getAuthorization(){\n try {\n const context = getBuilderContext()\n let spaceId = context.tenantId;\n let token = context.authToken;\n \n if (!spaceId || !token) {\n return null;\n }\n return `Bearer ${spaceId},${token}`;\n } catch (error) {\n console.error(error)\n }\n}\n\nexport function getUserId(){\n try {\n const context = getBuilderContext()\n let userId = context.userId;\n if (!userId) {\n return null;\n }\n return userId;\n } catch (error) {\n console.error(error)\n } \n}\n\nexport function absoluteUrl(url){\n return `${getRootUrl()}${url}`\n}\n\nexport function getRootUrl(defaultRootUrl){\n const context = getBuilderContext()\n if(context.rootUrl){\n return context.rootUrl;\n }\n const rootUrl = typeof window != 'undefined' ? window.localStorage.getItem(\"steedos:rootUrl\") : '';\n if(rootUrl){\n return rootUrl\n }\n return defaultRootUrl;\n}\n\nexport function setRootUrl(rootUrl){\n if(endsWith(rootUrl, '/')){\n rootUrl = rootUrl.substring(0, rootUrl.length-1)\n }\n localStorage.setItem(\"steedos:rootUrl\", rootUrl)\n}\n\nexport const getSteedosAuth = () => {\n // if(isEmpty(STEEDOS_AUTH)){\n // return {\n // space: localStorage.getItem(\"steedos:spaceId\"),\n // token: localStorage.getItem(\"steedos:token\"), \n // userId: localStorage.getItem(\"steedos:userId\"),\n // name: Meteor.user().name //TODO: 使用steedos 函数. 此属性在上传附件时使用\n // }\n // }\n return cloneDeep(STEEDOS_AUTH);\n}","import * as _ from 'lodash';\nimport { includes } from 'lodash';\nimport { getUISchema } from '../../objects';\n\nexport async function getFieldsTemplate(fields, expand){\n if(expand != false){\n expand = true;\n }\n let fieldsName = ['_id'];\n let displayFields = [];\n let fieldsArr = [];\n if(_.isArray(fields)){\n fieldsArr = fields;\n }else{\n fieldsArr = _.values(fields);\n }\n for (const field of fieldsArr) {\n if(field.name.indexOf('.') < 0){\n if(expand && (field.type == 'lookup' || field.type == 'master_detail')){\n fieldsName.push(`${field.name}`)\n displayFields.push(`${field.name}`)\n }else{\n fieldsName.push( field.alias ? `${field.alias}:${field.name}` : field.name)\n }\n if(includes(['time','date','datetime','boolean','number','currency'], field.type)){\n fieldsName.push(`${field.name}`)\n }\n if(includes(['time','filesize','date','datetime','boolean','number','currency', 'select', 'file', 'image', 'avatar', 'formula', 'summary'], field.type)){\n displayFields.push(`${field.name}`)\n }\n }\n }\n\n displayFields = _.uniq(displayFields);\n fieldsName = _.uniq(fieldsName);\n\n if(displayFields.length > 0){\n return `${fieldsName.join(',')},_display:_ui{${displayFields.join(',')}}`;\n }\n return `${fieldsName.join(' ')}`\n}\n\nexport function getRecordPermissionsTemplate(){\n return `\n recordPermissions: _permissions{\n allowCreate,\n allowCreateFiles,\n allowDelete,\n allowDeleteFiles,\n allowEdit,\n allowEditFiles,\n allowRead,\n allowReadFiles,\n disabled_actions,\n disabled_list_views,\n field_permissions,\n modifyAllFiles,\n modifyAllRecords,\n modifyAssignCompanysRecords,\n modifyCompanyRecords,\n uneditable_fields,\n unreadable_fields,\n unrelated_objects,\n viewAllFiles,\n viewAllRecords,\n viewAssignCompanysRecords,\n viewCompanyRecords,\n }\n `\n}\n\nexport async function getFindOneQuery(object, recordId, fields, options){\n let queryOptions = \"\";\n \n if(recordId){\n queryOptions = `(filters:[\"${object.idFieldName}\", \"=\", \"${recordId}\"])`;\n }\n let alias = \"data\";\n if(options){\n if(options.alias){\n alias = options.alias;\n }\n\n if(options.filters){\n queryOptions = `(filters:${options.filters})`;\n }\n if(options.queryOptions){\n queryOptions = `(${options.queryOptions})`;\n }\n }\n return {\n query: `{${alias}:${object.name}${queryOptions}{${await getFieldsTemplate(fields)}, ${getRecordPermissionsTemplate()}}}`\n }\n}\n\nexport function getSaveQuery(object, recordId, fields, options){\n return {\n objectName: object.name,\n $: \"$$\",\n recordId: recordId,\n modalName: \"${modalName}\"\n }\n}\n\n/*\n readonly字段应该移除掉不提交到服务端。\n*/\nexport function getScriptForReadonlyFields(fields){\n var scripts = [];\n fields.forEach((item)=>{\n if(item.readonly){\n scripts.push(`delete formData.${item.name};`);\n }\n });\n return scripts.join(\"\\r\\n\");\n}\n\n/*\n img/avatar字段值移除URL前缀使其保存时正常保存id,而不是url。\n*/\nexport function getScriptForRemoveUrlPrefixForImgFields(fields){\n let imgFieldsKeys = [];\n let imgFields = {};\n fields.forEach((item)=>{\n if(includes(['image','avatar'], item.type)){\n imgFieldsKeys.push(item.name);\n imgFields[item.name] = {\n name: item.name,\n multiple: item.multiple\n };\n }\n })\n if(!imgFieldsKeys.length){\n return '';\n }\n return `\n let imgFieldsKeys = ${JSON.stringify(imgFieldsKeys)};\n let imgFields = ${JSON.stringify(imgFields)};\n imgFieldsKeys.forEach((item)=>{\n let imgFieldValue = formData[item];\n if(imgFieldValue && imgFieldValue.length){\n // 因为表单初始化接口的接收适配器中为image字段值添加了url前缀(为了字段编辑时正常显示图片),所以保存时移除(为了字段值保存时正常保存id,而不是url)。\n if(imgFields[item].multiple){\n if(imgFieldValue instanceof Array){\n formData[item] = imgFieldValue.map((value)=>{ \n let itemValue = value?.split('/');\n return itemValue[itemValue.length - 1];\n });\n }\n }else{\n let imgValue = imgFieldValue.split('/');\n formData[item] = imgValue[imgValue.length - 1];\n }\n }\n })\n `\n}\n\n/*\n file字段值重写使其保存时正常保存id。\n*/\nexport function getScriptForSimplifiedValueForFileFields(fields){\n let fileFieldsKeys = [];\n let fileFields = {};\n fields.forEach((item)=>{\n if(item.type === 'file'){\n fileFieldsKeys.push(item.name);\n fileFields[item.name] = {\n name: item.name,\n multiple: item.multiple\n };\n }\n })\n if(!fileFieldsKeys.length){\n return '';\n }\n return `\n let fileFieldsKeys = ${JSON.stringify(fileFieldsKeys)};\n let fileFields = ${JSON.stringify(fileFields)};\n fileFieldsKeys.forEach((item)=>{\n let fileFieldValue = formData[item];\n if(fileFieldValue){\n // 因为表单初始化接口的接收适配器中为file字段值重写了值及格式(为了字段编辑时正常显示附件名、点击附件名正常下载),所以保存时还原(为了字段值保存时正常保存id)。\n if(fileFields[item].multiple){\n if(fileFieldValue instanceof Array && fileFieldValue.length){\n formData[item] = fileFieldValue.map((value)=>{ \n if(typeof value === 'object'){\n return value.value;\n }else{\n return value;\n }\n });\n }\n }else{\n formData[item] = typeof fileFieldValue === 'object' ? fileFieldValue.value : fileFieldValue;\n }\n }\n })\n `\n}\n\nexport function getSaveDataTpl(fields){\n\n return `\n const formData = api.data.$;\n for (key in formData){\n // image、select等字段清空值后保存的空字符串转换为null。\n if(formData[key] === ''){\n formData[key] = null;\n }\n }\n const objectName = api.data.objectName;\n const fieldsName = Object.keys(formData);\n delete formData.created;\n delete formData.created_by;\n delete formData.modified;\n delete formData.modified_by;\n delete formData._display;\n ${getScriptForReadonlyFields(fields)}\n ${getScriptForRemoveUrlPrefixForImgFields(fields)}\n ${getScriptForSimplifiedValueForFileFields(fields)}\n let query = \\`mutation{record: \\${objectName}__insert(doc: {__saveData}){_id}}\\`;\n if(formData.recordId && formData.recordId !='new'){\n query = \\`mutation{record: \\${objectName}__update(id: \"\\${formData._id}\", doc: {__saveData}){_id}}\\`;\n };\n delete formData._id;\n delete formData.__selectUserLoaded__;//选人控件加载标志不应该保存到数据库中\n let __saveData = JSON.stringify(JSON.stringify(formData));\n `\n}\n\nexport function getSaveRequestAdaptor(fields){\n return `\n ${getSaveDataTpl(fields)}\n api.data = {query: query.replace('{__saveData}', __saveData)};\n return api;\n `\n}\n\nexport async function getFindQuery(object, recordId, fields, options){\n let limit = options.limit || 10;\n let queryOptions = `(top: ${limit})`;\n if(recordId){\n queryOptions = `(filters:[\"_id\", \"=\", \"${recordId}\"], top: ${limit})`;\n }\n let alias = \"data\";\n if(options){\n if(options.alias){\n alias = options.alias;\n }\n\n if(options.filters){\n queryOptions = `(filters:${options.filters})`;\n }\n if(options.queryOptions){\n queryOptions = `(${options.queryOptions})`;\n }\n }\n var treeFields = '';\n if(object.enable_tree && _.includes(_.keys(object.fields), 'parent') && _.includes(_.keys(object.fields), 'children')){\n treeFields = ',parent,children';\n }\n\n var cfsFields = '';\n if(object.name === 'cms_files'){\n cfsFields = ',versions'\n }\n\n return {\n orderBy: \"${orderBy}\",\n orderDir: \"${orderDir}\",\n pageNo: \"${page}\",\n pageSize: \"${perPage}\",\n query: `{${alias}:${object.name}${queryOptions}{${await getFieldsTemplate(fields, options.expand)}${treeFields}${cfsFields}},count:${object.name}__count(filters:{__filters})}`\n }\n}\n\nexport function getRecordPermissionsQuery(object, recordId, options){\n let queryOptions = \"\";\n\n if(recordId){\n queryOptions = `(filters:[\"${object.idFieldName}\", \"=\", \"${recordId}\"])`;\n }\n let alias = \"data\";\n if(options){\n if(options.alias){\n alias = options.alias;\n }\n\n if(options.filters){\n queryOptions = `(filters:${options.filters})`;\n }\n if(options.queryOptions){\n queryOptions = `(${options.queryOptions})`;\n }\n }\n\n let recordPermissionsTemplate = getRecordPermissionsTemplate();\n if(options?.fields && options.fields.length){\n recordPermissionsTemplate = `\n recordPermissions: _permissions{\n ${options.fields.join(\",\")}\n }\n `;\n }\n return {\n query: `{${alias}:${object.name}${queryOptions}{${object.idFieldName},${recordPermissionsTemplate}}}`\n }\n}\n\nexport function getApi (isMobile){\n if(isMobile){\n //TODO 返回 绝对路径\n }else{\n // return __meteor_runtime_config__.ROOT_URL_PATH_PREFIX + \"/graphql\"\n return `\\${context.rootUrl}/graphql`\n }\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-08-16 17:02:08\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-12-30 13:57:19\n * @Description:\n */\n\n\nexport const Router = {\n getAppPath({formFactor, appId}){\n return `/app/${appId}`;\n },\n getPagePath(){\n //TODO\n },\n getObjectListViewPath({formFactor, appId, objectName, listViewName}){\n return `/app/${appId}/${objectName}/grid/${listViewName}`;\n },\n getObjectDetailPath(props){\n const {formFactor, appId, objectName, recordId, listViewName} = props;\n if(objectName === 'instances'){\n return `/workflow/space/\\${context.tenantId}/\\${listName}/${recordId}`;\n }\n return `/app/${appId}/${objectName}/view/${recordId}`;\n },\n getObjectRelatedViewPath({formFactor, appId, masterObjectName, masterRecordId, objectName, foreignKey}){\n return `/app/${appId}/${masterObjectName}/${masterRecordId}/${objectName}/grid?related_field_name=${foreignKey}`;\n }\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-05-23 09:53:08\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2023-02-01 15:54:58\n * @Description: \n */\nimport { Router } from '../../router'\n import { getUISchema } from '../../objects'\n\nexport function getCreatedInfoTpl(formFactor){\n const href = Router.getObjectDetailPath({\n formFactor, appId: \"admin\", objectName: 'users', recordId: '${created_by._id}'\n })\n return `<div><a href='${href}'>\\${_display.created_by.label}</a>\\${_display.created}</div>`\n}\n\nexport function getModifiedInfoTpl(formFactor){\n const href = Router.getObjectDetailPath({\n formFactor, appId: \"admin\", objectName: 'users', recordId: '${modified_by._id}'\n })\n return `<div><a href='${href}'>\\${_display.modified_by.label}</a>\\${_display.modified}</div>`\n}\n\nexport function getNumberTpl(field){\n return `<div>\\${_display.${field.name}}</div>`\n}\n\nexport function getTimeTpl(field){\n return `<div>\\${_display.${field.name}}</div>`\n}\n\nexport function getDateTpl(field){\n return `<div>\\${_display.${field.name}}</div>`\n}\n\n\nexport function getDateTimeTpl(field){\n return `<div>\\${_display.${field.name}}</div>`\n}\n\nexport function getUiFieldTpl(field){\n return `<div>\\${_display.${field.name}}</div>`\n}\n\nexport function getUiFileSizeTpl(field){\n return `<div>\\${_display.${field.name}}</div>`\n}\n\n//TODO 处理name字段\nexport async function getRefObjectNameFieldName(field){\n const refUiSchema = await getUISchema(field.reference_to)\n const NAME_FIELD_KEY = refUiSchema.NAME_FIELD_KEY || 'name';\n return NAME_FIELD_KEY;\n}\n\nexport function getSelectTpl(field){\n return `<div>\\${_display.${field.name}}</div>`\n}\n\nexport function getNameTplUrl(field, ctx){\n if(ctx.objectName === 'cms_files'){\n return `\\${context.rootUrl}/api/files/files/\\${versions[0]}?download=true`\n }\n const href = Router.getObjectDetailPath({\n ...ctx, formFactor: ctx.formFactor, appId: \"${appId}\", objectName: ctx.objectName || \"${objectName}\", recordId: `\\${${ctx.idFieldName}}`\n })\n return href;\n}\n\nexport function getNameTpl(field, ctx){\n const href = getNameTplUrl(field, ctx);\n return `<a href=\"${href}\">\\${${field.name}}</a>`\n}\n\nexport function getRelatedFieldTpl(field, ctx){\n let tpl = '';\n if(!field.reference_to && (field.optionsFunction || field._optionsFunction)){\n return `\\${${field.name}__label}`\n }\n\n const onlyDisplayLabel = ctx.onlyDisplayLabel;\n if(_.isString(field.reference_to) || !field.reference_to){\n if(field.multiple){\n let labelTpl = `<%=item.label%>`;\n if(!onlyDisplayLabel){\n const href = Router.getObjectDetailPath({\n formFactor: ctx.formFactor, appId: ctx.appId, objectName: `<%=item.objectName%>`, recordId: `<%=item.value%>`\n })\n labelTpl = `<a href=\"${href}\"><%=item.label%></a>`;\n }\n tpl = `\n <% if (data._display.${field.name} && data._display.${field.name}.length) { %><% data._display.${field.name}.forEach(function(item) { %> ${labelTpl} <% }); %><% } %>\n `\n }else{\n let labelTpl = `\\${_display.${field.name}.label}`;\n if(!onlyDisplayLabel){\n const href = Router.getObjectDetailPath({\n formFactor: ctx.formFactor, appId: ctx.appId, objectName: `\\${_display.${field.name}.objectName}`, recordId: `\\${_display.${field.name}.value}`\n })\n labelTpl = `<a href=\"${href}\">\\${_display.${field.name}.label}</a>`;\n }\n tpl = labelTpl;\n }\n\n \n }else{\n let labelTpl = `<%=item.label%>`;\n if(!onlyDisplayLabel){\n const href = Router.getObjectDetailPath({\n formFactor: ctx.formFactor, appId: ctx.appId, objectName: `<%=item.objectName%>`, recordId: `<%=item.value%>`\n })\n labelTpl = `<a href=\"${href}\"><%=item.label%></a>`;\n }\n tpl = `\n <% if (data._display.${field.name} && data._display.${field.name}.length) { %><% data._display.${field.name}.forEach(function(item) { %> ${labelTpl} <% }); %><% } %>\n `\n }\n return tpl\n}\n\nexport async function getLookupTpl(field, ctx){\n if(!field.reference_to){\n return getSelectTpl(field)\n }\n const NAME_FIELD_KEY = await getRefObjectNameFieldName(field);\n if(field.multiple){\n const href = Router.getObjectDetailPath({\n formFactor: ctx.formFactor, appId: ctx.appId, objectName: field.reference_to, recordId: `<%=item._id%>`\n })\n return `\n <% if (data.${field.name} && data.${field.name}.length) { %><% data.${field.name}.forEach(function(item) { %> <a href=\"${href}\"><%=item.${NAME_FIELD_KEY}%></a> <% }); %><% } %>\n `\n }else{\n const href = Router.getObjectDetailPath({\n formFactor: ctx.formFactor, appId: ctx.appId, objectName: field.reference_to, recordId: `\\${${field.name}._id}`\n })\n return `<a href=\"${href}\">\\${${field.name}.${NAME_FIELD_KEY}}</a>`\n }\n \n}\n\nexport function getSwitchTpl(field){\n return `<% if (data.${field.name}) { %>\n <span class=\"slds-icon_container slds-icon-utility-check slds-current-color\" title=\"<%=data._display.${field.name}%>\">\n <span ><%= data._display.${field.name} === \"√\" ? \"<svg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='currentColor' class='w-4 h-4'><path stroke-linecap='round' stroke-linejoin='round' d='M4.5 12.75l6 6 9-13.5' /></svg>\" : data._display.${field.name} %></span>\n </span>\n <% } %>`\n}\n\nexport function getPasswordTpl(field){\n return `<% if (data.${field.name}) { %>\n <span>······</span>\n <% } %>`\n}\n\n\nexport async function getFieldTpl (field, options){\n if((field.is_name || field.name === options.labelFieldName) && !options.onlyDisplayLabel){\n return getNameTpl(field, options)\n }\n switch (field.type) {\n case 'password':\n return getPasswordTpl(field);\n case 'boolean':\n return getSwitchTpl(field);\n case 'toggle':\n return getSwitchTpl(field);\n case 'select':\n return getSelectTpl(field);\n case 'time':\n return getTimeTpl(field);\n case 'date':\n return getDateTpl(field);\n case 'datetime':\n return getDateTimeTpl(field);\n case 'lookup':\n return await getRelatedFieldTpl(field, options);\n case 'master_detail':\n return await getRelatedFieldTpl(field, options);\n case 'number':\n case 'currency':\n return await getNumberTpl(field);\n case 'formula':\n case 'summary':\n return getUiFieldTpl(field)\n case 'filesize':\n return getUiFileSizeTpl(field)\n default:\n break;\n }\n};","import { OMIT_FIELDS } from './fields';\nimport { absoluteUrl } from '../../steedos.client'\nimport * as graphql from './graphql'\nimport * as _ from 'lodash';\n\nconst API_CACHE = 100;\n\nfunction getReadonlyFormAdaptor(fields){\n let scriptStr = '';\n const selectFields = _.filter(fields, function(field){return field.name.indexOf('.') < 0 && ((field.type == 'select' && field.options) || ((field.type == 'lookup' || field.type == 'master_detail') && !field.reference_to))});\n _.each(selectFields, function(field){\n if(!_.includes(OMIT_FIELDS, field.name)){\n const valueField = field.name;\n if(field.options){\n const options = JSON.stringify({options: field.options});\n scriptStr = scriptStr + `var ${field.name}Options= (${options}).options;`;\n }else if(field.optionsFunction){\n scriptStr = scriptStr + `var ${field.name}Options = eval(${field.optionsFunction.toString()})(api.data);`\n }else if(field._optionsFunction){\n scriptStr = scriptStr + `var ${field.name}Options = eval(${field._optionsFunction})(api.data);`\n }\n if(field.multiple){\n scriptStr = scriptStr + `data.${field.name}__label = _.map(_.filter(${field.name}Options, function(option){return _.includes(data.${field.name}, option.value)}), 'label');`\n }else{\n scriptStr = scriptStr + `var ${field.name}Selected = _.find(${field.name}Options, function(option){return data.${field.name} == option.value});`\n scriptStr = scriptStr + `data.${field.name}__label = ${field.name}Selected ? ${field.name}Selected.label:null;`\n }\n }\n })\n\n // const refFields = _.filter(fields, function(field){return field.name.indexOf('.') < 0 && (field.type == 'lookup' || field.type == 'master_detail') && !field.reference_to});\n // _.each(refFields, function(field){\n // if(!_.includes(OMIT_FIELDS, field.name)){\n // const valueField = field.reference_to_field || '_id';\n // scriptStr = scriptStr + `var ${field.name}Options = eval(${field.optionsFunction.toString()})(api.data);`\n // if(field.multiple){\n // scriptStr = scriptStr + `data.${field.name}__label = _.map(_.filter(${field.name}Options, function(option){return _.includes(data.${field.name}, option.value)}), 'label');`\n // }else{\n // scriptStr = scriptStr + `var ${field.name}Selected = _.find(${field.name}Options, function(option){return data.${field.name} == option.value});`\n // scriptStr = scriptStr + `data.${field.name}__label = ${field.name}Selected ? ${field.name}Selected.label:null;`\n // }\n // }\n // })\n\n return `\n if(payload.data.data){\n var data = payload.data.data[0];\n try{\n ${scriptStr}\n ${getScriptForAddUrlPrefixForImgFields(fields)}\n ${getScriptForRewriteValueForFileFields(fields)}\n }catch(e){\n console.error(e)\n }\n payload.data = data;\n window.postMessage(Object.assign({type: \"record.loaded\"}, {record: data}), \"*\")\n }\n if(payload.errors){\n payload.status = 2;\n payload.msg = payload.errors[0].message;\n }\n return payload;\n`\n}\n\nexport async function getReadonlyFormInitApi(object, recordId, fields, options){\n return {\n method: \"post\",\n url: graphql.getApi()+\"?rf=\"+ (new Date()).getTime(),\n cache: API_CACHE,\n adaptor: getReadonlyFormAdaptor(fields),\n data: await graphql.getFindOneQuery(object, recordId, fields, options),\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n}\n\nfunction getConvertDataScriptStr(fields){\n const refFields = _.filter(fields, function(field){return field.name.indexOf('.') < 0 && (field.type == 'lookup' || field.type == 'master_detail') && field.reference_to});\n let scriptStr = '';\n _.each(refFields, function(field){\n if(!_.includes(OMIT_FIELDS, field.name)){\n const valueField = field.reference_to_field || '_id';\n if(field.multiple){\n scriptStr = scriptStr + `data.${field.name} = _.map(data.${field.name}, '${valueField}');`\n }else{\n scriptStr = scriptStr + `data.${field.name} = data.${field.name} ? data.${field.name}.${valueField}:null;`\n }\n }\n })\n return scriptStr;\n}\n\n/*\n img/avatar字段值添加URL前缀使其在amis中正常显示图片。\n*/\nfunction getScriptForAddUrlPrefixForImgFields(fields){\n let imgFieldsKeys = [];\n let imgFields = {};\n fields.forEach((item)=>{\n if(_.includes(['image','avatar'], item.type)){\n imgFieldsKeys.push(item.name);\n imgFields[item.name] = {\n name: item.name,\n type: item.type,\n multiple: item.multiple\n };\n }\n })\n if(!imgFieldsKeys.length){\n return '';\n }\n return `\n // image字段值添加URL前缀\n let imgFieldsKeys = ${JSON.stringify(imgFieldsKeys)};\n let imgFields = ${JSON.stringify(imgFields)};\n imgFieldsKeys.forEach((item)=>{\n let imgFieldValue = data[item];\n let imgFieldDisplayValue = data._display && data._display[item];\n if(imgFieldValue && imgFieldValue.length){\n let fieldProps = imgFields[item];\n if(fieldProps.multiple){\n if(imgFieldDisplayValue instanceof Array){\n data[item] = imgFieldDisplayValue.map((i)=>{ return i.url });\n }\n }else{\n data[item] = imgFieldDisplayValue && imgFieldDisplayValue.url;\n }\n }\n })\n `\n}\n\n/*\n file字段值重写使其在amis中正常显示附件名、点击附件名下载文件。\n*/\nfunction getScriptForRewriteValueForFileFields(fields){\n let fileFieldsKeys = [];\n let fileFields = {};\n fields.forEach((item)=>{\n if(item.type === 'file'){\n fileFieldsKeys.push(item.name);\n fileFields[item.name] = {\n name: item.name,\n multiple: item.multiple\n };\n }\n })\n if(!fileFieldsKeys.length){\n return '';\n }\n return `\n // file字段值重写以便编辑时正常显示附件名、点击附件名正常下载附件\n let fileFieldsKeys = ${JSON.stringify(fileFieldsKeys)};\n let fileFields = ${JSON.stringify(fileFields)};\n fileFieldsKeys.forEach((item)=>{\n let fileFieldValue = data[item];\n let fileFieldDisplayValue = data._display && data._display[item];\n if(fileFieldValue && fileFieldValue.length){\n if(fileFields[item].multiple){\n if(fileFieldDisplayValue instanceof Array){\n data[item] = fileFieldDisplayValue.map((item, index)=>{ \n return {\n value: fileFieldValue[index],\n name: item.name,\n url: item.url + \"?download=true\",\n state: \"uploaded\"\n }\n });\n }\n }else{\n data[item] = {\n value: fileFieldValue,\n name: fileFieldDisplayValue.name,\n url: fileFieldDisplayValue.url + \"?download=true\",\n state: \"uploaded\"\n };\n }\n }\n })\n `\n}\n\nexport async function getEditFormInitApi(object, recordId, fields){\n return {\n method: \"post\",\n url: graphql.getApi(),\n sendOn: \"!!this.recordId\",\n cache: API_CACHE,\n adaptor: `\n if(payload.data.data){\n var data = payload.data.data[0];\n if(data){\n ${getScriptForAddUrlPrefixForImgFields(fields)}\n ${getScriptForRewriteValueForFileFields(fields)}\n //初始化接口返回的字段移除字段值为null的字段\n for (key in data){\n if(data[key] === null){\n delete data[key];\n }\n }\n };\n payload.data = data;\n delete payload.extensions;\n }\n return payload;\n `,\n data: await graphql.getFindOneQuery(object, recordId, fields),\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n}\n\n\nexport function getSaveApi(object, recordId, fields, options){\n return {\n method: 'post',\n url: graphql.getApi(),\n data: graphql.getSaveQuery(object, recordId, fields, options),\n requestAdaptor: graphql.getSaveRequestAdaptor(fields),\n responseData: {\n \"recordId\": \"${record._id}\"\n },\n adaptor: `\n if(payload.errors){\n payload.status = 2;\n payload.msg = window.t ? window.t(payload.errors[0].message) : payload.errors[0].message;\n }\n return payload;\n `,\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n}\n\nexport function getBatchDelete(objectName){\n return {\n method: 'post',\n url: graphql.getApi(),\n requestAdaptor: `\n var ids = api.data.ids.split(\",\");\n var deleteArray = [];\n ids.forEach((id,index)=>{\n deleteArray.push(\\`delete__\\${index}:${objectName}__delete(id: \"\\${id}\")\\`);\n })\n api.data = {query: \\`mutation{\\${deleteArray.join(',')}}\\`};\n return api;\n `,\n data: {\n ids: `\\${ids}`\n },\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-05-26 16:02:08\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2023-02-02 10:14:47\n * @Description: \n */\nimport * as Fields from '../fields';\nimport * as lodash from 'lodash';\n\nconst getFieldSchemaArray = (mergedSchema)=>{\n let fieldSchemaArray = [];\n fieldSchemaArray.length = 0\n\n const fieldsArr = [];\n lodash.forEach(mergedSchema.fields, (field, fieldName)=>{\n if(!lodash.has(field, \"name\")){\n field.name = fieldName\n }\n fieldsArr.push(field)\n })\n\n lodash.forEach(lodash.sortBy(mergedSchema.fields, \"sort_no\"), (field) => {\n if (!field.group || field.group == 'null' || field.group == '-')\n field.group = '通用'\n const fieldName = field.name;\n let isObjectField = /\\w+\\.\\w+/.test(fieldName)\n if (field.type == 'grid' || field.type == 'object') {\n // field.group = field.label\n field.is_wide = true;\n }\n \n if (!isObjectField){\n if(!field.hidden){\n fieldSchemaArray.push(Object.assign({name: fieldName}, field, {permission: {allowEdit: true}}))\n }\n }\n })\n return fieldSchemaArray;\n}\n\nconst getSection = async (permissionFields, fieldSchemaArray, sectionName, ctx) => {\n const sectionFields = lodash.filter(fieldSchemaArray, { 'group': sectionName });\n if(sectionFields.length == lodash.filter(sectionFields, ['hidden', true]).length){\n return ;\n }\n\n const fieldSetBody = [];\n\n for (const perField of sectionFields) {\n let field = perField;\n if(perField.type === 'grid'){\n field = await Fields.getGridFieldSubFields(perField, permissionFields);\n }else if(perField.type === 'object'){\n field = await Fields.getObjectFieldSubFields(perField, permissionFields);\n // console.log(`perField.type object ===> field`, field)\n }\n if(field.name.indexOf(\".\") < 0){\n ctx.__permissionFields = permissionFields;\n const amisField = await Fields.convertSFieldToAmisField(field, field.readonly, ctx);\n // console.log(`${field.name} amisField`, amisField)\n if(amisField){\n fieldSetBody.push(amisField);\n }\n }\n }\n\n // fieldSet 已支持显隐控制\n const sectionFieldsVisibleOn = lodash.map(lodash.compact(lodash.map(fieldSetBody, 'visibleOn')) , (visibleOn)=>{\n return `(${visibleOn.substring(2, visibleOn.length -1)})`;\n });\n const section = {\n \"type\": \"fieldSet\",\n \"title\": sectionName,\n \"collapsable\": true,\n \"body\": fieldSetBody,\n }\n if(sectionFieldsVisibleOn.length > 0 && fieldSetBody.length === sectionFieldsVisibleOn.length){\n section.visibleOn = `\\${${sectionFieldsVisibleOn.join(\" || \")}}`\n }\n return section\n}\n\nexport const getSections = async (permissionFields, mergedSchema, ctx) => {\n const fieldSchemaArray = getFieldSchemaArray(mergedSchema)\n const _sections = lodash.groupBy(fieldSchemaArray, 'group');\n const sections = [];\n for (const key in _sections) {\n const section = await getSection(permissionFields, fieldSchemaArray, key, ctx);\n if(section.body.length > 0){\n sections.push(section)\n }\n }\n return sections;\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-07-07 11:02:29\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-09-01 11:46:15\n * @Description: \n */\nimport { getSections } from './fields/sections';\n\nexport async function getFormBody(permissionFields, objectConfig, ctx){\n return await getSections(permissionFields, objectConfig, ctx);\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-07-23 09:12:14\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-11-25 13:28:35\n * @Description: \n */\n\nimport * as Tpl from '../tpl';\nimport { Router } from '../../../router'\n\nasync function getListBody(fields, options){\n const columns = [];\n for (const field of fields) {\n\n const tpl = await Tpl.getFieldTpl(field, options);\n\n let type = 'text';\n if(tpl){\n type = 'tpl';\n }\n if(!field.hidden && !field.extra){\n columns.push({\n name: field.name,\n label: field.label,\n sortable: field.sortable,\n // searchable: field.searchable,\n width: field.width,\n type: type,\n tpl: tpl,\n toggled: field.toggled\n // toggled: true \n })\n }\n };\n\n return {\n \"type\": \"hbox\",\n \"columns\": columns\n };\n}\n\nfunction getDefaultParams(options){\n return {\n perPage: options.top || options.perPage || 10\n }\n}\n\nexport async function getListSchema(fields, options){\n const listBody = await getListBody(fields, options);\n const columns = listBody.columns;\n return {\n mode: \"list\",\n name: \"thelist\",\n draggable: false,\n headerToolbar: ['reload'],\n defaultParams: getDefaultParams(options),\n syncLocation: false,\n keepItemSelectionOnPageChange: true,\n checkOnItemClick: false,\n labelTpl: `\\${name}`, //TODO 获取name字段\n listItem: {\n body: [...columns],\n actions: options.actions === false ? null : [\n {\n icon: \"fa fa-eye\",\n label: \"查看\",\n type: \"button\",\n actionType: \"link\",\n link: Router.getObjectDetailPath({\n formFactor: options.formFactor, \n appId: options.appId, \n objectName: options.tabId, \n listView: options.listView,\n recordId: `\\${_id}`\n })\n }\n ]\n }\n }\n}\n\n\nexport async function getCardSchema(fields, options){\n let title = null;\n const titleField = _.find(fields, (f)=>{\n return f.name === options.labelFieldName;\n });\n if(titleField){\n title = await Tpl.getFieldTpl(titleField, options)\n }\n const listBody = await getListBody(_.filter(fields, (f)=>{\n return f.name != options.labelFieldName\n }), options);\n return {\n mode: \"cards\",\n name: \"cards\",\n draggable: false,\n headerToolbar: ['statistics', 'pagination'],\n defaultParams: getDefaultParams(options),\n syncLocation: false,\n keepItemSelectionOnPageChange: false,\n checkOnItemClick: false,\n labelTpl: `\\${${options.labelFieldName}}`,\n card: {\n \"type\": \"card\",\n \"header\": {\n \"title\": title\n },\n \"body\": [...listBody.columns]\n }\n }\n}","import {get} from 'lodash'\n\nconst globalTag = '__G_L_O_B_A_L__';\n\nconst getParentPath = function (path) {\n var pathArr;\n if (typeof path === 'string') {\n pathArr = path.split('.');\n if (pathArr.length === 1) {\n return '#';\n }\n pathArr.pop();\n return pathArr.join('.');\n }\n return '#';\n}\n\nconst getValueByPath = function (formData, path) {\n if (path === '#' || !path) {\n return formData || {};\n } else if (typeof path === 'string') {\n return get(formData, path);\n } else {\n console.error('path has to be a string');\n }\n};\n\nexport const isExpression = function (func) {\n var pattern, reg1, reg2;\n if (typeof func !== 'string') {\n return false;\n }\n pattern = /^{{(.+)}}$/;\n reg1 = /^{{(function.+)}}$/;\n reg2 = /^{{(.+=>.+)}}$/;\n if (typeof func === 'string' && func.match(pattern) && !func.match(reg1) && !func.match(reg2)) {\n return true;\n }\n return false;\n};\n\nexport const parseSingleExpression = function (func, formData, dataPath, global, userSession = {}) {\n var error, funcBody, parent, parentPath, str;\n\n if (formData === void 0) {\n formData = {};\n }\n parentPath = getParentPath(dataPath);\n parent = getValueByPath(formData, parentPath) || {};\n if (typeof func === 'string') {\n funcBody = func.substring(2, func.length - 2);\n str = `\\n var $user=${JSON.stringify(userSession)}; return ` + funcBody.replace(/\\bformData\\b/g, JSON.stringify(formData).replace(/\\bglobal\\b/g, globalTag)).replace(/\\bglobal\\b/g, JSON.stringify(global)).replace(new RegExp('\\\\b' + globalTag + '\\\\b', 'g'), 'global').replace(/rootValue/g, JSON.stringify(parent));\n try {\n return Function(str)();\n } catch (_error) {\n error = _error;\n console.log(error, func, dataPath);\n return func;\n }\n } else {\n return func;\n }\n};","\nimport { toArray, mergeWith, isArray } from 'lodash';\n\n// lodash的defaultsDeep函数有bug,无法正确合并值为数值的节点,重写修正该函数\n// 源码出处:https://github.com/nodeutils/defaults-deep\nexport const defaultsDeep = (...args)=>{\n let output = {};\n toArray(args).reverse().forEach(item=> {\n mergeWith(output, item, (objectValue, sourceValue) => {\n return isArray(sourceValue) ? sourceValue : undefined;\n });\n });\n return output;\n};","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-08-04 10:42:49\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-08-25 10:28:47\n * @Description: \n */\nexport default {\n listView: {\n newRecordMode: 'modal',\n editRecordMode: 'modal',\n perPage: 20\n }\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-07-13 15:18:03\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-11-08 09:35:03\n * @Description: \n */\nimport { fetchAPI } from './steedos.client';\n\nexport async function getPage({type, pageId, appId, objectName = '', recordId, formFactor = 'LARGE'}){\n if(!objectName){\n objectName = ''\n }\n if(!recordId){\n recordId = ''\n }\n if(!pageId){\n pageId = ''\n }\n const api = `/api/pageSchema/${type}?app=${appId}&objectApiName=${objectName}&recordId=${recordId}&pageId=${pageId}&formFactor=${formFactor}`;\n const page = await fetchAPI(api);\n if (page && page.schema) {\n return page;\n }\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-11-01 15:51:00\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2023-01-12 18:15:27\n * @Description: \n */\n\nimport { getPage } from '../lib/page'\n\nexport const getSchema = async (uiSchema, ctx)=>{\n const title = \"新建 \" + uiSchema.label;\n const defaultFormSchema = {\n \"type\": \"steedos-object-form\",\n \"label\": \"对象表单\",\n \"objectApiName\": \"${objectName}\",\n \"recordId\": \"\",\n \"id\": \"u:f8ad8ddf153a\",\n \"mode\": \"edit\",\n \"layout\": \"normal\"\n };\n\n let formSchema = defaultFormSchema;\n const page = await getPage({type: 'form', appId: ctx.appId, objectName: ctx.objectName, formFactor: ctx.formFactor});\n\n if(page){\n formSchema = _.isString(page.schema) ? JSON.parse(page.schema) : page.schema;\n }\n // console.log(`standard_new getSchema`, uiSchema, ctx)\n return {\n \"type\": \"service\",\n \"body\": [\n {\n \"type\": \"button\",\n \"label\": \"新建\",\n \"id\": \"u:standard_new\",\n \"level\": \"default\",\n \"onEvent\": {\n \"click\": {\n \"actions\": [\n {\n \"actionType\": \"dialog\",\n \"dialog\": {\n \"type\": \"dialog\",\n \"data\": {\n \"$master\": \"$$\",\n \"&\": \"${defaultData}\",\n \"appId\": \"${appId}\",\n \"objectName\": \"${objectName}\",\n \"context\": \"${context}\",\n \"global\": \"${global}\",\n \"listViewId\": \"${listViewId}\"\n },\n \"title\": title,\n \"bodyClassName\": \"\",\n \"body\": [\n formSchema\n ],\n \"id\": \"u:0b96577db93c\",\n \"closeOnEsc\": false,\n \"closeOnOutside\": false,\n \"showCloseButton\": true,\n \"size\": \"lg\"\n }\n }\n ],\n \"weight\": 0\n }\n }\n }\n ],\n \"regions\": [\n \"body\"\n ],\n \"className\": \"p-0 border-0\",\n \"id\": \"u:aef99d937b10\"\n }\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-11-01 15:53:07\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-12-05 10:49:23\n * @Description: \n */\n\nimport * as standardNew from '../schema/standard_new.amis.js'\nimport * as standardEdit from '../schema/standard_edit.amis.js'\nimport * as standardDelete from '../schema/standard_delete.amis.js'\nimport * as standardImportData from '../schema/standard_import_data.amis.js'\nimport * as standardOpenView from '../schema/standard_open_view.amis.js'\n\nexport const StandardButtons = {\n getStandardNew: async (uiSchema, ctx)=>{\n return {\n type: 'amis_button',\n amis_schema: await standardNew.getSchema(uiSchema, ctx)\n }\n },\n getStandardEdit: async (uiSchema, ctx)=>{\n return {\n type: 'amis_button',\n amis_schema: await standardEdit.getSchema(uiSchema, ctx)\n }\n },\n getStandardDelete: async (uiSchema, ctx)=>{\n return {\n type: 'amis_button',\n amis_schema: await standardDelete.getSchema(uiSchema, ctx)\n }\n },\n getStandardDeleteMany: async (uiSchema, ctx)=>{\n return {\n type: 'script',\n todo: function(){\n const {\n appId,\n objectName,\n uiSchema\n } = this;\n const scopeId = this.scopeId || `amis-${appId}-${objectName}-listview`;\n const scope = this.scope || SteedosUI?.getRef(scopeId);\n const listViewRef = scope.getComponentById(`listview_${uiSchema.name}`);\n console.log(`listViewRef`, listViewRef)\n if(_.isEmpty(listViewRef.props.store.toJSON().selectedItems)){\n listViewRef.handleAction({}, {\n \"actionType\": \"toast\",\n \"toast\": {\n \"items\": [\n {\n \"position\": \"top-right\",\n \"body\": \"请选择要删除的项\"\n }\n ]\n }\n })\n }else{\n listViewRef.handleBulkAction(listViewRef.props.store.toJSON().selectedItems,[],{},listViewRef.props.bulkActions[0]);\n }\n }\n }\n },\n getStandardImportData: async (uiSchema, ctx)=>{\n return {\n type: 'amis_button',\n amis_schema: await standardImportData.getSchema(uiSchema, ctx)\n }\n },\n getStandardOpenView: async (uiSchema, ctx)=>{\n return {\n type: 'amis_button',\n amis_schema: await standardOpenView.getSchema(uiSchema, ctx)\n }\n }\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-11-01 15:49:58\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-11-08 16:39:40\n * @Description:\n */\n\nimport { getPage } from '../lib/page'\n\nexport const getSchema = async (uiSchema, ctx) => {\n const title = \"编辑 \" + uiSchema.label;\n\n const defaultFormSchema = {\n type: \"steedos-object-form\",\n label: \"对象表单\",\n objectApiName: \"${objectName}\",\n recordId: \"${recordId}\",\n id: \"u:d2b0c083c38f\",\n mode: \"edit\",\n };\n\n let formSchema = defaultFormSchema;\n const page = await getPage({\n type: \"form\",\n appId: ctx.appId,\n objectName: ctx.objectName,\n formFactor: ctx.formFactor,\n });\n\n if (page) {\n formSchema = _.isString(page.schema)\n ? JSON.parse(page.schema)\n : page.schema;\n }\n\n return {\n type: \"service\",\n body: [\n {\n type: \"button\",\n label: \"编辑\",\n id: \"u:standard_edit\",\n onEvent: {\n click: {\n actions: [\n {\n actionType: \"dialog\",\n dialog: {\n type: \"dialog\",\n title: title,\n bodyClassName: \"\",\n body: [formSchema],\n id: \"u:ee95697baa4f\",\n closeOnEsc: false,\n closeOnOutside: false,\n showCloseButton: true,\n size: \"lg\",\n },\n },\n ],\n weight: 0,\n },\n },\n },\n ],\n regions: [\"body\"],\n className: \"\",\n id: \"u:3c5cbc0429bb\",\n };\n};\n","export const getSchema = (uiSchema)=>{\n return {\n \"type\": \"service\",\n \"className\": \"p-0\",\n \"body\": [\n {\n \"type\": \"button\",\n \"label\": \"删除\",\n \"confirmText\": \"确定要删除此项目?\",\n \"onEvent\": {\n \"click\": {\n \"actions\": [\n {\n \"args\": {\n \"api\": {\n \"method\": \"post\",\n \"url\": \"${context.rootUrl}/graphql\",\n \"data\": {\n \"&\": \"$$\",\n \"recordId\": \"${recordId}\",\n \"objectName\": \"${objectName}\"\n },\n \"requestAdaptor\": \"const {recordId, objectName} = api.body; var deleteArray = []; deleteArray.push(`delete:${objectName}__delete(id: \\\"${recordId}\\\")`); api.data = {query: `mutation{${deleteArray.join(',')}}`}; return api;\",\n \"headers\": {\n \"Authorization\": \"Bearer ${context.tenantId},${context.authToken}\"\n },\n \"adaptor\": `\n if(payload.errors){\n payload.status = 2;\n payload.msg = payload.errors[0].message;\n }\n return payload;\n `,\n },\n \"messages\": {\n \"success\": \"删除成功\",\n \"failed\": \"删除失败\"\n }\n },\n \"actionType\": \"ajax\"\n },\n {\n \"componentId\": \"\",\n \"args\": {\n \"url\": \"/app/${app_id}/${objectName}/grid/all\",\n \"blank\": false\n },\n \"actionType\": \"link\",\n \"expression\": \"!!!listViewId\"\n },\n {\n \"componentId\": `listview_${uiSchema.name}`,\n \"actionType\": \"reload\",\n \"expression\": \"!!listViewId\"\n },\n ]\n }\n }\n }\n ],\n \"regions\": [\n \"body\"\n ]\n }\n}","export const getSchema = (uiSchema) => {\n return {\n type: \"service\",\n body: [\n {\n type: \"button\",\n label: \"导入数据\",\n id: \"u:import_data\",\n onEvent: {\n click: {\n actions: [\n {\n actionType: \"dialog\",\n dialog: {\n data: {\n \"&\": \"$$\",\n \"object_name\": \"${objectName}\"\n },\n type: \"dialog\",\n title: \"导入数据\",\n body: [\n {\n type: \"form\",\n mode: \"edit\",\n persistData: false,\n promptPageLeave: true,\n name: \"form_edit_data_import\",\n debug: false,\n title: \"\",\n submitText: \"\",\n api: {\n method: \"post\",\n url: \"${context.rootUrl}/graphql\",\n data: {\n objectName: \"queue_import_history\",\n $: \"$$\",\n },\n requestAdaptor:\n \"\\n const formData = api.data.$;\\n for (key in formData){\\n // image、select等字段清空值后保存的空字符串转换为null。\\n if(formData[key] === ''){\\n formData[key] = null;\\n }\\n }\\n const objectName = api.data.objectName;\\n const fieldsName = Object.keys(formData);\\n delete formData.created;\\n delete formData.created_by;\\n delete formData.modified;\\n delete formData.modified_by;\\n delete formData._display;\\n delete formData.success_count;\\ndelete formData.failure_count;\\ndelete formData.total_count;\\ndelete formData.start_time;\\ndelete formData.end_time;\\ndelete formData.state;\\ndelete formData.error;\\ndelete formData.created;\\ndelete formData.created_by;\\ndelete formData.modified;\\ndelete formData.modified_by;\\n \\n \\n let fileFieldsKeys = [\\\"file\\\"];\\n let fileFields = {\\\"file\\\":{\\\"name\\\":\\\"file\\\"}};\\n fileFieldsKeys.forEach((item)=>{\\n let fileFieldValue = formData[item];\\n if(fileFieldValue){\\n // 因为表单初始化接口的接收适配器中为file字段值重写了值及格式(为了字段编辑时正常显示附件名、点击附件名正常下载),所以保存时还原(为了字段值保存时正常保存id)。\\n if(fileFields[item].multiple){\\n if(fileFieldValue instanceof Array && fileFieldValue.length){\\n formData[item] = fileFieldValue.map((value)=>{ \\n if(typeof value === 'object'){\\n return value.value;\\n }else{\\n return value;\\n }\\n });\\n }\\n }else{\\n formData[item] = typeof fileFieldValue === 'object' ? fileFieldValue.value : fileFieldValue;\\n }\\n }\\n })\\n \\n let query = `mutation{record: ${objectName}__insert(doc: {__saveData}){_id}}`;\\n if(formData.recordId && formData.recordId !='new'){\\n query = `mutation{record: ${objectName}__update(id: \\\"${formData._id}\\\", doc: {__saveData}){_id}}`;\\n };\\n delete formData._id;\\n let __saveData = JSON.stringify(JSON.stringify(formData));\\n \\n api.data = {query: query.replace('{__saveData}', __saveData)};\\n return api;\\n \",\n responseData: {\n recordId: \"${record._id}\",\n },\n adaptor:\n \"console.log('payload', payload)\\n return payload;\\n \",\n headers: {\n Authorization:\n \"Bearer ${context.tenantId},${context.authToken}\",\n },\n dataType: \"json\",\n },\n initFetch: true,\n body: [\n {\n type: \"fieldSet\",\n title: \"通用\",\n collapsable: true,\n body: [\n {\n name: \"object_name\",\n label: \"导入对象\",\n required: false,\n type: \"select\",\n joinValues: false,\n extractValue: true,\n autoComplete: {\n method: \"post\",\n url: \"${context.rootUrl}/graphql\",\n data: {\n orderBy: \"${orderBy}\",\n orderDir: \"${orderDir}\",\n pageNo: \"${page}\",\n pageSize: \"${perPage}\",\n query:\n \"{options:objects(filters: {__filters}, top: {__top}){_id label:label value:name},count:objects__count(filters:{__filters})}\",\n $term: \"$term\",\n $value: \"$object_name.name\",\n $: \"$$\",\n rfield: \"${object_name}\",\n },\n headers: {\n Authorization:\n \"Bearer ${context.tenantId},${context.authToken}\",\n },\n requestAdaptor:\n \"\\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 \",\n },\n className: \"m-1\",\n labelClassName: \"text-left\",\n clearValueOnHidden: false,\n id: \"u:04295fee3896\",\n multiple: false,\n hidden: true,\n },\n {\n name: \"queue_import\",\n label: \"数据导入\",\n required: true,\n type: \"picker\",\n labelField: \"description\",\n valueField: \"_id\",\n modalMode: \"dialog\",\n source: {\n method: \"post\",\n url: \"${context.rootUrl}/graphql\",\n data: {\n orderBy: \"${orderBy}\",\n orderDir: \"${orderDir}\",\n pageNo: \"${page}\",\n pageSize: \"${perPage}\",\n query:\n '{rows:queue_import(filters: {__filters}, top: {__top}, skip: {__skip}, sort: \"{__sort}\"){_id,description,object_name,encoding,template_url,_display:_ui{object_name,encoding}},count:queue_import__count(filters:{__filters})}',\n $term: \"$term\",\n $self: \"$$\",\n },\n headers: {\n Authorization:\n \"Bearer ${context.tenantId},${context.authToken}\",\n },\n requestAdaptor:\n \"\\n const selfData = JSON.parse(JSON.stringify(api.data.$self));\\n var filters = [];\\n var pageSize = api.data.pageSize || 10;\\n var pageNo = api.data.pageNo || 1;\\n var skip = (pageNo - 1) * pageSize;\\n var orderBy = api.data.orderBy || '';\\n var orderDir = api.data.orderDir || '';\\n var sort = orderBy + ' ' + orderDir;\\n var allowSearchFields = [\\\"description\\\"];\\n if(api.data.$term){\\n filters = [[\\\"name\\\", \\\"contains\\\", \\\"'+ api.data.$term +'\\\"]];\\n }else if(selfData.op === 'loadOptions' && selfData.value){\\n if(selfData.value?.indexOf(',') > 0){\\n filters = [[\\\"_id\\\", \\\"=\\\", selfData.value.split(',')]];\\n }else{\\n filters = [[\\\"_id\\\", \\\"=\\\", selfData.value]];\\n }\\n }\\n if(allowSearchFields){\\n allowSearchFields.forEach(function(key){\\n const keyValue = selfData[key];\\n if(keyValue){\\n filters.push([key, \\\"contains\\\", keyValue]);\\n }\\n })\\n }\\n\\n const filtersFunction = function(filters, values){return ['object_name', '=', values.object_name]};\\n\\n if(filtersFunction){\\n const _filters = filtersFunction(filters, api.data.$self.__super.__super);\\n if(_filters && _filters.length > 0){\\n filters.push(_filters);\\n }\\n }\\n\\n api.data.query = api.data.query.replace(/{__filters}/g, JSON.stringify(filters)).replace('{__top}', pageSize).replace('{__skip}', skip).replace('{__sort}', sort.trim());\\n return api;\\n \",\n adaptor:\n \"\\n const enable_tree = undefined;\\n if(enable_tree){\\n const records = payload.data.rows;\\n const treeRecords = [];\\n const getChildren = (records, childrenIds)=>{\\n if(!childrenIds){\\n return;\\n }\\n const children = _.filter(records, (record)=>{\\n return _.includes(childrenIds, record._id)\\n });\\n _.each(children, (item)=>{\\n if(item.children){\\n item.children = getChildren(records, item.children)\\n }\\n })\\n return children;\\n }\\n\\n _.each(records, (record)=>{\\n if(!record.parent){\\n treeRecords.push(Object.assign({}, record, {children: getChildren(records, record.children)}));\\n }\\n });\\n payload.data.rows = treeRecords;\\n }\\n return payload;\\n \",\n },\n size: \"lg\",\n pickerSchema: {\n mode: \"table\",\n name: \"thelist\",\n draggable: false,\n headerToolbar: [\"reload\"],\n defaultParams: {\n perPage: 20,\n },\n columns: [\n {\n name: \"_index\",\n type: \"text\",\n width: 32,\n placeholder: \"\",\n },\n {\n name: \"description\",\n label: \"导入描述\",\n type: \"tpl\",\n tpl: '<a href=\"/app/undefined/undefined/view/${undefined}\">${description}</a>',\n className: \"whitespace-nowrap\",\n html: null,\n },\n {\n name: \"object_name\",\n label: \"导入对象\",\n type: \"tpl\",\n tpl: '<a href=\"/app/undefined/${_display.object_name.objectName}/view/${_display.object_name.value}\">${_display.object_name.label}</a>',\n className: \"whitespace-nowrap\",\n html: null,\n },\n {\n name: \"encoding\",\n label: \"字符代码\",\n type: \"tpl\",\n tpl: \"<div>${_display.encoding}</div>\",\n className: \"whitespace-nowrap\",\n html: null,\n },\n {\n name: \"template_url\",\n label: \"导入模板\",\n type: \"tpl\",\n // type: \"markdown\",\n // html: true,\n className: \"whitespace-nowrap\",\n },\n null,\n ],\n syncLocation: false,\n keepItemSelectionOnPageChange: true,\n checkOnItemClick: false,\n autoFillHeight: false,\n },\n joinValues: false,\n extractValue: true,\n className: \"m-1\",\n labelClassName: \"text-left\",\n clearValueOnHidden: true,\n id: \"u:401df27113e0\",\n },\n {\n name: \"file\",\n label: \"Excel文件\",\n required: true,\n type: \"input-file\",\n className: \"m-1\",\n labelClassName: \"text-left\",\n clearValueOnHidden: true,\n useChunk: false,\n receiver: {\n method: \"post\",\n url: \"${context.rootUrl}/s3/files\",\n data: {\n $: \"$$\",\n context: \"${context}\",\n },\n adaptor:\n '\\n const { context } = api.body; \\n var rootUrl = context.rootUrl + \"/api/files/files/\";\\n payload = {\\n status: response.status == 200 ? 0 : response.status,\\n msg: response.statusText,\\n data: {\\n value: payload._id,\\n name: payload.original.name,\\n url: rootUrl + payload._id,\\n }\\n }\\n return payload;\\n ',\n headers: {\n Authorization:\n \"Bearer ${context.tenantId},${context.authToken}\",\n },\n },\n id: \"u:0213f2cc365b\",\n },\n ],\n id: \"u:4899c260d667\",\n },\n ],\n panelClassName: \"m-0 sm:rounded-lg shadow-none\",\n bodyClassName: \"p-0\",\n className: \"p-4 sm:p-0 steedos-amis-form\",\n label: \"对象表单\",\n objectApiName: \"queue_import_history\",\n id: \"u:e4ef598eed61\",\n onEvent: {\n submitSucc: {\n weight: 0,\n actions: [\n {\n args: {\n api: {\n url: \"${context.rootUrl}/api/data/initiateImport\",\n method: \"post\",\n data: {\n eventData: \"${event.data}\",\n },\n dataType: \"json\",\n requestAdaptor:\n \"\\napi.data = {\\n importObjectHistoryId: api.body.eventData.result.data.recordId\\n}\\nreturn api;\",\n adaptor:\n \"payload.status = payload.status === 'success' ? 0 : payload.status;\\nconsole.log(\\\"payload ssss==>\\\", payload)\\nreturn payload;\",\n headers: {\n Authorization:\n \"Bearer ${context.tenantId},${context.authToken}\",\n },\n },\n messages: {\n success: \"已开始导入...\",\n failed: \"导入失败\",\n },\n },\n actionType: \"ajax\",\n expression: \"event.data.result\",\n },\n ],\n },\n },\n closeDialogOnSubmit: true,\n },\n ],\n id: \"u:dc05498d3bd4\",\n closeOnEsc: false,\n closeOnOutside: false,\n showCloseButton: true,\n size: \"lg\",\n },\n },\n ],\n weight: 0,\n },\n },\n level: \"default\",\n },\n ],\n regions: [\"body\"],\n className: \"p-0\",\n id: \"u:bd2f9c4e986f\",\n };\n};\n","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-11-07 17:00:38\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-11-07 17:12:20\n * @Description: \n */\nexport const getSchema = (uiSchema)=>{\n return {\n \"type\": \"service\",\n \"className\": \"p-0\",\n \"body\": [\n {\n \"type\": \"button\",\n \"label\": \"查看\",\n \"className\": \"border-none\",\n \"onEvent\": {\n \"click\": {\n \"actions\": [\n {\n \"componentId\": \"\",\n \"args\": {\n \"blank\": false,\n \"url\": \"/app/${app_id}/${objectName}/view/${_id}\"\n },\n \"actionType\": \"link\"\n }\n ]\n }\n },\n \"id\": \"u:ef35c9ae1d19\"\n }\n ],\n \"regions\": [\n \"body\"\n ]\n }\n}","import _ from \"lodash\";\nimport { isExpression, parseSingleExpression } from \"./expression\";\nimport { getApi } from './converter/amis/graphql';\nimport config from \"../config\";\nimport { getUISchema } from \"./objects\";\n\nimport { StandardButtons } from '../standard/button'\n\nconst getGlobalData = () => {\n return {\n now: new Date(),\n };\n};\n\nexport function getButtonVisibleOn(button){\n let visible= button.visible;\n\n if(button._visible){\n visible = button._visible;\n }\n\n if(_.isBoolean(visible)){\n visible = visible.toString();\n }\n\n if(visible){\n // if(visible.indexOf(\"Meteor.\") > 0 || visible.indexOf(\"Creator.\") > 0 || visible.indexOf(\"Session.\") > 0){\n // console.warn('无效的visible', visible)\n // return 'false';\n // }\n if(visible.trim().startsWith('function')){\n return `${visible}.apply({\n object: uiSchema\n }, [objectName, _id, recordPermissions, data])`\n }\n return visible;\n }\n\n if(button.type === 'amis_button'){\n const amisSchema = button.amis_schema;\n if(amisSchema && amisSchema.body && amisSchema.body.length > 0){\n const btn1 = amisSchema.body[0];\n return btn1.visibleOn\n }\n }\n}\n\nexport const getButtonVisible = (button, ctx) => {\n if (button._visible) {\n if (_.startsWith(_.trim(button._visible), \"function\")) {\n window.eval(\"var fun = \" + button._visible);\n button.visible = fun;\n } else if (isExpression(button._visible)) {\n button.visible = (props) => {\n parseSingleExpression(\n button._visible,\n props.record,\n \"#\",\n getGlobalData(),\n props.userSession\n );\n };\n }\n }\n if (_.isFunction(button.visible)) {\n try {\n return button.visible(ctx);\n } catch (error) {\n // console.error(`${button.name} visible error: ${error}`);\n }\n } else {\n return button.visible;\n }\n};\n\n\nexport const standardButtonsTodo = {\n // 批量删除比较特殊, CRUD组件在外部无法触发批量操作action.\n standard_delete_many: function(){\n const {\n listViewId,\n uiSchema,\n scopeId\n } = this;\n const listViewRef = SteedosUI?.getRef(scopeId || listViewId).getComponentById(`listview_${uiSchema.name}`)\n \n if(_.isEmpty(listViewRef.props.store.toJSON().selectedItems)){\n listViewRef.handleAction({}, {\n \"actionType\": \"toast\",\n \"toast\": {\n \"items\": [\n {\n \"position\": \"top-right\",\n \"body\": \"请选择要删除的项\"\n }\n ]\n }\n })\n }else{\n listViewRef.handleBulkAction(listViewRef.props.store.toJSON().selectedItems,[],{},listViewRef.props.bulkActions[0]);\n }\n }\n};\n\n\n/**\n * 按钮显隐规则: 优先使用页面布局上的配置.\n * @param {*} uiSchema \n * @param {*} ctx \n * @returns \n */\nexport const getButtons = (uiSchema, ctx) => {\n const disabledButtons = uiSchema.permissions && uiSchema.permissions.disabled_actions;\n let buttons = _.sortBy(_.values(uiSchema.actions), \"sort\");\n if (_.has(uiSchema, \"allow_customActions\")) {\n buttons = _.filter(buttons, (button) => {\n return _.include(uiSchema.allow_customActions, button.name); // || _.include(_.keys(Creator.getObject('base').actions) || {}, button.name)\n });\n }\n if (_.has(uiSchema, \"exclude_actions\")) {\n buttons = _.filter(buttons, (button) => {\n return !_.include(uiSchema.exclude_actions, button.name);\n });\n }\n\n _.each(buttons, (button) => {\n button.objectName = uiSchema.name;\n if (\n ctx.isMobile &&\n [\"record\", \"record_only\"].indexOf(button.on) > -1 &&\n button.name != \"standard_edit\"\n ) {\n if (button.on == \"record_only\") {\n button.on = \"record_only_more\";\n } else {\n button.on = \"record_more\";\n }\n }\n });\n\n if (\n ctx.isMobile &&\n [\"cms_files\", \"cfs.files.filerecord\"].indexOf(uiSchema.name) > -1\n ) {\n _.map(buttons, (button) => {\n if (button.name === \"standard_edit\") {\n button.on = \"record_more\";\n }\n if (button.name === \"download\") {\n button.on = \"record\";\n }\n });\n }\n\n return _.filter(buttons, (button) => {\n return _.indexOf(disabledButtons, button.name) < 0 && button.name != 'standard_query';\n });\n};\n\nexport const getListViewButtons = (uiSchema, ctx) => {\n const buttons = getButtons(uiSchema, ctx);\n const listButtons = _.filter(buttons, (button) => {\n return button.on == \"list\";\n });\n return listButtons;\n};\n\nexport const getObjectDetailButtons = (uiSchema, ctx) => {\n const buttons = getButtons(uiSchema, ctx);\n const detailButtons = _.filter(buttons, (button) => {\n return button.on == \"record\" || button.on == \"record_only\";\n });\n return _.sortBy(detailButtons, \"sort\");\n};\n\nexport const getObjectDetailMoreButtons = (uiSchema, ctx) => {\n const buttons = getButtons(uiSchema, ctx);\n const moreButtons = _.filter(buttons, (button) => {\n return button.on == \"record_more\" || button.on == \"record_only_more\";\n });\n return _.sortBy(moreButtons, \"sort\");\n};\n\nexport const getListViewItemButtons = async (uiSchema, ctx)=>{\n const buttons = getButtons(uiSchema, ctx);\n const listButtons = _.filter(buttons, (button) => {\n return button.on == \"record\" || button.on == \"list_item\" || button.on === 'record_more';\n });\n return listButtons;\n}\n\nexport const getObjectRelatedListButtons = async (uiSchema, ctx)=>{\n // const buttons = getButtons(uiSchema, ctx);\n // const relatedListButtons = _.filter(buttons, (button) => {\n // if(button.objectName === 'cms_files'){\n // // TODO:附件对象本身没有上传按钮,需要自定义\n // }else{\n // return button.name == \"standard_new\";\n // }\n // });\n // return relatedListButtons;\n const buttons = getButtons(uiSchema, ctx);\n const listButtons = _.filter(buttons, (button) => {\n return button.on == \"list\";\n });\n return listButtons;\n}\n\n/**\n * 由此函数负责内置按钮的转换\n * @param {*} objectName \n * @param {*} buttonName \n * @param {*} ctx \n * @returns \n */\nexport const getButton = async (objectName, buttonName, ctx)=>{\n const uiSchema = await getUISchema(objectName);\n const { props } = ctx;\n if(uiSchema){\n const buttons = await getButtons(uiSchema, ctx);\n const button = _.find(buttons, (button)=>{\n return button.name === buttonName\n });\n\n if(!button){\n return ;\n }\n\n if(button.name == 'standard_edit' && (button.todo === 'standard_edit' && button.type != \"amis_button\")){ // && button._visible.indexOf('Steedos.StandardObjects.Base.Actions.standard_edit.visible.apply') > 0\n return {\n label: button.label,\n name: button.name,\n on: button.on,\n ...await StandardButtons.getStandardEdit(uiSchema, ctx)\n };\n }\n if(objectName != 'cms_files' && button.name == 'standard_new' && (button.todo === 'standard_new' && button.type != \"amis_button\")){ //&& button._visible.indexOf('Steedos.StandardObjects.Base.Actions.standard_new.visible.apply') > 0\n return {\n label: button.label,\n name: button.name,\n on: button.on,\n ...await StandardButtons.getStandardNew(uiSchema, ctx)\n }\n }\n\n // 如果是standard_delete 且 _visible 中调用了 Steedos 函数, 则自动添加标准的删除功能\n if(button.name == 'standard_delete' && (button.todo === 'standard_delete' && button.type != \"amis_button\")){ // && button._visible.indexOf('Steedos.StandardObjects.Base.Actions.standard_delete.visible.apply') > 0\n return {\n label: button.label,\n name: button.name,\n on: button.on,\n sort: button.sort,\n ...await StandardButtons.getStandardDelete(uiSchema, ctx)\n }\n }\n\n if(uiSchema.hasImportTemplates && button.name === 'standard_import_data'){\n return {\n label: button.label,\n name: button.name,\n on: button.on,\n sort: button.sort,\n ...await StandardButtons.getStandardImportData(uiSchema, ctx)\n }\n }\n\n if(button.name === 'standard_open_view'){\n return {\n label: button.label,\n name: button.name,\n on: button.on,\n sort: button.sort,\n ...await StandardButtons.getStandardOpenView(uiSchema, ctx)\n }\n }\n\n if(button.name === 'standard_delete_many'){\n return {\n label: button.label,\n name: button.name,\n on: button.on,\n sort: button.sort,\n ...await StandardButtons.getStandardDeleteMany(uiSchema, ctx)\n }\n }\n\n return button;\n\n }\n}\n\nexport const execute = (button, props) => {\n if (!button.todo) {\n return; //TODO 弹出提示未配置todo\n }\n\n if (_.isString(button.todo)) {\n if (_.startsWith(_.trim(button.todo), \"function\")) {\n window.eval(\"var fun = \" + button.todo);\n button.todo = fun;\n }\n }\n if (_.isFunction(button.todo)) {\n const todoThis = {\n objectName: props.objectName, \n object_name: props.objectName, \n object: props.uiSchema, \n record: props.record,\n recordId: props.recordId,\n record_id: props.recordId,\n ...props,\n action: button\n }\n return button.todo.apply(todoThis, [todoThis.objectName, todoThis.recordId]);\n }\n};\n\nexport const executeButton = execute;\n","import { getAuthToken, getTenantId, getRootUrl } from '../../steedos.client.js';\nimport { getListViewButtons, getObjectDetailButtons, getObjectDetailMoreButtons, getObjectRelatedListButtons, getButtonVisibleOn } from '../../buttons'\nimport { getObjectFieldsFilterButtonSchema, getObjectFieldsFilterBarSchema } from './fields_filter';\nimport { map, each, sortBy, compact, keys } from 'lodash';\n\n/**\n * 列表视图顶部第一行amisSchema\n * @param {*} objectSchema 对象UISchema\n * @returns amisSchema\n */\nexport function getObjectListHeaderFirstLine(objectSchema, listViewName, ctx) {\n if (!ctx) {\n ctx = {};\n }\n const { icon, label } = objectSchema;\n const listViewButtonOptions = [];\n // let currentListView;\n each(\n objectSchema.list_views,\n (listView, name) => {\n listViewButtonOptions.push({\n type: \"button\",\n label: listView.label,\n actionType: \"link\",\n // icon: \"fa fa-plus\",\n link: `/app/\\${appId}/${objectSchema.name}/grid/${name}`\n });\n // if(name === listViewName){\n // currentListView = listView;\n // }\n }\n );\n\n // if(!currentListView){\n // return {};\n // }\n\n const buttons = getListViewButtons(objectSchema, {});\n let amisButtonsSchema = map(buttons, (button) => {\n return {\n type: 'steedos-object-button',\n name: button.name,\n objectName: button.objectName,\n visibleOn: getButtonVisibleOn(button),\n className: `button_${button.name}`\n }\n });\n // if(objectSchema.permissions?.allowDelete){\n // const bulkDeleteScript = `\n // const data = event.data;\n // const listViewId = data.listViewId;\n // const uiSchema = data.uiSchema;\n // const scopeId = data.scopeId;\n // BuilderAmisObject.AmisLib.standardButtonsTodo.standard_delete_many.call({\n // listViewId, \n // uiSchema, \n // scopeId\n // })\n // `;\n // amisButtonsSchema.push({\n // type: 'button',\n // label: \"删除\",\n // className: `antd-Button antd-Button--default antd-Button--size-default`,\n // \"onEvent\": {\n // \"click\": {\n // \"actions\": [\n // {\n // \"actionType\": \"custom\",\n // \"script\": bulkDeleteScript\n // }\n // ]\n // }\n // }\n // });\n // }\n const reg = new RegExp('_', 'g');\n const standardIcon = icon && icon.replace(reg, '-');\n return {\n \"type\": \"grid\",\n \"columns\": [\n {\n \"body\": [\n {\n \"type\": \"grid\",\n \"columns\": [\n {\n \"body\": {\n \"type\": \"tpl\",\n \"className\": \"block\",\n \"tpl\": `<img class=\\\"slds-icon slds-icon_container slds-icon-standard-${standardIcon} slds-page-header__icon\\\" src=\\\"\\${context.rootUrl}/unpkg.com/@salesforce-ux/design-system/assets/icons/standard/${icon}.svg\\\" />`\n },\n \"md\": \"auto\",\n \"className\": \"\",\n \"columnClassName\": \"flex justify-center items-center\",\n \"valign\": \"middle\",\n },\n {\n \"body\": [\n {\n \"type\": \"tpl\",\n \"tpl\": `${label}`,\n \"inline\": false,\n \"wrapperComponent\": \"\",\n \"className\": \"text-md leading-none text-black\",\n },\n {\n \"type\": \"dropdown-button\",\n \"className\": \"\",\n \"label\": \"\\${uiSchema.list_views[listName].label}\",\n \"rightIcon\": \"fa fa-caret-down\",\n \"size\": \"sm\",\n \"hideCaret\": true,\n \"btnClassName\": \"!bg-transparent !border-none !hover:border-none text-lg h-5 font-bold p-0 text-black leading-none\",\n \"buttons\": listViewButtonOptions\n }\n ],\n \"md\": \"\",\n \"columnClassName\": \"p-l-xs\"\n }\n ],\n \"className\": \"flex justify-between\"\n }\n ],\n \"md\": \"auto\"\n },\n {\n \"body\": {\n \"type\": \"flex\",\n \"items\": amisButtonsSchema,\n },\n \"md\": \"auto\",\n \"valign\": \"middle\",\n }\n ],\n \"className\": \"flex justify-between\"\n }\n}\n\n/**\n * 列表视图顶部第二行amisSchema\n * @param {*} objectSchema 对象UISchema\n * @returns amisSchema\n */\nexport async function getObjectListHeaderSecordLine(objectSchema, listViewName, ctx) {\n const amisListViewId = `listview_${objectSchema.name}`;\n const fieldsFilterButtonSchema = await getObjectFieldsFilterButtonSchema(objectSchema);\n // const onFilterChangeScript = `\n // const eventData = event.data;\n // const uiSchema = eventData.uiSchema;\n // const listName = eventData.listName;\n // const listViewId = eventData.listViewId;\n // var selectedListView = uiSchema.list_views[listName]\n // var filter = eventData.filter;\n // SteedosUI.ListView.showFilter(uiSchema.name, {\n // listView: selectedListView,\n // data: {\n // filters: SteedosUI.ListView.getVisibleFilter(selectedListView, filter, { listViewId }),\n // },\n // onFilterChange: (filter) => {\n // doAction({\n // componentId: \\`service_listview_\\${uiSchema.name}\\`,\n // actionType: 'setValue',\n // \"args\": {\n // \"value\": {\n // filter: filter\n // }\n // }\n // });\n // doAction({\n // componentId: \\`listview_\\${uiSchema.name}\\`,\n // actionType: 'reload',\n // \"args\": {\n // filter: filter\n // }\n // });\n // }\n // });\n // `;\n let secordLineSchema = {\n \"type\": \"grid\",\n \"columns\": [\n {\n \"body\": [\n {\n \"type\": \"tpl\",\n \"tpl\": \"${$count} 个项目\",\n \"visibleOn\": \"this.$count >= 0\",\n \"inline\": false,\n \"wrapperComponent\": \"\",\n \"className\": \"leading-none\",\n \"style\": {\n \"fontFamily\": \"\",\n \"fontSize\": 14\n },\n \"id\": \"u:1661f8471235\"\n }\n ],\n \"md\": \"auto\",\n \"columnClassName\": \"flex items-center\"\n },\n {\n \"body\": [\n fieldsFilterButtonSchema,\n {\n \"type\": \"button\",\n \"label\": \"\",\n \"icon\": \"fa fa-refresh\",\n \"actionType\": \"reload\",\n \"target\": amisListViewId,\n \"className\": \"bg-white p-2 rounded border-gray-300 text-gray-500\"\n },\n // {\n // \"type\": \"button\",\n // \"label\": \"\",\n // \"icon\": \"fa fa-filter\",\n // \"actionType\": \"custom\",\n // \"className\": \"bg-transparent p-2 rounded border-gray-300 text-gray-500\",\n // \"id\": \"u:c20cb87d96c9\",\n // \"onEvent\": {\n // \"click\": {\n // \"actions\": [\n // {\n // \"actionType\": \"custom\",\n // \"script\": onFilterChangeScript\n // }\n // ],\n // \"weight\": 0\n // }\n // }\n // }\n ],\n \"md\": \"auto\"\n }\n ],\n \"className\": \"flex justify-between\"\n };\n return secordLineSchema;\n}\n\n\n/**\n * 列表视图顶部放大镜过滤条件栏amisSchema\n * @param {*} objectSchema 对象UISchema\n * @returns amisSchema\n */\nexport async function getObjectListHeaderFieldsFilterBar(objectSchema, listViewName, ctx) {\n const searchableFields = keys(objectSchema.fields);\n const fields = sortBy(\n compact(\n map(searchableFields, (fieldName) => {\n return objectSchema.fields[fieldName];\n })\n ),\n \"sort_no\"\n );\n const fieldsFilterBarSchema = await getObjectFieldsFilterBarSchema(objectSchema, fields, ctx);\n return fieldsFilterBarSchema;\n}\n\n/**\n * 列表视图顶部amisSchema\n * @param {*} objectSchema 对象UISchema\n * @returns amisSchema\n */\nexport async function getObjectListHeader(objectSchema, listViewName, ctx) {\n if (!ctx) {\n ctx = {};\n }\n let firstLineSchema = getObjectListHeaderFirstLine(objectSchema, listViewName, ctx);\n // let secordLineSchema = await getObjectListHeaderSecordLine(objectSchema, listViewName, ctx);\n // let body = [firstLineSchema, secordLineSchema];\n let body = [firstLineSchema];\n // let roundedCss = \"\";\n // if (ctx.onlyFirstLine) {\n // body = [firstLineSchema];\n // }\n // else if (ctx.onlySecordLine) {\n // // 列表视图自定义amisSchema时不能加圆角\n // roundedCss = \"\";\n // // body = [secordLineSchema];\n // }\n let headerSchema = [{\n \"type\": \"wrapper\",\n \"body\": body,\n \"className\": `bg-gray-100 sm:rounded-tl sm:rounded-tr p-4 -mb-4`\n }];\n // const fieldsFilterBarSchema = await getObjectListHeaderFieldsFilterBar(objectSchema, listViewName, ctx);\n // headerSchema.push(fieldsFilterBarSchema);\n return headerSchema;\n}\n\n/**\n * 记录详细界面顶部头amisSchema,也是标题面板组件的amisSchema\n * @param {*} objectSchema 对象UISchema\n * @param {*} recordId 记录id\n * @param {*} optioins: {showRecordTitle: true}\n * @returns amisSchema\n */\nexport async function getObjectRecordDetailHeader(objectSchema, recordId, options) {\n const { showRecordTitle = true } = options || {}\n // console.log('amis==>', objectSchema, recordId)\n const { name, label, icon, NAME_FIELD_KEY } = objectSchema;\n const buttons = getObjectDetailButtons(objectSchema, {});\n const moreButtons = getObjectDetailMoreButtons(objectSchema, {\n recordId: recordId,\n objectName: name\n })\n let amisButtonsSchema = map(buttons, (button) => {\n return {\n type: 'steedos-object-button',\n name: button.name,\n objectName: button.objectName,\n visibleOn: getButtonVisibleOn(button),\n className: `button_${button.name}`\n }\n })\n let dropdownButtons = map(moreButtons, (button) => {\n return {\n type: 'steedos-object-button',\n name: button.name,\n objectName: button.objectName,\n visibleOn: getButtonVisibleOn(button),\n }\n })\n const dropdownButtonsSchema = {\n type: \"steedos-dropdown-button\",\n label: \"\",\n buttons: dropdownButtons,\n className: 'slds-icon'\n }\n amisButtonsSchema.push(dropdownButtonsSchema);\n const reg = new RegExp('_', 'g');\n const standardIcon = icon && icon.replace(reg, '-');\n\n const gridBody = [];\n if(showRecordTitle){\n gridBody.push({\n \"body\": [\n {\n \"type\": \"grid\",\n \"columns\": [\n {\n \"body\": {\n \"type\": \"tpl\",\n \"className\": \"block\",\n \"tpl\": `<img class='slds-icon slds-icon_container slds-icon-standard-${standardIcon}' src='\\${context.rootUrl}/unpkg.com/@salesforce-ux/design-system/assets/icons/standard/${icon}.svg'>`\n },\n \"md\": \"auto\",\n \"className\": \"\",\n \"columnClassName\": \"flex justify-center items-center\"\n },\n {\n \"body\": [\n {\n \"type\": \"tpl\",\n \"tpl\": `${label}`,\n \"inline\": false,\n \"wrapperComponent\": \"\",\n \"className\": \"leading-4 text-md\"\n },\n {\n \"type\": \"tpl\",\n \"tpl\": \"${name}\",\n // \"tpl\": \"${(record && uiSchema && record[uiSchema.NAME_FIELD_KEY]) || name}\",\n \"inline\": false,\n \"wrapperComponent\": \"\",\n \"className\": \"leading-5 text-xl font-bold\"\n }\n ],\n \"columnClassName\": \"p-l-xs\"\n }\n ],\n \"className\": \"flex justify-between\"\n }\n ],\n \"md\": \"auto\",\n })\n };\n\n gridBody.push({\n \"body\": {\n \"type\": \"flex\",\n \"items\": amisButtonsSchema,\n },\n \"md\": \"auto\",\n \"hiddenOn\": \"${recordLoaded != true}\"\n })\n\n let body = [\n {\n \"type\": \"service\",\n \"body\": [\n {\n \"type\": \"grid\",\n \"columns\": gridBody,\n \"className\": \"flex justify-between\"\n }\n ],\n \"messages\": {},\n // \"hiddenOn\": \"${recordLoaded != true}\"\n }\n ];\n\n return {\n type: 'service',\n bodyClassName: '',\n name: `page`,\n data: { \"&\":\"$$\", objectName: name, _id: recordId, recordPermissions: objectSchema.permissions, uiSchema: objectSchema },\n body: body, \n className: ''\n }\n\n}\n\n/**\n * 记录详细界面中相关表顶部头amisSchema\n * @param {*} relatedObjectSchema 相关对象UISchema\n * @returns amisSchema\n */\nexport async function getObjectRecordDetailRelatedListHeader(relatedObjectSchema, relatedLabel) {\n const { icon, label } = relatedObjectSchema;\n const buttons = await getObjectRelatedListButtons(relatedObjectSchema, {});\n let amisButtonsSchema = map(buttons, (button) => {\n return {\n type: 'steedos-object-button',\n name: button.name,\n objectName: button.objectName,\n visibleOn: getButtonVisibleOn(button),\n className: `button_${button.name}`\n }\n })\n const reg = new RegExp('_', 'g');\n const standardIcon = icon && icon.replace(reg, '-');\n const recordRelatedListHeader = {\n \"type\": \"wrapper\",\n \"body\": [\n {\n \"type\": \"grid\",\n \"valign\": \"middle\",\n \"columns\": [\n {\n \"body\": [\n {\n \"type\": \"grid\",\n \"valign\": \"middle\",\n \"className\": \"flex justify-between\",\n \"columns\": [\n {\n \"body\": {\n \"type\": \"tpl\",\n \"className\": \"block\",\n \"tpl\": `<img class=\\\"slds-icon_small slds-icon_container slds-icon-standard-${standardIcon}\\\" src=\\\"\\${context.rootUrl}/unpkg.com/@salesforce-ux/design-system/assets/icons/standard/${icon}.svg\\\" />`\n },\n \"md\": \"auto\",\n \"className\": \"\",\n \"columnClassName\": \"flex justify-center items-center\"\n },\n {\n \"body\": [\n {\n \"type\": \"tpl\",\n \"tpl\": `<a class=\"text-black text-base font-bold\" href=\"/app/\\${appId}/\\${masterObjectName}/\\${masterRecordId}/\\${objectName}/grid?related_field_name=\\${relatedKey}\">${relatedLabel}(\\${$count})</a>`,\n \"inline\": false,\n \"wrapperComponent\": \"\",\n \"className\": \"\",\n }\n ],\n \"md\": \"\",\n \"valign\": \"middle\",\n \"columnClassName\": \"p-l-xs\"\n }\n ]\n }\n ],\n \"md\": \"auto\"\n },\n {\n \"body\": {\n \"type\": \"flex\",\n \"items\": amisButtonsSchema,\n },\n \"md\": \"auto\"\n }\n ],\n \"className\": \"flex justify-between\"\n }\n ],\n \"className\": \"border-b border-gray-300 p-3\"\n };\n return recordRelatedListHeader;\n}\n\n/**\n * 点击记录详细界面相关表顶部标题进入的相关表页面的顶部amisSchema\n * @param {*} objectSchema \n * @param {*} recordId \n * @param {*} relatedObjectName \n * @returns amisSchema\n */\nexport async function getObjectRelatedListHeader(objectSchema, recordId, relatedObjectName) {\n}","import { getObjectListHeaderFieldsFilterBar } from './header';\n\nexport function getObjectHeaderToolbar(mainObject, formFactor){\n\n if(formFactor === 'SMALL'){\n const onReloadScript = `\n const scope = event.context.scoped;\n var listView = scope.parent.getComponents().find(function(n){\n return n.props.type === \"crud\";\n });\n listView.handleChangePage(1);\n `;\n return [\n // \"bulkActions\",\n {\n \"type\": \"tpl\",\n \"tpl\": \"${count} 个项目\"\n },\n {\n // \"type\": \"reload\",//不可以直接使用reload,因为它不会设置页码到第一页\n \"type\": \"button\",\n \"align\": \"right\",\n \"className\": \"bg-white p-2 rounded border-gray-300 text-gray-500\",\n \"label\": \"\",\n \"icon\": \"fa fa-sync\",\n \"onEvent\": {\n \"click\": {\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": onReloadScript\n }\n ]\n }\n },\n }\n ]\n }else{\n const onFieldsFilterToggleScript = `\n const scope = event.context.scoped;\n const filterForm = scope.getComponents().find(function(n){\n return n.props.type === \"form\";\n });\n const filterService = filterForm.context.getComponents().find(function(n){\n return n.props.type === \"service\";\n });\n filterService.setData({showFieldsFilter: !!!filterService.props.data.showFieldsFilter});\n `;\n return [\n // \"filter-toggler\",\n \"bulkActions\",\n {\n \"type\": \"columns-toggler\",\n \"className\": \"hidden\"\n },\n // {\n // \"type\": \"columns-toggler\",\n // \"className\": \"mr-2\"\n // },\n // {\n // \"type\": \"export-excel\",\n // \"align\": \"right\"\n // },\n {\n \"type\": \"tpl\",\n \"tpl\": \"${count} 个项目\"\n },\n {\n \"type\": \"reload\",\n \"align\": \"right\",\n \"className\": \"bg-white p-2 rounded border-gray-300 text-gray-500\"\n },\n {\n \"label\": \"\",\n \"icon\": \"fa fa-search\",\n \"type\": \"button\",\n \"align\": \"right\",\n \"className\": \"bg-white p-2 rounded border-gray-300 text-gray-500\",\n \"onEvent\": {\n \"click\": {\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": onFieldsFilterToggleScript\n }\n ]\n }\n }\n }\n // {\n // \"type\": \"search-box\",\n // \"align\": \"right\",\n // \"name\": \"__keywords\",\n // \"placeholder\": \"请输入关键字\",\n // \"mini\": true\n // },\n // {\n // \"type\": \"drag-toggler\",\n // \"align\": \"right\"\n // },\n // {\n // \"type\": \"pagination\",\n // \"align\": \"right\"\n // }\n ]\n }\n\n\n \n}\n\nexport function getObjectFooterToolbar(mainObject, formFactor) {\n if (formFactor === 'SMALL') {\n return [\n \"load-more\",\n ]\n }\n else {\n return [\n \"statistics\",\n // \"switch-per-page\",\n \"pagination\"\n ]\n }\n}\n\nexport async function getObjectFilter(objectSchema, fields, options) {\n const fieldsFilterBarSchema = await getObjectListHeaderFieldsFilterBar(objectSchema, null, options);\n return {\n \"title\": \"\",\n \"submitText\": \"\",\n \"className\": \"\",\n // \"debug\": true,\n \"mode\": \"normal\",\n \"wrapWithPanel\": false,\n \"body\": [\n fieldsFilterBarSchema\n ]\n }\n}\n","import { getAuthToken , getTenantId, getRootUrl, getSteedosAuth } from '../../steedos.client.js';\nimport { getReadonlyFormInitApi, getSaveApi, getEditFormInitApi, getBatchDelete } from './api';\nimport { getTableSchema, getTableApi } from './fields/table';\nimport { getFormBody } from './form';\nimport { getListSchema, getCardSchema } from './fields/list';\nimport _, { map } from 'lodash';\nimport { defaultsDeep } from '../../defaultsDeep';\nimport { getObjectHeaderToolbar, getObjectFooterToolbar, getObjectFilter } from './toolbar';\n\nfunction getBulkActions(objectSchema){\n return [\n {\n \"type\": \"button\",\n \"level\": \"danger\",\n \"label\": \"批量删除\",\n \"actionType\": \"ajax\",\n \"confirmText\": \"确定要删除吗\",\n \"className\": \"hidden\",\n \"id\": \"batchDelete\",\n \"api\": getBatchDelete(objectSchema.name),\n }\n // {\n // \"label\": \"批量修改\",\n // \"actionType\": \"dialog\",\n // \"dialog\": {\n // \"title\": \"批量编辑\",\n // \"name\": \"sample-bulk-edit\",\n // \"body\": {\n // \"type\": \"form\",\n // \"api\": \"https://3xsw4ap8wah59.cfc-execute.bj.baidubce.com/api/amis-mock/sample/bulkUpdate2\",\n // \"controls\": [\n // {\n // \"type\": \"hidden\",\n // \"name\": \"ids\"\n // },\n // {\n // \"type\": \"text\",\n // \"name\": \"name\",\n // \"label\": \"Name\"\n // }\n // ]\n // }\n // }\n // }\n ]\n}\n\nfunction getHeaderToolbar(mainObject, formFactor){\n\n if(formFactor === 'SMALL'){\n return [\n \"bulkActions\",\n {\n \"type\": \"reload\",\n \"align\": \"right\"\n },\n {\n \"type\": \"search-box\",\n \"align\": \"right\",\n \"name\": \"__keywords\",\n \"placeholder\": \"请输入关键字\",\n \"mini\": true\n }\n ]\n }else{\n return [\n \"filter-toggler\",\n \"bulkActions\",\n // {\n // \"type\": \"export-excel\",\n // \"align\": \"right\"\n // },\n // {\n // \"type\": \"reload\",\n // \"align\": \"right\"\n // },\n // {\n // \"type\": \"columns-toggler\",\n // \"align\": \"right\"\n // },\n {\n \"type\": \"search-box\",\n \"align\": \"right\",\n \"name\": \"__keywords\",\n \"placeholder\": \"请输入关键字\",\n \"mini\": true\n },\n // {\n // \"type\": \"drag-toggler\",\n // \"align\": \"right\"\n // },\n // {\n // \"type\": \"pagination\",\n // \"align\": \"right\"\n // }\n ]\n }\n\n\n \n}\n\nfunction getToolbar(){\n return [\n \n ]\n}\n\nfunction footerToolbar(){\n return [\n \"statistics\",\n // \"switch-per-page\",\n \"pagination\"\n ]\n}\n\nfunction getFilter(){\n return {\n \"title\": \"条件搜索\",\n \"submitText\": \"\",\n \"body\": [\n {\n \"type\": \"input-text\",\n \"name\": \"name\",\n \"placeholder\": \"合同名称\",\n \"addOn\": {\n \"label\": \"搜索\",\n \"type\": \"submit\"\n }\n }\n ]\n }\n}\n\nexport async function getObjectList(objectSchema, fields, options){\n const { top, perPage } = options;\n const nonpaged = objectSchema.paging && objectSchema.paging.enabled === false;\n const bulkActions = getBulkActions(objectSchema)\n\n const bodyProps = {\n toolbar: getToolbar(),\n bodyClassName: \"\",\n headerToolbar: getObjectHeaderToolbar(objectSchema, options.formFactor),\n headerToolbarClassName: \"px-4 py-2 border-gray-300 bg-gray-100 border-solid border-b\",\n footerToolbar: getObjectFooterToolbar(objectSchema, options.formFactor), \n className: `${options.className || \"\"}`\n }\n if(options.formFactor !== 'SMALL'){\n Object.assign(bodyProps, {\n filter: !!options.filterVisible && await getObjectFilter(objectSchema, fields, options),\n bulkActions: options.bulkActions != false ? bulkActions : false\n });\n }\n // yml里配置的不分页优先级最高,组件中输入的top次之。\n if(nonpaged){\n options.top = 1000;\n bodyProps.footerToolbar = [];\n }else if(top){\n bodyProps.footerToolbar = [];\n }\n let body = null;\n const id = `listview_${objectSchema.name}`;\n if(options.formFactor === 'SMALL' && false){\n delete bodyProps.bulkActions;\n delete bodyProps.headerToolbar;\n delete bodyProps.footerToolbar;\n const card = await getCardSchema(fields, Object.assign({idFieldName: objectSchema.idFieldName, labelFieldName: objectSchema.NAME_FIELD_KEY || 'name'}, options, {actions: false}));\n body = Object.assign({}, card , {\n type: 'crud', \n primaryField: '_id', \n id: id,\n name: id,\n keepItemSelectionOnPageChange: false, \n api: await getTableApi(objectSchema, fields, options),\n hiddenOn: options.tableHiddenOn,\n }, \n bodyProps\n );\n }else{\n const table = await getTableSchema(fields, Object.assign({idFieldName: objectSchema.idFieldName, labelFieldName: objectSchema.NAME_FIELD_KEY || 'name'}, options));\n delete table.mode;\n body = Object.assign({}, table, {\n type: 'crud', \n primaryField: '_id', \n affixHeader: false,\n id: id,\n name: id,\n keepItemSelectionOnPageChange: true, \n api: await getTableApi(objectSchema, fields, options),\n hiddenOn: options.tableHiddenOn,\n autoFillHeight: false,\n }, \n bodyProps,\n )\n }\n\n const defaults = options.defaults;\n if (defaults) {\n const listSchema = defaults.listSchema || {};\n body = defaultsDeep({}, listSchema, body);\n const headerSchema = defaults.headerSchema;\n const footerSchema = defaults.footerSchema;\n if (headerSchema || footerSchema) {\n let wrappedBody = [body];\n if (headerSchema) {\n if(_.isArray(headerSchema)){\n wrappedBody = _.union(headerSchema,wrappedBody);\n }\n else{\n wrappedBody.unshift(headerSchema);\n }\n }\n if (footerSchema) {\n if(_.isArray(footerSchema)){\n wrappedBody = _.union(wrappedBody,footerSchema);\n }\n else{\n wrappedBody.push(footerSchema);\n }\n }\n body = wrappedBody;\n }\n }\n\n // TODO: data应该只留loaded,其他属性都改为从上层传递下来\n return {\n type: 'service',\n className: '',\n id: `service_${id}`,\n name: `page`,\n data: {\n \"$master\": '$$',\n objectName: objectSchema.name,\n _id: null,\n recordPermissions: objectSchema.permissions,\n uiSchema: objectSchema,\n loaded: false //crud接收适配器中设置为true,否则就是刷新浏览器第一次加载\n },\n body: body\n }\n}\n\nconst getGlobalData = (mode)=>{\n const user = getSteedosAuth();\n return {mode: mode, user: user, spaceId: user.spaceId, userId: user.userId}\n}\n\nexport async function getObjectForm(objectSchema, ctx){\n const { recordId, formFactor, layout = formFactor === 'SMALL' ? 'normal' : \"normal\", labelAlign, tabId, appId, defaults } = ctx;\n const fields = _.values(objectSchema.fields);\n const formSchema = defaults && defaults.formSchema || {};\n const onSubmitSuccCustomScript = `\n const { recordId, listViewId } = context.props.data;\n const data = event.data;\n const appId = data.appId;\n const objectName = data.objectName;\n // 在记录详细界面时isRecordDetail为true\n // TODO: isRecordDetail这个判断需要优化\n const isRecordDetail = !!data.$master && data.$master.$master?.recordId;\n if(recordId){\n // 编辑记录时,刷新主表单\n doAction({\n componentId: \\`detail_\\${recordId}\\`,\n actionType: \"reload\",\n expression: \\`!\\${listViewId}\\`\n });\n }\n else if(!isRecordDetail){\n // 在列表视图界面新建记录时跳转到详细页面\n const listName = event.data.listName;\n const uiSchema = event.data.uiSchema;\n const listView = uiSchema && uiSchema.list_views[listName];\n const newRecordId = data.result.data?.recordId;\n doAction({\n \"args\": {\n \"url\": \"/app/\" + appId + \"/\" + objectName + \"/view/\" + newRecordId,\n \"blank\": false\n },\n \"actionType\": \"link\"\n });\n }\n `;\n const amisSchema = {\n type: 'service',\n className: 'p-0',\n name: `page_edit_${recordId}`,\n api: await getEditFormInitApi(objectSchema, recordId, fields),\n // data: {global: getGlobalData('edit'), recordId: recordId, objectName: objectSchema.name, context: {rootUrl: getRootUrl(), tenantId: getTenantId(), authToken: getAuthToken()}},\n initApi: null,\n initFetch: null ,\n body: [defaultsDeep({}, formSchema, {\n type: \"form\",\n mode: layout,\n labelAlign,\n persistData: false,\n promptPageLeave: true,\n name: `form_edit_${recordId}`,\n debug: false,\n title: \"\",\n submitText: \"\", // amis 表单不显示提交按钮, 表单提交由项目代码接管\n api: await getSaveApi(objectSchema, recordId, fields, {}),\n initFetch: recordId != 'new',\n body: await getFormBody(fields, objectSchema, ctx),\n panelClassName:'m-0 sm:rounded-lg shadow-none',\n bodyClassName: 'p-0',\n className: 'steedos-amis-form',\n onEvent: {\n \"submitSucc\": {\n \"weight\": 0,\n \"actions\": [\n {\n \"componentId\": `steedos-record-related-list-${objectSchema.name}`,\n \"actionType\": \"setValue\",\n \"args\": {\n value: {\n \"$count\": undefined,\n }\n }\n },\n {\n \"componentId\": `listview_${objectSchema.name}`,\n \"actionType\": \"reload\",\n \"expression\": \"!!listViewId\"\n },\n {\n \"actionType\": \"custom\",\n \"script\": onSubmitSuccCustomScript\n }\n ]\n }\n }\n })]\n };\n if(formSchema.id){\n amisSchema.id = `service-${formSchema.id}`;\n }\n return amisSchema;\n}\n\nexport async function getObjectDetail(objectSchema, recordId, ctx){\n const { formFactor, layout = formFactor === 'SMALL' ? 'normal' : \"normal\", labelAlign, formInitProps } = ctx;\n const fields = _.values(objectSchema.fields);\n return {\n type: 'service',\n name: `page_readonly_${recordId}`,\n id: `detail_${recordId}`,\n data: {global: getGlobalData('read'), context: {rootUrl: getRootUrl(), tenantId: getTenantId(), authToken: getAuthToken()}},\n api: await getReadonlyFormInitApi(objectSchema, recordId, fields, formInitProps),\n body: [\n {\n type: \"form\",\n mode: layout,\n labelAlign,\n persistData: false,\n promptPageLeave: false,\n name: `form_readonly_${recordId}`,\n debug: false,\n title: \"\",\n data: {\n \"formData\": \"$$\"\n },\n wrapWithPanel: false, \n body: await getFormBody(map(fields, (field)=>{field.readonly = true; return field;}), objectSchema, Object.assign({}, ctx, {showSystemFields: true})),\n className: 'steedos-amis-form bg-white',\n actions: [], // 不显示表单默认的提交按钮\n hiddenOn: \"${recordLoaded != true}\"\n }\n ],\n onEvent: {\n \"fetchInited\": {\n \"weight\": 0,\n \"actions\": [\n {\n actionType: 'broadcast',\n eventName: \"recordLoaded\",\n args: {\n eventName: \"recordLoaded\"\n },\n data: {\n record: \"${event.data}\"\n }\n },\n {\n \"actionType\": \"setValue\",\n \"args\": {\n value: {\n \"recordLoaded\": true,\n }\n }\n }\n ]\n }\n }\n }\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-10-28 14:52:55\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-10-28 14:53:02\n * @Description: \n */\nimport * as _ from 'lodash';\n\nconst AmisFormInputs = [\n 'text',\n 'date',\n 'file',\n \"avatar\",\n 'image',\n 'datetime',\n 'time',\n 'number',\n 'currency',\n 'percent',\n 'password',\n 'url',\n 'email'\n]\n\nexport function getAmisStaticFieldType(type, readonly, options){\n if(!readonly){\n if(_.includes(AmisFormInputs, type)){\n return `input-${type}`;\n }\n return type;\n }\n if(_.includes(['text','image'], type)){\n if('image' === type && options && options.multiple){\n return `static-images`;\n }\n return `static-${type}`;\n }else{\n return 'static';\n }\n};","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-10-28 14:15:09\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-11-02 18:06:16\n * @Description: \n */\nimport { getAmisStaticFieldType } from './type';\n\nconst getFileTableName = (steedosField)=>{\n switch (steedosField.type ) {\n case 'avatar':\n return 'avatars'\n case 'image':\n return 'images'\n case 'file':\n return 'files'\n default:\n break;\n }\n};\n\nconst getAmisFieldType = (steedosField, readonly)=>{\n return getAmisStaticFieldType(steedosField.type === 'avatar' ? 'image' : steedosField.type, readonly, {multiple: steedosField.multiple});\n}\n\nexport const getAmisFileReadonlySchema = (steedosField)=>{\n const type = steedosField.type;\n const amisFieldType = getAmisFieldType(steedosField, true)\n if(_.includes(['avatar','image'], type)){\n return {\n type: amisFieldType,\n defaultImage: '',\n enlargeAble: true,\n showToolbar: true,\n }\n }\n if(type === 'file'){\n return {\n type: amisFieldType,\n tpl: `\n <% let fileData = data.${steedosField.name}; if (fileData) { %>\n <% if(!Array.isArray(fileData)){ fileData = [fileData]} %>\n <% fileData.forEach(function(item) { %> \n <a href='<%= item.url %>' target='_self' class='block'><%= item.name %></a> \n <% });} %>`\n }\n }\n}\n\nexport const getAmisFileEditSchema = (steedosField)=>{\n const tableName = getFileTableName(steedosField);\n const amisFieldType = getAmisFieldType(steedosField, false)\n let convertData = {\n type: amisFieldType,\n useChunk: false, // 关闭分块上传\n receiver: {\n method: \"post\",\n url: `\\${context.rootUrl}/s3/${tableName}`,\n data: {\n $: \"$$\",\n context: `\\${context}`,\n },\n adaptor: `\n const { context } = api.body; \n var rootUrl = context.rootUrl + \"/api/files/${tableName}/\";\n payload = {\n status: response.status == 200 ? 0 : response.status,\n msg: response.statusText,\n data: {\n value: payload._id,\n name: payload.original.name,\n url: rootUrl + payload._id,\n }\n }\n return payload;\n `,\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n }\n \n if(steedosField.multiple){\n convertData.multiple = true;\n convertData.joinValues = false;\n convertData.extractValue = true;\n }\n return convertData;\n}\n\nexport const getAmisFileSchema = (steedosField, readonly)=>{\n return readonly ? getAmisFileReadonlySchema(steedosField) : getAmisFileEditSchema(steedosField);\n}","import * as _ from 'lodash'\nimport * as Tpl from '../tpl';\nimport * as Fields from '../index';\nimport * as graphql from '../graphql';\nimport config from '../../../../config'\nimport { each, forEach, isBoolean, isEmpty } from 'lodash';\nimport { getAmisFileReadonlySchema } from './file'\n\nfunction getOperation(fields){\n const controls = [];\n _.each(fields, function(field){\n controls.push(Fields.convertSFieldToAmisField(field, true));\n })\n return {\n \"type\": \"operation\",\n \"label\": \"操作\",\n \"width\": 100,\n fixed: \"right\",\n \"buttons\": [\n {\n \"type\": \"button\",\n \"icon\": \"fa fa-eye\",\n \"actionType\": \"dialog\",\n \"tooltip\": \"查看\",\n \"dialog\": {\n \"title\": \"查看\",\n \"body\": {\n \"type\": \"form\",\n \"controls\": controls\n }\n }\n }]\n }\n}\n\n//获取name字段,如果没有,则_index字段添加链接\nfunction getDetailColumn(){}\n\nasync function getTableColumns(fields, options){\n const columns = [{name: '_index',type: 'text', width: 32, placeholder: \"\"}];\n for (const field of fields) {\n if((field.is_name || field.name === options.labelFieldName) && options.objectName === 'cms_files'){\n const previewFileScript = `\n var data = event.data;\n var file_name = data.versions ? data.name : \"${field.label}\";\n var file_id = data._id;\n SteedosUI.previewFile && SteedosUI.previewFile({file_name, file_id});\n `;\n columns.push({\n \"type\": \"button\",\n \"label\": `<%=data.versions ? data.name : \"${field.label}\"%>`,\n \"className\": \"whitespace-nowrap\",\n \"level\": \"link\",\n \"onEvent\": {\n \"click\": {\n \"actions\": [\n {\n \"args\": {\n \"api\": {\n \"url\": \"${context.rootUrl}/api/files/files/${versions[0]}?download=true\",\n \"method\": \"get\",\n \"headers\": {\n \"Authorization\": \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n },\n \"actionType\": \"download\",\n \"expression\": \"!!!window?.nw?.require\"//浏览器上直接下载\n },\n {\n \"args\": {},\n \"actionType\": \"custom\",\n \"script\": previewFileScript,\n \"expression\": \"!!window?.nw?.require\" //PC客户端预览附件\n }\n ]\n }\n }\n })\n }else if(field.type === 'toggle'){\n columns.push({\n type: \"switch\",\n name: field.name,\n label: field.label,\n width: field.width,\n toggled: field.toggled,\n disabled: true,\n className:\"whitespace-nowrap\",\n })\n }else if(field.type === 'avatar' || field.type === 'image' || field.type === 'file'){\n columns.push({\n type: \"switch\",\n name: field.name,\n label: field.label,\n width: field.width,\n toggled: field.toggled,\n disabled: true,\n className:\"whitespace-nowrap\",\n ...getAmisFileReadonlySchema(field)\n })\n }\n \n else{\n const tpl = await Tpl.getFieldTpl(field, options);\n\n let type = 'text';\n if(tpl){\n type = 'tpl';\n }else if(field.type === 'html'){\n type = 'markdown';\n }\n if(!field.hidden && !field.extra){\n columns.push({\n name: field.name,\n label: field.label,\n sortable: field.sortable,\n // searchable: field.searchable,\n width: field.width,\n type: type,\n tpl: tpl,\n toggled: field.toggled,\n className: field.type === 'textarea' ? 'min-w-56 whitespace-pre-wrap textarea' : \"whitespace-nowrap\",\n html: field.type === 'html' ? true : null\n // toggled: true \n })\n }\n }\n \n };\n\n // columns.push(getOperation(fields));\n\n return columns;\n}\n\n/**\n * 生成移动端列表每行显示的amis行\n * @param {*} tpls 要显示的每个字段的tpl\n * @returns {\n \"type\": \"wrapper\",\n \"body\": [{\n \"type\": \"tpl\",\n \"tpl\": tpls[index].tpl,\n \"className\": \"truncate\"//左侧样式类\n },{\n \"type\": \"tpl\",\n \"tpl\": tpls[index + 1].tpl,\n \"className\": \"truncate ml-2 flex flex-shrink-0\"//右侧样式类\n }],\n \"size\": \"none\",\n \"className\": \"flex items-center justify-between\"//每行样式类\n }\n */\nfunction getMobileLines(tpls){\n let lines = [];\n let maxLineCount = 2;\n let lineChildren = [];\n let isNewLine = false;\n let isLeft = true;\n let lineChildrenClassName = \"\";\n let lineClassName = \"flex items-center justify-between\";\n tpls.forEach(function(item){\n if(isNewLine && lines.length < maxLineCount){\n lines.push({\n \"type\": \"wrapper\",\n \"body\": lineChildren,\n \"size\": \"none\",\n \"className\": lineClassName\n });\n lineChildren = [];\n }\n if(isLeft){\n // 左侧半行\n lineChildrenClassName = \"steedos-listview-item-left truncate\";\n if(item.field.is_wide){\n // 左侧全行样式可以单独写\n lineChildrenClassName = \"steedos-listview-item-wide truncate\";\n }\n }\n else{\n // 右侧半行\n lineChildrenClassName = \"steedos-listview-item-right truncate ml-2 flex flex-shrink-0\";\n }\n lineChildren.push({\n \"type\": \"tpl\",\n \"tpl\": item.tpl,\n \"className\": lineChildrenClassName\n });\n\n if(item.field.is_wide){\n // 宽字段占整行\n isLeft = true;\n isNewLine = true;\n }\n else{\n isLeft = !isLeft;\n isNewLine = isLeft;\n }\n });\n \n if(lineChildren.length && lines.length < maxLineCount){\n lines.push({\n \"type\": \"wrapper\",\n \"body\": lineChildren,\n \"size\": \"none\",\n \"className\": lineClassName\n });\n }\n \n return lines;\n}\n\nasync function getMobileTableColumns(fields, options){\n const columns = [];\n let nameField = {};\n let tpls = [];\n for (const field of fields) {\n let tpl = \"\";\n if(field.is_name || field.name === options.labelFieldName){\n nameField = field;\n options.onlyDisplayLabel = true;\n tpl = await Tpl.getFieldTpl(field, options);\n }\n else if(field.type === 'avatar' || field.type === 'image' || field.type === 'file'){\n // 图片和附件类型字段暂时显示为附件名称,后续需要再优化\n tpl = `\\${_display.${field.name}.name}`;\n }\n else{\n if(field.type === 'lookup' || field.type === 'master_detail'){\n options.onlyDisplayLabel = true;\n }\n tpl = await Tpl.getFieldTpl(field, options);\n }\n if(!tpl){\n tpl = `\\${${field.name}}`;\n }\n if(!field.hidden && !field.extra){\n tpls.push({ field, tpl });\n }\n };\n\n const url = Tpl.getNameTplUrl(nameField, options)\n\n const columnLines = getMobileLines(tpls);\n \n columns.push({\n name: nameField.name,\n label: nameField.label,\n sortable: nameField.sortable,\n type: \"button\",\n level: \"link\",\n actionType: \"link\",\n link: url,\n innerClassName: \"steedos-listview-item block hover:bg-gray-50 text-gray-500\",\n body:{\n \"type\": \"wrapper\",\n \"body\": columnLines,\n \"size\": \"none\",\n \"className\": \"p-2\"\n }\n });\n\n return columns;\n}\n\nfunction getDefaultParams(options){\n return {\n perPage: options.top || options.perPage || config.listView.perPage\n }\n}\n\nfunction getButtonVisibleOn(button){\n let visible= button.visible;\n\n if(button._visible){\n visible = button._visible;\n }\n\n if(isBoolean(visible)){\n visible = visible.toString();\n }\n\n if(visible){\n // if(visible.indexOf(\"Meteor.\") > 0 || visible.indexOf(\"Creator.\") > 0 || visible.indexOf(\"Session.\") > 0){\n // console.warn('无效的visible', visible)\n // return 'false';\n // }\n if(visible.trim().startsWith('function')){\n return `${visible}(objectName, _id, recordPermissions, data)`\n }\n return visible;\n }\n\n if(button.type === 'amis_button'){\n const amisSchema = button.amis_schema;\n if(amisSchema && amisSchema.body && amisSchema.body.length > 0){\n const btn1 = amisSchema.body[0];\n return btn1.visibleOn\n }\n }\n}\n\nasync function getTableOperation(ctx){\n const buttons = ctx.buttons;\n const operationButtons = [];\n each(buttons, (button)=>{\n if(isBoolean(button.visible)){\n button.visible = button.visible.toString();\n }\n // operationButtons.push({\n // type: 'button',\n // label: button.label,\n // visibleOn: button.visible ? `${button.visible}` : (button._visible ? `${button._visible}` : null),\n // onEvent: {\n // click: {\n // actions: []\n // }\n // }\n // })\n\n operationButtons.push({\n type: 'steedos-object-button',\n name: button.name,\n objectName: button.objectName,\n visibleOn: getButtonVisibleOn(button),\n className: 'antd-Button--default'\n })\n })\n if(operationButtons.length < 1){\n return ;\n }\n return {\n type: 'operation',\n label: '操作',\n fixed: 'right',\n labelClassName: 'text-center',\n className: 'text-center steedos-listview-operation w-20',\n buttons: [\n {\n \"type\": \"steedos-dropdown-button\",\n \"label\": \"xxx\",\n \"buttons\": operationButtons,\n \"placement\": \"bottomRight\",\n \"overlayClassName\": \"shadow !min-w-[160px]\",\n \"trigger\": [\"click\"],\n \"id\": \"u:c2140a365019\",\n onOpenApi: {\n url: `\\${context.rootUrl}/service/api/@\\${objectName}/recordPermissions/\\${_id}`,\n method: \"get\",\n data: {\n $: \"$$\",\n objectName: \"${objectName}\",\n listViewId: \"${listViewId}\",\n appId: \"${appId}\",\n formFactor: \"${formFactor}\",\n context: `\\${context}`\n },\n \"responseData\": {\n \"recordPermissions\": \"$$\"\n },\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n },\n adaptor: `\n payload.recordPermissions = payload;\n return payload;\n `,\n }\n }\n ]\n }\n}\n\nexport async function getTableSchema(fields, options){\n if(!options){\n options = {};\n }\n let columns = [];\n if(options.formFactor === 'SMALL'){\n columns = await getMobileTableColumns(fields, options);\n }\n else{\n columns = await getTableColumns(fields, options);\n columns.push(await getTableOperation(options));\n }\n return {\n mode: \"table\",\n name: \"thelist\",\n headerToolbarClassName: \"py-2 px-2 border-gray-300 bg-gray-100 border-solid border-b\",\n className: \"\",\n draggable: false,\n defaultParams: getDefaultParams(options),\n columns: columns,\n syncLocation: false,\n keepItemSelectionOnPageChange: true,\n checkOnItemClick: false,\n labelTpl: `\\${${options.labelFieldName}}`,\n autoFillHeight: false, // 自动高度效果不理想,先关闭\n columnsTogglable: false,\n }\n}\n\n\n\n/**\n * \n * @param {*} mainObject \n * @param {*} fields \n * @param {*} options = {globalFilter: 相关字表过滤条件, filter: listview 过滤条件, ...}\n * @returns \n */\nexport async function getTableApi(mainObject, fields, options){\n const searchableFields = [];\n let { globalFilter, filter, filtersFunction, sort, top, setDataToComponentId = '' } = options;\n\n if(_.isArray(filter)){\n filter = _.map(filter, function(item){\n if(item.operation){\n return [item.field, item.operation, item.value];\n }else{\n return item\n }\n })\n }\n if(!filter){\n filter = [];\n }\n // gloablFilter: 是定义为相关子表的过滤条件, filter 是列表视图自带的过滤条件。\n let baseFilters = null;\n if(!isEmpty(globalFilter) && !isEmpty(filter)){\n baseFilters = [globalFilter, 'and', filter]\n }else if(globalFilter){\n baseFilters = globalFilter;\n }else if(filter){\n baseFilters = filter;\n }\n _.each(fields,function(field){\n if(field.searchable){\n searchableFields.push(field.name);\n }\n })\n\n const fileFields = {};\n const fileFieldsKeys = [];\n fields.forEach((item)=>{\n if(_.includes(['image','avatar','file'], item.type)){\n fileFieldsKeys.push(item.name);\n fileFields[item.name] = {\n name: item.name,\n type: item.type,\n multiple: item.multiple\n };\n }\n })\n\n let valueField = mainObject.key_field || '_id';\n const api = await getApi(mainObject, null, fields, {alias: 'rows', limit: top, queryOptions: `filters: {__filters}, top: {__top}, skip: {__skip}, sort: \"{__sort}\"`});\n api.data.$term = \"$term\";\n api.data.$self = \"$$\";\n api.data.filter = \"$filter\"\n api.data.loaded = \"${loaded}\";\n api.data.listViewId = \"${listViewId}\";\n api.requestAdaptor = `\n let selfData = JSON.parse(JSON.stringify(api.data.$self));\n try{\n // TODO: 不应该直接在这里取localStorage,应该从外面传入\n const listViewId = api.data.listViewId;\n const listViewPropsStoreKey = location.pathname + \"/crud/\" + listViewId ;\n let localListViewProps = localStorage.getItem(listViewPropsStoreKey);\n if(localListViewProps){\n localListViewProps = JSON.parse(localListViewProps);\n selfData = Object.assign({}, localListViewProps, selfData);\n if(!api.data.filter){\n api.data.filter = localListViewProps.filter;\n }\n if(!api.data.loaded){\n // 第一次加载组件,比如刷新浏览器时因为api.data.pageNo有默认值1\n // 所以会把localSearchableFilter中已经存过的页码覆盖\n // 如果是第一次加载组件始终让翻页页码从本地存储中取值\n let formFactor = \"${options.formFactor}\";\n // 移动端不识别本地存储中的翻页页码,否则点击加载更多按钮后无法刷新回第一页\n api.data.pageNo = formFactor === \"SMALL\" ? 1 : (localListViewProps.page || 1);\n }\n }\n }\n catch(ex){\n console.error(\"本地存储中crud参数解析异常:\", ex);\n }\n ${baseFilters ? `var systemFilters = ${JSON.stringify(baseFilters)};` : 'var systemFilters = [];'}\n const filtersFunction = ${filtersFunction};\n if(filtersFunction){\n const _filters = filtersFunction(systemFilters, selfData);\n if(_filters && _filters.length > 0){\n if(_.isEmpty(systemFilters)){\n systemFilters = _filters || [];\n }else{\n systemFilters = [systemFilters, 'and', _filters];\n }\n }\n }\n let userFilters =[];\n \n if(_.isEmpty(systemFilters)){\n systemFilters = api.data.filter || [];\n }else{\n if(!_.isEmpty(api.data.filter)){\n systemFilters = [systemFilters, 'and', api.data.filter];\n }\n }\n var pageSize = api.data.pageSize || 10;\n var pageNo = api.data.pageNo || 1;\n var skip = (pageNo - 1) * pageSize;\n var orderBy = api.data.orderBy || '';\n var orderDir = api.data.orderDir || '';\n var sort = orderBy + ' ' + orderDir;\n sort = orderBy ? sort : \"${sort || ''}\";\n var allowSearchFields = ${JSON.stringify(searchableFields)};\n if(api.data.$term){\n userFilters = [[\"name\", \"contains\", \"'+ api.data.$term +'\"]];\n }else if(selfData.op === 'loadOptions' && selfData.value){\n userFilters = [[\"${valueField.name}\", \"=\", selfData.value]];\n }\n var searchableFilter = [];\n _.each(selfData, (value, key)=>{\n if(!_.isEmpty(value) || _.isBoolean(value)){\n if(_.startsWith(key, '__searchable__between__')){\n searchableFilter.push([\\`\\${key.replace(\"__searchable__between__\", \"\")}\\`, \"between\", value])\n }else if(_.startsWith(key, '__searchable__')){\n if(_.isString(value)){\n searchableFilter.push([\\`\\${key.replace(\"__searchable__\", \"\")}\\`, \"contains\", value])\n }else{\n searchableFilter.push([\\`\\${key.replace(\"__searchable__\", \"\")}\\`, \"=\", value])\n }\n }\n }\n });\n\n if(searchableFilter.length > 0){\n if(userFilters.length > 0 ){\n userFilters = [userFilters, 'and', searchableFilter];\n }else{\n userFilters = searchableFilter;\n }\n }\n\n if(allowSearchFields){\n allowSearchFields.forEach(function(key){\n const keyValue = selfData[key];\n if(_.isString(keyValue)){\n userFilters.push([key, \"contains\", keyValue]);\n }else if(_.isArray(keyValue) || _.isBoolean(keyValue) || keyValue){\n userFilters.push([key, \"=\", keyValue]);\n }\n })\n }\n\n if(selfData.__keywords && allowSearchFields){\n const keywordsFilters = [];\n allowSearchFields.forEach(function(key, index){\n const keyValue = selfData.__keywords;\n if(keyValue){\n keywordsFilters.push([key, \"contains\", keyValue]);\n if(index < allowSearchFields.length - 1){\n keywordsFilters.push('or');\n }\n }\n })\n userFilters.push(keywordsFilters);\n };\n\n let filters = [];\n\n if(!_.isEmpty(systemFilters)){\n filters = systemFilters;\n }\n\n if(!_.isEmpty(userFilters)){\n if(_.isEmpty(filters)){\n filters = userFilters;\n }else{\n filters.push('and');\n filters.push(userFilters)\n }\n }\n api.data = {\n query: api.data.query.replace(/{__filters}/g, JSON.stringify(filters)).replace('{__top}', pageSize).replace('{__skip}', skip).replace('{__sort}', sort.trim())\n }\n return api;\n `\n api.adaptor = `\n const enable_tree = ${mainObject.enable_tree};\n if(!enable_tree){\n _.each(payload.data.rows, function(item, index){\n const {pageNo, pageSize} = api.body;\n const skip = (pageNo - 1) * pageSize;\n item._index = skip + index + 1;\n })\n }\n window.postMessage(Object.assign({type: \"listview.loaded\"}), \"*\");\n let fileFields = ${JSON.stringify(fileFields)};\n _.each(payload.data.rows, function(item, index){\n _.each(fileFields , (field, key)=>{\n if(item[key] && item._display && item._display [key]){\n let value = item._display[key];\n if(!_.isArray(value)){\n value = [value]\n };\n if(field.type === 'file'){\n item[key] = value\n }else{\n item[key] = _.map(value, 'url')\n }\n }\n })\n })\n \n if(enable_tree){\n const records = payload.data.rows;\n const treeRecords = [];\n const getChildren = (records, childrenIds)=>{\n if(!childrenIds){\n return;\n }\n const children = _.filter(records, (record)=>{\n return _.includes(childrenIds, record._id)\n });\n _.each(children, (item)=>{\n if(item.children){\n item.children = getChildren(records, item.children)\n }\n })\n return children;\n }\n\n _.each(records, (record)=>{\n if(!record.parent){\n treeRecords.push(Object.assign({}, record, {children: getChildren(records, record.children)}));\n }\n });\n payload.data.rows = treeRecords;\n }\n\n\n try{\n // TODO: 不应该直接在这里取localStorage,应该从外面传入\n const listViewId = api.body.listViewId;\n const listViewPropsStoreKey = location.pathname + \"/crud/\" + listViewId ;\n /**\n * localListViewProps规范来自crud请求api中api.data.$self参数值的。\n * 比如:{\"perPage\":20,\"page\":1,\"__searchable__name\":\"7\",\"__searchable__between__n1__c\":[null,null],\"filter\":[[\"name\",\"contains\",\"a\"]]}\n * __searchable__...:顶部放大镜搜索条件\n * filter:右侧过滤器\n * perPage:每页条数\n * page:当前页码\n * orderBy:排序字段\n * orderDir:排序方向\n */\n let localListViewProps = localStorage.getItem(listViewPropsStoreKey);\n let selfData = JSON.parse(JSON.stringify(api.body.$self));\n if(localListViewProps){\n localListViewProps = JSON.parse(localListViewProps);\n selfData = Object.assign({}, localListViewProps, selfData, { filter: api.body.filter });\n if(!api.body.loaded){\n // 第一次加载组件,比如刷新浏览器时因为api.data.pageNo有默认值1\n // 所以会把localSearchableFilter中已经存过的页码覆盖\n // 如果是第一次加载组件始终让翻页页码从本地存储中取值\n let formFactor = \"${options.formFactor}\";\n // 移动端不识别本地存储中的翻页页码,否则点击加载更多按钮后无法刷新回第一页\n selfData.page = formFactor === \"SMALL\" ? 1 : (localListViewProps.page || 1);\n }\n }\n delete selfData.context;\n delete selfData.global;\n localStorage.setItem(listViewPropsStoreKey, JSON.stringify(selfData));\n // 返回页码到UI界面\n payload.data.page= selfData.page;\n }\n catch(ex){\n console.error(\"本地存储中crud参数解析异常:\", ex);\n }\n // 标记加载过,后续优先从本地存储中加载相关参数\n payload.data.loaded= true;\n\n const setDataToComponentId = \"${setDataToComponentId}\";\n if(setDataToComponentId){\n SteedosUI.getRef(api.body.$self.scopeId)?.getComponentById(setDataToComponentId)?.setData({$count: payload.data.count})\n }\n\n return payload;\n `;\n return api;\n}\n\nexport async function getApi(object, recordId, fields, options){\n const data = await graphql.getFindQuery(object, recordId, fields, options);\n return {\n method: \"post\",\n url: graphql.getApi(),\n data: data,\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n}\n\nexport function getRecordPermissionsApi(object, recordId, options){\n const data = graphql.getRecordPermissionsQuery(object, recordId, options);\n return {\n method: \"post\",\n url: graphql.getApi(),\n data: data,\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n}","import * as graphql from '../graphql';\nimport * as Field from './index';\nimport * as Tpl from '../tpl';\nimport * as _ from 'lodash';\nimport { getUISchema, getListViewSort } from '../../../objects';\n\nconst refUsersObjectName = \"space_users\";\nconst refOrgsObjectName = \"organizations\";\n\nasync function getSource(field, ctx) {\n // data.query 最终格式 \"{ \\tleftOptions:organizations(filters: {__filters}){value:_id,label:name,children}, children:organizations(filters: {__filters}){ref:_id,children}, defaultValueOptions:space_users(filters: {__options_filters}){user,name} }\"\n const data = await graphql.getFindQuery({ name: refOrgsObjectName }, null, [{ name: \"_id\", alias: \"value\" }, { name: \"name\", alias: \"label\" }, { name: \"children\" }], {\n alias: \"leftOptions\",\n filters: \"{__filters}\"\n });\n data.query = data.query.replace(/,count\\:.+/, \"}\");\n const childrenData = await graphql.getFindQuery({ name: refOrgsObjectName }, null, [{ name: \"_id\", alias: \"ref\" }], {\n alias: \"children\",\n filters: \"{__filters}\"\n });\n childrenData.query = childrenData.query.replace(/,count\\:.+/, \"}\");\n data.query = data.query.replace(/}$/, \",\" + childrenData.query.replace(/{(.+)}/, \"$1}\"));\n const defaultValueOptionsData = await graphql.getFindQuery({ name: refUsersObjectName }, null, [{ name: \"user\" }, { name: \"name\" }], {\n alias: \"defaultValueOptions\",\n filters: \"{__options_filters}\"\n });\n defaultValueOptionsData.query = defaultValueOptionsData.query.replace(/,count\\:.+/, \"}\");\n data.query = data.query.replace(/}$/, \",\" + defaultValueOptionsData.query.replace(/{(.+)}/, \"$1}\"))\n let valueField = `${field.name}`;\n if(ctx.fieldNamePrefix){\n valueField = `${ctx.fieldNamePrefix}${field.name}`;\n }\n data.$value = `$${valueField}`;\n data.__selectUserLoaded__ = \"${__selectUserLoaded__}\";\n // data[\"&\"] = \"$$\";\n const requestAdaptor = `\n console.log(\"select user field '${field.name}' requestAdaptor api:\", api);\n var filters = [['parent', '=', null]];\n api.data.query = api.data.query.replace(/{__filters}/g, JSON.stringify(filters));\n var defaultValue = api.data.$value;\n var optionsFiltersOp = \"${field.multiple ? \"in\" : \"=\"}\";\n var optionsFilters = [[\"user\", optionsFiltersOp, []]];\n if (defaultValue) { \n optionsFilters = [[\"user\", optionsFiltersOp, defaultValue]];\n }\n api.data.query = api.data.query.replace(/{__options_filters}/g, JSON.stringify(optionsFilters));\n return api;\n `;\n const adaptor = `\n const data = payload.data;\n data.children = data.children.map(function (child) { \n // child.defer = !!(child.children && child.children.length);\n child.defer = true;\n delete child.children;\n return child;\n });\n data.leftOptions = data.leftOptions.map(function (leftOption) {\n leftOption.defer = !!(leftOption.children && leftOption.children.length);\n delete leftOption.children;\n return leftOption;\n });\n var defaultValueOptions = data.defaultValueOptions;\n data.children = _.union(data.children, defaultValueOptions);\n delete data.defaultValueOptions;\n payload.data = { options: [data] };\n return payload;\n `;\n return {\n \"method\": \"post\",\n // \"url\": graphql.getApi() + \"?_id=${_id}\",\n // \"url\": graphql.getApi() + `?value=\\${${valueField}}`,\n // 要加url参数是因为amis select组件人员点选功能有bug,一定要第一次请求才能在requestAdaptor函数中取的form表单字段值\n // 见issue: https://github.com/baidu/amis/issues/6065\n \"url\": graphql.getApi() + `?value=\\${${field.multiple ? valueField + \"|join\" : valueField}}`,\n \"requestAdaptor\": requestAdaptor,\n \"adaptor\": adaptor,\n \"data\": data,\n // \"sendOn\": `!!this._id || !!!this.${valueField}`,\n \"sendOn\": `!this.__selectUserLoaded__`,\n \"headers\": {\n \"Authorization\": \"Bearer ${context.tenantId},${context.authToken}\"\n },\n }\n}\n\nasync function getDeferApi(field, ctx) {\n // data.query 最终格式 \"{ \\toptions:{__object_name}(filters:{__filters}){{__fields}} }\"\n const data = await graphql.getFindQuery({ name: \"{__object_name}\" }, null, [], {\n alias: \"options\",\n // filters: \"{__filters}\",\n queryOptions: `filters: {__filters}, sort: \"{__sort}\"`\n });\n // 传入的默认过滤条件,比如[[\"name\", \"contains\", \"三\"]],将会作为基本过滤条件\n let filters = field.filters;\n if(typeof filters === \"string\"){\n filters = new Function(`return ${filters}`);\n filters = filters();\n }\n if(typeof filters === \"function\"){\n filters = filters(field);\n }\n data.query = data.query.replace(/,count\\:.+/, \"}\");\n // 字段要根据请求参数动态生成,写死为__fields后续在发送适配器中替换\n data.query = data.query.replace(\"{_id}\", \"{{__fields}}\");\n const requestAdaptor = `\n var dep = api.query.dep;\n var ref = api.query.ref;\n var term = api.query.term;\n var filters;\n var objectName;\n var fields;\n var sort = \"\";\n if (dep) {\n objectName = \"${refOrgsObjectName}\";\n fields = \"value:_id,label:name,children\";\n filters = [['parent', '=', dep]];\n sort = \"${ctx.orgsSort}\";\n }\n else if (ref) { \n objectName = \"${refUsersObjectName}\";\n // 这里要额外把字段转为value和label是因为valueField和labelField在deferApi/searchApi中不生效,所以字段要取两次\n fields = \"user,name,value:user,label:name\";\n filters = [['user_accepted', '=', true]];\n var defaultFilters = ${filters && JSON.stringify(filters)};\n if(defaultFilters){\n filters.push(defaultFilters);\n }\n filters.push(['organizations_parents', '=', ref]);\n sort = \"${ctx.usersSort}\";\n }\n api.data.query = api.data.query.replace(/{__object_name}/g, objectName).replace(/{__fields}/g, fields).replace(/{__filters}/g, JSON.stringify(filters)).replace('{__sort}', sort.trim());\n return api;\n `;\n const adaptor = `\n if (api.query.dep) {\n // 展开组织时才需要根据children值设置defer属性\n const data = payload.data;\n data.options = data.options.map(function (option) {\n option.defer = !!(option.children && option.children.length);\n delete option.children;\n return option;\n });\n payload.data = data;\n }\n return payload;\n `;\n return {\n \"method\": \"post\",\n \"url\": graphql.getApi() + \"?ref=${ref}&dep=${value}\",\n \"requestAdaptor\": requestAdaptor,\n \"adaptor\": adaptor,\n \"data\": data,\n \"headers\": {\n \"Authorization\": \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n}\n\nasync function getSearchApi(field, ctx) {\n // data.query 最终格式 \"{ \\toptions:space_users(filters: {__filters}){user,name,value:user,label:name}}\"\n // 这里要额外把字段转为value和label是因为valueField和labelField在deferApi/searchApi中不生效,所以字段要取两次\n const data = await graphql.getFindQuery({ name: refUsersObjectName }, null, [{ name: \"user\" }, { name: \"name\" }, { name: \"user\", alias: \"value\" }, { name: \"name\", alias: \"label\" }], {\n alias: \"options\",\n // filters: \"{__filters}\",\n queryOptions: `filters: {__filters}, sort: \"{__sort}\"`\n });\n data.query = data.query.replace(/,count\\:.+/, \"}\");\n // 传入的默认过滤条件,比如[[\"name\", \"contains\", \"三\"]],将会作为基本过滤条件\n const filters = field.filters;\n const requestAdaptor = `\n var term = api.query.term;\n var filters;\n var sort = \"\";\n if (term) { \n filters = [['user_accepted', '=', true]];\n var defaultFilters = ${filters && JSON.stringify(filters)};\n if(defaultFilters){\n filters.push(defaultFilters);\n }\n var fieldsForSearch = [\"name\", \"username\", \"email\", \"mobile\"];\n var termFilters = [];\n fieldsForSearch.forEach(function (field) {\n termFilters.push([field, 'contains', term]);\n termFilters.push(\"or\");\n });\n termFilters.pop();\n filters.push(termFilters);\n sort = \"${ctx.usersSort}\";\n }\n api.data.query = api.data.query.replace(/{__filters}/g, JSON.stringify(filters)).replace('{__sort}', sort.trim());\n return api;\n `;\n return {\n \"method\": \"post\",\n \"url\": graphql.getApi() + \"?term=${term}\",\n \"requestAdaptor\": requestAdaptor,\n \"data\": data,\n \"headers\": {\n \"Authorization\": \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n}\n\nfunction getRefListViewSort(refObject){\n const listView = _.find(\n refObject.list_views,\n (view, name) => name === \"all\"\n );\n let sort = \"\";\n if(listView){\n sort = getListViewSort(listView);\n }\n return sort;\n}\n\nexport async function getSelectUserSchema(field, readonly, ctx) {\n if (!field) {\n return {}\n }\n\n if (!ctx) {\n ctx = {};\n }\n const amisSchema = {\n \"type\": Field.getAmisStaticFieldType('select', readonly)\n };\n\n if (readonly) {\n amisSchema.tpl = await Tpl.getLookupTpl(field, ctx)\n }\n else{\n const refUsersObjectConfig = await getUISchema(refUsersObjectName);\n ctx.usersSort = getRefListViewSort(refUsersObjectConfig);\n const refOrgsObjectConfig = await getUISchema(refOrgsObjectName);\n ctx.orgsSort = getRefListViewSort(refOrgsObjectConfig);\n Object.assign(amisSchema, {\n \"labelField\": \"name\",\n \"valueField\": \"user\",\n \"multiple\": field.multiple,\n \"searchable\": field.searchable,\n \"selectMode\": \"associated\",\n \"leftMode\": \"tree\",\n \"extractValue\": true,\n \"clearable\": true,\n \"source\": await getSource(field, ctx),\n \"deferApi\": await getDeferApi(field, ctx),\n \"searchApi\": await getSearchApi(field, ctx)\n });\n if(field.multiple){\n // 单选时如果配置joinValues为false,清空字段值会把字段值设置为空数组,这是amis人员单选功能的bug,普通的select没有这个问题\n Object.assign(amisSchema, {\n \"joinValues\": false,\n });\n }\n let defaultValue = field.defaultValue;\n if (_.has(field, 'defaultValue') && !(_.isString(defaultValue) && defaultValue.startsWith(\"{\"))) {\n if(_.isString(defaultValue) && defaultValue.startsWith(\"{{\")){\n defaultValue = `\\$${defaultValue.substring(1, defaultValue.length -1)}`\n }\n amisSchema.value = defaultValue\n }\n if (typeof amisSchema.searchable !== \"boolean\") {\n amisSchema.searchable = true;\n }\n const onEvent = field.onEvent;\n if (onEvent) {\n amisSchema.onEvent = onEvent;\n }\n \n // 这里要加change事件逻辑设置form的__selectUserLoaded__是因为人员字段多选时,每次在界面上操作变量字段值时会重新请求source接口造成选人组件重新初始化\n // 见issue: https://github.com/baidu/amis/issues/6065\n const onChangeScript = `\n // 往上找到form,设置__selectUserLoaded__标记已经加载过选人字段不能再调用source接口初始化选人组件了\n const getClosestAmisComponentByType = function(scope, type){\n const re = scope.getComponents().find(function(n){\n return n.props.type === type;\n });\n if(re){\n return re;\n }\n else{\n return getClosestAmisComponentByType(scope.parent, type);\n }\n }\n const form = getClosestAmisComponentByType(event.context.scoped, \"form\");\n form.setData({\"__selectUserLoaded__\":true});\n `;\n\n const onChangeEvent = {\n \"actionType\": \"custom\",\n \"script\": `${onChangeScript}`\n };\n if(amisSchema.onEvent){\n if(amisSchema.onEvent.change?.actions?.length){\n amisSchema.onEvent.change.actions.unshift(onChangeEvent);\n }\n else{\n amisSchema.onEvent.change = {\n \"weight\": 0,\n \"actions\": [onChangeEvent]\n };\n }\n }\n else{\n Object.assign(amisSchema, {\n \"onEvent\": {\n \"change\": {\n \"weight\": 0,\n \"actions\": [onChangeEvent]\n }\n }\n });\n }\n }\n\n return amisSchema;\n}\n","import { getUISchema } from '../../../objects';\nimport * as _ from 'lodash'\nimport * as graphql from '../graphql'\nimport * as Tpl from '../tpl';\nimport * as Field from './index';\nimport * as Table from './table';\nimport * as List from './list';\nimport { getSelectUserSchema } from './user';\nimport { getObjectHeaderToolbar, getObjectFooterToolbar, getObjectFilter } from './../toolbar';\nimport { getListViewSort } from './../../../objects';\n\nconst getReferenceTo = async (field)=>{\n let referenceTo = field.reference_to;\n if(!referenceTo){\n return ;\n }\n\n if(referenceTo === 'users'){\n referenceTo = 'space_users';\n field.reference_to_field = 'user'\n }\n\n const refObjectConfig = await getUISchema(referenceTo);\n let valueField = null;\n let valueFieldName = field.reference_to_field;\n if(!valueFieldName){\n valueFieldName = refObjectConfig.idFieldName || '_id';\n }\n if(valueFieldName === '_id'){\n valueField = {name: '_id', label: 'ID', type: 'text', toggled: false};\n }else{\n valueField = refObjectConfig.fields[valueFieldName] || {name: valueFieldName};\n }\n return {\n objectName: referenceTo,\n valueField: valueField,\n labelField: refObjectConfig.fields[refObjectConfig.NAME_FIELD_KEY || 'name'],\n NAME_FIELD_KEY: refObjectConfig.NAME_FIELD_KEY || 'name'\n }\n}\n\n\nexport async function lookupToAmisPicker(field, readonly, ctx){\n let referenceTo = await getReferenceTo(field);\n if(!referenceTo){\n return ;\n }\n const refObjectConfig = await getUISchema(referenceTo.objectName);\n const tableFields = [];\n let i = 0;\n const searchableFields = [];\n\n const fieldsArr = [];\n\n const listName = \"all\";\n\n const listView = _.find(\n refObjectConfig.list_views,\n (listView, name) => name === listName\n );\n if (listView && listView.columns) {\n _.each(listView.columns, function (column) {\n if (_.isString(column) && refObjectConfig.fields[column]) {\n fieldsArr.push(refObjectConfig.fields[column]);\n } else if (_.isObject(column) && refObjectConfig.fields[column.field]) {\n fieldsArr.push(\n Object.assign({}, refObjectConfig.fields[column.field], {\n width: column.width,\n wrap: column.wrap,\n })\n );\n }\n });\n }else{\n _.each(refObjectConfig.fields , (field, field_name)=>{\n if(field_name != '_id' && !field.hidden){\n if(!_.has(field, \"name\")){\n field.name = field_name\n }\n fieldsArr.push(field)\n }\n })\n }\n\n _.each(_.sortBy(fieldsArr, \"sort_no\"),function(field){\n if(i < 5){\n if(!_.find(tableFields, function(f){\n return f.name === field.name\n })){\n i++;\n tableFields.push(field)\n if(field.searchable){\n searchableFields.push(field.name);\n }\n }\n }\n });\n\n const fields = {\n [referenceTo.labelField.name]: referenceTo.labelField,\n [referenceTo.valueField.name]: referenceTo.valueField\n };\n\n _.each(tableFields, (tableField)=>{\n if(!tableField.hidden){\n fields[tableField.name] = tableField;\n }\n });\n\n let sort = \"\";\n if(listView){\n sort = getListViewSort(listView);\n }\n\n const source = await getApi(refObjectConfig, null, fields, {expand: true, alias: 'rows', queryOptions: `filters: {__filters}, top: {__top}, skip: {__skip}, sort: \"{__sort}\"`});\n \n if(source.url){\n const depend_on = [];\n const sendOn = [];\n _.each(field.depend_on, (fName)=>{\n depend_on.push(`depend_on_${fName}=\\${${fName}}`)\n sendOn.push(`this.${fName}`)\n })\n if(depend_on.length > 0){\n source.url = `${source.url}?${depend_on.join('&')}`;\n source.sendOn = `${sendOn.join(' && ')}`\n }\n }\n \n source.data.$term = \"$term\";\n source.data.$self = \"$$\";\n \n source.requestAdaptor = `\n const selfData = JSON.parse(JSON.stringify(api.data.$self));\n var filters = [];\n var pageSize = api.data.pageSize || 10;\n var pageNo = api.data.pageNo || 1;\n var skip = (pageNo - 1) * pageSize;\n var orderBy = api.data.orderBy || '';\n var orderDir = api.data.orderDir || '';\n var sort = orderBy + ' ' + orderDir;\n sort = orderBy ? sort : \"${sort}\";\n var allowSearchFields = ${JSON.stringify(searchableFields)};\n if(api.data.$term){\n filters = [[\"name\", \"contains\", \"'+ api.data.$term +'\"]];\n }else if(selfData.op === 'loadOptions' && selfData.value){\n if(selfData.value?.indexOf(',') > 0){\n filters = [[\"${referenceTo.valueField.name}\", \"=\", selfData.value.split(',')]];\n }else{\n filters = [[\"${referenceTo.valueField.name}\", \"=\", selfData.value]];\n }\n }\n\n var searchableFilter = [];\n _.each(selfData, (value, key)=>{\n if(!_.isEmpty(value) || _.isBoolean(value)){\n if(_.startsWith(key, '__searchable__between__')){\n searchableFilter.push([\\`\\${key.replace(\"__searchable__between__\", \"\")}\\`, \"between\", value])\n }else if(_.startsWith(key, '__searchable__')){\n if(_.isString(value)){\n searchableFilter.push([\\`\\${key.replace(\"__searchable__\", \"\")}\\`, \"contains\", value])\n }else{\n searchableFilter.push([\\`\\${key.replace(\"__searchable__\", \"\")}\\`, \"=\", value])\n }\n }\n }\n });\n\n if(searchableFilter.length > 0){\n if(filters.length > 0 ){\n filters = [filters, 'and', searchableFilter];\n }else{\n filters = searchableFilter;\n }\n }\n\n if(allowSearchFields){\n allowSearchFields.forEach(function(key){\n const keyValue = selfData[key];\n if(keyValue){\n filters.push([key, \"contains\", keyValue]);\n }\n })\n }\n\n const filtersFunction = ${field._filtersFunction};\n\n if(filtersFunction){\n const _filters = filtersFunction(filters, api.data.$self.__super.__super);\n if(_filters && _filters.length > 0){\n filters.push(_filters);\n }\n }\n\n api.data.query = api.data.query.replace(/{__filters}/g, JSON.stringify(filters)).replace('{__top}', pageSize).replace('{__skip}', skip).replace('{__sort}', sort.trim());\n return api;\n `\n source.adaptor = `\n const enable_tree = ${refObjectConfig.enable_tree};\n if(enable_tree){\n const records = payload.data.rows;\n const treeRecords = [];\n const getChildren = (records, childrenIds)=>{\n if(!childrenIds){\n return;\n }\n const children = _.filter(records, (record)=>{\n return _.includes(childrenIds, record._id)\n });\n _.each(children, (item)=>{\n if(item.children){\n item.children = getChildren(records, item.children)\n }\n })\n return children;\n }\n\n _.each(records, (record)=>{\n if(!record.parent){\n treeRecords.push(Object.assign({}, record, {children: getChildren(records, record.children)}));\n }\n });\n payload.data.rows = treeRecords;\n }\n return payload;\n `;\n let top = 20;\n\n if(refObjectConfig.paging && refObjectConfig.paging.enabled === false){\n top = 1000;\n };\n\n let pickerSchema = null;\n if(ctx.formFactor === 'SMALL'){\n pickerSchema = await List.getListSchema(tableFields, {\n top: top,\n ...ctx,\n actions: false\n })\n }else{\n pickerSchema = await Table.getTableSchema(tableFields, {\n labelFieldName: refObjectConfig.NAME_FIELD_KEY,\n top: top,\n ...ctx\n })\n\n pickerSchema.headerToolbar = getObjectHeaderToolbar(refObjectConfig, ctx.formFactor);\n pickerSchema.footerToolbar = getObjectFooterToolbar();\n if(ctx.filterVisible !== false){\n let filterLoopCount = ctx.filterLoopCount || 0;\n filterLoopCount++;\n // 可以传入filterVisible为false防止死循环\n pickerSchema.filter = await getObjectFilter(refObjectConfig, fields, {\n isLookup: true,\n ...ctx,\n filterLoopCount,\n });\n }\n pickerSchema.data = Object.assign({}, pickerSchema.data, {\n \"&\": \"$$\",\n \"objectName\": refObjectConfig.name,\n \"uiSchema\": refObjectConfig,\n \"listName\": listName,// 需要按视图取可搜索项\n \"isLookup\": true\n });\n }\n\n const data = {\n type: Field.getAmisStaticFieldType('picker', readonly),\n labelField: referenceTo.labelField.name,\n valueField: referenceTo.valueField.name,\n modalMode: 'dialog', //TODO 设置 dialog 或者 drawer,用来配置弹出方式\n source: source,\n size: \"lg\",\n pickerSchema: pickerSchema,\n joinValues: false,\n extractValue: true\n }\n if(field.multiple){\n data.multiple = true\n data.extractValue = true\n }\n\n if(readonly){\n data.tpl = await Tpl.getLookupTpl(field, ctx)\n }\n\n return data;\n}\n\nexport async function lookupToAmisSelect(field, readonly, ctx){\n let referenceTo = await getReferenceTo(field);\n\n let apiInfo;\n\n if(referenceTo){\n apiInfo = await getApi({\n name: referenceTo.objectName\n }, null, {\n [referenceTo.labelField.name]: Object.assign({}, referenceTo.labelField, {alias: 'label'}),\n [referenceTo.valueField.name]: Object.assign({}, referenceTo.valueField, {alias: 'value'})\n }, {expand: false, alias: 'options', queryOptions: `filters: {__filters}, top: {__top}, sort: \"{__sort}\"`})\n }else{\n apiInfo = {\n method: \"post\",\n url: graphql.getApi(),\n data: {query: '{objects(filters: [\"_id\", \"=\", \"-1\"]){_id}}', $: \"$$\"}\n }\n }\n\n const refObjectConfig = referenceTo && await getUISchema(referenceTo.objectName);\n const listView = refObjectConfig && _.find(\n refObjectConfig.list_views,\n (listView, name) => name === \"all\"\n );\n\n let sort = \"\";\n if(listView){\n sort = getListViewSort(listView);\n }\n\n if(apiInfo.url){\n const depend_on = [];\n const sendOn = [];\n _.each(field.depend_on, (fName)=>{\n depend_on.push(`depend_on_${fName}=\\${${fName}}`)\n sendOn.push(`this.${fName}`)\n })\n if(depend_on.length > 0){\n apiInfo.url = `${apiInfo.url}?${depend_on.join('&')}`;\n apiInfo.sendOn = `${sendOn.join(' && ')}`\n }\n }\n \n apiInfo.data.$term = \"$term\";\n apiInfo.data.$value = `$${field.name}.${referenceTo ? referenceTo.valueField.name : '_id'}`;\n _.each(field.depend_on, function(fName){\n apiInfo.data[fName] = `$${fName}`;\n })\n apiInfo.data['$'] = `$$`;\n apiInfo.data['rfield'] = `\\${object_name}`;\n // [[\"_id\", \"=\", \"$${field.name}._id\"],\"or\",[\"name\", \"contains\", \"$term\"]]\n apiInfo.requestAdaptor = `\n var filters = [];\n var top = 10;\n if(api.data.$term){\n filters = [[\"${referenceTo?.NAME_FIELD_KEY || 'name'}\", \"contains\", api.data.$term]];\n }else if(api.data.$value){\n filters = [[\"_id\", \"=\", api.data.$value]];\n }\n\n const filtersFunction = ${field._filtersFunction};\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 = \"${sort}\";\n api.data.query = api.data.query.replace(/{__filters}/g, JSON.stringify(filters)).replace('{__top}', top).replace('{__sort}', sort.trim());\n return api;\n `\n let labelField = referenceTo ? referenceTo.labelField.name : '';\n let valueField = referenceTo ? referenceTo.valueField.name : '';\n if(field._optionsFunction){\n apiInfo.adaptor = `\n payload.data.options = eval(${field._optionsFunction})(api.data);\n return payload;\n `\n labelField = 'label';\n valueField = 'value';\n }\n\n const data = {\n type: Field.getAmisStaticFieldType('select', readonly),\n joinValues: false,\n extractValue: true,\n // labelField: labelField,\n // valueField: valueField,\n source: apiInfo,\n autoComplete: apiInfo,\n searchable: true,\n }\n let defaultValue = field.defaultValue\n if(_.has(field, 'defaultValue') && !(_.isString(field.defaultValue) && field.defaultValue.startsWith(\"{\"))){\n if(_.isString(defaultValue) && defaultValue.startsWith(\"{{\")){\n defaultValue = `\\$${defaultValue.substring(1, defaultValue.length -1)}`\n }\n data.value = defaultValue\n }\n if(field.multiple){\n data.multiple = true\n data.extractValue = true\n }\n\n if(readonly){\n data.tpl = await Tpl.getLookupTpl(field, ctx)\n }\n return data;\n}\n\nasync function getApi(object, recordId, fields, options){\n const data = await graphql.getFindQuery(object, recordId, fields, options);\n return {\n method: \"post\",\n url: graphql.getApi(),\n data: data,\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n}\n\nexport async function lookupToAmis(field, readonly, ctx){\n if(readonly){\n return {\n type: Field.getAmisStaticFieldType('picker', readonly),\n tpl: Tpl.getRelatedFieldTpl(field, ctx)\n }\n }\n // console.log(`referenceTo.objectName====`, field)\n if(field.reference_to && !_.isString(field.reference_to) && !readonly){\n return {\n type: 'steedos-field-lookup',\n field,\n readonly,\n ctx: {},\n }\n // return await lookupToAmisGroup(field, readonly, ctx);\n }\n\n let referenceTo = await getReferenceTo(field);\n if(!referenceTo){\n return await lookupToAmisSelect(field, readonly, ctx);\n }\n\n const refObject = await getUISchema(referenceTo.objectName);\n\n if(referenceTo.objectName === \"space_users\" && field.reference_to_field === \"user\"){\n return await lookupToAmisSelectUser(field, readonly, ctx);\n }\n\n // 此处不参考 steedos 的 enable_enhanced_lookup 规则. 如果默认是开启弹出选择,用户选择过程操作太繁琐, 所以默认是关闭弹出选择.\n // 由于amis picker 目前不支持联动, 配置了depend_on时, 使用使用select ,以支持联动\n // TODO: 确认 amis picker 支持联动时, 清理field.depend_on判断\n if(refObject.enable_enhanced_lookup == true && _.isEmpty(field.depend_on)){\n return await lookupToAmisPicker(field, readonly, ctx);\n }else{\n return await lookupToAmisSelect(field, readonly, ctx);\n }\n}\n\nexport async function lookupToAmisSelectUser(field, readonly, ctx){\n return getSelectUserSchema(field, readonly, ctx);\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2023-01-13 17:27:54\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2023-01-16 10:36:27\n * @Description: \n */\n\n\nexport const getMarkdownFieldSchema = (field, readonly, ctx)=>{\n if(readonly){\n return {\n \"type\": \"markdown\",\n \"name\": field.name,\n \"options\": {\n \"linkify\": true,\n \"html\": true,\n \"breaks\": true\n }\n }\n }else{\n return {\n \"type\": \"group\",\n \"body\": [\n {\n \"type\": \"editor\",\n \"name\": field.name,\n \"language\": \"markdown\",\n },\n {\n \"type\": \"markdown\",\n \"name\": field.name,\n \"options\": {\n \"linkify\": true,\n \"html\": true,\n \"breaks\": true\n }\n }\n ]\n }\n }\n}\n\nexport const getHtmlFieldSchema = (field, readonly, ctx)=>{\n if(readonly){\n return {\n \"type\": \"html\",\n \"name\": field.name\n }\n }else{\n return {\n \"type\": \"input-rich-text\",\n \"name\": field.name\n }\n // return {\n // \"type\": \"group\",\n // \"body\": [\n // {\n // \"type\": \"editor\",\n // \"name\": field.name,\n // \"language\": \"html\"\n // },\n // {\n // \"type\": \"html\",\n // \"name\": field.name\n // }\n // ]\n // }\n }\n}","import { cloneDeep, includes } from 'lodash';\nimport { lookupToAmis } from './lookup';\nimport { getMarkdownFieldSchema, getHtmlFieldSchema } from './editor';\nimport * as Fields from '../fields';\nimport * as Tpl from '../tpl';\nimport * as File from './file';\nimport { getAmisStaticFieldType } from './type';\nimport * as _ from 'lodash'\nexport const OMIT_FIELDS = ['created', 'created_by', 'modified', 'modified_by'];\nexport { getAmisStaticFieldType } from './type';\n// const Lookup = require('./lookup');\n\nexport function getBaseFields(readonly){\n let calssName = 'm-1';\n if(readonly){\n calssName = `${calssName}`\n }\n return [\n { \n name: \"createdInfo\", \n label: \"创建人\",\n type: \"static\",\n labelClassName: 'text-left',\n className: calssName,\n tpl: Tpl.getCreatedInfoTpl()\n },\n { \n name: \"modifiedInfo\", \n label: \"修改人\",\n type: \"static\",\n labelClassName: 'text-left',\n className: calssName,\n tpl: Tpl.getModifiedInfoTpl()\n }\n ]\n};\n\n\n\nexport function getAmisFieldType(sField){\n switch (sField.type) {\n case 'text':\n return 'text';\n case 'textarea':\n return 'textarea';\n case 'html':\n return 'html';\n case 'markdown':\n return 'markdown';\n case 'select':\n return 'select';\n case 'boolean':\n return 'checkbox';\n case 'date':\n return 'date';\n case 'datetime':\n return 'datetime';\n case 'number':\n return 'number';\n case 'currency':\n return 'number';\n case 'percent':\n return 'number'\n case 'password':\n return 'password';\n case 'lookup':\n // TODO 根据字段配置返回 select || picker\n return 'select';\n case 'master_detail':\n // TODO 根据字段配置返回 select || picker\n return 'picker';\n case 'autonumber':\n return 'text';\n case 'url':\n return 'url'\n case 'email':\n return 'email'\n case 'image':\n return 'image'\n case 'formula':\n //TODO\n break;\n case 'summary':\n //TODO\n break;\n case 'grid':\n return 'table';\n default:\n console.log('convertData default', sField.type);\n // convertData.type = field.type\n break;\n }\n\n};\n\nexport function getObjectFieldSubFields(mainField, fields){\n const newMainField = Object.assign({subFields: []}, mainField);\n const subFields = _.filter(fields, function(field){\n let result = field.name.startsWith(`${mainField.name}.`) && _.split(field.name, \".\").length < 3;\n if(result){\n field._prefix = `${mainField.name}.`\n }\n return result;\n });\n newMainField.subFields = subFields;\n return newMainField;\n}\n\nexport function getGridFieldSubFields(mainField, fields){\n const newMainField = Object.assign({subFields: []}, mainField);\n const subFields = _.filter(fields, function(field){\n let result = field.name.startsWith(`${mainField.name}.`)\n if(result){\n field._prefix = `${mainField.name}.`\n }\n return result;\n });\n newMainField.subFields = subFields;\n return newMainField;\n}\n\n/**\n * TODO 处理权限\n * @param {*} object steedos object\n * @param {*} userSession \n */\n export function getPermissionFields(object, userSession){\n const permissionFields = [];\n const fieldsArr = [];\n\t_.each(object.fields , (field, field_name)=>{\n\t\tif(!_.has(field, \"name\")){\n\t\t\tfield.name = field_name\n }\n\t\tfieldsArr.push(field)\n })\n _.each(_.sortBy(fieldsArr, \"sort_no\"), function(field){\n if(!field.hidden){\n permissionFields.push( Object.assign({}, field, {permission: {allowEdit: true}}))\n }\n })\n return permissionFields;\n}\n\n\nexport function getSelectFieldOptions(field){\n const dataType = field.data_type || 'text';\n const options = [];\n _.each(field.options, (item)=>{\n switch (dataType) {\n case 'number':\n options.push({label: item.label, value: Number(item.value)});\n break;\n case 'text':\n options.push({label: item.label, value: String(item.value)});\n break;\n case 'boolean':\n options.push({label: item.label, value: item.value === 'false' ? false : true});\n break;\n default:\n break;\n }\n });\n return options;\n}\n\nexport async function convertSFieldToAmisField(field, readonly, ctx) {\n let rootUrl = null;\n // 创建人和修改人、创建时间和修改时间不显示\n if(_.includes(OMIT_FIELDS, field.name) && ctx.showSystemFields != true){\n return;\n }\n const baseData = {name: ctx.fieldNamePrefix ? `${ctx.fieldNamePrefix}${field.name}` : field.name, label: field.label, labelRemark: field.inlineHelpText, required: _.has(ctx, 'required') ? ctx.required : field.required};\n let convertData = {\n };\n // if(_.includes(OMIT_FIELDS, field.name)){\n // readonly = true;\n // }\n switch (field.type) {\n case 'text':\n convertData.type = getAmisStaticFieldType('text', readonly);\n break;\n case 'textarea':\n convertData.type = getAmisStaticFieldType('textarea', readonly);\n // convertData.tpl = `<b><%=data.${field.name}%></b>`;\n convertData.tpl = `<%=(data.${field.name} || \"\").split(\"\\\\n\").join('<br>')%>`;\n break;\n case 'html':\n convertData = getHtmlFieldSchema(field, readonly)\n break;\n // convertData = {\n // type: getAmisStaticFieldType('html', readonly)\n // }\n // break;\n case 'markdown':\n convertData = getMarkdownFieldSchema(field, readonly)\n break;\n // convertData = {\n // type: getAmisStaticFieldType('html', readonly)\n // }\n // break;\n case 'select':\n convertData = {\n type: getAmisStaticFieldType('select', readonly),\n joinValues: false,\n options: getSelectFieldOptions(field),\n extractValue: true,\n clearable: true,\n labelField: 'label',\n valueField: 'value',\n tpl: readonly ? Tpl.getSelectTpl(field) : null\n }\n let defaultValue = field.defaultValue\n if(_.has(field, 'defaultValue') && !(_.isString(field.defaultValue) && field.defaultValue.startsWith(\"{\"))){\n if(_.isString(defaultValue) && defaultValue.startsWith(\"{{\")){\n defaultValue = `\\$${defaultValue.substring(1, defaultValue.length -1)}`\n }\n const dataType = field.data_type || 'text';\n if(defaultValue != null){\n if(dataType === 'text'){\n convertData.value = String(defaultValue);\n }else if(dataType === 'number'){\n convertData.value = Number(defaultValue);\n }else if(dataType === 'boolean'){\n convertData.value = defaultValue === 'false' ? false : true;\n }\n }\n }\n if(field.multiple){\n convertData.multiple = true\n convertData.extractValue = true\n }\n break;\n case 'boolean':\n convertData = {\n type: getAmisStaticFieldType('checkbox', readonly),\n // option: field.inlineHelpText,\n tpl: readonly ? Tpl.getSwitchTpl(field) : null\n }\n break;\n case 'input-date-range':\n convertData = {\n type: \"input-date-range\",\n inputFormat: \"YYYY-MM-DD\",\n format:'YYYY-MM-DDT00:00:00.000[Z]',\n tpl: readonly ? Tpl.getDateTpl(field) : null,\n // utc: true,\n joinValues: false\n }\n break;\n case 'date':\n convertData = {\n type: getAmisStaticFieldType('date', readonly),\n inputFormat: \"YYYY-MM-DD\",\n format:'YYYY-MM-DDT00:00:00.000[Z]',\n tpl: readonly ? Tpl.getDateTpl(field) : null,\n // utc: true\n }\n break;\n case 'input-datetime-range':\n convertData = {\n type: \"input-datetime-range\",\n inputFormat: 'YYYY-MM-DD HH:mm',\n format:'YYYY-MM-DDTHH:mm:ss.SSSZ',\n tpl: readonly ? Tpl.getDateTimeTpl(field) : null,\n utc: true,\n joinValues: false\n }\n break;\n case 'datetime':\n convertData = {\n type: getAmisStaticFieldType('datetime', readonly),\n inputFormat: 'YYYY-MM-DD HH:mm',\n format:'YYYY-MM-DDTHH:mm:ss.SSSZ',\n tpl: readonly ? Tpl.getDateTimeTpl(field) : null,\n utc: true\n }\n break;\n case 'input-time-range':\n convertData = {\n type: 'input-time-range',\n inputFormat: 'HH:mm',\n timeFormat:'HH:mm',\n format:'1970-01-01THH:mm:00.000[Z]',\n tpl: readonly ? Tpl.getDateTimeTpl(field) : null,\n // utc: true,\n joinValues: false\n }\n break;\n case 'time':\n convertData = {\n type: getAmisStaticFieldType('time', readonly),\n inputFormat: 'HH:mm',\n timeFormat:'HH:mm',\n format:'1970-01-01THH:mm:00.000[Z]',\n tpl: readonly ? Tpl.getDateTimeTpl(field) : null,\n // utc: true\n }\n break;\n case 'currency':\n case 'number':\n if(readonly){\n convertData = {\n type: 'static-tpl',\n tpl: Tpl.getNumberTpl(field)\n }\n }else{\n convertData = {\n type: getAmisStaticFieldType('number', readonly),\n min: field.min,\n max: field.max,\n precision: field.scale\n }\n }\n \n break;\n case 'input-array':\n convertData = Object.assign({}, field, baseData);\n break;\n case 'input-range':\n convertData = {\n type: 'input-range',\n min: field.min,\n max: field.max,\n value: [0, 0],\n multiple: true,\n showInput: true\n }\n break;\n case 'percent':\n //TODO\n convertData = {\n type: getAmisStaticFieldType('number', readonly),\n min: field.min,\n max: field.max,\n precision: field.scale\n }\n break;\n case 'password':\n convertData = {\n type: getAmisStaticFieldType('password', readonly),\n tpl: readonly ? Tpl.getPasswordTpl(field) : null\n }\n break;\n case 'lookup':\n convertData = await lookupToAmis(field, readonly, ctx) //TODO\n break;\n case 'master_detail':\n convertData = await lookupToAmis(field, readonly, ctx) //TODO\n break;\n case 'autonumber':\n if(readonly){\n convertData = {\n type: 'static-text'\n }\n }\n break;\n case 'url':\n convertData = {\n type: getAmisStaticFieldType('url', readonly)\n }\n break;\n case 'email':\n convertData = {\n type: getAmisStaticFieldType('email', readonly)\n }\n break;\n case 'avatar':\n convertData = File.getAmisFileSchema(field, readonly);\n break;\n case 'image':\n convertData = File.getAmisFileSchema(field, readonly);\n break;\n case 'file':\n convertData = File.getAmisFileSchema(field, readonly);\n break;\n case 'formula':\n if(readonly){\n convertData.type = getAmisStaticFieldType(field.data_type, readonly);\n }\n break;\n case 'summary':\n if(readonly){\n convertData.type = getAmisStaticFieldType(field.data_type, readonly);\n }\n break;\n case 'code':\n convertData = {\n type: \"editor\",\n language: field.language,\n value: field.defaultValue || ''\n }\n break;\n case 'toggle':\n convertData = {\n type: \"switch\",\n name: field.name,\n label: field.label,\n width: field.width,\n toggled: field.toggled,\n disabled: readonly,\n }\n break;\n case 'grid':\n if(field.subFields){\n convertData = {\n type: 'input-table',\n showIndex: true,\n columnsTogglable: false,\n strictMode:false,\n affixHeader: false, // 是否固定表头, 不固定表头, 否则form有y轴滚动条时, 表头会跟随滚动条滚动.\n // needConfirm: true, 此属性设置为false后,导致table不能编辑。\n editable: !readonly,\n addable: !readonly,\n removable: !readonly,\n draggable: !readonly,\n columns: []\n }\n // console.log(`convertData ==2====>`, field, convertData)\n for (const subField of field.subFields) {\n const subFieldName = subField.name.replace(`${field._prefix || ''}${field.name}.$.`, '').replace(`${field.name}.`, '');\n const gridSub = await convertSFieldToAmisField(Object.assign({}, subField, {name: subFieldName}), readonly, ctx);\n if(gridSub){\n delete gridSub.name\n delete gridSub.label\n convertData.columns.push({\n name: subFieldName,\n label: subField.label,\n quickEdit: readonly ? false : gridSub\n })\n }\n }\n }\n break;\n case 'object':\n if(field.subFields){\n convertData = {\n type: 'combo',\n items: []\n };\n // console.log(`convertData ======>`, field, convertData)\n for (let subField of field.subFields) {\n const subFieldName = subField.name.replace(`${field.name}.$.`, '').replace(`${field.name}.`, '');\n if(subField.type === 'grid'){\n subField = await Fields.getGridFieldSubFields(subField, ctx.__permissionFields);\n }\n const gridSub = await convertSFieldToAmisField(Object.assign({}, subField, {name: subFieldName}), readonly, ctx);\n if(gridSub){\n delete gridSub.name\n delete gridSub.label\n convertData.items.push(\n Object.assign({}, gridSub, {\n name: subFieldName,\n label: subField.label\n })\n )\n }\n }\n }\n break;\n default:\n // console.log('convertData default', field.type);\n // convertData.type = field.type\n break;\n }\n if(!_.isEmpty(convertData)){\n if(field.is_wide || convertData.type === 'group'){\n convertData.className = 'col-span-2 m-1';\n }else{\n convertData.className = 'm-1';\n }\n if(readonly){\n convertData.className = `${convertData.className} md:border-b`\n }\n if(readonly){\n convertData.quickEdit = false;\n }\n\n if(field.visible_on){\n // convertData.visibleOn = `\\$${field.visible_on.substring(1, field.visible_on.length -1).replace(/formData./g, '')}`;\n if(field.visible_on.startsWith(\"{{\")){\n convertData.visibleOn = `${field.visible_on.substring(2, field.visible_on.length -2).replace(/formData./g, 'data.')}`\n }else{\n convertData.visibleOn = `${field.visible_on.replace(/formData./g, 'data.')}`\n }\n }\n if(convertData.type === 'group'){\n convertData.body[0] = Object.assign({}, baseData, convertData.body[0], { labelClassName: 'text-left', clearValueOnHidden: true, fieldName: field.name});\n return convertData\n }\n return Object.assign({}, baseData, convertData, { labelClassName: 'text-left', clearValueOnHidden: true, fieldName: field.name});\n }\n \n}\n\nexport async function getFieldSearchable(perField, permissionFields, ctx){\n const filterLoopCount = ctx.filterLoopCount || 0;\n const maxFilterLoopCount = 5;\n let field = perField;\n if(field.type === 'grid'){\n field = await Fields.getGridFieldSubFields(perField, permissionFields);\n }else if(perField.type === 'object'){\n field = await Fields.getObjectFieldSubFields(perField, permissionFields);\n }\n\n \n let fieldNamePrefix = '__searchable__';\n if(field.name.indexOf(\".\") < 0){\n let _field = cloneDeep(field)\n if(includes(['textarea', 'html', 'code', 'autonumber'], field.type)){\n _field.type = 'text'\n }\n\n if(field.type === 'number' || field.type === 'currency'){\n _field.type = 'input-array';\n _field.inline = true;\n _field.addable = false;\n _field.removable = false;\n _field.value = [null,null];\n _field.items = {\n type: \"input-number\"\n }\n _field.is_wide = true;\n fieldNamePrefix = `${fieldNamePrefix}between__`\n }\n\n if(field.type ==='date'){\n _field.type = 'input-date-range';\n _field.is_wide = true;\n fieldNamePrefix = `${fieldNamePrefix}between__`\n }\n if(field.type === 'datetime'){\n _field.type = 'input-datetime-range'\n _field.is_wide = true;\n fieldNamePrefix = `${fieldNamePrefix}between__`\n }\n if(field.type === 'time'){\n _field.type = 'input-time-range'\n _field.is_wide = true;\n fieldNamePrefix = `${fieldNamePrefix}between__`\n }\n if(field.reference_to === 'users'){\n _field.reference_to = 'space_users';\n _field.reference_to_field = 'user';\n }\n _field.readonly = false;\n _field.disabled = false;\n _field.multiple = true;\n _field.is_wide = false;\n _field.defaultValue = undefined;\n // filterVisible: false不再生成lookup字段时的filter,否则会死循环\n const amisField = await Fields.convertSFieldToAmisField(_field, false, Object.assign({}, ctx, {fieldNamePrefix: fieldNamePrefix, required: false, showSystemFields: true, filterVisible: filterLoopCount < maxFilterLoopCount}));\n if(amisField){\n return amisField;\n }\n }\n}","import { getFieldSearchable } from \"./fields/index\";\nimport { includes, map } from \"lodash\";\n\nexport async function getObjectFieldsFilterButtonSchema(objectSchema) {\n // const amisListViewId = `listview_${objectSchema.name}`;\n return {\n \"type\": \"button\",\n \"label\": \"\",\n \"icon\": \"fa fa-search\",\n \"className\": \"bg-white p-2 rounded border-gray-300 text-gray-500\",\n \"onEvent\": {\n \"click\": {\n \"actions\": [\n {\n \"actionType\": \"broadcast\",\n \"args\": {\n \"eventName\": \"broadcast_toggle_fields_filter\"\n }\n }\n ]\n }\n }\n }\n}\n\nexport async function getObjectFieldsFilterFormSchema(objectSchema, fields, ctx) {\n if(!ctx){\n ctx = {};\n }\n const body = [];\n for (let field of fields) {\n if (\n !includes(\n [\n \"grid\",\n \"avatar\",\n \"image\",\n \"object\",\n \"[object]\",\n \"[Object]\",\n \"[grid]\",\n \"[text]\",\n \"audio\",\n \"file\",\n ],\n field.type\n )\n ) {\n delete field.defaultValue\n delete field.required\n delete field.is_wide\n delete field.readonly\n delete field.hidden\n delete field.omit\n const amisField = await getFieldSearchable(field, fields, ctx);\n if (amisField) {\n body.push(amisField);\n }\n }\n }\n let persistDataKeys = map(body, \"name\");\n if(ctx.enableSearchableFieldsVisibleOn){\n body.forEach(function(fieldItem){\n fieldItem.visibleOn = `this.filterFormSearchableFields && this.filterFormSearchableFields.indexOf(\"${fieldItem.fieldName}\") > -1`;\n // fieldItem.clearValueOnHidden = true;//这个属性会把form字段值删除,但是点击搜索时crud还是把值给传递到过滤条件(api.requestAdaptor的data.$self)中了,应该是crud的bug\n });\n }\n\n // const onBroadcastSearchableFieldsChangeScript = `\n // const data = event.data;\n // const listViewId = data.listViewId;\n // const searchableFields = data.fields;\n // const preSearchableFields = data.__super.__super.fields;\n // const removedFields = _.difference(preSearchableFields, searchableFields);\n // const listViewPropsStoreKey = location.pathname + \"/crud/\" + listViewId ;\n // let localListViewProps = localStorage.getItem(listViewPropsStoreKey);\n // if(localListViewProps){\n // // 当变更可搜索字段时,如果被移除的可搜索字段在本地存储中已经存入过滤条件中则应该清除本地存储中相关字段的过滤条件。\n // localListViewProps = JSON.parse(localListViewProps);\n // let removedKeys = [];\n // _.each(localListViewProps, function(n,k){\n // // __searchable__开头的不在searchableFields范围则清除其值\n // let isRemoved = !!removedFields.find(function(fieldName){\n // return new RegExp(\"__searchable__\\.*\" + fieldName + \"$\").test(k);\n // });\n // if(isRemoved){\n // removedKeys.push(k);\n // }\n // });\n // const removedValues = {};\n // removedKeys.forEach(function(key){\n // delete localListViewProps[key];\n // removedValues[key] = \"\";\n // });\n // doAction({\n // actionType: 'setValue',\n // args: {\n // value: removedValues\n // }\n // });\n // localStorage.setItem(listViewPropsStoreKey, JSON.stringify(localListViewProps));\n // }\n // `;\n\n return {\n title: \"\",\n type: \"form\",\n // debug: true,\n name: \"listview-filter-form\",\n id: `listview_filter_form_${objectSchema.name}`,\n mode: \"normal\",\n wrapWithPanel: false,\n className: `sm:grid sm:gap-2 sm:grid-cols-4 mb-2`,\n data: {\n \"&\": \"${filterFormValues || {}}\",\n ...ctx.initData\n },\n // persistData: \"crud:${id}\",\n // persistDataKeys: persistDataKeys,\n body: body,\n // \"onEvent\": {\n // \"broadcastSearchableFieldsChange\": {\n // \"actions\": [\n // {\n // \"actionType\": \"custom\",\n // \"script\": onBroadcastSearchableFieldsChangeScript\n // }\n // ]\n // }\n // }\n };\n}\n\nexport async function getObjectFieldsFilterBarSchema(objectSchema, fields, ctx) {\n if(!ctx){\n ctx = {};\n }\n const filterFormSchema = await getObjectFieldsFilterFormSchema(objectSchema, fields, Object.assign({}, {\n enableSearchableFieldsVisibleOn: true\n }, ctx));\n const onSearchScript = `\n const scope = event.context.scoped;\n var filterForm = scope.getComponents().find(function(n){\n return n.props.type === \"form\";\n });\n var filterFormValues = filterForm.getValues();\n var listView = scope.parent.parent.parent.getComponents().find(function(n){\n return n.props.type === \"crud\";\n });\n const removedValues = {};\n // 设置搜索项中移除搜索项后,filterFormValues未把其字段的空值保存为own property,即hasOwnProperty属性中\n // 这会造成handleFilterSubmit时把移除掉的搜索项字段之前的值加到过滤条件中\n for(var k in filterFormValues){\n if(filterFormValues[k] === \"\" && !filterFormValues.hasOwnProperty(k)){\n removedValues[k] = \"\";\n }\n }\n listView.handleFilterSubmit(Object.assign({}, removedValues, filterFormValues));\n `;\n const dataProviderInited = `\n const objectName = data.objectName;\n const isLookup = data.isLookup;\n const listViewId = data.listViewId;\n let searchableFieldsStoreKey = location.pathname + \"/searchable_fields/\";\n if(isLookup){\n searchableFieldsStoreKey += \"lookup/\" + objectName;\n }\n else{\n searchableFieldsStoreKey += listViewId;\n }\n let defaultSearchableFields = localStorage.getItem(searchableFieldsStoreKey);\n if(!defaultSearchableFields && data.uiSchema){\n let listView = data.uiSchema.list_views[data.listName];\n defaultSearchableFields = listView && listView.searchable_fields;\n if(defaultSearchableFields && defaultSearchableFields.length){\n defaultSearchableFields = _.map(defaultSearchableFields, 'field');\n }\n }\n if(_.isEmpty(defaultSearchableFields) && data.uiSchema){\n defaultSearchableFields = _.map(\n _.filter(_.values(data.uiSchema.fields), (field) => {\n return field.searchable;\n }),\n \"name\"\n );\n }\n setData({ filterFormSearchableFields: defaultSearchableFields });\n if(isLookup){\n // looup字段过滤器不在本地缓存记住过滤条件,所以初始始终隐藏过滤器\n setData({ showFieldsFilter: false });\n }\n else{\n const listViewPropsStoreKey = location.pathname + \"/crud/\" + data.listViewId ;\n let localListViewProps = localStorage.getItem(listViewPropsStoreKey);\n if(localListViewProps){\n localListViewProps = JSON.parse(localListViewProps);\n let filterFormValues = _.pickBy(localListViewProps, function(n,k){\n return /^__searchable__/g.test(k);\n });\n if(!_.isEmpty(filterFormValues)){\n setData({ filterFormValues });\n const omitedEmptyFormValue = _.omitBy(filterFormValues, function(n){\n return _.isNil(n) \n || (_.isObject(n) && _.isEmpty(n)) \n || (_.isArray(n) && _.isEmpty(n.filter(function(item){return !_.isNil(item)})))\n || (_.isString(n) && n.length === 0);\n });\n // 有过滤条件时自动展开搜索栏\n if(!_.isEmpty(omitedEmptyFormValue)){\n setData({ showFieldsFilter: true });\n }\n }\n }\n }\n `;\n const onSearchableFieldsChangeScript = `\n const data = context.props.data;\n const listName = data.listName;\n const objectName = data.objectName;\n const isLookup = data.isLookup;\n const listViewId = data.listViewId;\n const value = data.fields;\n const scope = event.context.scoped;\n // 这里的filterForm不是name为\"listview-filter-form\"的内部form,而是crud自带的filter form\n const filterForm = scope.parent.parent.getComponents().find(function(n){\n return n.props.type === \"form\";\n });\n const filterService = filterForm.context.getComponents().find(function(n){\n return n.props.type === \"service\";\n });\n filterService.setData({ filterFormSearchableFields: value });\n let searchableFieldsStoreKey = location.pathname + \"/searchable_fields/\";\n if(isLookup){\n searchableFieldsStoreKey += \"lookup/\" + objectName;\n }\n else{\n searchableFieldsStoreKey += listViewId;\n }\n localStorage.setItem(searchableFieldsStoreKey, value);\n\n // ===START===:当变更可搜索字段时,如果被移除的可搜索字段在本地存储中已经存入过滤条件中则应该清除本地存储中相关字段的过滤条件。\n const searchableFields = data.fields;\n let preSearchableFields = data.__super.fields;\n if(typeof preSearchableFields === \"string\"){\n preSearchableFields = preSearchableFields.split(\",\");\n }\n const removedFields = _.difference(preSearchableFields, searchableFields);\n\n // const getClosestAmisComponentByType = function (scope, type, name) {\n // // 递归children找到listview-filter-form\n // let re = scope.getComponents().find(function (n) {\n // return n.props.type === type && n.props.name === name;\n // });\n // if (re) {\n // return re;\n // }\n // else {\n // if (scope.children && scope.children.length) {\n // for (let i = 0; i < scope.children.length; i++) {\n // re = getClosestAmisComponentByType(scope.children[i], type, name);\n // if (re) {\n // break;\n // }\n // }\n // return re;\n // }\n \n // }\n // }\n // // 这里第二层form才是真正要提交到crud过滤条件的form\n // filterInnerForm = getClosestAmisComponentByType(filterForm.context, \"form\", \"listview-filter-form\");\n\n const filterFormValues = filterForm.getValues();\n let removedKeys = [];\n _.each(filterFormValues, function(n,k){\n // __searchable__开头的不在searchableFields范围则清除其值\n let isRemoved = !!removedFields.find(function(fieldName){\n return new RegExp(\"__searchable__\\.*\" + fieldName + \"$\").test(k);\n });\n if(isRemoved){\n removedKeys.push(k);\n }\n });\n const removedValues = {};\n removedKeys.forEach(function(key){\n removedValues[key] = \"\";\n });\n filterForm.setValues(removedValues);//这里使用filterInnerForm也可以\n\n if(isLookup){\n return;\n }\n \n // 列表视图crud支持本地缓存,所以需要进一步清除浏览器本地缓存里面用户在可搜索项中移除的字段值\n const listViewPropsStoreKey = location.pathname + \"/crud/\" + listViewId ;\n let localListViewProps = localStorage.getItem(listViewPropsStoreKey);\n if(localListViewProps){\n localListViewProps = JSON.parse(localListViewProps);\n // const removedValues = {};\n removedKeys.forEach(function(key){\n delete localListViewProps[key];\n // removedValues[key] = \"\";\n });\n localStorage.setItem(listViewPropsStoreKey, JSON.stringify(localListViewProps));\n }\n // ===END===\n `;\n return {\n \"type\": \"service\",\n \"name\": \"service_listview_filter_form\",\n \"data\": {\n // \"showFieldsFilter\": false\n // \"filterFormSearchableFields\": [\"name\"],//默认可搜索项\n // \"filterFormValues\": {\"__searchable__name\": \"xxx\"},//搜索项表单值\n // \"listViewId\": \"${listViewId}\"\n },\n \"id\": `service_listview_filter_form_${objectSchema.name}`,\n \"dataProvider\": {\n \"inited\": dataProviderInited\n },\n \"body\": {\n \"type\": \"wrapper\",\n \"body\": {\n \"type\": \"wrapper\",\n \"body\": [{\n \"type\": \"wrapper\",\n \"body\": [\n filterFormSchema\n ],\n \"size\": \"xs\",\n \"visibleOn\": \"this.filterFormSearchableFields && this.filterFormSearchableFields.length\",\n \"className\": \"slds-filters__body p-0\"\n }, {\n \"type\": \"wrapper\",\n \"body\": {\n \"type\": \"wrapper\",\n \"body\": [\n {\n \"type\": \"button\",\n \"label\": \"搜索\",\n \"icon\": \"fa fa-search\",\n \"visibleOn\": \"this.filterFormSearchableFields && this.filterFormSearchableFields.length\",\n \"onEvent\": {\n \"click\": {\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": onSearchScript\n }\n ]\n }\n }\n },\n {\n \"type\": \"button\",\n \"label\": \"设置搜索项\",\n \"onEvent\": {\n \"click\": {\n \"actions\": [\n {\n \"actionType\": \"dialog\",\n \"dialog\": {\n \"type\": \"dialog\",\n \"size\": \"md\",\n \"title\": \"设置搜索项\",\n \"body\": [\n {\n \"type\": \"form\",\n \"title\": \"\",\n \"body\": [\n {\n \"label\": \"\",\n \"type\": \"transfer\",\n \"name\": \"fields\",\n \"id\": \"u:92c0b3cccca0\",\n \"source\": {\n \"method\": \"get\",\n \"url\": \"${context.rootUrl}/service/api/amis-metadata-objects/objects/${objectName}/fields/options\",\n \"dataType\": \"json\",\n \"headers\": {\n \"Authorization\": \"Bearer ${context.tenantId},${context.authToken}\"\n },\n \"data\": null,\n \"requestAdaptor\": \"\",\n \"adaptor\": \"\"\n },\n \"options\": [],\n \"required\": true,\n \"placeholder\": \"-\",\n \"className\": \"col-span-2 m-0\",\n \"checkAll\": false,\n \"searchable\": true,\n \"sortable\": true,\n \"joinValues\": false,\n \"extractValue\": true,\n \"multiple\": true\n }\n ],\n \"id\": \"u:e5ac506d5683\",\n \"mode\": \"normal\",\n \"persistData\": false,\n \"promptPageLeave\": true,\n \"name\": \"form\",\n \"debug\": false,\n \"actions\": [],\n \"panelClassName\": \"m-0\",\n \"bodyClassName\": \"p-4\",\n \"className\": \"steedos-amis-form\"\n }\n ],\n \"id\": \"u:ca99fa9fe1b1\",\n \"actions\": [\n {\n \"type\": \"button\",\n \"label\": \"取消\",\n \"onEvent\": {\n \"click\": {\n \"actions\": [\n {\n \"componentId\": \"\",\n \"args\": {},\n \"actionType\": \"closeDialog\"\n }\n ]\n }\n },\n \"id\": \"u:4e447b5ca72a\"\n },\n {\n \"type\": \"button\",\n \"label\": \"确认\",\n \"onEvent\": {\n \"click\": {\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": onSearchableFieldsChangeScript\n },\n // {\n // \"actionType\": \"broadcast\",\n // \"eventName\": \"broadcastSearchableFieldsChange\",\n // \"args\": {\n // \"eventName\": \"broadcastSearchableFieldsChange\"\n // },\n // \"data\": {\n // \"fields\": \"${event.data.fields}\"\n // }\n // },\n {\n \"componentId\": \"\",\n \"args\": {},\n \"actionType\": \"closeDrawer\"\n }\n ]\n }\n },\n \"id\": \"u:14e7388fecd3\",\n \"level\": \"primary\"\n }\n ],\n \"closeOnEsc\": false,\n \"closeOnOutside\": false,\n \"showCloseButton\": true,\n \"data\": {\n \"&\": \"$$\",\n \"objectName\": \"${objectName}\",\n \"listName\": \"${listName}\",\n \"listViewId\": \"${listViewId}\",\n \"uiSchema\": \"${uiSchema}\",\n \"isLookup\": \"${isLookup}\",\n \"context\": \"${context}\",\n \"fields\": \"${filterFormSearchableFields}\"\n }\n }\n }\n ]\n }\n },\n \"id\": \"u:b96d84868a5a\",\n \"level\": \"link\"\n }\n ],\n \"size\": \"xs\",\n \"className\": \"space-x-4\"\n },\n \"size\": \"xs\",\n \"className\": \"slds-filters__footer slds-grid slds-shrink-none flex justify-between p-0\"\n }],\n \"size\": \"xs\",\n \"className\": \"slds-filters\"\n },\n \"size\": \"xs\",\n \"className\": `border-gray-300 border-y slds-grid slds-grid_vertical slds-nowrap ${!ctx.isLookup && \"mt-2\"}`,\n \"visibleOn\": \"this.showFieldsFilter\",\n },\n \"className\": \"bg-white\"\n };\n}\n\n","import { getApi, getRecordPermissionsApi } from './fields/table';\nimport { getSaveApi } from './api';\nimport { each, values } from 'lodash';\nimport * as graphql from './graphql'\nimport _, { isEmpty, omitBy, isNil } from 'lodash';\n\nexport const DEFAULT_CALENDAR_OPTIONS = {\n startDateExpr: \"start\",\n endDateExpr: \"end\",\n allDayExpr: \"is_all_day\",\n textExpr: \"name\"\n};\n\nexport async function getCalendarApi(mainObject, fields, options) {\n if (!options) {\n options = {};\n }\n const calendarOptions = options.calendarOptions;\n const searchableFields = [];\n let { globalFilter, filter, sort, top, setDataToComponentId = '' } = options;\n\n if(!top){\n // 日历请求不翻页\n top = 200;\n }\n\n if (_.isArray(filter)) {\n filter = _.map(filter, function (item) {\n if (item.operation) {\n return [item.field, item.operation, item.value];\n } else {\n return item\n }\n })\n }\n if (!filter) {\n filter = [];\n }\n\n _.each(fields, function (field) {\n if (field.searchable) {\n searchableFields.push(field.name);\n }\n })\n\n const idFieldName = mainObject.idFieldName || \"_id\";\n let valueField = mainObject.key_field || '_id';\n const api = await getApi(mainObject, null, fields, { alias: 'rows', limit: top, queryOptions: `filters: {__filters}, top: {__top}, skip: {__skip}, sort: \"{__sort}\"` });\n api.data.$term = \"$term\";\n api.data.$self = \"$$\";\n api.data.filter = \"$filter\";\n api.data.pageSize = top || 10;\n api.requestAdaptor = `\n let selfData = JSON.parse(JSON.stringify(api.data.$self));\n ${globalFilter ? `var filters = ${JSON.stringify(globalFilter)};` : 'var filters = [];'}\n if(_.isEmpty(filters)){\n filters = api.data.filter || ${JSON.stringify(filter)};\n }else{\n filters = [filters, 'and', api.data.filter || ${JSON.stringify(filter)}]\n }\n const eventFetchInfo = selfData.fetchInfo;\n const startDateExpr = \"${calendarOptions.startDateExpr}\";\n const endDateExpr = \"${calendarOptions.endDateExpr}\";\n const eventDurationFilters = [[endDateExpr, \">=\", eventFetchInfo.start], [startDateExpr, \"<=\", eventFetchInfo.end]];\n if(_.isEmpty(filters)){\n filters = eventDurationFilters;\n }else{\n filters = [filters, 'and', eventDurationFilters]\n }\n var pageSize = api.data.pageSize || 10;\n var pageNo = api.data.pageNo || 1;\n var skip = (pageNo - 1) * pageSize;\n var orderBy = api.data.orderBy || '';\n var orderDir = api.data.orderDir || '';\n var sort = orderBy + ' ' + orderDir;\n sort = orderBy ? sort : \"${sort}\";\n var allowSearchFields = ${JSON.stringify(searchableFields)};\n if(api.data.$term){\n filters = [[\"name\", \"contains\", \"'+ api.data.$term +'\"]];\n }else if(selfData.op === 'loadOptions' && selfData.value){\n filters = [[\"${valueField.name}\", \"=\", selfData.value]];\n }\n var searchableFilter = [];\n _.each(selfData, (value, key)=>{\n if(!_.isEmpty(value) || _.isBoolean(value)){\n if(_.startsWith(key, '__searchable__between__')){\n searchableFilter.push([\\`\\${key.replace(\"__searchable__between__\", \"\")}\\`, \"between\", value])\n }else if(_.startsWith(key, '__searchable__')){\n if(_.isString(value)){\n searchableFilter.push([\\`\\${key.replace(\"__searchable__\", \"\")}\\`, \"contains\", value])\n }else{\n searchableFilter.push([\\`\\${key.replace(\"__searchable__\", \"\")}\\`, \"=\", value])\n }\n }\n }\n });\n\n if(searchableFilter.length > 0){\n if(filters.length > 0 ){\n filters = [filters, 'and', searchableFilter];\n }else{\n filters = searchableFilter;\n }\n }\n\n if(allowSearchFields){\n allowSearchFields.forEach(function(key){\n const keyValue = selfData[key];\n if(_.isString(keyValue)){\n filters.push([key, \"contains\", keyValue]);\n }else if(_.isArray(keyValue) || _.isBoolean(keyValue) || keyValue){\n filters.push([key, \"=\", keyValue]);\n }\n })\n }\n\n if(selfData.__keywords && allowSearchFields){\n const keywordsFilters = [];\n allowSearchFields.forEach(function(key, index){\n const keyValue = selfData.__keywords;\n if(keyValue){\n keywordsFilters.push([key, \"contains\", keyValue]);\n if(index < allowSearchFields.length - 1){\n keywordsFilters.push('or');\n }\n }\n })\n filters.push(keywordsFilters);\n }\n api.data.query = api.data.query.replace(/{__filters}/g, JSON.stringify(filters)).replace('{__top}', pageSize).replace('{__skip}', skip).replace('{__sort}', sort.trim());\n delete api.data.$term;\n delete api.data.filter;\n delete api.data.pageSize;\n delete api.data.pageNo;\n delete api.data.orderBy;\n delete api.data.orderDir;\n return api;\n `\n api.adaptor = `\n window.postMessage(Object.assign({type: \"listview.loaded\"}), \"*\");\n const setDataToComponentId = \"${setDataToComponentId}\";\n if(setDataToComponentId){\n SteedosUI.getRef(api.body.$self.scopeId)?.getComponentById(setDataToComponentId)?.setData({$count: payload.data.count})\n }\n const rows = payload.data.rows || [];\n const selfData = api.data.$self;\n const events = rows.map(function(n){\n return {\n id: n[\"${idFieldName}\"],\n title: n[\"${calendarOptions.textExpr}\"],\n start: n[\"${calendarOptions.startDateExpr}\"],\n end: n[\"${calendarOptions.endDateExpr}\"],\n allDay: n[\"${calendarOptions.allDayExpr}\"]\n }\n });\n const successCallback = selfData.successCallback;\n const failureCallback = selfData.failureCallback;\n successCallback(events);\n return payload;\n `;\n return api;\n}\n\nexport function getCalendarRecordPermissionsApi(mainObject, recordId) {\n const api = getRecordPermissionsApi(mainObject, recordId, { alias: 'rows', limit: 1, fields: [\"allowEdit\"] });\n api.data.$self = \"$$\";\n api.adaptor = `\n const rows = payload.data.rows || [];\n const selfData = api.data.$self;\n const revert = selfData.revert;\n const recordPermissions = rows[0] && rows[0].recordPermissions;\n const editable = !!(recordPermissions && recordPermissions.allowEdit);\n if(!editable){\n // 没有权限时还原\n revert && revert();\n }\n payload.data.editable = editable;\n return payload;\n `;\n return api;\n}\n\nexport function getCalendarRecordSaveApi(object, calendarOptions) {\n const formData = {};\n const idFieldName = object.idFieldName || \"_id\";\n formData[idFieldName] = \"${event.data.event.id}\";\n const nameFieldKey = object.NAME_FIELD_KEY || \"name\";\n formData[nameFieldKey] = \"${event.data.event.title}\";\n formData[calendarOptions.startDateExpr] = \"${event.data.event.start}\";\n formData[calendarOptions.endDateExpr] = \"${event.data.event.end}\";\n formData[calendarOptions.allDayExpr] = \"${event.data.event.allDay}\";\n // formData[calendarOptions.textExpr] = \"${event.data.event.title}\";\n const apiData = {\n objectName: \"${objectName}\",\n $: formData,\n $self: \"$$\"\n };\n const saveDataTpl = `\n const formData = api.data.$;\n const objectName = api.data.objectName;\n let query = \\`mutation{record: \\${objectName}__update(id: \"\\${formData.${idFieldName}}\", doc: {__saveData}){${idFieldName}}}\\`;\n delete formData.${idFieldName};\n let __saveData = JSON.stringify(JSON.stringify(formData));\n `;\n const requestAdaptor = `\n ${saveDataTpl}\n api.data.query = query.replace('{__saveData}', __saveData);\n return api;\n `;\n\n return {\n method: 'post',\n url: graphql.getApi(),\n data: apiData,\n requestAdaptor: requestAdaptor,\n adaptor: `\n if(payload.errors){\n payload.status = 2;\n payload.msg = payload.errors[0].message;\n const revert = api.data.$self.event.data.revert;\n revert && revert();\n }\n return payload;\n `,\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n };\n}\n\n/**\n * 列表视图Calendar amisSchema\n * @param {*} objectSchema 对象UISchema\n * @returns amisSchema\n */\nexport async function getObjectCalendar(objectSchema, calendarOptions, options) {\n const permissions = objectSchema.permissions;\n if (!options) {\n options = {};\n }\n\n calendarOptions = Object.assign({}, DEFAULT_CALENDAR_OPTIONS, omitBy(calendarOptions, isNil));\n\n const titleFields = calendarOptions.title || [\n calendarOptions.startDateExpr, \n calendarOptions.endDateExpr, \n calendarOptions.allDayExpr, \n calendarOptions.textExpr\n ];\n let fields = [];\n each(titleFields, function (n) {\n if (objectSchema.fields[n]) {\n fields.push(objectSchema.fields[n]);\n }\n });\n\n if (objectSchema.fields[calendarOptions.allDayExpr]) {\n fields.push(objectSchema.fields[calendarOptions.allDayExpr]);\n }\n\n let sort = options.sort;\n if (!sort) {\n const sortField = options.sortField;\n const sortOrder = options.sortOrder;\n if (sortField) {\n let sortStr = sortField + ' ' + sortOrder || 'asc';\n sort = sortStr;\n }\n }\n let initialView = calendarOptions.currentView;\n if(initialView){\n // day, week, month, agenda\n switch(initialView){\n case \"day\":\n initialView = \"timeGridDay\"\n break;\n case \"week\":\n initialView = \"timeGridWeek\"\n break;\n case \"month\":\n initialView = \"dayGridMonth\"\n break;\n case \"agenda\":\n initialView = \"timeGridDay\"\n break;\n }\n }\n else{\n initialView = \"timeGridWeek\";\n }\n\n options.calendarOptions = calendarOptions;\n const api = await getCalendarApi(objectSchema, fields, options);\n\n const onGetEventsScript = `\n const api = ${JSON.stringify(api)};\n event.data.calendarOptions = ${JSON.stringify(calendarOptions)};\n doAction({\n \"actionType\": 'ajax',\n \"args\": {\n \"api\": api\n },\n });\n `;\n\n const onSelectScript = `\n const data = event.data;\n const doc = {};\n doc[\"${calendarOptions.startDateExpr}\"] = data.start;\n doc[\"${calendarOptions.endDateExpr}\"] = data.end;\n doc[\"${calendarOptions.allDayExpr}\"] = data.allDay;\n doc[\"${calendarOptions.textExpr}\"] = data.title;\n // ObjectForm会认作用域下的变量值\n // TODO: 待组件支持initValues属性后应该改掉,不应该通过data直接传值\n // TODO: 全天事件属性传入doc了但是没有生效,需要手动在ObjectForm中勾选全天事件\n event.data = doc;\n const title = \"新建 ${objectSchema.label}\";\n doAction(\n {\n \"actionType\": \"dialog\",\n \"dialog\": {\n \"type\": \"dialog\",\n \"title\": title,\n \"body\": [\n {\n \"type\": \"steedos-object-form\",\n \"objectApiName\": \"\\${objectName}\",\n \"mode\": \"edit\",\n \"onEvent\": {\n \"submitSucc\": {\n \"weight\": 0,\n \"actions\": [\n {\n \"actionType\": \"custom\",\n \"script\": \"event.data.view?.calendar.refetchEvents();\"\n }\n ]\n }\n }\n }\n ],\n \"closeOnEsc\": false,\n \"closeOnOutside\": false,\n \"showCloseButton\": true,\n \"size\": \"lg\"\n }\n });\n `;\n\n const onEventClickScript = `\n const data = event.data;\n const eventData = data.event;\n const appId = data.appId;\n const objectName = data.objectName;\n const eventId = data.event && data.event.id;\n doAction({\n \"actionType\": \"dialog\",\n \"dialog\": {\n \"type\": \"dialog\",\n \"title\": \"\",\n \"body\": [\n {\n \"type\": \"steedos-record-detail\",\n \"objectApiName\": \"\\${objectName}\",\n \"recordId\": data.event && data.event.id\n }\n ],\n \"closeOnEsc\": false,\n \"closeOnOutside\": false,\n \"showCloseButton\": true,\n \"size\": \"lg\",\n \"actions\": []\n }\n });\n `;\n\n const recordId = \"${event.id}\";\n const recordPermissionsApi = getCalendarRecordPermissionsApi(objectSchema, recordId);\n const recordSaveApi = getCalendarRecordSaveApi(objectSchema, calendarOptions);\n \n const businessHours = {\n daysOfWeek: [ 1, 2, 3, 4, 5 ],\n startTime: '08:00',\n endTime: '18:00',\n };\n if(!isEmpty(calendarOptions.startDayHour)){\n businessHours.startTime = `${calendarOptions.startDayHour}:00`;\n }\n if(!isEmpty(calendarOptions.endDayHour)){\n businessHours.endTime = `${calendarOptions.endDayHour}:00`;\n }\n \n const amisSchema = {\n \"type\": \"steedos-fullcalendar\",\n \"label\": \"\",\n \"name\": \"fullcalendar\",\n \"editable\": permissions.allowEdit,\n \"selectable\": permissions.allowCreate,\n \"selectMirror\": permissions.allowCreate,\n \"initialView\": initialView,\n \"businessHours\": businessHours,\n \"onEvent\": {\n \"getEvents\": {\n \"weight\": 0,\n \"actions\": [\n {\n \"componentId\": \"\",\n \"args\": {\n },\n \"actionType\": \"custom\",\n \"script\": onGetEventsScript\n }\n ]\n },\n \"select\": {\n \"weight\": 0,\n \"actions\": [\n {\n \"componentId\": \"\",\n \"args\": {\n },\n \"actionType\": \"custom\",\n \"script\": onSelectScript\n }\n ]\n },\n \"eventClick\": {\n \"weight\": 0,\n \"actions\": [\n {\n \"componentId\": \"\",\n \"args\": {\n },\n \"actionType\": \"custom\",\n \"script\": onEventClickScript\n }\n ]\n },\n \"eventAdd\": {\n \"weight\": 0,\n \"actions\": [\n {\n \"componentId\": \"\",\n \"args\": {\n },\n \"actionType\": \"custom\",\n \"script\": \"console.log('eventAdd'); console.log(event);\"\n }\n ]\n },\n \"eventChange\": {\n \"weight\": 0,\n \"actions\": [\n {\n \"actionType\": 'ajax',\n \"args\": {\n \"api\": recordPermissionsApi\n }\n },\n {\n \"actionType\": \"toast\",\n \"expression\": \"!event.data.editable\",\n \"args\": {\n \"msgType\": \"error\",\n \"msg\": \"您没有编辑该记录的权限!\",\n \"position\": \"top-center\"\n }\n },\n {\n \"actionType\": 'ajax',\n \"expression\": \"event.data.editable\",\n \"args\": {\n \"api\": recordSaveApi,\n \"messages\": {\n \"success\": objectSchema.label + \"修改成功\",\n \"failed\": objectSchema.label + \"修改失败!\"\n }\n }\n }\n ]\n },\n \"eventRemove\": {\n \"weight\": 0,\n \"actions\": [\n {\n \"componentId\": \"\",\n \"args\": {\n },\n \"actionType\": \"custom\",\n \"script\": \"console.log('eventRemove'); console.log(event);\"\n }\n ]\n },\n \"eventsSet\": {\n \"weight\": 0,\n \"actions\": [\n {\n \"componentId\": \"\",\n \"args\": {\n },\n \"actionType\": \"custom\",\n \"script\": \"console.log('eventsSet'); console.log(event);\"\n }\n ]\n },\n }\n };\n return amisSchema;\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-09-01 09:00:26\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-09-03 13:21:38\n * @Description: \n */\nimport { fetchAPI, getSteedosAuth } from \"./steedos.client\"\nimport { each } from \"lodash\";\n\nconst getGraphqlFieldsQuery = (fields)=>{\n const fieldsName = ['_id'];\n fields.push('record_permissions');\n //TODO 此处需要考虑相关对象查询\n each(fields, (fieldName)=>{\n if(fieldName.indexOf('.') > -1){\n fieldName = fieldName.split('.')[0]\n }\n fieldsName.push(`${fieldName}`)\n })\n return `${fieldsName.join(' ')}`;\n}\n\nconst getFindOneQuery = (objectName, id, fields)=>{\n objectName = objectName.replace(/\\./g, '_');\n const queryFields = getGraphqlFieldsQuery(fields);\n let queryOptions = ''\n let alias = \"record\";\n \n const queryOptionsArray = [`id: \"${id}\"`];\n \n if(queryOptionsArray.length > 0){\n queryOptions = `(${queryOptionsArray.join(',')})`\n }\n\n return `{${alias}:${objectName}__findOne${queryOptions}{${queryFields}}}`\n}\n\nexport const getRecord = async (objectName, recordId, fields)=>{\n const result = await fetchAPI('/graphql', {\n method: 'post',\n body: JSON.stringify({\n query: getFindOneQuery(objectName, recordId, fields)\n })\n })\n return result.data.record;\n}\n\nexport const getRelatedsCount = async (masterRecordId, relateds) => {\n const relatedQuery = [];\n\n each(relateds, (relate)=>{\n relatedQuery.push(`${relate.object_name}: ${relate.object_name}__count(filters: [[\"${relate.foreign_key}\",\"=\",\"${masterRecordId}\"]])`);\n })\n\n const query = `\n {\n ${relatedQuery.join(',')}\n }\n `;\n const result = await fetchAPI('/graphql', {\n method: 'POST',\n body: JSON.stringify({ query })\n })\n\n return result.data\n}\n\nexport const getRecordPermissions = async (objectName, recordId)=>{\n const result = await fetchAPI(`/service/api/@${objectName}/recordPermissions/${recordId}`, {\n method: 'GET'\n })\n return result;\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-07-05 15:55:39\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2023-02-02 10:15:07\n * @Description:\n */\nimport { fetchAPI, getUserId } from \"./steedos.client\";\nimport { getObjectFieldsFilterFormSchema } from './converter/amis/fields_filter';\nimport { getObjectCalendar } from './converter/amis/calendar';\n\nimport {\n getObjectList,\n getObjectDetail,\n getObjectForm,\n} from \"./converter/amis/index\";\nimport { getObjectListHeader, getObjectListHeaderFirstLine, getObjectRecordDetailHeader, getObjectRecordDetailRelatedListHeader } from './converter/amis/header';\nimport _, { cloneDeep, slice, isEmpty, each, has, findKey, find, isString, isObject, keys, includes, isArray, isFunction, map, forEach, defaultsDeep } from \"lodash\";\nimport { getRecord } from './record';\nimport { getListViewItemButtons } from './buttons'\n\nlet UI_SCHEMA_CACHE = {};\n\nlet UISchemaFunction;\nexport const setUISchemaFunction = function(fun){\n UISchemaFunction = fun;\n};\n\nif('undefined' != typeof window){\n if(!window.UI_SCHEMA_CACHE){\n window.UI_SCHEMA_CACHE = UI_SCHEMA_CACHE;\n }\n UI_SCHEMA_CACHE = window.UI_SCHEMA_CACHE;\n}\n\nconst setUISchemaCache = (key, value) => {\n UI_SCHEMA_CACHE[key] = value;\n};\n\nconst getUISchemaCache = (key) => {\n return cloneDeep(UI_SCHEMA_CACHE[key]);\n};\n\nconst hasUISchemaCache = (key) => {\n return has(UI_SCHEMA_CACHE, key);\n};\n\nexport function getListViewColumns(listView, formFactor) {\n let listViewColumns = [];\n if (formFactor === \"SMALL\") {\n listViewColumns = !isEmpty(listView.mobile_columns)\n ? listView.mobile_columns\n : slice(listView.columns, 0, 4);\n } else {\n listViewColumns = listView.columns;\n }\n return listViewColumns;\n};\n\nexport function getListViewSort(listView) {\n let sort = '';\n if(listView && listView.sort && listView.sort.length){\n each(listView.sort,function(item,index){\n if(isArray(item)){\n const field_name = item[0];\n const order = item[1] || '';\n let sortStr = field_name + ' ' + order;\n sortStr = index > 0 ? ','+sortStr : sortStr\n sort += sortStr;\n }else{\n let sortStr = item.field_name + ' ' + item.order;\n sortStr = index > 0 ? ','+sortStr : sortStr\n sort += sortStr;\n }\n })\n }\n return sort;\n};\n\nexport function getListViewFilter(listView){\n if(!listView){\n return ;\n }\n const userId = getUserId();\n let filters = listView.filters;\n if(listView.filter_scope === 'mine'){\n if(_.isEmpty(filters)){\n filters = [[\"owner\", \"=\", userId]]\n }else{\n filters.push([\"owner\", \"=\", userId])\n }\n };\n return filters;\n}\n\n\nexport async function getUISchema(objectName, force) {\n if (!objectName) {\n return;\n }\n if (hasUISchemaCache(objectName) && !force) {\n return getUISchemaCache(objectName);\n }\n let uiSchema = null;\n try {\n if(UISchemaFunction){\n uiSchema = await UISchemaFunction(objectName, force);\n }\n else {\n const url = `/service/api/@${objectName.replace(/\\./g, \"_\")}/uiSchema`;\n uiSchema = await fetchAPI(url, { method: \"get\" });\n }\n if(!uiSchema){\n return ;\n }\n setUISchemaCache(objectName, uiSchema);\n // for (const fieldName in uiSchema.fields) {\n // if (uiSchema.fields) {\n // const field = uiSchema.fields[fieldName];\n\n // if (\n // (field.type === \"lookup\" || field.type === \"master_detail\") &&\n // field.reference_to\n // ) {\n // let refTo = null;\n // if(isFunction(field.reference_to)){\n // try {\n // refTo = eval(field.reference_to)();\n // } catch (error) {\n // console.error(error)\n // }\n // }\n // if(isString(field.reference_to)){\n // refTo = [field.reference_to]\n // }else if(isArray(field.reference_to)){\n // refTo = field.reference_to\n // }\n // for (const item of refTo) {\n // const refUiSchema = await getUISchema(item);\n // if (!refUiSchema) {\n // delete uiSchema.fields[fieldName];\n // }\n // }\n \n // }\n // }\n // }\n each(uiSchema.list_views, (v, k)=>{\n v.name = k;\n if(!has(v, 'columns')){\n v.columns = uiSchema.list_views.all.columns;\n }\n })\n } catch (error) {\n console.error(`getUISchema`, objectName, error);\n setUISchemaCache(objectName, null);\n }\n return getUISchemaCache(objectName);\n}\n\nexport async function getField(objectName, fieldName) {\n const uiSchema = await getUISchema(objectName);\n return uiSchema?.fields[fieldName];\n}\n\n// 获取表单页面\nexport async function getFormSchema(objectName, ctx) {\n const uiSchema = await getUISchema(objectName);\n const amisSchema = await getObjectForm(uiSchema, ctx);\n return {\n uiSchema,\n amisSchema,\n };\n}\n\n// 获取只读页面\nexport async function getViewSchema(objectName, recordId, ctx) {\n const uiSchema = await getUISchema(objectName);\n const amisSchema = await getObjectDetail(uiSchema, recordId, ctx);\n // console.log(`getViewSchema amisSchema`, amisSchema)\n return {\n uiSchema,\n amisSchema,\n };\n}\n\n// 获取列表视图\nexport async function getListSchema(\n appName,\n objectName,\n listViewName,\n ctx = {}\n) {\n const uiSchema = await getUISchema(objectName);\n const listView = find(\n uiSchema.list_views,\n (listView, name) => {\n // 传入listViewName空值则取第一个\n if(!listViewName){\n listViewName = name;\n }\n return name === listViewName || listView._id === listViewName;\n }\n );\n\n if (!listView) {\n return { uiSchema };\n }\n\n if(listView.enable_amis_schema && listView.amis_schema){\n const amisSchema = isString(listView.amis_schema) ? JSON.parse(listView.amis_schema) : listView.amis_schema;\n return {\n uiSchema,\n isCustomAmisSchema: true,\n amisSchema\n };\n }\n\n let listViewColumns = getListViewColumns(listView, ctx.formFactor);\n let sort = getListViewSort(listView);\n let listviewFilter = getListViewFilter(listView, ctx);\n let listview_filters = listView && listView._filters;\n if(listView.type === \"calendar\"){\n const amisSchema = {\n \"type\": \"steedos-object-calendar\",\n \"objectApiName\": objectName,\n \"filters\": listviewFilter,\n \"filtersFunction\": listview_filters,\n \"sort\": sort,\n ...listView.options\n };\n return {\n uiSchema,\n isCalendar: true,\n amisSchema\n };\n }\n\n const defaults = ctx.defaults || {};\n\n if(!defaults.headerSchema && ctx.showHeader){\n defaults.headerSchema = await getObjectListHeader(uiSchema, listViewName);\n }\n\n if(!ctx.showHeader){\n defaults.headerSchema = null;\n }\n\n try {\n const listViewPropsStoreKey = location.pathname + \"/crud/\" + ctx.listViewId;\n let localListViewProps = localStorage.getItem(listViewPropsStoreKey);\n /**\n * localListViewProps规范来自crud请求api中api.data.$self参数值的。\n * 比如:{\"perPage\":20,\"page\":1,\"__searchable__name\":\"7\",\"__searchable__between__n1__c\":[null,null],\"filter\":[[\"name\",\"contains\",\"a\"]]}\n * __searchable__...:顶部放大镜搜索条件\n * filter:右侧过滤器\n * perPage:每页条数\n * page:当前页码\n * orderBy:排序字段\n * orderDir:排序方向\n */\n if (localListViewProps) {\n localListViewProps = JSON.parse(localListViewProps);\n // localListViewProps.perPage = 3;\n let listSchema = {};\n if(localListViewProps.orderBy){\n listSchema.orderBy = localListViewProps.orderBy;\n }\n if(localListViewProps.orderDir){\n listSchema.orderDir = localListViewProps.orderDir;\n }\n if(localListViewProps.perPage){\n listSchema.defaultParams = {\n perPage: localListViewProps.perPage\n }\n }\n defaults.listSchema = defaultsDeep({}, listSchema, defaults.listSchema || {});\n }\n }\n catch (ex) {\n console.error(\"本地存储中crud参数解析异常:\", ex);\n }\n\n ctx.defaults = defaults;\n\n const amisSchema = {\n \"type\": \"steedos-object-table\",\n \"objectApiName\": objectName,\n \"columns\": listViewColumns,\n \"extraColumns\": listView.extra_columns,\n \"filters\": listviewFilter,\n \"filtersFunction\": listview_filters,\n \"sort\": sort,\n \"ctx\": ctx\n };\n\n return {\n uiSchema,\n amisSchema,\n };\n}\n\n// 获取对象表格\nexport async function getTableSchema(\n appName,\n objectName,\n columns,\n ctx = {}\n) {\n const uiSchema = await getUISchema(objectName);\n\n let sort = ctx.sort;\n if(!sort){\n const sortField = ctx.sortField;\n const sortOrder = ctx.sortOrder;\n if(sortField){\n let sortStr = sortField + ' ' + sortOrder || 'asc';\n sort = sortStr;\n }\n }\n\n let fields = [];\n each(columns, function (column) {\n if (isString(column) && uiSchema.fields[column]) {\n fields.push(uiSchema.fields[column]);\n } else if (isObject(column) && uiSchema.fields[column.field]) {\n fields.push(\n Object.assign({}, uiSchema.fields[column.field], {\n width: column.width,\n wrap: column.wrap,\n })\n );\n }\n });\n\n const extraColumns = ctx.extraColumns;\n\n if (extraColumns) {\n each(extraColumns, function (column) {\n if (isString(column)) {\n fields.push({ extra: true, name: column });\n } else if (isObject(column)) {\n fields.push({ extra: true, name: column.field });\n }\n });\n }\n \n const amisSchema = await getObjectList(uiSchema, fields, {\n tabId: objectName,\n appId: appName,\n objectName: objectName,\n ...ctx,\n filter: ctx.filters,\n sort,\n buttons: await getListViewItemButtons(uiSchema, ctx)\n });\n\n return {\n uiSchema,\n amisSchema,\n };\n}\n\n// 获取对象日历\nexport async function getCalendarSchema(\n appName,\n objectName,\n calendarOptions,\n ctx = {}\n) {\n const uiSchema = await getUISchema(objectName);\n const amisSchema = await getObjectCalendar(uiSchema, calendarOptions, {\n tabId: objectName,\n appId: appName,\n objectName: objectName,\n ...ctx\n });\n return {\n uiSchema,\n amisSchema\n };\n}\n\nexport async function getRecordDetailHeaderSchema(objectName,recordId, options){\n const uiSchema = await getUISchema(objectName);\n const amisSchema = await getObjectRecordDetailHeader(uiSchema, recordId, options);\n return {\n uiSchema,\n amisSchema,\n };\n}\n\nexport async function getRecordDetailSchema(objectName, appId){\n const uiSchema = await getUISchema(objectName);\n return {\n uiSchema,\n amisSchema: {\n \"type\": \"service\",\n \"body\": [\n {\n \"type\": \"steedos-record-detail-header\",\n \"label\": \"标题面板\",\n \"objectApiName\": \"${objectName}\",\n \"recordId\": \"${recordId}\",\n \"id\": \"u:48d2c28eb755\",\n onEvent: {\n \"recordLoaded\": {\n \"actions\": [\n {\n \"actionType\": \"reload\",\n \"data\": {\n \"name\": `\\${record.${uiSchema?.NAME_FIELD_KEY || 'name'}}`,\n \"record\": `\\${record}`,\n \"recordLoaded\": true\n }\n }\n ]\n }\n },\n },\n {\n \"type\": \"tabs\",\n \"className\": \"sm:mt-3 bg-white sm:shadow sm:rounded sm:border border-slate-300 p-4\",\n \"tabs\": [\n {\n \"title\": \"详细\",\n \"className\": \"px-0 py-4\",\n \"body\": [\n {\n \"type\": \"steedos-object-form\",\n \"label\": \"对象表单\",\n \"objectApiName\": \"${objectName}\",\n \"recordId\": \"${recordId}\",\n \"id\": \"u:d4a495811d57\", \n appId: appId\n }\n ],\n \"id\": \"u:5d4e7e3f6ecc\"\n },\n {\n \"title\": \"相关\",\n \"className\": \"px-0 pt-4\",\n \"body\": [\n {\n \"type\": \"steedos-object-related-lists\",\n \"label\": \"相关列表\",\n \"objectApiName\": \"${objectName}\",\n \"recordId\": \"${recordId}\",\n \"id\": \"u:3b85b7b7a7f6\", \n appId: appId\n }\n ],\n \"id\": \"u:1a0326aeec2b\"\n }\n ],\n \"id\": \"u:a649e4094a12\"\n }\n ],\n }\n }\n}\n\n// export async function getRecordDetailRelatedListSchema(objectName,recordId,relatedObjectName){\n// // console.log('b==>',objectName,recordId,relatedObjectName)\n// const relatedObjectUiSchema = await getUISchema(relatedObjectName);\n// const { list_views, label , icon, fields } = relatedObjectUiSchema;\n// const firstListViewName = keys(list_views)[0];\n// const relatedKey = findKey(fields, function(field) { \n// return [\"lookup\",\"master_detail\"].indexOf(field.type) > -1 && field.reference_to === objectName; \n// });\n// const globalFilter = [relatedKey,'=',recordId];\n// const recordRelatedListHeader = await getObjectRecordDetailRelatedListHeader(relatedObjectUiSchema);\n// const options = {\n// globalFilter,\n// defaults: {\n// listSchema: { headerToolbar:[],columnsTogglable:false },\n// headerSchema: recordRelatedListHeader\n// },\n// showHeader: true\n// }\n// const amisSchema= (await getListSchema(null, relatedObjectName, firstListViewName, options)).amisSchema;\n// return {\n// uiSchema: relatedObjectUiSchema,\n// amisSchema: {\n// type: \"service\",\n// data: {\n// masterObjectName: objectName,\n// masterRecordId: \"${recordId}\",\n// relatedKey: relatedKey, \n// objectName: relatedObjectName,\n// listViewId: `amis-\\${appId}-${relatedObjectName}-listview`,\n// },\n// body:[\n// {\n// ...amisSchema,\n// data: {\n// filter: [\"${relatedKey}\", \"=\", \"${masterRecordId}\"],\n// objectName: \"${objectName}\",\n// recordId: \"${masterRecordId}\",\n// ...{[relatedKey]: getRelatedFieldValue(objectName, \"${recordId}\", relatedSchema.uiSchema, relatedKey)}\n// }\n// }\n// ]\n// }\n// };\n// }\n\n// 获取所有相关表\nexport async function getObjectRelatedList(\n appName,\n objectName,\n recordId,\n formFactor\n) {\n const uiSchema = await getUISchema(objectName);\n\n const related = [];\n\n const relatedLists = [].concat(uiSchema.related_lists || []);\n\n if(!isEmpty(relatedLists)){\n for (const relatedList of relatedLists) {\n const arr = relatedList.related_field_fullname.split(\".\");\n let filter = null;\n const refField = await getField(arr[0], arr[1]);\n if(refField){\n if (\n refField._reference_to ||\n (refField.reference_to && !isString(refField.reference_to))\n ) {\n filter = [\n [`${arr[1]}/o`, \"=\", objectName],\n [`${arr[1]}/ids`, \"=\", recordId],\n ];\n } else {\n filter = [`${arr[1]}`, \"=\", recordId];\n }\n const relatedUiSchema = await getUISchema(arr[0]);\n if(relatedUiSchema){\n let fields = [];\n forEach(relatedList.field_names , (fName)=>{\n const field = find(relatedUiSchema.fields, (item)=>{\n return item.name === fName\n })\n if(field){\n fields.push(field);\n }\n })\n related.push({\n masterObjectName: objectName,\n object_name: arr[0],\n foreign_key: arr[1],\n label: relatedList.label,\n schema: {\n uiSchema: relatedUiSchema,\n amisSchema: await getObjectList(relatedUiSchema, fields, {\n tabId: objectName,\n appId: appName,\n objectName: arr[0],\n formFactor: formFactor,\n globalFilter: filter,\n buttons: await getListViewItemButtons(relatedUiSchema, {isMobile: false})\n })\n }\n });\n }\n }\n }\n\n }else{\n const details = [].concat(uiSchema.details || []);\n\n for (const detail of details) {\n const arr = detail.split(\".\");\n const relatedUiSchema = await getUISchema(arr[0]);\n if(relatedUiSchema){\n let filter = null;\n const refField = await getField(arr[0], arr[1]);\n if (\n refField._reference_to ||\n (refField.reference_to && !isString(refField.reference_to))\n ) {\n filter = [\n [`${arr[1]}/o`, \"=\", objectName],\n [`${arr[1]}/ids`, \"=\", recordId],\n ];\n } else {\n filter = [`${arr[1]}`, \"=\", recordId];\n }\n \n related.push({\n masterObjectName: objectName,\n object_name: arr[0],\n foreign_key: arr[1],\n schema: await getListSchema(appName, arr[0], \"all\", {\n globalFilter: filter,\n formFactor: formFactor,\n buttons: await getListViewItemButtons(relatedUiSchema, {isMobile: false})\n }),\n });\n }\n }\n }\n\n return related;\n}\n\n// 获取单个相关表\nexport async function getObjectRelated(\n {appName,\n masterObjectName,\n objectName,\n relatedFieldName,\n recordId,\n formFactor}\n) {\n let filter = null;\n const refField = await getField(objectName, relatedFieldName);\n if (\n refField._reference_to ||\n (refField.reference_to && !isString(refField.reference_to))\n ) {\n filter = [\n [`${relatedFieldName}/o`, \"=\", masterObjectName],\n [`${relatedFieldName}/ids`, \"=\", recordId],\n ];\n } else {\n filter = [`${relatedFieldName}`, \"=\", recordId];\n }\n const masterObjectUISchema = await getUISchema(masterObjectName);\n return {\n masterObjectName: masterObjectName,\n object_name: objectName,\n foreign_key: relatedFieldName,\n schema: await getListSchema(appName, objectName, \"all\", {\n globalFilter: filter,\n formFactor: formFactor,\n }),\n record: await getRecord(masterObjectName, recordId, [\n masterObjectUISchema.NAME_FIELD_KEY,\n ]),\n masterObjectUISchema: masterObjectUISchema,\n };\n}\n\nexport async function getSearchableFieldsFilterSchema(objectSchema, fields, ctx) {\n return await getObjectFieldsFilterFormSchema(objectSchema, fields, ctx);\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-07-05 15:55:39\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2023-01-11 14:08:49\n * @Description:\n */\n\nimport {\n getObjectList\n} from \"./converter/amis/index\";\nimport { getObjectRecordDetailRelatedListHeader } from './converter/amis/header';\nimport { isEmpty, find, isString, forEach, keys, findKey } from \"lodash\";\nimport { getListViewItemButtons } from './buttons'\nimport { getUISchema, getListSchema, getField } from './objects'\nimport { getRecord } from './record';\n\nexport const getRelatedFieldValue = (masterObjectName, record_id, uiSchema, foreign_key) => {\n const relatedField = find(uiSchema.fields, (field) => {\n return foreign_key === field?.name\n });\n // console.log(`getRelatedFieldValue`, relatedField, uiSchema, foreign_key)\n if (!isString(relatedField.reference_to)) {\n return { o: masterObjectName, ids: [record_id] }\n } else if (relatedField.multiple) {\n return [record_id]\n } else {\n return record_id\n }\n}\n\n// 获取所有相关表\nexport async function getAmisObjectRelatedList(\n appName,\n objectName,\n recordId,\n formFactor\n) {\n const uiSchema = await getUISchema(objectName);\n const related = [];\n const relatedLists = [].concat(uiSchema.related_lists || []);\n if(!isEmpty(relatedLists)){\n for (const relatedList of relatedLists) {\n const arr = relatedList.related_field_fullname.split(\".\");\n let filter = null;\n const refField = await getField(arr[0], arr[1]);\n if(refField){\n if (\n refField._reference_to ||\n (refField.reference_to && !isString(refField.reference_to))\n ) {\n filter = [\n [`${arr[1]}/o`, \"=\", objectName],\n [`${arr[1]}/ids`, \"=\", recordId],\n ];\n } else {\n filter = [`${arr[1]}`, \"=\", recordId];\n }\n const relatedUiSchema = await getUISchema(arr[0]);\n if(relatedUiSchema){\n let fields = [];\n forEach(relatedList.field_names , (fName)=>{\n const field = find(relatedUiSchema.fields, (item)=>{\n return item.name === fName\n })\n if(field){\n fields.push(field);\n }\n })\n // TODO: 也需在amisSchema上再添加一层service\n related.push({\n masterObjectName: objectName,\n object_name: arr[0],\n foreign_key: arr[1],\n schema: {\n uiSchema: relatedUiSchema,\n amisSchema: await getObjectList(relatedUiSchema, fields, {\n tabId: objectName,\n appId: appName,\n objectName: arr[0],\n formFactor: formFactor,\n globalFilter: filter,\n buttons: await getListViewItemButtons(relatedUiSchema, {isMobile: false})\n })\n }\n });\n }\n }\n }\n\n }else{\n const details = [].concat(uiSchema.details || []);\n\n for (const detail of details) {\n const arr = detail.split(\".\");\n const relatedUiSchema = await getUISchema(arr[0]);\n if(relatedUiSchema){\n let filter = null;\n const refField = await getField(arr[0], arr[1]);\n if (\n refField._reference_to ||\n (refField.reference_to && !isString(refField.reference_to))\n ) {\n filter = [\n [`${arr[1]}/o`, \"=\", objectName],\n [`${arr[1]}/ids`, \"=\", recordId],\n ];\n } else {\n filter = [`${arr[1]}`, \"=\", recordId];\n }\n const relatedSchema = await getListSchema(appName, arr[0], \"all\", {\n // globalFilter: filter,\n formFactor: formFactor,\n buttons: await getListViewItemButtons(relatedUiSchema, {isMobile: false})\n });\n\n const relatedAmisSchema = relatedSchema.amisSchema;\n const recordRelatedListHeader = await getObjectRecordDetailRelatedListHeader(relatedUiSchema);\n relatedAmisSchema.headerSchema = recordRelatedListHeader;\n // relatedAmisSchema.listSchema = { headerToolbar:[],columnsTogglable:false };\n relatedAmisSchema.headerToolbar = [];\n relatedAmisSchema.columnsTogglable = false ;\n delete relatedAmisSchema.ctx;\n relatedSchema.amisSchema = {\n type: \"service\",\n className: \"b-a m-b\",\n data: {\n masterObjectName: objectName,\n masterRecordId: \"${recordId}\",\n relatedKey: arr[1], \n objectName: arr[0],\n listViewId: `amis-\\${appId}-${arr[0]}-listview`,\n },\n body:[\n {\n ...relatedAmisSchema,\n data: {\n filter: [\"${relatedKey}\", \"=\", \"${masterRecordId}\"],\n objectName: \"${objectName}\",\n recordId: \"${masterRecordId}\",\n defaultData: {\n ...{[arr[1]]: getRelatedFieldValue(objectName, recordId, relatedSchema.uiSchema, arr[1])}\n }\n }\n }\n ]\n }\n\n related.push({\n masterObjectName: objectName,\n object_name: arr[0],\n foreign_key: arr[1],\n schema: relatedSchema,\n });\n }\n }\n }\n\n return related;\n}\n\n// 获取单个相关表\nexport async function getRecordDetailRelatedListSchema(objectName, recordId, relatedObjectName, relatedKey, top, perPage, hiddenEmptyTable, appId, relatedLabel, className){\n // console.log('b==>',objectName,recordId,relatedObjectName)\n const relatedObjectUiSchema = await getUISchema(relatedObjectName);\n const { list_views, label , icon, fields } = relatedObjectUiSchema;\n if(!relatedLabel){\n relatedLabel = label;\n }\n const firstListViewName = keys(list_views)[0];\n if(!relatedKey){\n relatedKey = findKey(fields, function(field) { \n return [\"lookup\",\"master_detail\"].indexOf(field.type) > -1 && field.reference_to === objectName; \n });\n }\n let globalFilter = null;\n const refField = await getField(relatedObjectName, relatedKey);\n\n let relatedValue = recordId;\n if(refField.reference_to_field && refField.reference_to_field != '_id'){\n const masterRecord = await getRecord(objectName, recordId, [refField.reference_to_field]);\n relatedValue = masterRecord[refField.reference_to_field]\n }\n \n if (\n refField._reference_to ||\n (refField.reference_to && !isString(refField.reference_to))\n ) {\n globalFilter = [\n [`${relatedKey}/o`, \"=\", objectName],\n [`${relatedKey}/ids`, \"=\", relatedValue],\n ];\n } else {\n globalFilter = [`${relatedKey}`, \"=\", relatedValue];\n }\n const recordRelatedListHeader = await getObjectRecordDetailRelatedListHeader(relatedObjectUiSchema, relatedLabel);\n const componentId = `steedos-record-related-list-${relatedObjectName}`;\n const options = {\n globalFilter,\n defaults: {\n listSchema: { headerToolbar:[],columnsTogglable:false },\n headerSchema: recordRelatedListHeader\n },\n showHeader: true,\n top: top,\n perPage: perPage,\n setDataToComponentId: componentId,\n tableHiddenOn: hiddenEmptyTable ? \"this.$count === 0\" : null,\n appId: appId\n }\n const amisSchema= (await getListSchema(null, relatedObjectName, firstListViewName, options)).amisSchema;\n return {\n uiSchema: relatedObjectUiSchema,\n amisSchema: {\n type: \"service\",\n id: componentId,\n className: `steedos-record-related-list sm:rounded sm:border border-slate-300 bg-gray-100 mb-4 ${className}`,\n data: {\n \"&\": \"$$\",\n appId: \"${appId}\",\n app_id: \"${appId}\",\n masterObjectName: objectName,\n masterRecordId: \"${recordId}\",\n relatedKey: relatedKey, \n objectName: relatedObjectName,\n listViewId: `amis-\\${appId}-${relatedObjectName}-listview`,\n },\n body:[\n {\n ...amisSchema,\n data: {\n \"&\": \"$$\",\n appId: \"${appId}\",\n app_id: \"${appId}\",\n // filter: [\"${relatedKey}\", \"=\", \"${masterRecordId}\"], 此语法不符合amis 数据映射规范\n relatedKey: relatedKey,\n objectName: \"${objectName}\",\n recordId: \"${masterRecordId}\",\n defaultData: {\n ...{[relatedKey]: getRelatedFieldValue(objectName, relatedValue, relatedObjectUiSchema, relatedKey)}\n }\n }\n }\n ]\n }\n };\n}","import { map } from 'lodash';\n\nconst PUBLIC_ENV = {};\n\nexport const setEnv = (k, v)=>{\n PUBLIC_ENV[k] = v;\n}\n\nexport const getEnv = (k) =>{\n return PUBLIC_ENV[k];\n}\n\nexport const setEnvs = (data) =>{\n map(data, (v, k)=>{\n PUBLIC_ENV[k] = v;\n });\n}\n\nexport const getEnvs = () =>{\n return PUBLIC_ENV;\n}","import { getUISchema } from './objects';\n\nexport async function getSpaceUsersPickerAmisSchema(spaceUserSchema, name, options) {\n return {\n \"type\": \"picker\",\n \"label\": \"人员\",\n \"name\": name,\n \"id\": options.id,\n \"modalMode\": \"dialog\",\n \"joinValues\": false,\n \"source\": {\n \"method\": \"post\",\n \"url\": \"${context.rootUrl}/graphql\",\n \"data\": {\n \"orderBy\": \"${orderBy}\",\n \"orderDir\": \"${orderDir}\",\n \"pageNo\": \"${page}\",\n \"pageSize\": \"${perPage}\",\n \"query\": \"{rows:space_users(filters: {__filters}, top: {__top}, skip: {__skip}, sort: \\\"{__sort}\\\"){_id,name,email,mobile},count:space_users__count(filters:{__filters})}\",\n \"$term\": \"$term\",\n \"$self\": \"$$\"\n },\n \"requestAdaptor\": \"\\n const selfData = JSON.parse(JSON.stringify(api.data.$self));\\n var filters = [];\\n var pageSize = api.data.pageSize || 10;\\n var pageNo = api.data.pageNo || 1;\\n var skip = (pageNo - 1) * pageSize;\\n var orderBy = api.data.orderBy || '';\\n var orderDir = api.data.orderDir || '';\\n var sort = orderBy + ' ' + orderDir;\\n var allowSearchFields = [\\\"name\\\"];\\n if(api.data.$term){\\n filters = [[\\\"name\\\", \\\"contains\\\", \\\"'+ api.data.$term +'\\\"]];\\n }else if(selfData.op === 'loadOptions' && selfData.value){\\n filters = [[\\\"_id\\\", \\\"=\\\", selfData.value]];\\n }\\n if(allowSearchFields){\\n allowSearchFields.forEach(function(key){\\n const keyValue = selfData[key];\\n if(keyValue){\\n filters.push([key, \\\"contains\\\", keyValue]);\\n }\\n })\\n }\\n api.data.query = api.data.query.replace(/{__filters}/g, JSON.stringify(filters)).replace('{__top}', pageSize).replace('{__skip}', skip).replace('{__sort}', sort.trim());\\n return api;\\n \"\n },\n \"pickerSchema\": {\n \"mode\": \"table\",\n \"name\": \"thelist\",\n \"draggable\": false,\n \"headerToolbar\": [\n \"switch-per-page\",\n \"pagination\"\n ],\n \"defaultParams\": {\n \"perPage\": 50\n },\n \"columns\": [\n {\n \"name\": \"_index\",\n \"type\": \"text\",\n \"width\": 32,\n \"placeholder\": \"\"\n },\n {\n \"name\": \"_id\",\n \"label\": \"ID\",\n \"type\": \"text\",\n \"toggled\": false\n },\n {\n \"name\": \"name\",\n \"label\": \"姓名\",\n \"sortable\": true,\n \"searchable\": true,\n \"type\": \"text\"\n },\n {\n \"name\": \"email\",\n \"label\": \"邮件\",\n \"sortable\": true,\n \"type\": \"text\",\n \"searchable\": true\n },\n {\n \"name\": \"mobile\",\n \"label\": \"手机\",\n \"type\": \"text\",\n \"sortable\": true,\n \"searchable\": true\n }\n ],\n \"syncLocation\": false,\n \"keepItemSelectionOnPageChange\": true\n },\n \"labelField\": \"name\",\n \"valueField\": \"_id\",\n \"size\": \"lg\",\n \"extractValue\": true,\n \"className\": \"m-0\",\n \"labelClassName\": \"text-left\"\n }\n}\n\nexport async function getSpaceUsersPickerSchema(name, options) {\n const uiSchema = await getUISchema(\"space_users\");\n const amisSchema = await getSpaceUsersPickerAmisSchema(uiSchema, name, options);\n return {\n uiSchema,\n amisSchema,\n };\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-08-02 11:19:09\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-08-05 11:15:42\n * @Description:\n */\n// # 日期类型: date, datetime 支持操作符: \"=\", \"<>\", \"<\", \">\", \"<=\", \">=\"\n// # 文本类型: text, textarea, html 支持操作符: \"=\", \"<>\", \"contains\", \"notcontains\", \"startswith\"\n// # 选择类型: lookup, master_detail, select 支持操作符: \"=\", \"<>\"\n// # 数值类型: currency, number 支持操作符: \"=\", \"<>\", \"<\", \">\", \"<=\", \">=\"\n// # 布尔类型: boolean 支持操作符: \"=\", \"<>\"\n// # 数组类型: checkbox, [text] 支持操作符: \"=\", \"<>\"\nimport lodash from 'lodash';\n\nconst DATE_DATETIME_BETWEEN_VALUES = [\n \"last_year\",\n \"this_year\",\n \"next_year\",\n \"last_quarter\",\n \"this_quarter\",\n \"next_quarter\",\n \"last_month\",\n \"this_month\",\n \"next_month\",\n \"last_week\",\n \"this_week\",\n \"next_week\",\n \"yestday\",\n \"today\",\n \"tomorrow\",\n \"last_7_days\",\n \"last_30_days\",\n \"last_60_days\",\n \"last_90_days\",\n \"last_120_days\",\n \"next_7_days\",\n \"next_30_days\",\n \"next_60_days\",\n \"next_90_days\",\n \"next_120_days\",\n];\n\n/**\n *\n */\n\nconst opMaps = {\n equal: \"=\",\n not_equal: \"!=\",\n less: \"<\",\n less_or_equal: \"<=\",\n greater: \">\",\n greater_or_equal: \">=\",\n between: \"between\",\n not_between: \"not_between\", // TODO 不支持待@steedos/filters 增强\n is_empty: \"is_empty\", // TODO 不支持待@steedos/filters 增强\n is_not_empty: \"is_not_empty\", // TODO 不支持待@steedos/filters 增强\n select_equals: \"=\",\n select_not_equals: \"!=\",\n select_any_in: \"in\",\n select_not_any_in: \"<>\",\n like: \"contains\",\n not_like: \"notcontains\",\n starts_with: \"startswith\",\n ends_with: \"endswith\",\n};\n\nconst isGroup = (item) => {\n return _.has(item, \"conjunction\");\n};\n\nconst conditionGroupToFilters = (group) => {\n const filters = [];\n const { conjunction, children } = group;\n if (conjunction && children) {\n children.forEach((item) => {\n if (filters.length > 0) {\n filters.push(conjunction);\n }\n if (isGroup(item)) {\n const filter = conditionGroupToFilters(item);\n if (filter && filter.length > 0) {\n filters.push(filter);\n }\n } else {\n const filter = conditionItemToFilters(item);\n if (filter) {\n filters.push(filter);\n }\n }\n });\n }\n return filters;\n};\n\nconst conditionItemToFilters = (item) => {\n const { left, op, right } = item;\n if (left && left.type === \"field\") {\n if (op) {\n if (op.startsWith(\"between:\")) {\n const array = op.split(\":\");\n return [left.field, array[0], array[1]];\n } else {\n if (right != null) {\n return [left.field, opMaps[op], right];\n }\n }\n }\n }\n};\n\n// const conditionChildrenToFilters = (children)=>{\n\n// }\nconst filterToConditionItem = (filter) => {\n if (filter.length === 3) {\n const op = lodash.findKey(opMaps, (value) => {\n return value === filter[1];\n });\n if (\n op === \"between\" &&\n lodash.includes(DATE_DATETIME_BETWEEN_VALUES, filter[2])\n ) {\n return {\n left: {\n type: \"field\",\n field: filter[0],\n },\n op: `${op}:${filter[2]}`,\n };\n } else {\n return {\n left: {\n type: \"field\",\n field: filter[0],\n },\n op: op,\n right: filter[2],\n };\n }\n } else {\n console.warn(`无效的filter:${JSON.stringify(filter)}`);\n }\n};\n\nconst filterObjectToArray = (filter) => {\n if (!lodash.isArray(filter) && lodash.isObject(filter)) {\n return [filter.field, filter.operation, filter.value];\n }\n return filter;\n};\n\nconst filtersToConditionGroup = (filters) => {\n filters = filterObjectToArray(filters);\n\n const conditions = {\n conjunction: \"and\",\n children: [],\n };\n if (!filters || filters.length == 0) {\n return conditions;\n }\n filters.forEach((filter) => {\n filter = filterObjectToArray(filter);\n if (filter === \"or\" || filter === \"and\") {\n conditions.conjunction = filter;\n } else {\n if (\n filter.length === 3 &&\n filter.indexOf(\"and\") == -1 &&\n filter.indexOf(\"or\") == -1\n ) {\n conditions.children.push(filterToConditionItem(filter));\n } else {\n conditions.children.push(filtersToConditionGroup(filter));\n }\n }\n });\n return conditions;\n};\n\nexport const conditionsToFilters = (conditions) => {\n return conditionGroupToFilters(conditions);\n};\n\nexport const filtersToConditions = (filters) => {\n return filtersToConditionGroup(filters);\n};\n","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-09-07 16:20:45\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-09-14 16:31:47\n * @Description:\n */\nimport { lookupToAmisPicker } from '../converter/amis/fields/lookup'\n\nimport { each, startsWith } from 'lodash';\n\nconst getSelectOptions = (field)=>{\n const options = [];\n each(field.options.split(\"\\n\"), (item)=>{\n var foo = item.split(':');\n if(foo.length == 2){\n options.push({label: foo[0], value: foo[1]})\n }else{\n options.push({label: item, value: item})\n }\n })\n return options;\n}\n\nconst getTdInputTpl = (field, label) => {\n const tpl = {\n label: label === true ? field.name : false,\n name: field.code,\n mode: \"horizontal\",\n className: \"m-none p-none\",\n disabled: field.permission === \"readonly\",\n };\n switch (field.type) {\n case \"input\":\n if (field.is_textarea) {\n tpl.type = \"textarea\";\n } else {\n tpl.type = \"input-text\";\n }\n break;\n case \"number\":\n tpl.type = \"input-number\";\n break;\n case \"date\":\n tpl.type = \"input-date\";\n break;\n case \"dateTime\":\n tpl.type = \"input-datetime\";\n break;\n case \"checkbox\":\n tpl.type = \"checkbox\";\n break;\n case \"email\":\n tpl.type = \"input-email\";\n tpl.validations = {\n isEmail: true\n }\n break;\n case \"url\":\n tpl.type = \"input-url\";\n tpl.validations = {\n isUrl: true\n }\n break;\n case \"password\":\n tpl.type = \"input-password\";\n tpl.showCounter = true;\n break;\n case \"select\":\n tpl.type = \"select\";\n tpl.options = getSelectOptions(field)\n break;\n case \"user\":\n tpl.type = \"input-text\"; //TODO\n break;\n case \"group\":\n tpl.type = \"input-text\"; //TODO\n break;\n case \"radio\":\n tpl.type = \"radios\";\n tpl.options = getSelectOptions(field)\n break;\n case \"multiSelect\":\n tpl.type = \"checkboxes\";\n tpl.options = getSelectOptions(field)\n break;\n case \"odata\":\n var labelField = field.formula.substr(1, field.formula.length - 2);\n tpl.type = \"select\";\n tpl.multiple = field.is_multiselect\n tpl.labelField = labelField;\n tpl.valueField = \"$$\"\n tpl.source = {\n \"url\": startsWith(field.url, 'http') ? field.url : `\\${context.rootUrl}${field.url}`,\n \"method\": \"get\",\n \"dataType\": \"json\",\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n break;\n case \"html\":\n tpl.type = \"html\";\n break;\n case \"table\":\n tpl.type = \"input-table\"; //TODO\n tpl.addable = field.permission != \"readonly\";\n tpl.editable = tpl.addable;\n tpl.copyable = tpl.addable;\n tpl.columns = [];\n each(field.sfields, (sField)=>{\n if(sField.type != 'hidden'){\n tpl.columns.push(getTdInputTpl(sField, true))\n }\n })\n break;\n case \"section\":\n tpl.type = \"input-text\";\n break;\n default:\n break;\n }\n\n return tpl;\n};\n\nconst getTdField = (field, fieldsCount) => {\n return {\n background: field.permission === \"readonly\" ? \"\" : \"rgba(255,255,0,.1)\",\n colspan: field.type === 'table' ? 4 : 3 - (fieldsCount - 1) * 2,\n align: \"left\",\n className: \"td-field\",\n body: [\n getTdInputTpl(field)\n ],\n style: {\n marginTop: \"0\",\n paddingTop: \"0\",\n paddingRight: \"0\",\n paddingBottom: \"0\",\n paddingLeft: \"0\",\n marginRight: \"0\",\n marginBottom: \"0\",\n marginLeft: \"0\",\n },\n // \"id\": \"u:9b001b7ff92d\"\n };\n};\n\nconst getTdTitle = (field) => {\n return {\n className: \"td-title\",\n align: field.type != 'section' ? \"center\" : \"left\",\n width: field.type != 'section' ? \"16%\" : \"\",\n colspan: field.type == 'section' ? 4 : \"\",\n body: [\n {\n type: \"tpl\",\n tpl: `<div style='font-size:20px'>${field.name}</div>`,\n },\n ],\n // \"id\": \"u:9b001b7ff92d\"\n };\n};\n\nconst getTds = (tdFields) => {\n const tds = [];\n each(tdFields, (field) => {\n if(field.type != 'table'){\n tds.push(getTdTitle(field));\n }\n if(field.type != 'section'){\n tds.push(getTdField(field, tdFields.length));\n }\n });\n return tds;\n};\n\nconst getFormTrs = (form) => {\n const trsSchema = [];\n const trs = [];\n let tdFields = [];\n each(form.fields, (field, index) => {\n if (field.is_wide) {\n if (tdFields.length != 0) {\n trs.push(tdFields);\n }\n if(field.type == 'table'){\n trs.push([Object.assign({}, field, {type: 'section'})])\n }\n tdFields = [];\n tdFields.push(field);\n trs.push(tdFields);\n tdFields = [];\n } else {\n tdFields.push(field);\n if (tdFields.length == 2 || index === form.fields.length - 1) {\n trs.push(tdFields);\n tdFields = [];\n }\n }\n });\n\n each(trs, (tdFields) => {\n trsSchema.push({\n background: \"#F7F7F7\",\n tds: getTds(tdFields),\n });\n });\n\n return trsSchema;\n};\n\nconst getFormTableView = (form) => {\n return {\n type: \"table-view\",\n trs: getFormTrs(form),\n id: \"u:047f3669468b\",\n };\n};\n\nexport const getFlowFormSchema = (form) => {\n return {\n type: \"page\",\n body: [\n {\n type: \"service\",\n data: {\n beijing: \"20\",\n tianjing: \"19\",\n },\n body: [\n {\n type: \"tpl\",\n id: \"u:f5bb0ad602a6\",\n tpl: `<div style='font-size:20px'>${form.title}</div>`,\n inline: true,\n wrapperComponent: \"\",\n style: {\n fontFamily: \"\",\n fontSize: 12,\n textAlign: \"center\",\n },\n },\n getFormTableView(form),\n ],\n id: \"u:a381684e042b\",\n },\n ],\n id: \"u:63849ea39e12\",\n messages: {},\n pullRefresh: {},\n regions: [\"body\"],\n };\n};\n","/**\n * 将例如像 a.b.c 或 a[1].b 的字符串转换为路径数组\n *\n * @param string 要转换的字符串\n */\n export const keyToPath = (string: string) => {\n const result = [];\n \n if (string.charCodeAt(0) === '.'.charCodeAt(0)) {\n result.push('');\n }\n \n string.replace(\n new RegExp(\n '[^.[\\\\]]+|\\\\[(?:([^\"\\'][^[]*)|([\"\\'])((?:(?!\\\\2)[^\\\\\\\\]|\\\\\\\\.)*?)\\\\2)\\\\]|(?=(?:\\\\.|\\\\[\\\\])(?:\\\\.|\\\\[\\\\]|$))',\n 'g'\n ),\n (match, expression, quote, subString) => {\n let key = match;\n if (quote) {\n key = subString.replace(/\\\\(\\\\)?/g, '$1');\n } else if (expression) {\n key = expression.trim();\n }\n result.push(key);\n return '';\n }\n );\n \n return result;\n };\n ","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n","import isPlainObject from 'lodash/isPlainObject';\nimport {keyToPath} from './keyToPath';\n\n// 方便取值的时候能够把上层的取到,但是获取的时候不会全部把所有的数据获取到。\nexport function createObject(\n superProps?: {[propName: string]: any},\n props?: {[propName: string]: any},\n properties?: any\n): object {\n if (superProps && Object.isFrozen(superProps)) {\n superProps = cloneObject(superProps);\n }\n\n const obj = superProps\n ? Object.create(superProps, {\n ...properties,\n __super: {\n value: superProps,\n writable: false,\n enumerable: false\n }\n })\n : Object.create(Object.prototype, properties);\n\n props &&\n isObject(props) &&\n Object.keys(props).forEach(key => (obj[key] = props[key]));\n\n return obj;\n}\n\nexport function cloneObject(target: any, persistOwnProps: boolean = true) {\n const obj =\n target && target.__super\n ? Object.create(target.__super, {\n __super: {\n value: target.__super,\n writable: false,\n enumerable: false\n }\n })\n : Object.create(Object.prototype);\n persistOwnProps &&\n target &&\n Object.keys(target).forEach(key => (obj[key] = target[key]));\n return obj;\n}\n\nexport function extendObject(\n target: any,\n src?: any,\n persistOwnProps: boolean = true\n) {\n const obj = cloneObject(target, persistOwnProps);\n src && Object.keys(src).forEach(key => (obj[key] = src[key]));\n return obj;\n}\n\nexport function isObject(obj: any) {\n const typename = typeof obj;\n return (\n obj &&\n typename !== 'string' &&\n typename !== 'number' &&\n typename !== 'boolean' &&\n typename !== 'function' &&\n !Array.isArray(obj)\n );\n}\n\nexport function setVariable(\n data: {[propName: string]: any},\n key: string,\n value: any,\n convertKeyToPath?: boolean\n) {\n data = data || {};\n\n if (key in data) {\n data[key] = value;\n return;\n }\n\n const parts = convertKeyToPath !== false ? keyToPath(key) : [key];\n const last = parts.pop() as string;\n\n while (parts.length) {\n let key = parts.shift() as string;\n if (isPlainObject(data[key])) {\n data = data[key] = {\n ...data[key]\n };\n } else if (Array.isArray(data[key])) {\n data[key] = data[key].concat();\n data = data[key];\n } else if (data[key]) {\n // throw new Error(`目标路径不是纯对象,不能覆盖`);\n // 强行转成对象\n data[key] = {};\n data = data[key];\n } else {\n data[key] = {};\n data = data[key];\n }\n }\n\n data[last] = value;\n}\n\nexport function deleteVariable(data: {[propName: string]: any}, key: string) {\n if (!data) {\n return;\n } else if (data.hasOwnProperty(key)) {\n delete data[key];\n return;\n }\n\n const parts = keyToPath(key);\n const last = parts.pop() as string;\n\n while (parts.length) {\n let key = parts.shift() as string;\n if (isPlainObject(data[key])) {\n data = data[key] = {\n ...data[key]\n };\n } else if (data[key]) {\n throw new Error(`目标路径不是纯对象,不能修改`);\n } else {\n break;\n }\n }\n\n if (data && data.hasOwnProperty && data.hasOwnProperty(last)) {\n delete data[last];\n }\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-07-05 15:54:17\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-07-05 16:30:29\n * @Description: \n */\nimport { fetchAPI } from './steedos.client';\n\nexport async function getApps(){\n const APPS_API = '/service/api/apps/menus';\n const apps = await fetchAPI(APPS_API);\n return apps;\n}\n\nexport async function getApp(appName){\n const appApi = `/service/api/apps/${appName}/menus`;\n const app = await fetchAPI(appApi);\n return app;\n}","import { getRootUrl, getSteedosAuth } from \"./lib/steedos.client\";\n\n/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-12-17 17:03:40\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-12-17 17:03:42\n * @Description: \n */\nexport const getDefaultRenderData = ()=>{\n const steedosAuth = getSteedosAuth();\n return {\n context: {\n rootUrl: getRootUrl(),\n userId: steedosAuth.userId,\n tenantId: steedosAuth.spaceId,\n authToken: steedosAuth.authToken,\n user: steedosAuth\n },\n global: {\n userId: steedosAuth.userId,\n spaceId: steedosAuth.spaceId,\n user: steedosAuth, \n now: new Date(),\n // mode: mode //由表单提供\n }\n }\n }","import { first, keys, map, find } from 'lodash';\nimport { getUISchema, getObjectRelatedList,getRecordDetailHeaderSchema, getFormSchema, getViewSchema, getListViewColumns, getListViewSort, getTableSchema } from './objects';\nimport { getAmisObjectRelatedList } from './objectsRelated';\n\nimport { getObjectListHeader,getObjectRecordDetailRelatedListHeader } from './converter/amis/header';\n// import { getListSchema } from './objects';\n\n// 获取表单初始化amisSchema\nexport async function getFormPageInitSchema(objectApiName) {\n const schema = await getFormSchema(objectApiName, {recordId: '${recordId}'});\n return {\n type: 'page',\n bodyClassName: '',\n regions: [\n \"body\"\n ],\n body:[\n schema.amisSchema\n ]\n }\n}\n\n// 获取列表页面初始化amisSchema\nexport async function getListPageInitSchema(objectApiName, formFactor, userSession) {\n // let schema = await getListSchema(null, objectApiName, null, { showHeader: true });\n // let amisSchema = schema && schema.amisSchema;\n // if (amisSchema) {\n // return {\n // type: 'page',\n // bodyClassName: 'p-0',\n // regions: [\n // \"body\"\n // ],\n // // name: `page_${readonly ? 'readonly':'edit'}_${recordId}`\n // body: amisSchema\n // }\n // }\n\n // const uiSchema = await getUISchema(objectApiName);\n // const listViewName = first(keys(uiSchema.list_views));\n // const headerSchema = await getObjectListHeader(uiSchema, listViewName);\n\n return {\n type: 'page',\n bodyClassName: '',\n regions: [\n \"body\"\n ],\n // name: `page_${readonly ? 'readonly':'edit'}_${recordId}`\n body: [{\n \"type\": \"steedos-object-listview\",\n \"objectApiName\": objectApiName,\n // \"listName\": \"${listName}\",\n // \"headerToolbar\": [],\n \"columnsTogglable\": false,\n \"showHeader\": true,\n // \"headerSchema\": headerSchema\n }]\n }\n}\n\n// 获取\nexport async function getRecordPageInitSchema(objectApiName){\n // console.log('getRecordPageSchema==>', objectApiName, ctx, formFactor, userSession);\n // const detailHeaderAmisSchema = (await getRecordDetailHeaderSchema(objectApiName, \"${recordId}\")).amisSchema;\n // const objectFormAmisSchema = (await getViewSchema(objectApiName, \"${recordId}\", {labelAlign:\"left\"})).amisSchema;\n \n const recordId = '${recordId}';\n const relatedList = await getAmisObjectRelatedList(null, objectApiName, recordId, null);\n const uiSchema = await getUISchema(objectApiName);\n let body = [\n // detailHeaderAmisSchema,\n {\n \"type\": \"steedos-record-detail-header\",\n \"label\": \"标题面板\",\n \"objectApiName\": \"${objectName}\",\n \"recordId\": \"${recordId}\",\n \"onEvent\": {\n \"recordLoaded\": {\n \"actions\": [\n {\n \"actionType\": \"setValue\",\n \"args\": {\n \"value\": {\n \"recordLoaded\": true,\n }\n }\n },\n {\n \"actionType\": \"reload\",\n \"data\": {\n \"name\": `\\${record.${uiSchema?.NAME_FIELD_KEY || 'name'}}`,\n \"record\": `\\${record}`,\n \"recordLoaded\": true,\n }\n }\n ]\n }\n }\n }\n ];\n let contentBody = {\n \"type\": \"tabs\",\n \"tabs\": [\n {\n \"title\": \"详情\",\n \"body\": [\n // objectFormAmisSchema\n {\n \"type\": \"steedos-object-form\",\n \"label\": \"对象表单\",\n \"mode\": \"read\",\n \"objectApiName\": \"${objectName}\",\n \"recordId\": \"${recordId}\",\n \"labelAlign\": \"left\"\n }\n ]\n }\n ],\n \"className\": \"sm:mt-3 flex flex-col region-main bg-white sm:shadow sm:rounded sm:border border-slate-300\",\n \"linksClassName\": \"pl-4 pt-2\"\n };\n const relatedListSchema = map(relatedList,(item)=>{\n return item.schema.amisSchema;\n })\n if(relatedListSchema.length){\n contentBody.tabs.push({\n \"title\": \"相关\",\n \"body\": relatedListSchema\n })\n }\n body.push(contentBody);\n return {\n type: 'page',\n id: `page_${objectApiName}_record_detail`,\n bodyClassName: '',\n regions: [\n \"body\"\n ],\n body\n }\n}\n\n// 获取对象的某个列表视图初始化amisSchema\nexport async function getListviewInitSchema(objectApiName, listViewName, ctx) {\n if(!ctx){\n ctx = {};\n }\n const uiSchema = await getUISchema(objectApiName);\n const listView = find(\n uiSchema.list_views,\n (listView, name) => {\n return name === listViewName;\n }\n );\n\n let amisSchema = {};\n\n if (listView) {\n const listViewColumns = getListViewColumns(listView, ctx.formFactor);\n const sort = getListViewSort(listView);\n \n // amisSchema = {\n // \"type\": \"steedos-object-table\",\n // \"objectApiName\": objectApiName,\n // \"columns\": listViewColumns,\n // \"extraColumns\": listView.extra_columns,\n // \"filters\": listView.filters,\n // \"sort\": sort,\n // \"headerSchema\": headerSchema\n // };\n\n const defaults = ctx.defaults || {};\n if(!defaults.headerSchema){\n //传入isListviewInit是区别于对象列表类型的微页面,即getListPageInitSchema函数中该属性为false\n const headerSchema = await getObjectListHeader(uiSchema, listViewName, {\n onlySecordLine: true,\n isListviewInit: true\n });\n defaults.headerSchema = headerSchema;\n }\n ctx.defaults = defaults;\n let setDataToComponentId = ctx.setDataToComponentId;\n if(!setDataToComponentId){\n setDataToComponentId = `service_listview_${objectApiName}`;\n }\n const schema = await getTableSchema(null, objectApiName, listViewColumns, {\n sort,\n ...ctx,\n setDataToComponentId\n });\n amisSchema = schema.amisSchema;\n // TODO: 下面这些data下的无用属性在底层代码中就不应该加,待底层移除后下面的删除语句就可以去掉了\n delete amisSchema.data.$master;\n delete amisSchema.data._id;\n delete amisSchema.data.recordPermissions;\n delete amisSchema.data.uiSchema;\n }\n // 不可以外面包一层page,否则列表视图渲染时的data无法传入顶部第一行造成按钮显示异常\n return amisSchema;\n\n // return {\n // type: 'page',\n // bodyClassName: 'p-0',\n // regions: [\n // \"body\"\n // ],\n // // name: `page_${readonly ? 'readonly':'edit'}_${recordId}`\n // body: [amisSchema],\n // data:{\n // listName: listViewName\n // }\n // }\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-08-15 11:53:28\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-08-27 16:54:21\n * @Description: \n */\nimport { fetchAPI, getSteedosAuth } from \"./steedos.client\"\n\nexport const getNotifications = async () => {\n const auth = getSteedosAuth();\n const query = `\n {\n notifications(filters: [\"owner\",\"=\",\"${auth.userId}\"], sort: \"created desc,name\", top : 10){\n _id,name,body,related_to,related_name,url,owner,is_read,from,created\n },\n unReadCount: notifications__count(filters: [[\"owner\",\"=\",\"${auth.userId}\"], [\"is_read\", \"!=\", true]])\n }\n `;\n const result = await fetchAPI('/graphql', {\n method: 'POST',\n body: JSON.stringify({ query })\n })\n\n return result.data\n}\n\nexport const markReadAll = async ()=>{\n return await fetchAPI('/api/v4/notifications/all/markReadAll', {\n method: 'POST'\n });\n}","/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-09-13 14:34:18\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-09-13 14:59:00\n * @Description: 加载资产包,并返回所有可用资产\n */\nimport { isString, filter, map } from 'lodash';\n\nexport const registerRemoteAssets = async (assetUrls)=>{\n if(assetUrls && assetUrls.length > 0){\n let assetUrlsArray = assetUrls;\n if(isString(assetUrlsArray)){\n assetUrlsArray = assetUrlsArray.split(',');\n }\n await Builder.registerRemoteAssets(assetUrlsArray);\n const amisComps = filter(Builder.registry['meta-components'], function(item){ return item.componentName && item.amis?.render});\n return map(amisComps, (item)=>{\n return { componentType: item.componentType, componentName: item.componentName, ...item.amis.render}\n })\n }else{\n return []\n }\n}"],"names":["RegisterRenders","normalizeLink","to","location","window","pathname","search","idx","indexOf","idx2","let","substring","undefined","hash","test","m","paths","split","pop","exec","length","concat","join","getEvn","theme","notify","type","msg","props","schema","tpl","SteedosUI","message","console","warn","confirm","Promise","resolve","reject","Modal","title","onOk","okText","cancelText","jumpTo","action","history","back","actionType","blank","router","push","open","target","replace","registerRenders","isEmpty","assets","isArray","amisLib","amisRequire","registerMap","renderer","Renderer","formitem","FormItem","options","OptionsControl","amisReact","each","find","componentName","asset","Component","Builder","components","item","name","AmisWrapper","class","componentType","body","render","setSchema","useState","useEffect","result","then","data","createElement","Fragment","usage","RegExp","weight","autoVar","info","component","framework","error","consoleTag","STEEDOS_AUTH","getBuilderContext","settings","context","async","fetchAPI","api","credentials","headers","Content-Type","AUTHORIZATION","getAuthorization","res","Object","assign","await","fetch","getRootUrl","status","Error","json","errors","getTenantId","spaceId","tenantId","searchParams","URLSearchParams","get","getAuthToken","token","authToken","getUserId","userId","defaultRootUrl","rootUrl","localStorage","getItem","getSteedosAuth","cloneDeep","getFieldsTemplate","fields","expand","fieldsName","displayFields","fieldsArr","field","_","values","alias","includes","uniq","getRecordPermissionsTemplate","getFindOneQuery","object","recordId","queryOptions","idFieldName","filters","query","getSaveDataTpl","scripts","forEach","readonly","imgFieldsKeys","imgFields","multiple","JSON","stringify","fileFieldsKeys","fileFields","getFindQuery","limit","treeFields","enable_tree","keys","cfsFields","orderBy","orderDir","pageNo","pageSize","getApi","isMobile","Router","getAppPath","appId","getPagePath","getObjectListViewPath","objectName","listViewName","getObjectDetailPath","getObjectRelatedViewPath","masterObjectName","masterRecordId","foreignKey","getNumberTpl","getDateTpl","getDateTimeTpl","getSelectTpl","getNameTplUrl","ctx","formFactor","getRelatedFieldTpl","reference_to","optionsFunction","_optionsFunction","href","onlyDisplayLabel","isString","labelTpl","getLookupTpl","NAME_FIELD_KEY","getUISchema","getSwitchTpl","getPasswordTpl","getFieldTpl","is_name","labelFieldName","API_CACHE","getReadonlyFormInitApi","method","url","graphql.getApi","Date","getTime","cache","adaptor","scriptStr","selectFields","filter","OMIT_FIELDS","toString","getScriptForAddUrlPrefixForImgFields","getScriptForRewriteValueForFileFields","graphql.getFindOneQuery","Authorization","getSaveApi","$","modalName","requestAdaptor","responseData","getFieldSchemaArray","fieldSchemaArray","lodash","mergedSchema","fieldName","has","sortBy","group","isObjectField","is_wide","hidden","permission","allowEdit","getSection","permissionFields","sectionName","sectionFields","amisField","fieldSetBody","perField","Fields.getGridFieldSubFields","Fields.getObjectFieldSubFields","__permissionFields","Fields.convertSFieldToAmisField","sectionFieldsVisibleOn","map","compact","visibleOn","section","collapsable","getSections","sections","key","groupBy","getFormBody","objectConfig","getListBody","columns","Tpl.getFieldTpl","extra","label","sortable","width","toggled","getDefaultParams","perPage","top","isExpression","func","reg1","reg2","match","parseSingleExpression","formData","dataPath","global","userSession","funcBody","parentPath","getParentPath","parent","getValueByPath","str","globalTag","Function","_error","log","defaultsDeep","args","output","toArray","reverse","mergeWith","objectValue","sourceValue","path","pathArr","config","listView","newRecordMode","editRecordMode","getPage","pageId","page","StandardButtons","getStandardNew","uiSchema","amis_schema","formSchema","objectApiName","id","mode","layout","level","onEvent","click","actions","dialog","$master","&","listViewId","bodyClassName","parse","closeOnEsc","closeOnOutside","showCloseButton","size","regions","className","getStandardEdit","getStandardDelete","confirmText","messages","success","failed","componentId","expression","getStandardDeleteMany","todo","this","scopeId","listViewRef","scope","getRef","getComponentById","store","toJSON","selectedItems","handleAction","toast","items","position","handleBulkAction","bulkActions","getStandardImportData","object_name","persistData","promptPageLeave","debug","submitText","dataType","initFetch","required","joinValues","extractValue","autoComplete","$term","$value","rfield","labelClassName","clearValueOnHidden","labelField","valueField","modalMode","source","$self","pickerSchema","draggable","headerToolbar","defaultParams","placeholder","html","syncLocation","keepItemSelectionOnPageChange","checkOnItemClick","autoFillHeight","useChunk","receiver","panelClassName","submitSucc","eventData","closeDialogOnSubmit","getStandardOpenView","getButtonVisibleOn","button","visible","_visible","isBoolean","trim","startsWith","amisSchema","standardButtonsTodo","standard_delete_many","getButtons","disabledButtons","permissions","disabled_actions","buttons","include","allow_customActions","exclude_actions","on","getListViewButtons","getObjectDetailButtons","detailButtons","getObjectDetailMoreButtons","moreButtons","getListViewItemButtons","getObjectRelatedListButtons","execute","eval","fun","isFunction","todoThis","record","record_id","apply","executeButton","getObjectListHeaderFirstLine","objectSchema","icon","listViewButtonOptions","list_views","link","amisButtonsSchema","reg","md","columnClassName","valign","inline","wrapperComponent","rightIcon","hideCaret","btnClassName","getObjectListHeaderFieldsFilterBar","searchableFields","getObjectFieldsFilterBarSchema","getObjectListHeader","getObjectRecordDetailHeader","showRecordTitle","dropdownButtons","standardIcon","gridBody","hiddenOn","_id","recordPermissions","getObjectRecordDetailRelatedListHeader","relatedObjectSchema","relatedLabel","getObjectHeaderToolbar","mainObject","align","script","getObjectFooterToolbar","getObjectFilter","wrapWithPanel","getBulkActions","ids","getObjectList","nonpaged","paging","enabled","bodyProps","toolbar","headerToolbarClassName","footerToolbar","filterVisible","table","getTableSchema","primaryField","affixHeader","getTableApi","tableHiddenOn","defaults","listSchema","headerSchema","footerSchema","wrappedBody","union","unshift","loaded","getGlobalData","user","getObjectForm","labelAlign","sendOn","initApi","value","$count","AmisFormInputs","getAmisStaticFieldType","getAmisFieldType","steedosField","getAmisFileReadonlySchema","amisFieldType","defaultImage","enlargeAble","showToolbar","getAmisFileEditSchema","tableName","convertData","getAmisFileSchema","getMobileTableColumns","nameField","tpls","Tpl.getNameTplUrl","columnLines","lines","lineChildren","isNewLine","isLeft","lineChildrenClassName","lineClassName","innerClassName","getTableOperation","operationButtons","fixed","placement","overlayClassName","trigger","onOpenApi","disabled","previewFileScript","columnsTogglable","globalFilter","filtersFunction","sort","setDataToComponentId","baseFilters","operation","searchable","key_field","graphql.getFindQuery","getRecordPermissionsApi","recordPermissionsTemplate","refUsersObjectName","refOrgsObjectName","getRefListViewSort","refObject","view","getListViewSort","getSelectUserSchema","Field.getAmisStaticFieldType","Tpl.getLookupTpl","refUsersObjectConfig","refOrgsObjectConfig","usersSort","orgsSort","selectMode","leftMode","clearable","childrenData","defaultValueOptionsData","fieldNamePrefix","__selectUserLoaded__","deferApi","searchApi","defaultValue","onChangeEvent","change","getReferenceTo","referenceTo","reference_to_field","refObjectConfig","valueFieldName","lookupToAmisPicker","tableFields","i","column","isObject","wrap","field_name","f","tableField","depend_on","fName","_filtersFunction","listItem","tabId","Table.getTableSchema","filterLoopCount","isLookup","listName","lookupToAmisSelect","apiInfo","lookupToAmis","Tpl.getRelatedFieldTpl","lookupToAmisSelectUser","enable_enhanced_lookup","getObjectFieldSubFields","mainField","newMainField","subFields","_prefix","getGridFieldSubFields","getSelectFieldOptions","data_type","Number","String","convertSFieldToAmisField","showSystemFields","baseData","labelRemark","inlineHelpText","linkify","breaks","language","Tpl.getSelectTpl","Tpl.getSwitchTpl","inputFormat","format","Tpl.getDateTpl","Tpl.getDateTimeTpl","utc","timeFormat","Tpl.getNumberTpl","min","max","precision","scale","showInput","Tpl.getPasswordTpl","File.getAmisFileSchema","showIndex","strictMode","editable","addable","removable","subField","subFieldName","gridSub","quickEdit","visible_on","getFieldSearchable","_field","calssName","sField","getObjectFieldsFilterButtonSchema","eventName","getObjectFieldsFilterFormSchema","omit","enableSearchableFieldsVisibleOn","fieldItem","initData","filterFormSchema","dataProvider","inited","checkAll","DEFAULT_CALENDAR_OPTIONS","startDateExpr","endDateExpr","allDayExpr","textExpr","getObjectCalendar","calendarOptions","titleFields","omitBy","isNil","initialView","n","sortField","sortOrder","currentView","recordPermissionsApi","onGetEventsScript","onSelectScript","recordSaveApi","nameFieldKey","apiData","businessHours","daysOfWeek","startTime","endTime","startDayHour","endDayHour","selectable","allowCreate","selectMirror","getEvents","select","eventClick","eventAdd","eventChange","msgType","eventRemove","eventsSet","queryFields","queryOptionsArray","getRecord","UI_SCHEMA_CACHE","UISchemaFunction","setUISchemaCache","getUISchemaCache","hasUISchemaCache","getListViewColumns","listViewColumns","mobile_columns","slice","index","sortStr","order","getListViewFilter","filter_scope","force","v","k","all","getField","getFormSchema","getListSchema","appName","enable_amis_schema","isCustomAmisSchema","listviewFilter","listview_filters","_filters","isCalendar","showHeader","listViewPropsStoreKey","localListViewProps","ex","extraColumns","extra_columns","getRelatedFieldValue","foreign_key","relatedField","o","getAmisObjectRelatedList","related","relatedLists","related_lists","detail","details","relatedSchema","relatedAmisSchema","arr","relatedUiSchema","refField","_reference_to","recordRelatedListHeader","relatedKey","defaultData","relatedList","related_field_fullname","field_names","PUBLIC_ENV","getSpaceUsersPickerAmisSchema","spaceUserSchema","DATE_DATETIME_BETWEEN_VALUES","opMaps","equal","not_equal","less","less_or_equal","greater","greater_or_equal","between","not_between","is_empty","is_not_empty","select_equals","select_not_equals","select_any_in","select_not_any_in","like","not_like","starts_with","ends_with","isGroup","conditionGroupToFilters","conjunction","children","conditionItemToFilters","array","left","op","right","filterToConditionItem","findKey","filterObjectToArray","filtersToConditionGroup","conditions","getSelectOptions","foo","getTdInputTpl","code","is_textarea","validations","isEmail","isUrl","showCounter","formula","substr","is_multiselect","copyable","sfields","getTds","tds","tdFields","fieldsCount","colspan","background","style","marginTop","paddingTop","paddingRight","paddingBottom","paddingLeft","marginRight","marginBottom","marginLeft","getFormTrs","trsSchema","trs","form","keyToPath","string","charCodeAt","quote","subString","__assign","t","s","arguments","p","prototype","hasOwnProperty","call","cloneObject","persistOwnProps","obj","__super","create","writable","enumerable","typename","Array","root","env","amis","embed","e","nodeName","toLocaleLowerCase","preventDefault","superProps","properties","isFrozen","parts","last","key_2","shift","isPlainObject","src","buttonName","hasImportTemplates","now","steedosAuth","fileId","beijing","tianjing","fontFamily","fontSize","textAlign","pullRefresh","auth","amisListViewId","relatedFieldName","masterObjectUISchema","relatedObjectName","hiddenEmptyTable","relatedObjectUiSchema","firstListViewName","relatedValue","masterRecord","app_id","recordLoaded","tabs","contentBody","linksClassName","relatedListSchema","relateds","relatedQuery","relate","formInitProps","fetchInited","assetUrls","assetUrlsArray","registerRemoteAssets","amisComps","registry","endsWith","setItem","steedosSession","convertKeyToPath","key_1"],"mappings":"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"}
|