UNPKG

@tomino/dynamic-form-semantic-ui

Version:

Semantic UI form renderer based on dynamic form generation

1,305 lines (1,280 loc) 1.12 MB
(function(FuseBox){FuseBox.$fuse$=FuseBox; FuseBox.target = "browser"; // allowSyntheticDefaultImports FuseBox.sdep = true; var __process_env__ = {"NODE_ENV":"test"}; FuseBox.pkg("default", {}, function(___scope___){ ___scope___.file("luis_app.js", function(exports, require, module, __filename, __dirname){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const luis_1 = require("luis"); if (!global.process) { global.process = { env: { NODE_ENV: 'development' } }; } require("semantic-ui-css/semantic.css"); const react_router_1 = require("luis/proxies/react-router"); const apollo_1 = require("luis/proxies/apollo"); const proxy_store_1 = require("luis/client/models/proxy_store"); exports.ApolloProxy = apollo_1.createApolloProxy({ endpoint: 'http://localhost:4000/graphql' }); const RouterProxy = { proxy: react_router_1.createRouterProxy(), key: 'router' }; proxy_store_1.ProxyStore.init([exports.ApolloProxy, RouterProxy]); luis_1.renderLuis({ loadTests: () => { require('**.test'); } }); //# sourceMappingURL=luis-client.js.map?tm=1560968381591 }); ___scope___.file("apollo/tests/apollo_mutation.test.jsx", function(exports, require, module, __filename, __dirname){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const common_1 = require("../../semantic/tests/common"); const form_query_data_1 = require("../../semantic/tests/form_query_data"); const schema = { type: 'object', properties: { people: { type: 'array', items: { type: 'object', properties: { name: { type: 'string' }, sex: { type: 'string' } } } } } }; const withFakeData = (data) => [ { control: 'Stack', props: { layout: 'column', gap: '3px' }, elements: [ { control: 'ApolloMutation', props: { fakeData: data, clickHandler: 'mutate', mutation: `mutation Mutate { mutate { name sex } }`, target: 'people', loadingText: 'Loading ...' }, elements: [ { control: 'Button', props: { content: 'Mutate', onClick: 'mutate' } }, { control: 'Repeater', props: { value: { source: 'people' } }, elements: [ { control: 'Stack', elements: [ { control: 'Text', props: { value: { source: 'name' } } }, { control: 'Text', props: { value: ':\xa0' } }, { control: 'Text', props: { value: { source: 'sex' } } } ] }, null, null ] } ] } ] } ]; const formDefinition = form_query_data_1.create.stack({ elements: [ { control: 'Text', props: { value: 'Empty' } }, { control: 'ApolloProvider', props: { server: 'http://localhost:4000/graphql', auth: false }, elements: [] }, { control: 'Text', props: { value: 'Real Data' } }, { control: 'ApolloProvider', props: { server: 'http://localhost:4000/graphql', auth: false, disable: false }, elements: withFakeData(null) }, { control: 'Text', props: { value: 'Fake Data' } }, { control: 'ApolloProvider', props: { server: 'http://localhost:4000/graphql', auth: false, disable: false }, elements: withFakeData(JSON.stringify({ mutate: [ { __typename: 'Person', name: 'Tomas', sex: 'Male' }, { __typename: 'Person', name: 'Valeria', sex: 'Female' } ] })) } ] }); const formData = {}; describe('Apollo', () => { describe('Mutation', () => { return { component: common_1.prepareComponent(formDefinition, schema, formData, { addEditor: true }) }; }); }); //# sourceMappingURL=apollo_mutation.test.js.map }); ___scope___.file("semantic/tests/common.jsx", function(exports, require, module, __filename, __dirname){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const react_1 = tslib_1.__importDefault(require("react")); const react_test_renderer_1 = tslib_1.__importDefault(require("react-test-renderer")); const propertyHandlers = tslib_1.__importStar(require("../../editor/properties/property_panel.handlers")); const semantic_ui_react_1 = require("semantic-ui-react"); const dynamic_form_1 = require("@tomino/dynamic-form"); const mobx_react_1 = require("mobx-react"); require("prismjs/themes/prism.css"); require("prismjs/themes/prism-dark.css"); const form_view_1 = require("../../form_view"); const catalogue_editor_1 = require("../../catalogue_editor"); const tool_box_1 = require("../../editor/toolbox/tool_box"); const form_view_2 = require("../form_view"); const catalogue_1 = require("../../catalogue"); const property_view_1 = require("../../editor/properties/property_view"); const error_boundary_1 = require("../../vanilla/error_boundary"); const context_1 = require("../../context"); const editor_context_1 = require("../../editor/editor_context"); const editor_state_1 = require("../../editor/editor_state"); const catalogue_2 = require("../../editor/catalogue"); const catalogue_editor_2 = require("../../editor/catalogue_editor"); const helpers_1 = require("../../helpers"); const mobx_1 = require("mobx"); const outline_view_1 = require("../../editor/outline/outline_view"); const editor_styles_1 = require("../../editor/editor_styles"); const componentCatalogue = helpers_1.merge(catalogue_1.catalogue, catalogue_2.catalogue); const editorComponentCatalogue = helpers_1.merge(catalogue_editor_1.catalogueEditor, catalogue_editor_2.catalogueEditor); exports.d = 2; function testStandard(formDefinition, schema, formData) { const component = prepareComponent(formDefinition, schema, formData, { addEditor: false, showReadOnly: false }); const wrapper = react_test_renderer_1.default.create(component()); require('chai') .expect(wrapper) .toMatchSnapshot(); } exports.testStandard = testStandard; function testReadonly(formDefinition, schema, formData) { const component = prepareComponent(formDefinition, schema, formData, { addEditor: false, showReadOnly: true, showStandard: false }); const wrapper = react_test_renderer_1.default.create(component()); require('chai') .expect(wrapper) .toMatchSnapshot(); } exports.testReadonly = testReadonly; function testEditor(formDefinition, schema, formData) { const component = prepareComponent(formDefinition, schema, formData, { addEditor: true, showReadOnly: false, showStandard: false, showProperties: false, showToolBox: false }); const wrapper = react_test_renderer_1.default.create(component()); require('chai') .expect(wrapper) .toMatchSnapshot(); } exports.testEditor = testEditor; function prepareComponent(formDefinition, schema, data, { addEditor = false, showToolBox = true, showReadOnly = false, showStandard = true, showProperties = true, showOutline = false, validate = false, handlers = {} } = {}) { return function component() { const form = new dynamic_form_1.FormModel(formDefinition, schema, data); let context = null; if (addEditor) { context = new editor_state_1.EditorState(componentCatalogue, editorComponentCatalogue, handlers); context.load({ form: form.formDefinition, schema }, false); if (validate) { form.validateWithReport(); } } return (react_1.default.createElement(TestComponent, { form: form, context: context, handlers: handlers, showToolbox: showToolBox, showOutline: showOutline, showStandard: showStandard, showReadOnly: showReadOnly, showProperties: showProperties })); }; } exports.prepareComponent = prepareComponent; let TestComponent = class TestComponent extends react_1.default.Component { render() { const { form, context, handlers } = this.props; return (react_1.default.createElement(error_boundary_1.ErrorBoundary, null, react_1.default.createElement(context_1.Context.Provider, { value: { auth: mobx_1.observable({ user: null }), alert: null, app: {}, authToken: null } }, react_1.default.createElement(semantic_ui_react_1.Segment, null, this.props.showStandard && (react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement(semantic_ui_react_1.Header, { content: "Standard", dividing: true }), react_1.default.createElement(form_view_2.SemanticFormView, { formElement: form, owner: form.dataSet, readOnly: false, handlers: handlers, catalogue: componentCatalogue }))), this.props.showReadonly && (react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement(semantic_ui_react_1.Header, { content: "Readonly", dividing: true }), react_1.default.createElement(form_view_2.SemanticFormView, { formElement: form, owner: form.dataSet, readOnly: true, handlers: handlers, catalogue: componentCatalogue }))), context && (react_1.default.createElement(editor_context_1.EditorContext.Provider, { value: context }, react_1.default.createElement(semantic_ui_react_1.Header, { content: "Editor", dividing: true }), react_1.default.createElement("div", { style: { display: 'flex' } }, this.props.showToolbox && (react_1.default.createElement("div", { style: { position: 'relative', flexBasis: '200px', paddingRight: '12px' } }, react_1.default.createElement(tool_box_1.ToolBox, { catalogue: catalogue_editor_1.catalogueEditor }))), this.props.showOutline && (react_1.default.createElement("div", { style: { position: 'relative', flexBasis: '200px', paddingRight: '12px' } }, react_1.default.createElement(editor_styles_1.List, null, react_1.default.createElement(outline_view_1.OutlineView, { catalogue: catalogue_editor_1.catalogueEditor })))), react_1.default.createElement("div", { style: { flex: '1' } }, react_1.default.createElement(form_view_1.FormView, { formElement: context.form, owner: form.dataSet, readOnly: false, handlers: handlers, catalogue: editorComponentCatalogue })), context && this.props.showProperties && (react_1.default.createElement("div", { style: { padding: '12px', flexBasis: '350px', minHeight: '600px', position: 'relative' } }, react_1.default.createElement(property_view_1.PropertyEditor, { handlers: propertyHandlers })))))))))); } }; TestComponent = tslib_1.__decorate([ mobx_react_1.observer ], TestComponent); exports.TestComponent = TestComponent; //# sourceMappingURL=common.js.map }); ___scope___.file("editor/properties/property_panel.handlers.jsx", function(exports, require, module, __filename, __dirname){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const helpers_1 = require("../../helpers"); const controlVisibility = (controls) => ({ owner }) => { return controls.indexOf(owner.control) >= 0; }; const controlInvisibility = (controls) => ({ owner }) => { return controls.indexOf(owner.control) === -1; }; const parentControlVisibility = (controls) => ({ owner }) => { return controls.indexOf(owner.parent.control) >= 0; }; exports.elementWithSource = ({ owner, context }) => { const editorElement = context.editorCatalogue.components[owner.control]; return editorElement ? editorElement.bound : false; }; exports.readonlyElements = controlInvisibility(['Text', 'Image', 'Value']); exports.textVisibleHandler = controlVisibility(['Text', 'Link']); exports.gridVisibleHandler = controlVisibility(['Grid']); exports.verticalVisibleHandler = controlVisibility(['Radio', 'Checkbox']); exports.parentGridVisibleHandler = parentControlVisibility(['Grid']); exports.parentStackVisibleHandler = parentControlVisibility(['Stack']); function clickApproveHandler() { } exports.clickApproveHandler = clickApproveHandler; function buildDatasetPaths(element, parent = '', parentPaths = '') { let result = []; let adjustedPath = parentPaths + '.'; for (let key of Object.keys(element.properties || {})) { let current = element.properties[key]; let parentPath = (parent ? parent + '.' : '') + key; if (parentPaths) { if (parentPath.substring(0, adjustedPath.length) === adjustedPath) { result.push(parentPath.replace(adjustedPath, '')); } } else { result.push(parentPath); } if (current.type === 'object') { result.push(...buildDatasetPaths(current, parentPath, parentPaths)); } else if (parentPaths && current.type === 'array' && current.items && current.items.type === 'object') { result.push(...buildDatasetPaths(current.items, parentPath, parentPaths)); } } return result; } exports.datasetSource = ({ owner, context }) => { let parent = owner.parent; let parentPath = ''; while (parent.parent != null) { parent = parent.parent; const control = context.editorCatalogue.components[parent.control]; if (control && control.valueProvider && parent.props && parent.props.value && parent.props.value.source) { parentPath = parent.props.value.source + (parentPath ? '.' : '') + parentPath; } } let schema = helpers_1.schemaDatasetToJS(context.schema); let paths = buildDatasetPaths(schema, '', parentPath); let all = buildDatasetPaths(schema); let array = [{ text: 'Item', value: '__item', disabled: false }]; const values = [{ text: 'None', value: '', disabled: false }] .concat(array) .concat(paths.sort().map(p => ({ text: p, value: p, disabled: false }))) .concat(parentPath !== '' ? [{ text: 'GLOBAL', value: '__global', disabled: true }].concat(all.sort().map(p => ({ text: p, value: '/' + p, disabled: false }))) : []); return values; }; exports.optionsHandlers = ({ context }) => { return [{ text: 'None', value: '' }].concat(context.projectHandlers.filter(h => h !== '__esModule').map(h => ({ value: h, text: h }))); }; //# sourceMappingURL=property_panel.handlers.js.map }); ___scope___.file("helpers.js", function(exports, require, module, __filename, __dirname){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const react_1 = tslib_1.__importDefault(require("react")); const mobx_1 = require("mobx"); const context_1 = require("./context"); function merge(...catalogues) { if (!catalogues.some(c => c.createComponent)) { throw new Error('The catalogue needs to define a createComponent function!'); } return { createComponent: catalogues.find(c => c.createComponent).createComponent, cssClass: catalogues.map(c => (c.cssClass ? c.cssClass + ' ' : '')).join(''), components: Object.assign({}, ...catalogues.map(c => c.components)) }; } exports.merge = merge; const composites = ['definitions', 'properties', 'items']; function schemaDatasetToJS(schema, faker = true) { let result = cleanSchemaDataset(mobx_1.toJS(schema), faker); if (!result) { return null; } if (result.type === 'object' && !result.properties) { result.properties = {}; } return result; } exports.schemaDatasetToJS = schemaDatasetToJS; function formDatasetToJS(form) { return cleanForm(mobx_1.toJS(form)); } exports.formDatasetToJS = formDatasetToJS; function cleanForm(form) { if (!form) { return null; } let result = {}; for (let key of Object.getOwnPropertyNames(form)) { if (key === 'parent' || key === 'isSelected') { continue; } let value = form[key]; if (Array.isArray(value)) { if (value.length > 0) { result[key] = value.map(v => (typeof v === 'object' ? cleanForm(v) : v)); } } else if (value != null && typeof value === 'object') { if (Object.getOwnPropertyNames(value).length > 0) { result[key] = cleanForm(value); } } else if (value) { result[key] = value; } } if (Object.keys(result).length === 0) { return undefined; } return result; } function cleanSchemaDataset(schema, faker) { const cleaned = {}; if (schema == null) { return; } let keys = Object.getOwnPropertyNames(schema || {}); for (let key of keys) { let value = schema[key]; if (value == null || value === '') { continue; } if (key === 'errors' || key === 'imports' || typeof schema[key] === 'function') { } else if (key === 'reference') { if (faker) { cleaned.properties = cleanSchemaDataset(schema.reference.properties, faker); } } else if (composites.indexOf(key) >= 0) { if ((faker || !schema.$ref) && value && Object.getOwnPropertyNames(value).length > 0) { cleaned[key] = cleanSchemaDataset(schema[key], faker); } } else if (key === '$enum') { if (schema.$enum.length > 0) { cleaned.enum = schema.$enum.map((e) => e.value); cleaned.$enum = schema.$enum.map((e) => ({ text: e.text, value: e.value, icon: e.icon })); } } else if (Array.isArray(value)) { if (value.length > 0) { cleaned[key] = value.map(v => (typeof v === 'object' ? cleanSchemaDataset(v, faker) : v)); } } else if (typeof value === 'object') { if (Object.getOwnPropertyNames(value).length > 0) { cleaned[key] = cleanSchemaDataset(value, faker); } } else { cleaned[key] = value; } } if (faker) { if (schema.properties) { cleaned.required = Object.getOwnPropertyNames(schema.properties); } } return cleaned; } function simpleHandle(props, handleName, context, args) { return handle(props.handlers, handleName, props.owner, props, props.formElement, context, args); } exports.simpleHandle = simpleHandle; function handle(handlers, handle, owner, props, formElement, context, args) { if (!handlers[handle]) { console.error('Handler does not exist: ' + handle); return; } return handle && handlers[handle] ? handlers[handle]({ owner, props, formElement, context, args }) : null; } exports.handle = handle; function bindGetValue(props, context) { return function (element, propName, defaultValue) { return getPropValue(props, element, context, propName, defaultValue); }; } exports.bindGetValue = bindGetValue; function getValues(props, ...propNames) { const context = react_1.default.useContext(context_1.Context); return propNames.map(p => getPropValue(props, props.formElement, context, p)); } exports.getValues = getValues; function getValue(props, context, propName, defaultValue, path = '') { return getPropValue(props, props.formElement, context, propName, defaultValue, path); } exports.getValue = getValue; function getPropValue(props, formElement, context, propName = undefined, defaultValue = undefined, path = '') { if (!propName) { propName = 'value'; } let prop = formElement.props ? formElement.props[propName] : null; if (prop == null) { return defaultValue; } if (typeof prop !== 'object' || Array.isArray(prop)) { return prop; } if (prop.value != null) { return prop.value; } else if (prop.handler) { return handle(props.handlers, prop.handler, props.owner, props, props.formElement, context); } else if (prop.source) { return props.owner.getValue ? props.owner.getValue(prop.source + path) : props.owner[prop.source]; } return defaultValue === null ? '' : defaultValue; } exports.getPropValue = getPropValue; function safeGetValue(props, context, propName = null, defaultValue = null) { let value = getValue(props, context, propName, defaultValue); if (value == null) { return value; } return value.toString(); } exports.safeGetValue = safeGetValue; function setValue(props, context, value, propName = undefined, path = '') { setPropValue(props, props.owner, context, value, propName, path); } exports.setValue = setValue; function setPropValue(props, owner, context, value, propName = undefined, path = '') { if (!propName) { propName = 'value'; } let prop = props.formElement.props[propName]; if (prop == null) { return; } if (typeof prop !== 'object') { owner.setValue(propName, value); } if (prop.parse) { handle(props.handlers, prop.parse, props.owner, props, props.formElement, context, { current: value, previous: getValue(props, context, propName) }); return; } if (prop.source) { owner.setValue(prop.source, path ? { [path.substring(1)]: value } : value, prop.validate ? props.handlers[prop.validate] : undefined); } else if (prop.handler) { handle(props.handlers, prop.handler, props.owner, props, context, value); } } exports.setPropValue = setPropValue; function prop(formElement, propName = 'value', type = 'source') { return formElement && formElement.props && formElement.props[propName] ? formElement.props[propName][type] : null; } exports.prop = prop; function isNullOrEmpty(val) { return val == null || val == ''; } exports.isNullOrEmpty = isNullOrEmpty; function valueSource(formElement) { return prop(formElement, 'value', 'source'); } exports.valueSource = valueSource; function valueHandler(formElement) { return prop(formElement, 'value', 'handler'); } exports.valueHandler = valueHandler; function value(formElement) { return prop(formElement, 'value', 'value'); } exports.value = value; function stripUid(obj) { if (obj.uid) { delete obj.uid; } for (let key of Object.keys(obj)) { let property = obj[key]; if (property.uid) { delete property.uid; } if (Array.isArray(property)) { for (let e of property) { stripUid(e); } } else if (typeof property === 'object') { stripUid(property); } } return obj; } function clone(dataset) { return stripUid(formDatasetToJS(dataset)); } exports.clone = clone; function parseProps(props, context) { const value = getValue(props, context, undefined, undefined) || ''; const controlSource = valueSource(props.formElement); let error = ''; let disabled = false; const label = getValue(props, context, 'label'); if (controlSource !== '' && props.owner.getSchema(controlSource, false) != null) { error = controlSource ? props.owner.getError(controlSource) : null; disabled = props.readOnly || (controlSource && props.owner.getSchema(controlSource).readOnly); } return { value, label, error, disabled }; } exports.parseProps = parseProps; function processControl(props, createCallback = true) { const context = react_1.default.useContext(context_1.Context); const { formElement, owner } = props; let handleChange; if (createCallback) { handleChange = react_1.default.useCallback((e, uiProps) => { const source = valueSource(formElement); if (!source) { return; } setValue(props, context, uiProps.checked != null ? uiProps.checked : uiProps.value != null ? uiProps.value : e.currentTarget.checked !== undefined ? e.currentTarget.checked : e.currentTarget.value); const changeHandler = props.formElement.props.onChange; if (changeHandler) { simpleHandle(props, changeHandler, context); } }, [context, formElement, props]); } const { error, value, disabled } = parseProps(props, context); const source = valueSource(formElement); return { context, owner, formElement, error, value, disabled, source, handleChange, controlProps: formElement.props }; } exports.processControl = processControl; //# sourceMappingURL=luis-client.js.map?tm=1561468800872 }); ___scope___.file("context.js", function(exports, require, module, __filename, __dirname){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const react_1 = tslib_1.__importDefault(require("react")); const mobx_1 = require("mobx"); exports.context = { alert: null, authToken: null, auth: mobx_1.observable({ user: null }), app: {} }; exports.Context = react_1.default.createContext(exports.context); //# sourceMappingURL=luis-client.js.map?tm=1560968381591 }); ___scope___.file("form_view.jsx", function(exports, require, module, __filename, __dirname){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const React = tslib_1.__importStar(require("react")); const mobx_react_1 = require("mobx-react"); const common_1 = require("./common"); const context_1 = require("./context"); const wrapper_1 = require("./wrapper"); const form = common_1.css ` background: white; label: form; `; const FormViewComponent = props => { const context = React.useContext(context_1.Context); const controlProps = props.formElement.props || {}; const { formElement, owner, extra } = controlProps.onCreate ? common_1.handle(props.handlers, controlProps.onCreate, props.owner, props, props.formElement, context) : props; if (!formElement.elements) { return React.createElement("div", null, "Form is empty \u00AF\\_(\u30C4)_/\u00AF"); } return (React.createElement(wrapper_1.DynamicComponent, Object.assign({}, props, { styleName: common_1.names(props.className, props.catalogue.cssClass, form) }), common_1.createComponents({ ...props, formElement, owner, extra }))); }; exports.FormView = mobx_react_1.observer(FormViewComponent); //# sourceMappingURL=form_view.js.map }); ___scope___.file("common.jsx", function(exports, require, module, __filename, __dirname){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const react_1 = tslib_1.__importDefault(require("react")); const classnames_1 = tslib_1.__importDefault(require("classnames")); const emotion_1 = require("emotion"); const mobx_1 = require("mobx"); const toolbelt_1 = require("@tomino/toolbelt"); const helpers_1 = require("./helpers"); var emotion_2 = require("emotion"); exports.css = emotion_2.css; var common_1 = require("./editor/themes/common"); exports.Theme = common_1.Theme; var classnames_2 = require("classnames"); exports.names = classnames_2.default; var context_1 = require("./context"); exports.Context = context_1.Context; var helpers_2 = require("./helpers"); exports.handle = helpers_2.handle; exports.getValue = helpers_2.getValue; exports.isNullOrEmpty = helpers_2.isNullOrEmpty; exports.prop = helpers_2.prop; exports.processControl = helpers_2.processControl; exports.valueSource = helpers_2.valueSource; var wrapper_1 = require("./wrapper"); exports.DynamicControl = wrapper_1.DynamicComponent; exports.paintProps = wrapper_1.paintProps; exports.select = emotion_1.css ` .react-select__control { border: 0px; border-radius: 0 !important; min-height: 23px; } .react-select__indicators { height: 23px; } .react-select__indicator { padding: 2px; } .react-select__value-container { height: 23px; > div { /* position: absolute; */ margin: 0px; padding: 0px; } } .react-select__single-value { margin-top: 0px; } .react-select__menu { border-radius: 0px; margin-top: 2px; } label: select; `; exports.fieldSet = emotion_1.css ` /* name: fieldset */ border: solid 1px #ddd; border-radius: 5px; background-color: #fafafa; legend { padding: 0px 6px; font-weight: bold; } `; exports.breakingLabel = emotion_1.css ` display: block; font-weight: bold; margin-top: 3px; margin-bottom: 3px; `; exports.nonBreakingLabel = emotion_1.css ` display: inline-block; font-weight: bold; padding-right: 6px; margin-top: 3px; margin-bottom: 3px; `; exports.fullWidth = emotion_1.css ` width: 100%; `; exports.noPadding = emotion_1.css ` padding: 0px !important; `; exports.marginLess = emotion_1.css ` margin: 0px !important; `; exports.pointer = emotion_1.css ` cursor: pointer !important; label: pointer; `; const missing = emotion_1.css ` background: red; padding: 3px; border-radius: 3px; font-weight: bold; color: white; `; function parseFromOwner(str, owner) { try { return toolbelt_1.interpolate(str, owner); } catch (ex) { return 'Error parsing string: ' + ex.message; } } exports.parseFromOwner = parseFromOwner; function sourceValue(prop) { return prop ? prop.source : null; } exports.sourceValue = sourceValue; function handlerValue(prop) { return prop ? prop.handler : null; } exports.handlerValue = handlerValue; function root(formElement) { let root = formElement; while (root.parent != null && (!root.pages || root.pages.length === 0)) { root = root.parent; } return root; } exports.root = root; const extraProps = ['editorLabel']; function cleanProps(props) { const result = {}; const js = toJS(props); for (let key of Object.keys(js)) { if (js[key] === '' || js[key] == null || js[key].length === 0 || extraProps.indexOf(key) >= 0) { continue; } result[key] = js[key]; } return result; } exports.cleanProps = cleanProps; function tryInterpolate(text, owner) { try { return toolbelt_1.interpolate(text, owner); } catch (ex) { return 'Error: ' + ex.message; } } exports.tryInterpolate = tryInterpolate; function useMergeState(initialState) { const [state, setState] = react_1.default.useState(initialState); const setMergedState = (newState) => setState((prevState) => Object.assign({}, prevState, newState)); return [state, setMergedState]; } exports.useMergeState = useMergeState; function createComponents(props, className = null) { if (!props.formElement.elements || props.formElement.elements.length === 0) { return undefined; } return props.formElement.elements.map((e, i) => (react_1.default.createElement(react_1.default.Fragment, { key: i }, props.catalogue.createComponent({ ...props, className: '' }, e, className)))); } exports.createComponents = createComponents; function createComponent1(props, formElement, context, className, extraProps) { if (!formElement || formElement.control === 'EditorCell') { return null; } if (props.catalogue.components[formElement.control] === undefined) { return react_1.default.createElement("div", { className: classnames_1.default(className, missing) }, formElement.control); } const hide = helpers_1.getPropValue(props, formElement, context, 'hidden', false); if (hide) { return null; } const controlDefinition = props.catalogue.components[formElement.control]; const Control = controlDefinition.Component || controlDefinition; Control.displayName = 'CreateComponentWrapper'; let renderedControl = (react_1.default.createElement(Control, { owner: props.owner, className: className, handlers: props.handlers, catalogue: props.catalogue, formElement: formElement, extra: { ...props.extra, ...extraProps }, dataProps: props.dataProps })); return renderedControl; } exports.createComponent1 = createComponent1; function toJS(obj) { return mobx_1.toJS(obj); } exports.toJS = toJS; function addProviders(mainForm, form) { let formElement = form; if (form !== mainForm) { let model = toJS(mainForm); let provider = model; while (provider.elements && provider.elements.length && provider.elements[0].control.indexOf('Provider') >= 0) { provider = provider.elements[0]; } if (provider != model) { provider.elements = [form]; formElement = model; } } return formElement; } exports.addProviders = addProviders; //# sourceMappingURL=common.js.map }); ___scope___.file("editor/themes/common.js", function(exports, require, module, __filename, __dirname){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); //# sourceMappingURL=common.js.map }); ___scope___.file("wrapper.jsx", function(exports, require, module, __filename, __dirname){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const react_1 = tslib_1.__importDefault(require("react")); const classnames_1 = tslib_1.__importDefault(require("classnames")); const context_1 = require("./context"); const emotion_1 = require("emotion"); const helpers_1 = require("./helpers"); const error_boundary_1 = require("./vanilla/error_boundary"); const common_1 = require("./common"); const mobx_react_1 = require("mobx-react"); const error_view_1 = require("./semantic/error_view"); exports.breakingLabel = emotion_1.css ` display: block; font-weight: bold; margin-top: 3px; margin-bottom: 3px; `; exports.nonBreakingLabel = emotion_1.css ` display: inline-block; font-weight: bold; padding-right: 6px; margin-top: 3px; margin-bottom: 3px; `; const defaultMouseEvents = ['onClick', 'onMouseOver', 'onMouseOut', 'onMouseDown', 'onMouseUp']; const defaultFormEvents = ['onChange', 'onInput']; const defaultKeyEvents = ['onKeyDown', 'onKeyUp']; const defaultEvents = [...defaultMouseEvents, ...defaultFormEvents, ...defaultKeyEvents]; const omitKeys = [ 'styleName', 'catalogue', 'children', 'extra', 'formElement', 'handlers', 'owner', 'className', 'readOnly', 'controlProps', 'control', 'ownAddCell', 'EmptyCell', 'Component', 'showError', 'staticContext', 'routerProps', 'dataProps', 'hideLabel' ]; function omit(obj, keys) { var target = {}; for (var i of Object.keys(obj)) { if (keys.indexOf(i) >= 0) continue; target[i] = obj[i]; } return Object.keys(target).length > 0 ? target : null; } const eventCache = []; function getCachedEvent(formElement, event, props, context, extra = null, events = null) { let current = eventCache.find(c => c.props === props); if (!current) { current = { props }; eventCache.push(current); } if (!current[event]) { current[event] = (e, ui) => { if (extra && extra[event]) { extra[event](e, ui); } if (events && events[event]) { events[event](e, ui); } if (formElement.props[event]) { helpers_1.handle(props.handlers, formElement.props[event], props.owner, props, context, { e, ui }); } }; } else { console.log('Using cached ...'); } return current[event]; } function paintProps(props, context, className, allowedProperties, componentProps) { let result = { id: props.formElement.uid, 'data-control': props.formElement.control }; if (props.formElement.props) { for (let prop of Object.keys(props.formElement.props)) { if (defaultEvents.indexOf(prop) >= 0) { result[prop] = getCachedEvent(props.formElement, prop, props, context, props.extra, componentProps); } else if (allowedProperties && allowedProperties.indexOf(prop) >= 0) { result[prop] = helpers_1.getValue(props, context, prop, undefined); result[prop] = helpers_1.isNullOrEmpty(result[prop]) ? undefined : result[prop]; } } } const controlCss = helpers_1.getValue(props, context, 'css'); if (props.className || controlCss || className || (props.extra && props.extra.className)) { result.className = classnames_1.default(result[className], className, props.className, props.extra ? props.extra.className : undefined, controlCss ? emotion_1.css([controlCss]) : undefined); } if (props.extra) { for (let prop of Object.keys(props.extra)) { if (!result[prop]) { result[prop] = props.extra[prop]; } } } if (componentProps) { for (let prop of Object.keys(componentProps)) { result[prop] = componentProps[prop]; } } return result; } exports.paintProps = paintProps; function renderEmptyCell(props, className) { return (props.formElement.elements.length === 0 && props.EmptyCell && react_1.default.createElement(props.EmptyCell, Object.assign({}, props, { className: className }))); } exports.renderEmptyCell = renderEmptyCell; exports.DynamicComponent = mobx_react_1.observer(props => { const context = react_1.default.useContext(context_1.Context); react_1.default.useEffect(() => () => { eventCache.splice(eventCache.findIndex(c => c.props == props), 1); }); let formElement = props.formElement; let currentProps = paintProps(props, context, props.styleName, props.controlProps, omit(props, omitKeys)); if (props.preserveProps) { currentProps = { ...currentProps, ...props }; } currentProps.key = formElement.uid; const label = helpers_1.getValue(props, context, 'label'); if (label) { const { onMouseOver, onMouseOut, className, ...rest } = currentProps; return (react_1.default.createElement(error_boundary_1.ErrorBoundary, null, react_1.default.createElement("div", { onMouseOver: onMouseOver, onMouseOut: onMouseOut, className: className, "data-control": currentProps['data-control'] + 'Wrapper' }, !props.hideLabel && (label || formElement.props.formAlign) && (react_1.default.createElement("label", { className: formElement.props.inline ? exports.nonBreakingLabel : exports.breakingLabel, htmlFor: formElement.uid }, label || '\xa0')), react_1.default.createElement(props.control || 'div', rest, props.children)), props.showError && (react_1.default.createElement(error_view_1.ErrorView, { inline: !!formElement.props.inline, owner: props.owner, source: helpers_1.valueSource(formElement) })))); } return (react_1.default.createElement(error_boundary_1.ErrorBoundary, null, react_1.default.createElement(props.control || 'div', currentProps, props.children || common_1.createComponents(props)), props.showError && (react_1.default.createElement(error_view_1.ErrorView, { inline: !!formElement.props.inline, owner: props.owner, source: helpers_1.valueSource(formElement) })))); }); exports.DynamicComponent.displayName = 'DynamicControl'; //# sourceMappingURL=wrapper.js.map }); ___scope___.file("vanilla/error_boundary.jsx", function(exports, require, module, __filename, __dirname){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const React = tslib_1.__importStar(require("react")); const semantic_ui_react_1 = require("semantic-ui-react"); const common_1 = require("../common"); const segment = common_1.css ` margin: 12px !important; `; const error = common_1.css ` overflow: auto; `; class ErrorBoundary extends React.Component { constructor(props) { super(props); this.state = { hasError: false }; } componentDidCatch(error, info) { this.setState({ hasError: true, error, info }); console.group('REACT ERROR'); console.error(error); console.error(info); console.groupEnd(); } render() { if (this.state.hasError) { return (React.createElement("div", { className: segment }, React.createElement(semantic_ui_react_1.Segment, { inverted: true, attached: "top", color: "red" }, "\uD83D\uDE22 ", this.state.error.message), React.createElement(semantic_ui_react_1.Segment, { attached: "bottom", className: error }, React.createElement("pre", null, this.state.error.stack), React.createElement("pre", null, this.state.info.componentStack)))); } return this.props.children; } } ErrorBoundary.displayName = 'ErrorBoundary'; exports.ErrorBoundary = ErrorBoundary; //# sourceMappingURL=error_boundary.js.map }); ___scope___.file("semantic/error_view.jsx", function(exports, require, module, __filename, __dirname){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const React = tslib_1.__importStar(require("react")); const mobx_react_1 = require("mobx-react"); const semantic_ui_react_1 = require("semantic-ui-react"); function renderError(error, pointing) { return (React.createElement(semantic_ui_react_1.Label, { pointing: pointing, color: "red" }, error)); } exports.renderError = renderError; const ErrorViewComponent = ({ owner, source, newLine, inline, pointing = true }) => { if (!owner.getError) { return null; } pointing = inline ? 'left' : pointing; let error = source && owner.getError(source); if (!error) { return null; } if (newLine) { return React.createElement("div", null, renderError(error, pointing)); } return renderError(error, pointing); }; ErrorViewComponent.displayName = 'ErrorView'; exports.ErrorView = mobx_react_1.observer(ErrorViewComponent); const ErrorLabelComponent = ({ error, pointing = true }) => { if (!error) { return null; } return (React.createElement(semantic_ui_react_1.Label, { color: "red", pointing: pointing }, error)); }; ErrorLabelComponent.displayName = 'ErrorLabel'; exports.ErrorLabel = mobx_react_1.observer(ErrorLabelComponent); //# sourceMappingURL=error_view.js.map }); ___scope___.file("catalogue_editor.js", function(exports, require, module, __filename, __dirname){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const catalogue_editor_1 = require("./vanilla/catalogue_editor"); const catalogue_editor_2 = require("./semantic/catalogue_editor"); const catalogue_editor_3 = require("./apollo/catalogue_editor"); const catalogue_editor_4 = require("./react-router/catalogue_editor"); const catalogue_editor_5 = require("./react-alert/catalogue_editor"); const catalogue_editor_6 = require("./semantic/auth-graphql-react-router/catalogue_editor"); const helpers_1 = require("./helpers"); exports.catalogueEditor = helpers_1.merge(catalogue_editor_1.catalogueEditor, catalogue_editor_2.catalogueEditor, catalogue_editor_3.catalogueEditor, catalogue_editor_4.catalogueEditor, catalogue_editor_5.catalogueEditor, catalogue_editor_6.catalogueEditor); //# sourceMappingURL=luis-client.js.map?tm=1561469333852 }); ___scope___.file("vanilla/catalogue_editor.js", function(exports, require, module, __filename, __dirname){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const formula_editor_1 = require("./formula_editor"); const repeater_editor_1 = require("./repeater_editor"); const text_editor_1 = require("./text_editor"); const grid_editor_1 = require("../layouts/grid_editor"); const stack_editor_1 = require("../layouts/stack_editor"); const form_editor_1 = require("../form_editor"); const auth_item_editor_1 = require("./auth_item_editor"); const flex_editor_1 = require("../layouts/flex_editor"); const layouts_common_editor_1 = require("../editor/layouts_common_editor"); exports.catalogueEditor = { createComponent: layouts_common_editor_1.createComponent, cssClass: '', components: { AuthItem: auth_item_editor_1.AuthItemEditor, Flex: flex_editor_1.FlexEditor, Form: form_editor_1.FormEditor, Formula: formula_editor_1.FormulaEditor, Grid: grid_editor_1.GridEditor, Image: text_editor_1.ImageEditor, Repeater: repeater_editor_1.RepeaterEditor, Link: text_editor_1.LinkEditor, LinkSelector: text_editor_1.LinkSelectorEditor, Stack: stack_editor_1.StackEditor, Text: text_editor_1.TextEditor } }; //# sourceMappingURL=catalogue_editor.js.map }); ___scope___.file("vanilla/formula_editor.jsx", function(exports, require, module, __filename, __dirname){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const formula_view_1 = require("./formula_view"); exports.FormulaEditor = { Component: formula_view_1.FormulaComponent, title: 'Formula', control: 'Formula', icon: 'code' }; //# sourceMappingURL=formula_editor.js.map }); ___scope___.file("vanilla/formula_view.jsx", function(exports, require, module, __filename, __dirname){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const React = tslib_1.__importStar(require("react")); const mobx_react_1 = require("mobx-react"); const common_1 = require("../common"); const helpers_1 = require("../helpers"); const context_1 = require("../context"); const formula = common_1.css ` padding: 9px 0px; `; exports.FormulaComponent = props => { const context = React.useContext(context_1.Context); const value = helpers_1.getValue(props, context); return (React.createElement("div", { className: "ui input" }, React.createElement("div", { className: formula }, value == null ? '#Formula' : value))); }; exports.FormulaView = { Component: mobx_react_1.observer(exports.FormulaComponent), toString: (_owner, props, context) => helpers_1.getValue(props, context) }; //# sourceMappingURL=formula_view.js.map }); ___scope___.file("vanilla/repeater_editor.jsx", function(exports, require, module, __filename, __dirname){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const React = tslib_1.__importStar(require("react")); const repeater_view_1 = require("./repeater_view"); const mobx_react_1 = require("mobx-react"); const editor_common_1 = require("../editor/editor_common"); const wrapper_1 = require("../wrapper"); const template_editor_1 = require("./template_editor"); const templates = [ { text: 'Component View', value: 'component' }, { text: 'View Template', value: 'view' }, { text: 'Edit Template', value: 'edit' }, { text: 'Add Template', value: 'add' } ]; const RepeaterComponent = (props) => { return (React.createElement(wrapper_1.DynamicComponent, Object.assign({}, props), React.createElement(template_editor_1.TemplateEditor, Object.assign({}, props, { extra: props.extra, Component: repeater_view_1.RepeaterView.Component, options: templates })))); }; exports.RepeaterEditor = { Component: mobx_react_1.observer(RepeaterComponent), title: 'Repeater', control: 'Repeater', ico