@steedos-widgets/amis-lib 0.0.1 → 0.0.2
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/amis-lib.umd.js +3 -3
- package/dist/amis-lib.umd.min.js +3 -3
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/index.cjs.js +2 -2
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +2 -2
- package/dist/index.esm.js.map +1 -1
- package/dist/types/lib/objects.d.ts +1 -1
- package/package.json +1 -1
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/lib/steedos.client.js","../src/lib/converter/amis/graphql.js","../src/lib/router.jsx","../src/lib/converter/amis/tpl.js","../src/config/index.js","../src/lib/converter/amis/fields/table.js","../src/lib/converter/amis/fields/list.js","../src/lib/converter/amis/fields/lookup.js","../src/lib/converter/amis/fields/index.js","../src/lib/converter/amis/api.js","../src/lib/converter/amis/fields/sections.js","../src/lib/converter/amis/form.js","../src/lib/converter/amis/index.js","../src/lib/record.js","../src/lib/objects.js","../src/lib/apps.js","../src/lib/expression.js","../src/lib/buttons.js","../src/lib/notification.js","../src/lib/page.js","../src/lib/public.env.js"],"sourcesContent":["/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-07-04 11:24:28\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-09-01 16:00:48\n * @Description: \n */\nimport { endsWith, isEmpty, cloneDeep } from \"lodash\";\n\nconst STEEDOS_AUTH = {};\n\nconst getBuilderContext = ()=>{\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\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 const 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 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 { 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') && field.reference_to){\n const refUiSchema = await getUISchema(field.reference_to);\n const NAME_FIELD_KEY = refUiSchema.NAME_FIELD_KEY || 'name';\n fieldsName.push(`${field.name}:${field.name}__expand{_id,${NAME_FIELD_KEY}${field.reference_to_field ? `,${field.reference_to_field}`:''}}`);\n }else{\n fieldsName.push( field.alias ? `${field.alias}:${field.name}` : field.name)\n }\n\n if(field.type === 'date' || field.type == 'datetime' || field.type == 'boolean'){\n fieldsName.push(`${field.name}`)\n }\n\n if(field.type === 'date' || field.type == 'datetime' || field.type == 'boolean' || field.type == 'select' || field.type == 'file'){\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{${displayFields.join(',')}}`;\n }\n return `${fieldsName.join(' ')}`\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)}}}`\n }\n}\n\nexport function getSaveQuery(object, recordId, fields, options){\n return {\n objectName: \"${objectName}\",\n $: \"$$\",\n recordId: \"${recordId}\",\n modalName: \"${modalName}\"\n }\n}\n\n/*\n img字段值移除URL前缀使其保存时正常保存id,而不是url。\n*/\nexport function getScriptForRemoveUrlPrefixForImgFields(fields){\n let imgFieldsKeys = [];\n let imgFields = {};\n fields.forEach((item)=>{\n if(item.type === 'image'){\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 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 ${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 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 return {\n orderBy: \"${orderBy}\",\n orderDir: \"${orderDir}\",\n pageNo: \"${page}\",\n pageSize: \"${perPage}\",\n query: `{${alias}:${object.name}${queryOptions}{${await getFieldsTemplate(fields, options.expand)}},count:${object.name}__count(filters:{__filters})}`\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-08-16 17:29:37\n * @Description:\n */\n\n\nexport const Router = {\n getAppPath({formFactor, appId}){\n return `/${formFactor === 'SMALL' ? 'mapp': 'app'}/${appId}`;\n },\n getPagePath(){\n //TODO\n },\n getObjectListViewPath({formFactor, appId, objectName, listViewName}){\n return `/${formFactor === 'SMALL' ? 'mapp': 'app'}/${appId}/${objectName}/grid/${listViewName}`;\n },\n getObjectDetailPath({formFactor, appId, objectName, recordId}){\n return `/${formFactor === 'SMALL' ? 'mapp': 'app'}/${appId}/${objectName}/view/${recordId}`;\n },\n getObjectRelatedViewPath({formFactor, appId, masterObjectName, masterRecordId, objectName, foreignKey}){\n return `/${formFactor === 'SMALL' ? 'mapp': '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-09-02 10:43:04\n * @Description: \n */\nimport { Router } from '../../router'\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}'>\\${created_by.name}</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}'>\\${modified_by.name}</a>\\${_display.modified}</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\n//TODO 处理name字段\nexport function getRefObjectNameFieldName(field){\n // const refObject = objectql.getObject(field.reference_to);\n // return refObject.NAME_FIELD_KEY;\n return 'name';\n}\n\nexport function getSelectTpl(field){\n return `<div>\\${_display.${field.name}}</div>`\n}\n\nexport function getNameTpl(field, ctx){\n if(ctx.objectName === 'cms_files'){\n return `<a href=\"\\${context.rootUrl}/api/files/files/\\${versions[0]}?download=true\">\\${${field.name}}</a>`\n }\n const href = Router.getObjectDetailPath({\n formFactor: ctx.formFactor, appId: ctx.appId, objectName: ctx.tabId, recordId: `\\${${ctx.idFieldName}}`\n })\n return `<a href=\"${href}\">\\${${field.name}}</a>`\n}\n\nexport function getLookupTpl(field, ctx){\n if(!field.reference_to){\n return getSelectTpl(field)\n }\n const NAME_FIELD_KEY = 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 class=\"slds-assistive-text\"><%=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 function getFieldTpl (field, options){\n if(field.is_name || field.name === options.labelFieldName){\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 'select':\n return getSelectTpl(field);\n case 'date':\n return getDateTpl(field);\n case 'datetime':\n return getDateTimeTpl(field);\n case 'lookup':\n return getLookupTpl(field, options);\n case 'master_detail':\n return getLookupTpl(field, options);\n default:\n break;\n }\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}","import * as _ from 'lodash'\nimport * as Tpl from '../tpl';\nimport * as Fields from '../index';\nimport * as graphql from '../graphql';\nimport config from '../../../../config'\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\nfunction getTableColumns(fields, options){\n const columns = [{name: '_index',type: 'text', width: 32, placeholder: \"\"}];\n _.each(fields, function(field){\n if((field.is_name || field.name === options.labelFieldName) && options.objectName === 'cms_files'){\n columns.push({\n \"type\": \"button\",\n \"label\": `\\${${field.name}}`,\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{\n const tpl = 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 });\n\n // columns.push(getOperation(fields));\n\n return columns;\n}\n\nfunction getDefaultParams(options){\n return {\n perPage: options.top || config.listView.perPage\n }\n}\n\nexport function getTableSchema(fields, options){\n if(!options){\n options = {};\n }\n return {\n mode: \"table\",\n name: \"thelist\",\n draggable: false,\n headerToolbar: [ 'reload'],\n defaultParams: getDefaultParams(options),\n columns: getTableColumns(fields, options),\n syncLocation: false,\n keepItemSelectionOnPageChange: true,\n checkOnItemClick: false,\n labelTpl: `\\${${options.labelFieldName}}`,\n autoFillHeight: false, // 自动高度效果不理想,先关闭\n }\n}\n\nexport async function getTableApi(mainObject, fields, options){\n const searchableFields = [];\n let { globalFilter, filter } = 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\n _.each(fields,function(field){\n if(field.searchable){\n searchableFields.push(field.name);\n }\n })\n let valueField = mainObject.key_field || '_id';\n const api = await getApi(mainObject, null, fields, {alias: 'rows', 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.requestAdaptor = `\n const 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 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 = ${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\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 searchableFilter = filters;\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 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 return api;\n `\n api.adaptor = `\n _.each(payload.data.rows, function(item, index){\n item._index = index + 1;\n })\n window.postMessage(Object.assign({type: \"listview.loaded\"}), \"*\")\n return payload;\n `;\n return api;\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 * @Author: baozhoutao@steedos.com\n * @Date: 2022-07-23 09:12:14\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-09-02 10:46:48\n * @Description: \n */\n\nimport * as Tpl from '../tpl';\nimport { Router } from '../../../router'\n\nfunction getListBody(fields, options){\n const columns = [];\n _.each(fields, function(field){\n\n const tpl = 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 || 10\n }\n}\n\nexport function getListSchema(fields, options){\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: [...(getListBody(fields, options).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 recordId: `\\${_id}`\n })\n }\n ]\n }\n }\n}\n\n\nexport 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 = Tpl.getFieldTpl(titleField, options)\n }\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\": [...(getListBody(_.filter(fields, (f)=>{\n return f.name != options.labelFieldName\n }), options).columns)]\n }\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';\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 }\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\t_.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 _.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 const source = await getApi({\n name: referenceTo.objectName\n }, null, fields, {expand: true, alias: 'rows', queryOptions: `filters: {__filters}, top: {__top}, skip: {__skip}, sort: \"{__sort}\"`});\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 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 = [[\"${referenceTo.valueField.name}\", \"=\", 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 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 = List.getListSchema(tableFields, {\n top: top,\n ...ctx,\n actions: false\n })\n }else{\n pickerSchema = Table.getTableSchema(tableFields, {\n top: top,\n ...ctx\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 = 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}`})\n }else{\n apiInfo = {\n method: \"post\",\n url: graphql.getApi(),\n data: {query: '{objects(filters: [\"_id\", \"=\", \"-1\"]){_id}}', $: \"$$\"}\n }\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 = '[\"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 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 autoComplete: apiInfo,\n }\n if(_.has(field, 'defaultValue') && !(_.isString(field.defaultValue) && field.defaultValue.startsWith(\"{\"))){\n data.value = field.defaultValue\n }\n if(field.multiple){\n data.multiple = true\n data.extractValue = true\n }\n\n if(readonly){\n data.tpl = Tpl.getLookupTpl(field, ctx)\n }\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 let referenceTo = await getReferenceTo(field);\n if(!referenceTo){\n return await lookupToAmisSelect(field, readonly, ctx);\n }\n const refObject = await getUISchema(referenceTo.objectName);\n\n // 此处不参考 steedos 的 enable_enhanced_lookup 规则. 如果默认是开启弹出选择,用户选择过程操作太繁琐, 所以默认是关闭弹出选择.\n if(refObject.enable_enhanced_lookup == true){\n return await lookupToAmisPicker(field, readonly, ctx);\n }else{\n return await lookupToAmisSelect(field, readonly, ctx);\n }\n}","import { cloneDeep, includes } from 'lodash';\nimport { lookupToAmis } from './lookup';\nimport { absoluteUrl } from '../../../steedos.client.js'\nimport * as Fields from '../fields';\nimport * as Tpl from '../tpl';\nimport * as _ from 'lodash'\nexport const OMIT_FIELDS = ['created', 'created_by', 'modified', 'modified_by'];\n// const Lookup = require('./lookup');\nconst AmisFormInputs = [\n 'text',\n 'date',\n 'file',\n 'image',\n 'datetime',\n 'time',\n 'number',\n 'currency',\n 'percent',\n 'password',\n 'url',\n 'email'\n]\n\nexport function getBaseFields(readonly){\n let calssName = 'm-1';\n if(readonly){\n calssName = `${calssName} slds-form-element_readonly`\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\nexport function getAmisStaticFieldType(type, readonly){\n if(!readonly){\n if(_.includes(AmisFormInputs, type)){\n return `input-${type}`;\n }\n return type;\n }\n if(_.includes(['text'], type)){\n return `static-${type}`;\n }else{\n return 'static';\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 '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 break;\n case 'html':\n convertData = {\n type: \"editor\",\n language: \"html\",\n value: field.defaultValue || ''\n }\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 if(_.has(field, 'defaultValue') && !(_.isString(field.defaultValue) && field.defaultValue.startsWith(\"{\"))){\n const dataType = field.data_type || 'text';\n if(field.defaultValue != null){\n if(dataType === 'text'){\n convertData.value = String(field.defaultValue);\n }else if(dataType === 'number'){\n convertData.value = Number(field.defaultValue);\n }else if(dataType === 'boolean'){\n convertData.value = field.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 }\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.SSS[Z]',\n tpl: readonly ? Tpl.getDateTimeTpl(field) : null,\n utc: true\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.SSS[Z]',\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:'1970-01-01THH:mm:00.000[Z]',\n format:'1970-01-01THH:mm:00.000[Z]',\n tpl: readonly ? Tpl.getDateTimeTpl(field) : null,\n // utc: true\n }\n break;\n case 'time':\n convertData = {\n type: getAmisStaticFieldType('time', readonly),\n inputFormat: 'HH:mm',\n timeFormat:'1970-01-01THH:mm:00.000[Z]',\n format:'1970-01-01THH:mm:00.000[Z]',\n tpl: readonly ? Tpl.getDateTimeTpl(field) : null,\n // utc: true\n }\n break;\n case 'number':\n convertData = {\n type: getAmisStaticFieldType('number', readonly),\n min: field.min,\n max: field.max,\n precision: field.scale\n }\n break;\n case 'currency':\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 '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 //TODO\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 'image':\n rootUrl = absoluteUrl('/api/files/images/');\n convertData = {\n type: getAmisStaticFieldType('image', readonly),\n receiver: {\n method: \"post\",\n url: \"${context.rootUrl}/s3/images\",\n adaptor: `\nvar rootUrl = ${JSON.stringify(rootUrl)};\npayload = {\n status: response.status == 200 ? 0 : response.status,\n msg: response.statusText,\n data: {\n value: payload._id,\n filename: payload.original.name,\n url: rootUrl + payload._id,\n }\n}\nreturn payload;\n `,\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n }\n if(field.multiple){\n convertData.multiple = true;\n convertData.joinValues = false;\n convertData.extractValue = true;\n }\n break;\n case 'file':\n rootUrl = absoluteUrl('/api/files/files/');\n convertData = {\n type: getAmisStaticFieldType('file', readonly),\n receiver: {\n method: \"post\",\n url: \"${context.rootUrl}/s3/files\",\n adaptor: `\nvar rootUrl = ${JSON.stringify(rootUrl)};\npayload = {\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}\nreturn payload;\n `,\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n }\n if(field.multiple){\n convertData.multiple = true;\n convertData.joinValues = false;\n convertData.extractValue = true;\n }\n break;\n case 'formula':\n //TODO\n break;\n case 'summary':\n //TODO\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 }\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 _.each(field.subFields, function(subField){\n const subFieldName = subField.name.replace(`${field.name}.$.`, '').replace(`${field.name}.`, '');\n const gridSub = convertSFieldToAmisField(Object.assign({}, subField, {name: subFieldName}), readonly);\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){\n convertData.className = 'col-span-2 m-1';\n }else{\n convertData.className = 'm-1';\n }\n if(readonly){\n convertData.className = `${convertData.className} slds-form-element_readonly`\n }\n convertData.labelClassName = 'text-left';\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 }\n\n return Object.assign({}, baseData, convertData);\n }\n \n}\n\nexport async function getFieldSearchable(perField, permissionFields, ctx){\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 const amisField = await Fields.convertSFieldToAmisField(_field, false, Object.assign({}, ctx, {fieldNamePrefix: fieldNamePrefix, required: false, showSystemFields: true}));\n if(amisField){\n return amisField;\n }\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 }\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 ${scriptStr}\n payload.data = data;\n window.postMessage(Object.assign({type: \"record.loaded\"}, {record: data}), \"*\")\n }\n return payload;\n`\n}\n\nexport async function getReadonlyFormInitApi(object, recordId, fields){\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),\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字段值添加URL前缀使其在amis中正常显示图片。\n*/\nfunction getScriptForAddUrlPrefixForImgFields(fields){\n let imgFieldsKeys = [];\n let imgFields = {};\n let rootUrl = absoluteUrl('/api/files/images/');\n fields.forEach((item)=>{\n if(item.type === 'image'){\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 // image字段值添加URL前缀\n let imgFieldsKeys = ${JSON.stringify(imgFieldsKeys)};\n let imgFields = ${JSON.stringify(imgFields)};\n let rootUrl = ${JSON.stringify(rootUrl)};\n imgFieldsKeys.forEach((item)=>{\n let imgFieldValue = data[item];\n if(imgFieldValue && imgFieldValue.length){\n if(imgFields[item].multiple){\n if(imgFieldValue instanceof Array){\n data[item] = imgFieldValue.map((value)=>{ return rootUrl + value});\n }\n }else{\n data[item] = rootUrl + imgFieldValue;\n }\n }\n })\n `\n}\n\n/*\n file字段值重写使其在amis中正常显示附件名、点击附件名下载文件。\n*/\nfunction getScriptForRewriteValueForFileFields(fields){\n let fileFieldsKeys = [];\n let fileFields = {};\n let fileRootUrl = absoluteUrl('/api/files/files/');\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 let fileRootUrl = ${JSON.stringify(fileRootUrl)};\n fileFieldsKeys.forEach((item)=>{\n let fileFieldValue = data[item];\n if(fileFieldValue && fileFieldValue.length){\n const fileFieldNames = data._display[item].split(',');\n if(fileFields[item].multiple){\n if(fileFieldValue instanceof Array){\n data[item] = fileFieldValue.map((value, index)=>{ \n return {\n value: value,\n name: fileFieldNames[index],\n url: fileRootUrl + value + \"?download=true\",\n state: \"uploaded\"\n }\n });\n }\n }else{\n data[item] = {\n value: fileFieldValue,\n name: fileFieldNames[0],\n url: fileRootUrl + fileFieldValue + \"?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 ${getConvertDataScriptStr(fields)}\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 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: 2022-09-01 11:25:18\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\n const section = {\n \"type\": \"fieldSet\",\n \"title\": sectionName,\n \"collapsable\": true,\n \"body\": fieldSetBody,\n }\n // if(sectionFieldsVisibleOn.length > 0){\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}","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';\n\nfunction getBulkActions(objectSchema){\n return [\n {\n \"type\": \"button\",\n \"level\": \"danger\",\n \"label\": \"批量删除\",\n \"actionType\": \"ajax\",\n \"confirmText\": \"确定要删除吗\",\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 \n const bulkActions = getBulkActions(objectSchema)\n\n const bodyProps = {\n toolbar: getToolbar(), \n footerToolbar: footerToolbar(), \n headerToolbar: getHeaderToolbar(objectSchema, options.formFactor),\n bulkActions: bulkActions, \n bodyClassName: \"\",\n // filterTogglable: true,\n // filterDefaultVisible: true,\n // filter: getFilter()\n }\n\n let body = null;\n const id = `listview_${objectSchema.name}`;\n if(options.formFactor === 'SMALL'){\n delete bodyProps.bulkActions;\n delete bodyProps.headerToolbar;\n delete bodyProps.footerToolbar;\n body = Object.assign({}, getCardSchema(fields, Object.assign({idFieldName: objectSchema.idFieldName, labelFieldName: objectSchema.NAME_FIELD_KEY || 'name'}, options, {actions: false})), {\n type: 'crud', \n primaryField: '_id', \n id: id,\n name: id,\n keepItemSelectionOnPageChange: false, \n api: await getTableApi(objectSchema, fields, options)}, \n bodyProps\n );\n }else{\n const table = 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 id: id,\n name: id,\n keepItemSelectionOnPageChange: true, \n api: await getTableApi(objectSchema, fields, options)}, \n bodyProps\n )\n }\n\n return {\n type: 'service',\n bodyClassName: '',\n name: `page`,\n data: {context: {rootUrl: getRootUrl(), tenantId: getTenantId(), authToken: getAuthToken()}},\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, tabId, appId } = ctx;\n const fields = _.values(objectSchema.fields);\n return {\n type: 'page',\n bodyClassName: 'p-0',\n regions: [\n \"body\"\n ],\n name: `page_edit_${recordId}`,\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: [\n {\n type: \"form\",\n mode: ctx.formFactor === 'SMALL' ? 'normal' : 'horizontal',\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 initApi: await getEditFormInitApi(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: 'p-4 sm:p-0 steedos-amis-form',\n }\n ]\n }\n}\n\nexport async function getObjectDetail(objectSchema, recordId, 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),\n body: [\n {\n type: \"form\",\n mode: ctx.formFactor === 'SMALL' ? 'normal' : 'horizontal',\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;}), objectSchema, ctx),\n className: 'steedos-amis-form',\n actions: [] // 不显示表单默认的提交按钮\n }\n ]\n }\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: 2022-09-03 10:46:31\n * @Description:\n */\nimport { fetchAPI } from \"./steedos.client\";\nimport {\n getObjectList,\n getObjectDetail,\n getObjectForm,\n} from \"./converter/amis/index\";\nimport _ , { slice, isEmpty, each, has } from \"lodash\";\nimport { getFieldSearchable } from \"./converter/amis/fields/index\";\nimport { getRecord } from './record';\n\nconst UI_SCHEMA_CACHE = {};\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\nconst 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 async function getUISchema(objectName, force) {\n if (!objectName) {\n return;\n }\n if (hasUISchemaCache(objectName) && !force) {\n return getUISchemaCache(objectName);\n }\n const url = `/service/api/@${objectName.replace(/\\./g, \"_\")}/uiSchema`;\n let uiSchema = null;\n try {\n uiSchema = await fetchAPI(url, { method: \"get\" });\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 const refUiSchema = await getUISchema(field.reference_to);\n if (!refUiSchema) {\n delete uiSchema.fields[fieldName];\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 options = {}\n) {\n const uiSchema = await getUISchema(objectName);\n const listView = _.find(\n uiSchema.list_views,\n (listView, name) => name === listViewName\n );\n\n if (!listView) {\n return { uiSchema };\n }\n let fields = uiSchema.fields;\n const listViewFields = [];\n\n let listViewColumns = getListViewColumns(listView, options.formFactor);\n\n if (listView && listViewColumns) {\n _.each(listViewColumns, function (column) {\n if (_.isString(column) && uiSchema.fields[column]) {\n listViewFields.push(uiSchema.fields[column]);\n } else if (_.isObject(column) && uiSchema.fields[column.field]) {\n listViewFields.push(\n Object.assign({}, uiSchema.fields[column.field], {\n width: column.width,\n wrap: column.wrap,\n })\n );\n }\n });\n }\n\n if (listView && listView.extra_columns) {\n _.each(listView.extra_columns, function (column) {\n if (_.isString(column)) {\n listViewFields.push({ extra: true, name: column });\n } else if (_.isObject(column)) {\n listViewFields.push({ extra: true, name: column.field });\n }\n });\n }\n\n fields = listViewFields;\n const amisSchema = await getObjectList(uiSchema, fields, {\n tabId: objectName,\n appId: appName,\n objectName: objectName,\n ...options,\n filter: listView.filters,\n });\n\n return {\n uiSchema,\n amisSchema,\n };\n}\n\n// 获取所有相关表\nexport async function getObjectRelateds(\n appName,\n objectName,\n recordId,\n formFactor\n) {\n const uiSchema = await getUISchema(objectName);\n\n const related = [];\n\n const details = [].concat(uiSchema.details || []);\n\n if (uiSchema.enable_files) {\n details.push(`cms_files.parent`);\n }\n\n for (const detail of details) {\n const arr = detail.split(\".\");\n\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 }),\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, formFactor);\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(fields) {\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, {});\n if (amisField) {\n amisField.className = \"min-w-[200px] pr-4 max-w-[350px] grow\";\n body.push(amisField);\n }\n }\n }\n return {\n title: \"\",\n type: \"form\",\n name: \"listview-filter-form\",\n mode: \"normal\",\n wrapWithPanel: false,\n className: \"flex flex-row w-full flex-wrap mb-3\",\n body: body,\n };\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 * as _ 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};","import _ from \"lodash\";\nimport { isExpression, parseSingleExpression } from \"./expression\";\nimport { getApi } from './converter/amis/graphql';\nimport config from \"../config\";\n\nconst getGlobalData = () => {\n return {\n now: new Date(),\n };\n};\n\nconst isVisible = (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// TODO\nexport const standardButtonsTodo = {\n standard_new: (event, props) => {\n const {\n appId,\n listViewId,\n uiSchema,\n formFactor,\n data,\n router,\n options = {},\n } = props;\n // router.push('/app/'+props.data.app_id+'/'+props.data.objectName+'/view/new');\n const type = config.listView.newRecordMode;\n SteedosUI?.Object.newRecord({\n onSubmitted: () => {\n SteedosUI.getRef(listViewId)\n .getComponentByName(`page.listview_${uiSchema.name}`)\n .handleAction({}, { actionType: \"reload\" });\n },\n onCancel: () => {\n SteedosUI.getRef(listViewId)\n .getComponentByName(`page.listview_${uiSchema.name}`)\n .handleAction({}, { actionType: \"reload\" });\n },\n appId: appId,\n formFactor: formFactor,\n name: SteedosUI.getRefId({ type: `${type}-form` }),\n title: `新建 ${uiSchema.label}`,\n objectName: uiSchema.name,\n data: data,\n recordId: \"new\",\n type,\n options: options,\n router,\n });\n },\n standard_edit: (event, props) => {\n const type = config.listView.newRecordMode;\n const {\n appId,\n recordId,\n uiSchema,\n formFactor,\n router,\n options = {},\n } = props;\n SteedosUI?.Object.editRecord({\n appId: appId,\n name: SteedosUI.getRefId({ type: `${type}-form` }),\n title: `编辑 ${uiSchema.label}`,\n objectName: uiSchema.name,\n recordId: recordId,\n type,\n options: options,\n router,\n formFactor: formFactor,\n onSubmitted: () => {\n SteedosUI.getRef(\n SteedosUI.getRefId({\n type: \"detail\",\n appId: appId,\n name: uiSchema.name,\n })\n )\n .getComponentById(`detail_${recordId}`)\n .reload();\n },\n });\n },\n standard_delete: (event, props) => { },\n standard_delete_many: (event, props)=>{\n const {\n listViewId,\n uiSchema,\n } = props;\n const listViewRef = SteedosUI?.getRef(listViewId).getComponentByName(`page.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// TODO\nconst standardButtonsVisible = {\n standard_newVisible: (props) => { },\n};\n\nexport const getButtons = (uiSchema, ctx) => {\n const disabledButtons = 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 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;\n });\n};\n\nexport const getListViewButtons = (uiSchema, ctx) => {\n const buttons = getButtons(uiSchema, ctx);\n const listButtons = _.filter(buttons, (button) => {\n if (button.on == \"list\") {\n return isVisible(button, ctx);\n }\n return false;\n });\n // 如果是standard_new 且 _visible 中调用了 Steedos 函数, 则自动添加标准的新建功能\n const standardNew = _.find(buttons, (btn)=>{ return btn.name == 'standard_new'})\n if( uiSchema.name != 'cms_files' && uiSchema.permissions.allowCreate && standardNew && standardNew._visible.indexOf('Steedos.StandardObjects.Base.Actions.standard_new.visible.apply') > 0){\n listButtons.push({\n label: standardNew.label,\n name: standardNew.name,\n on: standardNew.on,\n type: standardNew.type,\n todo: (event)=>{\n return standardButtonsTodo.standard_new.call({}, event, {\n listViewId: ctx.listViewId,\n appId: ctx.app_id,\n uiSchema: uiSchema,\n formFactor: ctx.formFactor,\n router: ctx.router,\n data: ctx.data,\n options: ctx.formFactor === 'SMALL' ? {\n props: {\n width: \"100%\",\n style: {\n width: \"100%\",\n },\n bodyStyle: { padding: \"0px\", paddingTop: \"0px\" },\n }\n } : null\n })\n }\n }); \n }\n return listButtons;\n};\n\nexport const getObjectDetailButtons = (uiSchema, ctx) => {\n const buttons = getButtons(uiSchema, ctx);\n const detailButtons = _.filter(buttons, (button) => {\n if (button.on == \"record\" || button.on == \"record_only\") {\n return isVisible(button, ctx);\n }\n return false;\n });\n // 如果是standard_edit 且 _visible 中调用了 Steedos 函数, 则自动添加标准的编辑功能\n const standardEdit = _.find(buttons, (btn)=>{ return btn.name == 'standard_edit'})\n if(ctx.permissions?.allowEdit && standardEdit && standardEdit._visible.indexOf('Steedos.StandardObjects.Base.Actions.standard_edit.visible.apply') > 0){\n detailButtons.push({\n label: standardEdit.label,\n name: standardEdit.name,\n on: standardEdit.on,\n type: standardEdit.type,\n todo: (event)=>{\n return standardButtonsTodo.standard_edit.call({}, event, {\n recordId: ctx.recordId,\n appId: ctx.app_id,\n uiSchema: uiSchema,\n formFactor: ctx.formFactor,\n router: ctx.router,\n options: ctx.formFactor === 'SMALL' ? {\n props: {\n width: \"100%\",\n style: {\n width: \"100%\",\n },\n bodyStyle: { padding: \"0px\", paddingTop: \"0px\" },\n }\n } : null\n })\n }\n })\n }\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 if (button.on == \"record_more\" || button.on == \"record_only_more\") {\n return isVisible(button, ctx);\n }\n return false;\n });\n\n // 如果是standard_delete 且 _visible 中调用了 Steedos 函数, 则自动添加标准的删除功能\n const standardDelete = _.find(buttons, (btn)=>{ return btn.name == 'standard_delete'})\n if(ctx.permissions?.allowDelete && standardDelete && standardDelete._visible.indexOf('Steedos.StandardObjects.Base.Actions.standard_delete.visible.apply') > 0){\n moreButtons.push({\n label: standardDelete.label,\n name: standardDelete.name,\n on: standardDelete.on,\n type: \"amis_action\",\n confirmText: \"确定要删除此项目?\",\n sort: standardDelete.sort,\n amis_actions: [\n {\n \"args\": {\n \"api\": {\n method: 'post',\n url: getApi(),\n requestAdaptor: `\n var deleteArray = [];\n deleteArray.push(\\`delete:${ctx.objectName}__delete(id: \"${ctx.recordId}\")\\`);\n api.data = {query: \\`mutation{\\${deleteArray.join(',')}}\\`};\n return api;\n `,\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n },\n \"messages\": {\n \"success\": \"删除成功\",\n \"failed\": \"删除失败\"\n }\n },\n \"actionType\": \"ajax\"\n }\n ]\n })\n }\n return _.sortBy(moreButtons, \"sort\");\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 return button.todo.apply({}, [props]);\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-07-13 15:18:03\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-07-13 15:25:42\n * @Description: \n */\nimport { fetchAPI } from './steedos.client';\n\nexport async function getPage(pageId, appId, objectName = '', recordId, formFactor = 'LARGE'){\n const APPS_API = `/api/pageSchema/app?app=${appId}&objectApiName=${objectName}&recordId=${recordId}&pageId=${pageId}&formFactor=${formFactor}`;\n const page = await fetchAPI(APPS_API);\n return page;\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}"],"names":["STEEDOS_AUTH","getBuilderContext","Builder","settings","context","setSteedosAuth","Object","assign","steedosSession","async","fetchAPI","api","options","credentials","headers","Content-Type","AUTHORIZATION","getAuthorization","Error","res","await","fetch","getRootUrl","status","json","errors","console","error","getFileSrc","fileId","getImageSrc","getTenantId","spaceId","tenantId","searchParams","window","location","search","URLSearchParams","get","getAuthToken","token","authToken","absoluteUrl","url","defaultRootUrl","rootUrl","localStorage","getItem","setRootUrl","endsWith","substring","length","setItem","getSteedosAuth","cloneDeep","getFieldsTemplate","fields","expand","let","fieldsName","displayFields","fieldsArr","field","_","isArray","values","NAME_FIELD_KEY","name","indexOf","type","reference_to","getUISchema","push","reference_to_field","alias","uniq","join","getFindOneQuery","object","recordId","queryOptions","idFieldName","filters","query","getSaveQuery","objectName","$","modalName","getScriptForRemoveUrlPrefixForImgFields","imgFieldsKeys","imgFields","forEach","item","multiple","JSON","stringify","getScriptForSimplifiedValueForFileFields","fileFieldsKeys","fileFields","getSaveDataTpl","getSaveRequestAdaptor","getFindQuery","limit","orderBy","orderDir","pageNo","pageSize","getApi","isMobile","Router","getAppPath","formFactor","appId","getPagePath","getObjectListViewPath","listViewName","getObjectDetailPath","getObjectRelatedViewPath","masterObjectName","masterRecordId","foreignKey","getDateTpl","getDateTimeTpl","getRefObjectNameFieldName","getSelectTpl","getNameTpl","ctx","tabId","getLookupTpl","href","getSwitchTpl","getPasswordTpl","getFieldTpl","is_name","labelFieldName","config","listView","newRecordMode","editRecordMode","perPage","getTableColumns","columns","width","placeholder","each","tpl","Tpl.getFieldTpl","hidden","extra","label","sortable","toggled","actionType","method","Authorization","responseType","dataType","id","level","getDefaultParams","top","getTableSchema","mode","draggable","headerToolbar","defaultParams","syncLocation","keepItemSelectionOnPageChange","checkOnItemClick","labelTpl","autoFillHeight","getTableApi","mainObject","searchableFields","globalFilter","filter","map","operation","value","searchable","valueField","key_field","data","$term","$self","requestAdaptor","adaptor","graphql.getFindQuery","graphql.getApi","getListBody","getListSchema","listItem","body","actions","icon","link","getCardSchema","title","titleField","find","f","card","header","getReferenceTo","referenceTo","refObjectConfig","valueFieldName","labelField","lookupToAmisPicker","readonly","tableFields","i","field_name","has","sortBy","source","tableField","pickerSchema","paging","enabled","List.getListSchema","Table.getTableSchema","Field.getAmisStaticFieldType","modalMode","size","joinValues","extractValue","Tpl.getLookupTpl","lookupToAmisSelect","apiInfo","$value","depend_on","fName","_optionsFunction","autoComplete","isString","defaultValue","startsWith","lookupToAmis","enable_enhanced_lookup","OMIT_FIELDS","AmisFormInputs","getAmisStaticFieldType","includes","getObjectFieldSubFields","mainField","newMainField","subFields","getGridFieldSubFields","getSelectFieldOptions","data_type","Number","String","convertSFieldToAmisField","showSystemFields","baseData","fieldNamePrefix","labelRemark","inlineHelpText","required","convertData","language","clearable","Tpl.getSelectTpl","option","Tpl.getSwitchTpl","inputFormat","format","Tpl.getDateTpl","Tpl.getDateTimeTpl","utc","timeFormat","min","max","precision","scale","showInput","Tpl.getPasswordTpl","receiver","strictMode","affixHeader","editable","addable","removable","subField","subFieldName","replace","gridSub","quickEdit","isEmpty","is_wide","className","labelClassName","visible_on","visibleOn","getFieldSearchable","perField","permissionFields","Fields.getGridFieldSubFields","Fields.getObjectFieldSubFields","_field","inline","items","disabled","undefined","amisField","Fields.convertSFieldToAmisField","API_CACHE","getReadonlyFormAdaptor","scriptStr","selectFields","optionsFunction","toString","getReadonlyFormInitApi","Date","getTime","cache","graphql.getFindOneQuery","getConvertDataScriptStr","refFields","getScriptForAddUrlPrefixForImgFields","getScriptForRewriteValueForFileFields","fileRootUrl","getEditFormInitApi","sendOn","getSaveApi","graphql.getSaveQuery","graphql.getSaveRequestAdaptor","responseData","getBatchDelete","ids","getFieldSchemaArray","fieldSchemaArray","lodash","mergedSchema","fieldName","group","isObjectField","test","permission","allowEdit","getSection","sectionName","sectionFields","fieldSetBody","collapsable","getSections","sections","key","groupBy","section","getFormBody","objectConfig","getBulkActions","objectSchema","confirmText","getHeaderToolbar","align","mini","getToolbar","footerToolbar","getObjectList","bulkActions","bodyProps","toolbar","bodyClassName","primaryField","table","getGlobalData","user","userId","getObjectForm","regions","global","initApi","initFetch","persistData","promptPageLeave","debug","submitText","panelClassName","getObjectDetail","formData","wrapWithPanel","getGraphqlFieldsQuery","split","queryFields","queryOptionsArray","getRecord","record","getRelatedsCount","relateds","relatedQuery","relate","object_name","foreign_key","getRecordPermissions","UI_SCHEMA_CACHE","setUISchemaCache","getUISchemaCache","hasUISchemaCache","getListViewColumns","listViewColumns","mobile_columns","slice","force","uiSchema","list_views","v","k","all","getField","getFormSchema","amisSchema","getViewSchema","appName","listViewFields","column","isObject","wrap","extra_columns","getObjectRelateds","related","details","concat","enable_files","detail","arr","refField","_reference_to","schema","getObjectRelated","relatedFieldName","masterObjectUISchema","getSearchableFieldsFilterSchema","omit","getApps","getApp","globalTag","getParentPath","path","pathArr","pop","getValueByPath","isExpression","func","reg1","reg2","match","parseSingleExpression","dataPath","userSession","funcBody","parentPath","parent","str","RegExp","Function","_error","log","now","isVisible","button","_visible","trim","eval","visible","fun","props","isFunction","standardButtonsTodo","standard_new","event","listViewId","router","SteedosUI","newRecord","onSubmitted","getRef","getComponentByName","handleAction","onCancel","getRefId","standard_edit","editRecord","getComponentById","reload","standard_delete","standard_delete_many","listViewRef","store","toJSON","selectedItems","toast","position","handleBulkAction","getButtons","disabledButtons","permissions","disabled_actions","buttons","include","allow_customActions","exclude_actions","on","getListViewButtons","listButtons","standardNew","btn","allowCreate","todo","call","app_id","style","bodyStyle","padding","paddingTop","getObjectDetailButtons","detailButtons","standardEdit","getObjectDetailMoreButtons","moreButtons","standardDelete","allowDelete","sort","amis_actions","args","messages","success","failed","execute","apply","getNotifications","auth","markReadAll","getPage","pageId","PUBLIC_ENV","setEnv","getEnv","setEnvs","getEnvs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/lib/steedos.client.js","../src/lib/converter/amis/graphql.js","../src/lib/router.js","../src/lib/converter/amis/tpl.js","../src/config/index.js","../src/lib/converter/amis/fields/table.js","../src/lib/converter/amis/fields/list.js","../src/lib/converter/amis/fields/lookup.js","../src/lib/converter/amis/fields/index.js","../src/lib/converter/amis/api.js","../src/lib/converter/amis/fields/sections.js","../src/lib/converter/amis/form.js","../src/lib/converter/amis/index.js","../src/lib/record.js","../src/lib/objects.js","../src/lib/apps.js","../src/lib/expression.js","../src/lib/buttons.js","../src/lib/notification.js","../src/lib/page.js","../src/lib/public.env.js"],"sourcesContent":["/*\n * @Author: baozhoutao@steedos.com\n * @Date: 2022-07-04 11:24:28\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-09-01 16:00:48\n * @Description: \n */\nimport { endsWith, isEmpty, cloneDeep } from \"lodash\";\n\nconst STEEDOS_AUTH = {};\n\nconst getBuilderContext = ()=>{\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\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 const 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 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 { 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') && field.reference_to){\n const refUiSchema = await getUISchema(field.reference_to);\n const NAME_FIELD_KEY = refUiSchema.NAME_FIELD_KEY || 'name';\n fieldsName.push(`${field.name}:${field.name}__expand{_id,${NAME_FIELD_KEY}${field.reference_to_field ? `,${field.reference_to_field}`:''}}`);\n }else{\n fieldsName.push( field.alias ? `${field.alias}:${field.name}` : field.name)\n }\n\n if(field.type === 'date' || field.type == 'datetime' || field.type == 'boolean'){\n fieldsName.push(`${field.name}`)\n }\n\n if(field.type === 'date' || field.type == 'datetime' || field.type == 'boolean' || field.type == 'select' || field.type == 'file'){\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{${displayFields.join(',')}}`;\n }\n return `${fieldsName.join(' ')}`\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)}}}`\n }\n}\n\nexport function getSaveQuery(object, recordId, fields, options){\n return {\n objectName: \"${objectName}\",\n $: \"$$\",\n recordId: \"${recordId}\",\n modalName: \"${modalName}\"\n }\n}\n\n/*\n img字段值移除URL前缀使其保存时正常保存id,而不是url。\n*/\nexport function getScriptForRemoveUrlPrefixForImgFields(fields){\n let imgFieldsKeys = [];\n let imgFields = {};\n fields.forEach((item)=>{\n if(item.type === 'image'){\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 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 ${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 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 return {\n orderBy: \"${orderBy}\",\n orderDir: \"${orderDir}\",\n pageNo: \"${page}\",\n pageSize: \"${perPage}\",\n query: `{${alias}:${object.name}${queryOptions}{${await getFieldsTemplate(fields, options.expand)}},count:${object.name}__count(filters:{__filters})}`\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-08-16 17:29:37\n * @Description:\n */\n\n\nexport const Router = {\n getAppPath({formFactor, appId}){\n return `/${formFactor === 'SMALL' ? 'mapp': 'app'}/${appId}`;\n },\n getPagePath(){\n //TODO\n },\n getObjectListViewPath({formFactor, appId, objectName, listViewName}){\n return `/${formFactor === 'SMALL' ? 'mapp': 'app'}/${appId}/${objectName}/grid/${listViewName}`;\n },\n getObjectDetailPath({formFactor, appId, objectName, recordId}){\n return `/${formFactor === 'SMALL' ? 'mapp': 'app'}/${appId}/${objectName}/view/${recordId}`;\n },\n getObjectRelatedViewPath({formFactor, appId, masterObjectName, masterRecordId, objectName, foreignKey}){\n return `/${formFactor === 'SMALL' ? 'mapp': '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-09-02 10:43:04\n * @Description: \n */\nimport { Router } from '../../router'\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}'>\\${created_by.name}</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}'>\\${modified_by.name}</a>\\${_display.modified}</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\n//TODO 处理name字段\nexport function getRefObjectNameFieldName(field){\n // const refObject = objectql.getObject(field.reference_to);\n // return refObject.NAME_FIELD_KEY;\n return 'name';\n}\n\nexport function getSelectTpl(field){\n return `<div>\\${_display.${field.name}}</div>`\n}\n\nexport function getNameTpl(field, ctx){\n if(ctx.objectName === 'cms_files'){\n return `<a href=\"\\${context.rootUrl}/api/files/files/\\${versions[0]}?download=true\">\\${${field.name}}</a>`\n }\n const href = Router.getObjectDetailPath({\n formFactor: ctx.formFactor, appId: ctx.appId, objectName: ctx.tabId, recordId: `\\${${ctx.idFieldName}}`\n })\n return `<a href=\"${href}\">\\${${field.name}}</a>`\n}\n\nexport function getLookupTpl(field, ctx){\n if(!field.reference_to){\n return getSelectTpl(field)\n }\n const NAME_FIELD_KEY = 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 class=\"slds-assistive-text\"><%=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 function getFieldTpl (field, options){\n if(field.is_name || field.name === options.labelFieldName){\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 'select':\n return getSelectTpl(field);\n case 'date':\n return getDateTpl(field);\n case 'datetime':\n return getDateTimeTpl(field);\n case 'lookup':\n return getLookupTpl(field, options);\n case 'master_detail':\n return getLookupTpl(field, options);\n default:\n break;\n }\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}","import * as _ from 'lodash'\nimport * as Tpl from '../tpl';\nimport * as Fields from '../index';\nimport * as graphql from '../graphql';\nimport config from '../../../../config'\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\nfunction getTableColumns(fields, options){\n const columns = [{name: '_index',type: 'text', width: 32, placeholder: \"\"}];\n _.each(fields, function(field){\n if((field.is_name || field.name === options.labelFieldName) && options.objectName === 'cms_files'){\n columns.push({\n \"type\": \"button\",\n \"label\": `\\${${field.name}}`,\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{\n const tpl = 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 });\n\n // columns.push(getOperation(fields));\n\n return columns;\n}\n\nfunction getDefaultParams(options){\n return {\n perPage: options.top || config.listView.perPage\n }\n}\n\nexport function getTableSchema(fields, options){\n if(!options){\n options = {};\n }\n return {\n mode: \"table\",\n name: \"thelist\",\n draggable: false,\n headerToolbar: [ 'reload'],\n defaultParams: getDefaultParams(options),\n columns: getTableColumns(fields, options),\n syncLocation: false,\n keepItemSelectionOnPageChange: true,\n checkOnItemClick: false,\n labelTpl: `\\${${options.labelFieldName}}`,\n autoFillHeight: false, // 自动高度效果不理想,先关闭\n }\n}\n\nexport async function getTableApi(mainObject, fields, options){\n const searchableFields = [];\n let { globalFilter, filter } = 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\n _.each(fields,function(field){\n if(field.searchable){\n searchableFields.push(field.name);\n }\n })\n let valueField = mainObject.key_field || '_id';\n const api = await getApi(mainObject, null, fields, {alias: 'rows', 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.requestAdaptor = `\n const 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 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 = ${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\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 searchableFilter = filters;\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 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 return api;\n `\n api.adaptor = `\n _.each(payload.data.rows, function(item, index){\n item._index = index + 1;\n })\n window.postMessage(Object.assign({type: \"listview.loaded\"}), \"*\")\n return payload;\n `;\n return api;\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 * @Author: baozhoutao@steedos.com\n * @Date: 2022-07-23 09:12:14\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-09-02 10:46:48\n * @Description: \n */\n\nimport * as Tpl from '../tpl';\nimport { Router } from '../../../router'\n\nfunction getListBody(fields, options){\n const columns = [];\n _.each(fields, function(field){\n\n const tpl = 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 || 10\n }\n}\n\nexport function getListSchema(fields, options){\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: [...(getListBody(fields, options).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 recordId: `\\${_id}`\n })\n }\n ]\n }\n }\n}\n\n\nexport 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 = Tpl.getFieldTpl(titleField, options)\n }\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\": [...(getListBody(_.filter(fields, (f)=>{\n return f.name != options.labelFieldName\n }), options).columns)]\n }\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';\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 }\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\t_.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 _.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 const source = await getApi({\n name: referenceTo.objectName\n }, null, fields, {expand: true, alias: 'rows', queryOptions: `filters: {__filters}, top: {__top}, skip: {__skip}, sort: \"{__sort}\"`});\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 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 = [[\"${referenceTo.valueField.name}\", \"=\", 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 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 = List.getListSchema(tableFields, {\n top: top,\n ...ctx,\n actions: false\n })\n }else{\n pickerSchema = Table.getTableSchema(tableFields, {\n top: top,\n ...ctx\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 = 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}`})\n }else{\n apiInfo = {\n method: \"post\",\n url: graphql.getApi(),\n data: {query: '{objects(filters: [\"_id\", \"=\", \"-1\"]){_id}}', $: \"$$\"}\n }\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 = '[\"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 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 autoComplete: apiInfo,\n }\n if(_.has(field, 'defaultValue') && !(_.isString(field.defaultValue) && field.defaultValue.startsWith(\"{\"))){\n data.value = field.defaultValue\n }\n if(field.multiple){\n data.multiple = true\n data.extractValue = true\n }\n\n if(readonly){\n data.tpl = Tpl.getLookupTpl(field, ctx)\n }\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 let referenceTo = await getReferenceTo(field);\n if(!referenceTo){\n return await lookupToAmisSelect(field, readonly, ctx);\n }\n const refObject = await getUISchema(referenceTo.objectName);\n\n // 此处不参考 steedos 的 enable_enhanced_lookup 规则. 如果默认是开启弹出选择,用户选择过程操作太繁琐, 所以默认是关闭弹出选择.\n if(refObject.enable_enhanced_lookup == true){\n return await lookupToAmisPicker(field, readonly, ctx);\n }else{\n return await lookupToAmisSelect(field, readonly, ctx);\n }\n}","import { cloneDeep, includes } from 'lodash';\nimport { lookupToAmis } from './lookup';\nimport { absoluteUrl } from '../../../steedos.client.js'\nimport * as Fields from '../fields';\nimport * as Tpl from '../tpl';\nimport * as _ from 'lodash'\nexport const OMIT_FIELDS = ['created', 'created_by', 'modified', 'modified_by'];\n// const Lookup = require('./lookup');\nconst AmisFormInputs = [\n 'text',\n 'date',\n 'file',\n 'image',\n 'datetime',\n 'time',\n 'number',\n 'currency',\n 'percent',\n 'password',\n 'url',\n 'email'\n]\n\nexport function getBaseFields(readonly){\n let calssName = 'm-1';\n if(readonly){\n calssName = `${calssName} slds-form-element_readonly`\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\nexport function getAmisStaticFieldType(type, readonly){\n if(!readonly){\n if(_.includes(AmisFormInputs, type)){\n return `input-${type}`;\n }\n return type;\n }\n if(_.includes(['text'], type)){\n return `static-${type}`;\n }else{\n return 'static';\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 '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 break;\n case 'html':\n convertData = {\n type: \"editor\",\n language: \"html\",\n value: field.defaultValue || ''\n }\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 if(_.has(field, 'defaultValue') && !(_.isString(field.defaultValue) && field.defaultValue.startsWith(\"{\"))){\n const dataType = field.data_type || 'text';\n if(field.defaultValue != null){\n if(dataType === 'text'){\n convertData.value = String(field.defaultValue);\n }else if(dataType === 'number'){\n convertData.value = Number(field.defaultValue);\n }else if(dataType === 'boolean'){\n convertData.value = field.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 }\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.SSS[Z]',\n tpl: readonly ? Tpl.getDateTimeTpl(field) : null,\n utc: true\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.SSS[Z]',\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:'1970-01-01THH:mm:00.000[Z]',\n format:'1970-01-01THH:mm:00.000[Z]',\n tpl: readonly ? Tpl.getDateTimeTpl(field) : null,\n // utc: true\n }\n break;\n case 'time':\n convertData = {\n type: getAmisStaticFieldType('time', readonly),\n inputFormat: 'HH:mm',\n timeFormat:'1970-01-01THH:mm:00.000[Z]',\n format:'1970-01-01THH:mm:00.000[Z]',\n tpl: readonly ? Tpl.getDateTimeTpl(field) : null,\n // utc: true\n }\n break;\n case 'number':\n convertData = {\n type: getAmisStaticFieldType('number', readonly),\n min: field.min,\n max: field.max,\n precision: field.scale\n }\n break;\n case 'currency':\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 '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 //TODO\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 'image':\n rootUrl = absoluteUrl('/api/files/images/');\n convertData = {\n type: getAmisStaticFieldType('image', readonly),\n receiver: {\n method: \"post\",\n url: \"${context.rootUrl}/s3/images\",\n adaptor: `\nvar rootUrl = ${JSON.stringify(rootUrl)};\npayload = {\n status: response.status == 200 ? 0 : response.status,\n msg: response.statusText,\n data: {\n value: payload._id,\n filename: payload.original.name,\n url: rootUrl + payload._id,\n }\n}\nreturn payload;\n `,\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n }\n if(field.multiple){\n convertData.multiple = true;\n convertData.joinValues = false;\n convertData.extractValue = true;\n }\n break;\n case 'file':\n rootUrl = absoluteUrl('/api/files/files/');\n convertData = {\n type: getAmisStaticFieldType('file', readonly),\n receiver: {\n method: \"post\",\n url: \"${context.rootUrl}/s3/files\",\n adaptor: `\nvar rootUrl = ${JSON.stringify(rootUrl)};\npayload = {\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}\nreturn payload;\n `,\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n }\n }\n if(field.multiple){\n convertData.multiple = true;\n convertData.joinValues = false;\n convertData.extractValue = true;\n }\n break;\n case 'formula':\n //TODO\n break;\n case 'summary':\n //TODO\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 }\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 _.each(field.subFields, function(subField){\n const subFieldName = subField.name.replace(`${field.name}.$.`, '').replace(`${field.name}.`, '');\n const gridSub = convertSFieldToAmisField(Object.assign({}, subField, {name: subFieldName}), readonly);\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){\n convertData.className = 'col-span-2 m-1';\n }else{\n convertData.className = 'm-1';\n }\n if(readonly){\n convertData.className = `${convertData.className} slds-form-element_readonly`\n }\n convertData.labelClassName = 'text-left';\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 }\n\n return Object.assign({}, baseData, convertData);\n }\n \n}\n\nexport async function getFieldSearchable(perField, permissionFields, ctx){\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 const amisField = await Fields.convertSFieldToAmisField(_field, false, Object.assign({}, ctx, {fieldNamePrefix: fieldNamePrefix, required: false, showSystemFields: true}));\n if(amisField){\n return amisField;\n }\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 }\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 ${scriptStr}\n payload.data = data;\n window.postMessage(Object.assign({type: \"record.loaded\"}, {record: data}), \"*\")\n }\n return payload;\n`\n}\n\nexport async function getReadonlyFormInitApi(object, recordId, fields){\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),\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字段值添加URL前缀使其在amis中正常显示图片。\n*/\nfunction getScriptForAddUrlPrefixForImgFields(fields){\n let imgFieldsKeys = [];\n let imgFields = {};\n let rootUrl = absoluteUrl('/api/files/images/');\n fields.forEach((item)=>{\n if(item.type === 'image'){\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 // image字段值添加URL前缀\n let imgFieldsKeys = ${JSON.stringify(imgFieldsKeys)};\n let imgFields = ${JSON.stringify(imgFields)};\n let rootUrl = ${JSON.stringify(rootUrl)};\n imgFieldsKeys.forEach((item)=>{\n let imgFieldValue = data[item];\n if(imgFieldValue && imgFieldValue.length){\n if(imgFields[item].multiple){\n if(imgFieldValue instanceof Array){\n data[item] = imgFieldValue.map((value)=>{ return rootUrl + value});\n }\n }else{\n data[item] = rootUrl + imgFieldValue;\n }\n }\n })\n `\n}\n\n/*\n file字段值重写使其在amis中正常显示附件名、点击附件名下载文件。\n*/\nfunction getScriptForRewriteValueForFileFields(fields){\n let fileFieldsKeys = [];\n let fileFields = {};\n let fileRootUrl = absoluteUrl('/api/files/files/');\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 let fileRootUrl = ${JSON.stringify(fileRootUrl)};\n fileFieldsKeys.forEach((item)=>{\n let fileFieldValue = data[item];\n if(fileFieldValue && fileFieldValue.length){\n const fileFieldNames = data._display[item].split(',');\n if(fileFields[item].multiple){\n if(fileFieldValue instanceof Array){\n data[item] = fileFieldValue.map((value, index)=>{ \n return {\n value: value,\n name: fileFieldNames[index],\n url: fileRootUrl + value + \"?download=true\",\n state: \"uploaded\"\n }\n });\n }\n }else{\n data[item] = {\n value: fileFieldValue,\n name: fileFieldNames[0],\n url: fileRootUrl + fileFieldValue + \"?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 ${getConvertDataScriptStr(fields)}\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 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: 2022-09-01 11:25:18\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\n const section = {\n \"type\": \"fieldSet\",\n \"title\": sectionName,\n \"collapsable\": true,\n \"body\": fieldSetBody,\n }\n // if(sectionFieldsVisibleOn.length > 0){\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}","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';\n\nfunction getBulkActions(objectSchema){\n return [\n {\n \"type\": \"button\",\n \"level\": \"danger\",\n \"label\": \"批量删除\",\n \"actionType\": \"ajax\",\n \"confirmText\": \"确定要删除吗\",\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 \n const bulkActions = getBulkActions(objectSchema)\n\n const bodyProps = {\n toolbar: getToolbar(), \n footerToolbar: footerToolbar(), \n headerToolbar: getHeaderToolbar(objectSchema, options.formFactor),\n bulkActions: bulkActions, \n bodyClassName: \"\",\n // filterTogglable: true,\n // filterDefaultVisible: true,\n // filter: getFilter()\n }\n\n let body = null;\n const id = `listview_${objectSchema.name}`;\n if(options.formFactor === 'SMALL'){\n delete bodyProps.bulkActions;\n delete bodyProps.headerToolbar;\n delete bodyProps.footerToolbar;\n body = Object.assign({}, getCardSchema(fields, Object.assign({idFieldName: objectSchema.idFieldName, labelFieldName: objectSchema.NAME_FIELD_KEY || 'name'}, options, {actions: false})), {\n type: 'crud', \n primaryField: '_id', \n id: id,\n name: id,\n keepItemSelectionOnPageChange: false, \n api: await getTableApi(objectSchema, fields, options)}, \n bodyProps\n );\n }else{\n const table = 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 id: id,\n name: id,\n keepItemSelectionOnPageChange: true, \n api: await getTableApi(objectSchema, fields, options)}, \n bodyProps\n )\n }\n\n return {\n type: 'service',\n bodyClassName: '',\n name: `page`,\n data: {context: {rootUrl: getRootUrl(), tenantId: getTenantId(), authToken: getAuthToken()}},\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, tabId, appId } = ctx;\n const fields = _.values(objectSchema.fields);\n return {\n type: 'page',\n bodyClassName: 'p-0',\n regions: [\n \"body\"\n ],\n name: `page_edit_${recordId}`,\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: [\n {\n type: \"form\",\n mode: ctx.formFactor === 'SMALL' ? 'normal' : 'horizontal',\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 initApi: await getEditFormInitApi(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: 'p-4 sm:p-0 steedos-amis-form',\n }\n ]\n }\n}\n\nexport async function getObjectDetail(objectSchema, recordId, 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),\n body: [\n {\n type: \"form\",\n mode: ctx.formFactor === 'SMALL' ? 'normal' : 'horizontal',\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;}), objectSchema, ctx),\n className: 'steedos-amis-form',\n actions: [] // 不显示表单默认的提交按钮\n }\n ]\n }\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: 2022-09-05 17:53:41\n * @Description:\n */\nimport { fetchAPI } from \"./steedos.client\";\nimport {\n getObjectList,\n getObjectDetail,\n getObjectForm,\n} from \"./converter/amis/index\";\nimport _ , { slice, isEmpty, each, has } from \"lodash\";\nimport { getFieldSearchable } from \"./converter/amis/fields/index\";\nimport { getRecord } from './record';\n\nconst UI_SCHEMA_CACHE = {};\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\nconst 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 async function getUISchema(objectName, force) {\n if (!objectName) {\n return;\n }\n if (hasUISchemaCache(objectName) && !force) {\n return getUISchemaCache(objectName);\n }\n const url = `/service/api/@${objectName.replace(/\\./g, \"_\")}/uiSchema`;\n let uiSchema = null;\n try {\n uiSchema = await fetchAPI(url, { method: \"get\" });\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 const refUiSchema = await getUISchema(field.reference_to);\n if (!refUiSchema) {\n delete uiSchema.fields[fieldName];\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 options = {}\n) {\n const uiSchema = await getUISchema(objectName);\n const listView = _.find(\n uiSchema.list_views,\n (listView, name) => name === listViewName\n );\n\n if (!listView) {\n return { uiSchema };\n }\n let fields = uiSchema.fields;\n const listViewFields = [];\n\n let listViewColumns = getListViewColumns(listView, options.formFactor);\n\n if (listView && listViewColumns) {\n _.each(listViewColumns, function (column) {\n if (_.isString(column) && uiSchema.fields[column]) {\n listViewFields.push(uiSchema.fields[column]);\n } else if (_.isObject(column) && uiSchema.fields[column.field]) {\n listViewFields.push(\n Object.assign({}, uiSchema.fields[column.field], {\n width: column.width,\n wrap: column.wrap,\n })\n );\n }\n });\n }\n\n if (listView && listView.extra_columns) {\n _.each(listView.extra_columns, function (column) {\n if (_.isString(column)) {\n listViewFields.push({ extra: true, name: column });\n } else if (_.isObject(column)) {\n listViewFields.push({ extra: true, name: column.field });\n }\n });\n }\n\n fields = listViewFields;\n const amisSchema = await getObjectList(uiSchema, fields, {\n tabId: objectName,\n appId: appName,\n objectName: objectName,\n ...options,\n filter: listView.filters,\n });\n\n return {\n uiSchema,\n amisSchema,\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 details = [].concat(uiSchema.details || []);\n\n if (uiSchema.enable_files) {\n details.push(`cms_files.parent`);\n }\n\n for (const detail of details) {\n const arr = detail.split(\".\");\n\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 }),\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, formFactor);\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(fields) {\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, {});\n if (amisField) {\n amisField.className = \"min-w-[200px] pr-4 max-w-[350px] grow\";\n body.push(amisField);\n }\n }\n }\n return {\n title: \"\",\n type: \"form\",\n name: \"listview-filter-form\",\n mode: \"normal\",\n wrapWithPanel: false,\n className: \"flex flex-row w-full flex-wrap mb-3\",\n body: body,\n };\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 * as _ 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};","import _ from \"lodash\";\nimport { isExpression, parseSingleExpression } from \"./expression\";\nimport { getApi } from './converter/amis/graphql';\nimport config from \"../config\";\n\nconst getGlobalData = () => {\n return {\n now: new Date(),\n };\n};\n\nconst isVisible = (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// TODO\nexport const standardButtonsTodo = {\n standard_new: (event, props) => {\n const {\n appId,\n listViewId,\n uiSchema,\n formFactor,\n data,\n router,\n options = {},\n } = props;\n // router.push('/app/'+props.data.app_id+'/'+props.data.objectName+'/view/new');\n const type = config.listView.newRecordMode;\n SteedosUI?.Object.newRecord({\n onSubmitted: () => {\n SteedosUI.getRef(listViewId)\n .getComponentByName(`page.listview_${uiSchema.name}`)\n .handleAction({}, { actionType: \"reload\" });\n },\n onCancel: () => {\n SteedosUI.getRef(listViewId)\n .getComponentByName(`page.listview_${uiSchema.name}`)\n .handleAction({}, { actionType: \"reload\" });\n },\n appId: appId,\n formFactor: formFactor,\n name: SteedosUI.getRefId({ type: `${type}-form` }),\n title: `新建 ${uiSchema.label}`,\n objectName: uiSchema.name,\n data: data,\n recordId: \"new\",\n type,\n options: options,\n router,\n });\n },\n standard_edit: (event, props) => {\n const type = config.listView.newRecordMode;\n const {\n appId,\n recordId,\n uiSchema,\n formFactor,\n router,\n options = {},\n } = props;\n SteedosUI?.Object.editRecord({\n appId: appId,\n name: SteedosUI.getRefId({ type: `${type}-form` }),\n title: `编辑 ${uiSchema.label}`,\n objectName: uiSchema.name,\n recordId: recordId,\n type,\n options: options,\n router,\n formFactor: formFactor,\n onSubmitted: () => {\n SteedosUI.getRef(\n SteedosUI.getRefId({\n type: \"detail\",\n appId: appId,\n name: uiSchema.name,\n })\n )\n .getComponentById(`detail_${recordId}`)\n .reload();\n },\n });\n },\n standard_delete: (event, props) => { },\n standard_delete_many: (event, props)=>{\n const {\n listViewId,\n uiSchema,\n } = props;\n const listViewRef = SteedosUI?.getRef(listViewId).getComponentByName(`page.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// TODO\nconst standardButtonsVisible = {\n standard_newVisible: (props) => { },\n};\n\nexport const getButtons = (uiSchema, ctx) => {\n const disabledButtons = 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 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;\n });\n};\n\nexport const getListViewButtons = (uiSchema, ctx) => {\n const buttons = getButtons(uiSchema, ctx);\n const listButtons = _.filter(buttons, (button) => {\n if (button.on == \"list\") {\n return isVisible(button, ctx);\n }\n return false;\n });\n // 如果是standard_new 且 _visible 中调用了 Steedos 函数, 则自动添加标准的新建功能\n const standardNew = _.find(buttons, (btn)=>{ return btn.name == 'standard_new'})\n if( uiSchema.name != 'cms_files' && uiSchema.permissions.allowCreate && standardNew && standardNew._visible.indexOf('Steedos.StandardObjects.Base.Actions.standard_new.visible.apply') > 0){\n listButtons.push({\n label: standardNew.label,\n name: standardNew.name,\n on: standardNew.on,\n type: standardNew.type,\n todo: (event)=>{\n return standardButtonsTodo.standard_new.call({}, event, {\n listViewId: ctx.listViewId,\n appId: ctx.app_id,\n uiSchema: uiSchema,\n formFactor: ctx.formFactor,\n router: ctx.router,\n data: ctx.data,\n options: ctx.formFactor === 'SMALL' ? {\n props: {\n width: \"100%\",\n style: {\n width: \"100%\",\n },\n bodyStyle: { padding: \"0px\", paddingTop: \"0px\" },\n }\n } : null\n })\n }\n }); \n }\n return listButtons;\n};\n\nexport const getObjectDetailButtons = (uiSchema, ctx) => {\n const buttons = getButtons(uiSchema, ctx);\n const detailButtons = _.filter(buttons, (button) => {\n if (button.on == \"record\" || button.on == \"record_only\") {\n return isVisible(button, ctx);\n }\n return false;\n });\n // 如果是standard_edit 且 _visible 中调用了 Steedos 函数, 则自动添加标准的编辑功能\n const standardEdit = _.find(buttons, (btn)=>{ return btn.name == 'standard_edit'})\n if(ctx.permissions?.allowEdit && standardEdit && standardEdit._visible.indexOf('Steedos.StandardObjects.Base.Actions.standard_edit.visible.apply') > 0){\n detailButtons.push({\n label: standardEdit.label,\n name: standardEdit.name,\n on: standardEdit.on,\n type: standardEdit.type,\n todo: (event)=>{\n return standardButtonsTodo.standard_edit.call({}, event, {\n recordId: ctx.recordId,\n appId: ctx.app_id,\n uiSchema: uiSchema,\n formFactor: ctx.formFactor,\n router: ctx.router,\n options: ctx.formFactor === 'SMALL' ? {\n props: {\n width: \"100%\",\n style: {\n width: \"100%\",\n },\n bodyStyle: { padding: \"0px\", paddingTop: \"0px\" },\n }\n } : null\n })\n }\n })\n }\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 if (button.on == \"record_more\" || button.on == \"record_only_more\") {\n return isVisible(button, ctx);\n }\n return false;\n });\n\n // 如果是standard_delete 且 _visible 中调用了 Steedos 函数, 则自动添加标准的删除功能\n const standardDelete = _.find(buttons, (btn)=>{ return btn.name == 'standard_delete'})\n if(ctx.permissions?.allowDelete && standardDelete && standardDelete._visible.indexOf('Steedos.StandardObjects.Base.Actions.standard_delete.visible.apply') > 0){\n moreButtons.push({\n label: standardDelete.label,\n name: standardDelete.name,\n on: standardDelete.on,\n type: \"amis_action\",\n confirmText: \"确定要删除此项目?\",\n sort: standardDelete.sort,\n amis_actions: [\n {\n \"args\": {\n \"api\": {\n method: 'post',\n url: getApi(),\n requestAdaptor: `\n var deleteArray = [];\n deleteArray.push(\\`delete:${ctx.objectName}__delete(id: \"${ctx.recordId}\")\\`);\n api.data = {query: \\`mutation{\\${deleteArray.join(',')}}\\`};\n return api;\n `,\n headers: {\n Authorization: \"Bearer ${context.tenantId},${context.authToken}\"\n }\n },\n \"messages\": {\n \"success\": \"删除成功\",\n \"failed\": \"删除失败\"\n }\n },\n \"actionType\": \"ajax\"\n }\n ]\n })\n }\n return _.sortBy(moreButtons, \"sort\");\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 return button.todo.apply({}, [props]);\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-07-13 15:18:03\n * @LastEditors: baozhoutao@steedos.com\n * @LastEditTime: 2022-07-13 15:25:42\n * @Description: \n */\nimport { fetchAPI } from './steedos.client';\n\nexport async function getPage(pageId, appId, objectName = '', recordId, formFactor = 'LARGE'){\n const APPS_API = `/api/pageSchema/app?app=${appId}&objectApiName=${objectName}&recordId=${recordId}&pageId=${pageId}&formFactor=${formFactor}`;\n const page = await fetchAPI(APPS_API);\n return page;\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}"],"names":["STEEDOS_AUTH","getBuilderContext","Builder","settings","context","setSteedosAuth","Object","assign","steedosSession","async","fetchAPI","api","options","credentials","headers","Content-Type","AUTHORIZATION","getAuthorization","Error","res","await","fetch","getRootUrl","status","json","errors","console","error","getFileSrc","fileId","getImageSrc","getTenantId","spaceId","tenantId","searchParams","window","location","search","URLSearchParams","get","getAuthToken","token","authToken","absoluteUrl","url","defaultRootUrl","rootUrl","localStorage","getItem","setRootUrl","endsWith","substring","length","setItem","getSteedosAuth","cloneDeep","getFieldsTemplate","fields","expand","let","fieldsName","displayFields","fieldsArr","field","_","isArray","values","NAME_FIELD_KEY","name","indexOf","type","reference_to","getUISchema","push","reference_to_field","alias","uniq","join","getFindOneQuery","object","recordId","queryOptions","idFieldName","filters","query","getSaveQuery","objectName","$","modalName","getScriptForRemoveUrlPrefixForImgFields","imgFieldsKeys","imgFields","forEach","item","multiple","JSON","stringify","getScriptForSimplifiedValueForFileFields","fileFieldsKeys","fileFields","getSaveDataTpl","getSaveRequestAdaptor","getFindQuery","limit","orderBy","orderDir","pageNo","pageSize","getApi","isMobile","Router","getAppPath","formFactor","appId","getPagePath","getObjectListViewPath","listViewName","getObjectDetailPath","getObjectRelatedViewPath","masterObjectName","masterRecordId","foreignKey","getDateTpl","getDateTimeTpl","getRefObjectNameFieldName","getSelectTpl","getNameTpl","ctx","tabId","getLookupTpl","href","getSwitchTpl","getPasswordTpl","getFieldTpl","is_name","labelFieldName","config","listView","newRecordMode","editRecordMode","perPage","getTableColumns","columns","width","placeholder","each","tpl","Tpl.getFieldTpl","hidden","extra","label","sortable","toggled","actionType","method","Authorization","responseType","dataType","id","level","getDefaultParams","top","getTableSchema","mode","draggable","headerToolbar","defaultParams","syncLocation","keepItemSelectionOnPageChange","checkOnItemClick","labelTpl","autoFillHeight","getTableApi","mainObject","searchableFields","globalFilter","filter","map","operation","value","searchable","valueField","key_field","data","$term","$self","requestAdaptor","adaptor","graphql.getFindQuery","graphql.getApi","getListBody","getListSchema","listItem","body","actions","icon","link","getCardSchema","title","titleField","find","f","card","header","getReferenceTo","referenceTo","refObjectConfig","valueFieldName","labelField","lookupToAmisPicker","readonly","tableFields","i","field_name","has","sortBy","source","tableField","pickerSchema","paging","enabled","List.getListSchema","Table.getTableSchema","Field.getAmisStaticFieldType","modalMode","size","joinValues","extractValue","Tpl.getLookupTpl","lookupToAmisSelect","apiInfo","$value","depend_on","fName","_optionsFunction","autoComplete","isString","defaultValue","startsWith","lookupToAmis","enable_enhanced_lookup","OMIT_FIELDS","AmisFormInputs","getAmisStaticFieldType","includes","getObjectFieldSubFields","mainField","newMainField","subFields","getGridFieldSubFields","getSelectFieldOptions","data_type","Number","String","convertSFieldToAmisField","showSystemFields","baseData","fieldNamePrefix","labelRemark","inlineHelpText","required","convertData","language","clearable","Tpl.getSelectTpl","option","Tpl.getSwitchTpl","inputFormat","format","Tpl.getDateTpl","Tpl.getDateTimeTpl","utc","timeFormat","min","max","precision","scale","showInput","Tpl.getPasswordTpl","receiver","strictMode","affixHeader","editable","addable","removable","subField","subFieldName","replace","gridSub","quickEdit","isEmpty","is_wide","className","labelClassName","visible_on","visibleOn","getFieldSearchable","perField","permissionFields","Fields.getGridFieldSubFields","Fields.getObjectFieldSubFields","_field","inline","items","disabled","undefined","amisField","Fields.convertSFieldToAmisField","API_CACHE","getReadonlyFormAdaptor","scriptStr","selectFields","optionsFunction","toString","getReadonlyFormInitApi","Date","getTime","cache","graphql.getFindOneQuery","getConvertDataScriptStr","refFields","getScriptForAddUrlPrefixForImgFields","getScriptForRewriteValueForFileFields","fileRootUrl","getEditFormInitApi","sendOn","getSaveApi","graphql.getSaveQuery","graphql.getSaveRequestAdaptor","responseData","getBatchDelete","ids","getFieldSchemaArray","fieldSchemaArray","lodash","mergedSchema","fieldName","group","isObjectField","test","permission","allowEdit","getSection","sectionName","sectionFields","fieldSetBody","collapsable","getSections","sections","key","groupBy","section","getFormBody","objectConfig","getBulkActions","objectSchema","confirmText","getHeaderToolbar","align","mini","getToolbar","footerToolbar","getObjectList","bulkActions","bodyProps","toolbar","bodyClassName","primaryField","table","getGlobalData","user","userId","getObjectForm","regions","global","initApi","initFetch","persistData","promptPageLeave","debug","submitText","panelClassName","getObjectDetail","formData","wrapWithPanel","getGraphqlFieldsQuery","split","queryFields","queryOptionsArray","getRecord","record","getRelatedsCount","relateds","relatedQuery","relate","object_name","foreign_key","getRecordPermissions","UI_SCHEMA_CACHE","setUISchemaCache","getUISchemaCache","hasUISchemaCache","getListViewColumns","listViewColumns","mobile_columns","slice","force","uiSchema","list_views","v","k","all","getField","getFormSchema","amisSchema","getViewSchema","appName","listViewFields","column","isObject","wrap","extra_columns","getObjectRelatedList","related","details","concat","enable_files","detail","arr","refField","_reference_to","schema","getObjectRelated","relatedFieldName","masterObjectUISchema","getSearchableFieldsFilterSchema","omit","getApps","getApp","globalTag","getParentPath","path","pathArr","pop","getValueByPath","isExpression","func","reg1","reg2","match","parseSingleExpression","dataPath","userSession","funcBody","parentPath","parent","str","RegExp","Function","_error","log","now","isVisible","button","_visible","trim","eval","visible","fun","props","isFunction","standardButtonsTodo","standard_new","event","listViewId","router","SteedosUI","newRecord","onSubmitted","getRef","getComponentByName","handleAction","onCancel","getRefId","standard_edit","editRecord","getComponentById","reload","standard_delete","standard_delete_many","listViewRef","store","toJSON","selectedItems","toast","position","handleBulkAction","getButtons","disabledButtons","permissions","disabled_actions","buttons","include","allow_customActions","exclude_actions","on","getListViewButtons","listButtons","standardNew","btn","allowCreate","todo","call","app_id","style","bodyStyle","padding","paddingTop","getObjectDetailButtons","detailButtons","standardEdit","getObjectDetailMoreButtons","moreButtons","standardDelete","allowDelete","sort","amis_actions","args","messages","success","failed","execute","apply","getNotifications","auth","markReadAll","getPage","pageId","PUBLIC_ENV","setEnv","getEnv","setEnvs","getEnvs"],"mappings":"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"}
|