UNPKG

amis

Version:

一种MIS页面生成工具

318 lines (317 loc) 12.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.RendererEnv = exports.getRendererByName = exports.getRenderers = exports.resolveRenderer = exports.updateEnv = exports.clearStoresCache = exports.render = exports.loadRenderer = exports.unRegisterRenderer = exports.registerRenderer = exports.Renderer = exports.filterSchema = exports.addSchemaFilter = void 0; var tslib_1 = require("tslib"); var react_1 = tslib_1.__importDefault(require("react")); var qs_1 = tslib_1.__importDefault(require("qs")); var index_1 = require("./store/index"); var mobx_state_tree_1 = require("mobx-state-tree"); var api_1 = require("./utils/api"); var normalizeLink_1 = require("./utils/normalizeLink"); var helper_1 = require("./utils/helper"); var mobx_react_1 = require("mobx-react"); var Scoped_1 = tslib_1.__importDefault(require("./Scoped")); var theme_1 = require("./theme"); var find_1 = tslib_1.__importDefault(require("lodash/find")); var Alert2_1 = tslib_1.__importDefault(require("./components/Alert2")); var Toast_1 = require("./components/Toast"); var Alert_1 = require("./components/Alert"); var locale_1 = require("./locale"); var Root_1 = tslib_1.__importDefault(require("./Root")); var WithStore_1 = require("./WithStore"); var env_1 = require("./env"); Object.defineProperty(exports, "RendererEnv", { enumerable: true, get: function () { return env_1.RendererEnv; } }); var renderers = []; var rendererNames = []; var schemaFilters = []; var anonymousIndex = 1; function addSchemaFilter(fn) { schemaFilters.push(fn); } exports.addSchemaFilter = addSchemaFilter; function filterSchema(schema, render, props) { return schemaFilters.reduce(function (schema, filter) { return filter(schema, render, props); }, schema); } exports.filterSchema = filterSchema; function Renderer(config) { return function (component) { var renderer = registerRenderer(tslib_1.__assign(tslib_1.__assign({}, config), { component: component })); return renderer.component; }; } exports.Renderer = Renderer; function registerRenderer(config) { if (!config.test) { throw new TypeError('config.test is required'); } else if (!config.component) { throw new TypeError('config.component is required'); } config.weight = config.weight || 0; config.Renderer = config.component; config.name = config.name || "anonymous-" + anonymousIndex++; if (~rendererNames.indexOf(config.name)) { throw new Error("The renderer with name \"" + config.name + "\" has already exists, please try another name!"); } if (config.storeType && config.component) { config.component = WithStore_1.HocStoreFactory({ storeType: config.storeType, extendsData: config.storeExtendsData, shouldSyncSuperStore: config.shouldSyncSuperStore })(mobx_react_1.observer(config.component)); } if (config.isolateScope) { config.component = Scoped_1.default(config.component); } var idx = helper_1.findIndex(renderers, function (item) { return config.weight < item.weight; }); ~idx ? renderers.splice(idx, 0, config) : renderers.push(config); rendererNames.push(config.name); return config; } exports.registerRenderer = registerRenderer; function unRegisterRenderer(config) { var idx = typeof config === 'string' ? helper_1.findIndex(renderers, function (item) { return item.name === config; }) : renderers.indexOf(config); ~idx && renderers.splice(idx, 1); var idx2 = typeof config === 'string' ? helper_1.findIndex(rendererNames, function (item) { return item === config; }) : rendererNames.indexOf(config.name || ''); ~idx2 && rendererNames.splice(idx2, 1); // 清空渲染器定位缓存 cache = {}; } exports.unRegisterRenderer = unRegisterRenderer; function loadRenderer(schema, path) { return (react_1.default.createElement(Alert2_1.default, { level: "danger" }, react_1.default.createElement("p", null, "Error: \u627E\u4E0D\u5230\u5BF9\u5E94\u7684\u6E32\u67D3\u5668"), react_1.default.createElement("p", null, "Path: ", path), react_1.default.createElement("pre", null, react_1.default.createElement("code", null, JSON.stringify(schema, null, 2))))); } exports.loadRenderer = loadRenderer; var defaultOptions = { session: 'global', affixOffsetTop: 50, affixOffsetBottom: 0, richTextToken: '', loadRenderer: loadRenderer, fetcher: function () { return Promise.reject('fetcher is required'); }, // 使用 WebSocket 来实时获取数据 wsFetcher: function (ws, onMessage, onError) { if (ws) { var socket = new WebSocket(ws); socket.onmessage = function (event) { if (event.data) { onMessage(JSON.parse(event.data)); } }; socket.onerror = onError; return { close: socket.close }; } else { return { close: function () { } }; } }, isCancel: function () { console.error('Please implements this. see https://baidu.gitee.io/amis/docs/start/getting-started#%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97'); return false; }, updateLocation: function () { console.error('Please implements this. see https://baidu.gitee.io/amis/docs/start/getting-started#%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97'); }, alert: Alert_1.alert, confirm: Alert_1.confirm, notify: function (type, msg, conf) { return Toast_1.toast[type] ? Toast_1.toast[type](msg, type === 'error' ? 'Error' : 'Info', conf) : console.warn('[Notify]', type, msg); }, jumpTo: function (to, action) { if (to === 'goBack') { return window.history.back(); } to = normalizeLink_1.normalizeLink(to); if (action && action.actionType === 'url') { action.blank === false ? (window.location.href = to) : window.open(to); return; } if (/^https?:\/\//.test(to)) { window.location.replace(to); } else { location.href = to; } }, isCurrentUrl: function (to) { if (!to) { return false; } var link = normalizeLink_1.normalizeLink(to); var location = window.location; var pathname = link; var search = ''; var idx = link.indexOf('?'); if (~idx) { pathname = link.substring(0, idx); search = link.substring(idx); } if (search) { if (pathname !== location.pathname || !location.search) { return false; } var query_1 = qs_1.default.parse(search.substring(1)); var currentQuery_1 = qs_1.default.parse(location.search.substring(1)); return Object.keys(query_1).every(function (key) { return query_1[key] === currentQuery_1[key]; }); } else if (pathname === location.pathname) { return true; } return false; }, copy: function (contents) { console.error('copy contents', contents); }, rendererResolver: resolveRenderer }; var stores = {}; function render(schema, props, options, pathPrefix) { if (props === void 0) { props = {}; } if (options === void 0) { options = {}; } if (pathPrefix === void 0) { pathPrefix = ''; } var locale = props.locale || locale_1.getDefaultLocale(); // 兼容 locale 的不同写法 locale = locale.replace('_', '-'); locale = locale === 'en' ? 'en-US' : locale; locale = locale === 'zh' ? 'zh-CN' : locale; locale = locale === 'cn' ? 'zh-CN' : locale; var translate = props.translate || locale_1.makeTranslator(locale); var store = stores[options.session || 'global']; if (!store) { options = tslib_1.__assign(tslib_1.__assign(tslib_1.__assign({}, defaultOptions), options), { fetcher: options.fetcher ? api_1.wrapFetcher(options.fetcher) : defaultOptions.fetcher, confirm: helper_1.promisify(options.confirm || defaultOptions.confirm || window.confirm), locale: locale, translate: translate }); store = index_1.RendererStore.create({}, options); stores[options.session || 'global'] = store; } window.amisStore = store; // 为了方便 debug. var env = mobx_state_tree_1.getEnv(store); var theme = props.theme || options.theme || 'default'; env.theme = theme_1.getTheme(theme); if (props.locale !== undefined) { env.translate = translate; env.locale = locale; } return (react_1.default.createElement(env_1.EnvContext.Provider, { value: env }, react_1.default.createElement(Root_1.default, tslib_1.__assign({}, props, { schema: schema, pathPrefix: pathPrefix, rootStore: store, env: env, theme: theme, locale: locale, translate: translate })))); } exports.render = render; // 默认 env 会被缓存,所以新传入的 env 不会替换旧的。 // 除非先删了旧的,新的才会生效。 function clearStoresCache(sessions) { if (sessions === void 0) { sessions = Object.keys(stores); } if (!Array.isArray(sessions)) { sessions = [sessions]; } sessions.forEach(function (key) { var store = stores[key]; // @ts-ignore delete stores[key]; store && mobx_state_tree_1.destroy(store); }); } exports.clearStoresCache = clearStoresCache; // 当然也可以直接这样更新。 // 主要是有时候第一次创建的时候并没有准备多少接口, // 可以后续补充点,比如 amis 自己实现的,prompt 里面的表单。 function updateEnv(options, session) { if (session === void 0) { session = 'global'; } options = tslib_1.__assign({}, options); if (options.fetcher) { options.fetcher = api_1.wrapFetcher(options.fetcher); } if (options.confirm) { options.confirm = helper_1.promisify(options.confirm); } var store = stores[options.session || session]; if (!store) { store = index_1.RendererStore.create({}, options); stores[options.session || session] = store; } else { var env = mobx_state_tree_1.getEnv(store); Object.assign(env, options); } } exports.updateEnv = updateEnv; var cache = {}; function resolveRenderer(path, schema) { if (cache[path]) { return cache[path]; } else if (path && path.length > 1024) { throw new Error('Path太长是不是死循环了?'); } var renderer = null; renderers.some(function (item) { var matched = false; // 不应该搞得这么复杂的,让每个渲染器唯一 id,自己不晕别人用起来也不晕。 if (typeof item.test === 'function') { matched = item.test(path, schema, resolveRenderer); } else if (item.test instanceof RegExp) { matched = item.test.test(path); } if (matched) { renderer = item; } return matched; }); // 只能缓存纯正则表达式的后者方法中没有用到第二个参数的, // 因为自定义 test 函数的有可能依赖 schema 的结果 if (renderer !== null && (renderer.test instanceof RegExp || (typeof renderer.test === 'function' && renderer.test.length < 2))) { cache[path] = renderer; } return renderer; } exports.resolveRenderer = resolveRenderer; function getRenderers() { return renderers.concat(); } exports.getRenderers = getRenderers; function getRendererByName(name) { return find_1.default(renderers, function (item) { return item.name === name; }); } exports.getRendererByName = getRendererByName; Alert_1.setRenderSchemaFn(function (controls, value, callback, scopeRef, theme) { return render({ name: 'form', type: 'form', wrapWithPanel: false, mode: 'horizontal', controls: controls, messages: { validateFailed: '' } }, { data: value, onFinished: callback, scopeRef: scopeRef, theme: theme }, { session: 'prompt' }); }); //# sourceMappingURL=./factory.js.map