@saltcorn/mobile-builder 1.6.0-beta.9 → 1.6.0-rc.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/tests/bundle/any-bootstrap-theme.bundle.js +71 -0
- package/dist/tests/bundle/base_plugin.bundle.js +160 -0
- package/dist/tests/bundle/common_chunks.bundle.js +16869 -0
- package/dist/tests/bundle/data.bundle.js +2308 -0
- package/dist/tests/bundle/markup.bundle.js +547 -0
- package/dist/tests/bundle/sbadmin2.bundle.js +50 -0
- package/dist/tests/bundle/tabulator.bundle.js +113 -0
- package/dist/tests/versioncode.test.d.ts +2 -0
- package/dist/tests/versioncode.test.d.ts.map +1 -0
- package/dist/tests/versioncode.test.js +24 -0
- package/dist/tests/versioncode.test.js.map +1 -0
- package/dist/tests/webpack.test.d.ts +2 -0
- package/dist/tests/webpack.test.d.ts.map +1 -0
- package/dist/tests/webpack.test.js +73 -0
- package/dist/tests/webpack.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +9 -9
|
@@ -0,0 +1,547 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
|
|
3
|
+
* This devtool is neither made for production nor for readable output files.
|
|
4
|
+
* It uses "eval()" calls to create a separate source file in the browser devtools.
|
|
5
|
+
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
|
6
|
+
* or disable the default devtool with "devtool: false".
|
|
7
|
+
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
|
8
|
+
*/
|
|
9
|
+
(function webpackUniversalModuleDefinition(root, factory) {
|
|
10
|
+
if(typeof exports === 'object' && typeof module === 'object')
|
|
11
|
+
module.exports = factory();
|
|
12
|
+
else if(typeof define === 'function' && define.amd)
|
|
13
|
+
define([], factory);
|
|
14
|
+
else if(typeof exports === 'object')
|
|
15
|
+
exports["saltcorn"] = factory();
|
|
16
|
+
else
|
|
17
|
+
root["saltcorn"] = root["saltcorn"] || {}, root["saltcorn"]["markup"] = factory();
|
|
18
|
+
})(self, () => {
|
|
19
|
+
return /******/ (() => { // webpackBootstrap
|
|
20
|
+
/******/ "use strict";
|
|
21
|
+
/******/ var __webpack_modules__ = ({
|
|
22
|
+
|
|
23
|
+
/***/ "../saltcorn-markup/dist/builder.js"
|
|
24
|
+
/*!******************************************!*\
|
|
25
|
+
!*** ../saltcorn-markup/dist/builder.js ***!
|
|
26
|
+
\******************************************/
|
|
27
|
+
(module, __unused_webpack_exports, __webpack_require__) {
|
|
28
|
+
|
|
29
|
+
eval("{\n/**\n * @category saltcorn-markup\n * @module builder\n */\nconst tags = __webpack_require__(/*! ./tags */ \"../saltcorn-markup/dist/tags.js\");\nconst { p, div, i, label, text, button, a, h4, span, script, style, input, link, form, domReady, } = tags;\n/**\n * @param {object} rec\n * @param {object} csrf\n * @returns {object}\n */\nconst addCsrf = (rec, csrf) => {\n rec.csrfToken = csrf;\n return rec;\n};\n/**\n * @param {object} x\n * @returns {string}\n */\nconst encode = (x) => encodeURIComponent(JSON.stringify(x));\nmodule.exports = ({ options, context, action, stepName, layout, mode = \"show\", version_tag, }, csrfToken) => div(script({\n src: version_tag\n ? `/static_assets/${version_tag}/builder_bundle.js`\n : \"/builder_bundle.js\",\n}), script({\n src: version_tag\n ? `/static_assets/${version_tag}/ckeditor/ckeditor.js`\n : \"/ckeditor/ckeditor.js\",\n}), link({\n rel: \"stylesheet\",\n type: \"text/css\",\n media: \"screen\",\n href: version_tag\n ? `/static_assets/${version_tag}/fonticonpicker.react.css`\n : \"/fonticonpicker.react.css\",\n}), link({\n rel: \"stylesheet\",\n type: \"text/css\",\n media: \"screen\",\n href: version_tag\n ? `/static_assets/${version_tag}/saltcorn-builder.css`\n : \"/saltcorn-builder.css\",\n}), div({ id: \"saltcorn-builder\" }), form({ action, method: \"post\", id: \"scbuildform\" }, input({\n type: \"hidden\",\n name: \"contextEnc\",\n value: encodeURIComponent(JSON.stringify(context)),\n}), input({ type: \"hidden\", name: \"stepName\", value: stepName }), input({ type: \"hidden\", name: \"columns\", value: \"\" }), input({ type: \"hidden\", name: \"layout\", value: \"\" }), input({ type: \"hidden\", name: \"_csrf\", value: csrfToken })), script(`builder.renderBuilder(\n \"saltcorn-builder\", \n \"${encode(addCsrf(options, csrfToken))}\", \n \"${encode(layout || {})}\",\n ${JSON.stringify(mode)}\n );`), script(domReady(`enable_error_catcher();\n window.set_state_fields = ()=>{};\n window.set_state_field = ()=>{};\n window.pjax_to = ()=>{};\n if (typeof _sc_lightmode !== \"undefined\" && _sc_lightmode === \"dark\") {\n document.body.setAttribute(\"data-bs-theme\", \"dark\");\n document.body.classList.add(\"builder-dark\");\n }`)));\n//# sourceMappingURL=builder.js.map\n\n//# sourceURL=webpack://saltcorn/../saltcorn-markup/dist/builder.js?\n}");
|
|
30
|
+
|
|
31
|
+
/***/ },
|
|
32
|
+
|
|
33
|
+
/***/ "../saltcorn-markup/dist/form.js"
|
|
34
|
+
/*!***************************************!*\
|
|
35
|
+
!*** ../saltcorn-markup/dist/form.js ***!
|
|
36
|
+
\***************************************/
|
|
37
|
+
(module, __unused_webpack_exports, __webpack_require__) {
|
|
38
|
+
|
|
39
|
+
eval("{\n/**\n * @category saltcorn-markup\n * @module form\n */\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nconst tags = __webpack_require__(/*! ./tags */ \"../saltcorn-markup/dist/tags.js\");\nconst { p, div, i, label, text, text_attr, button, a, h5, span, script, domReady, ul, li, input, pre, select, textarea, option, escape, } = tags;\nconst renderLayout = __webpack_require__(/*! ./layout */ \"../saltcorn-markup/dist/layout.js\");\nconst helpers = __webpack_require__(/*! ./helpers */ \"../saltcorn-markup/dist/helpers.js\");\nconst { isdef, select_options, search_bar } = helpers;\nconst abstract_field_1 = __webpack_require__(/*! @saltcorn/types/model-abstracts/abstract_field */ \"../saltcorn-types/dist/model-abstracts/abstract_field.js\");\nconst layout_utils_1 = __importDefault(__webpack_require__(/*! ./layout_utils */ \"../saltcorn-markup/dist/layout_utils.js\"));\nconst { renderTabs } = layout_utils_1.default;\nconst isNode = typeof window === \"undefined\";\n/**\n * @param s\n * @returns\n */\nconst rmInitialDot = (s) => s && s[0] === \".\" ? s.replace(\".\", \"\") : s;\nconst buildActionAttribute = (form) => (isNode && !form.req?.smr) || form.isWorkflow\n ? form.action\n : \"javascript:void(0)\";\n/**\n * @param sIf\n * @returns\n */\nconst mkShowIf = (sIf) => encodeURIComponent(Object.entries(sIf)\n .map(([target, value]) => typeof value === \"boolean\"\n ? `e.data(\"data-closest-form-ns\").find('[data-fieldname=${rmInitialDot(target)}]').prop('checked')===${JSON.stringify(value)}`\n : Array.isArray(value)\n ? `[${value\n .map((v) => `'${v}'`)\n .join()}].includes(e.data(\"data-closest-form-ns\").find('[data-fieldname=${rmInitialDot(target)}]:not(:disabled)').val())`\n : target.includes(\"|_\")\n ? `splitTargetMatch(e.data(\"data-closest-form-ns\").find('[data-fieldname=${rmInitialDot(target).split(\"|_\")[0]}]:not(:disabled)').val(),'${value}', '${target}')`\n : `e.data(\"data-closest-form-ns\").find('[data-fieldname=${rmInitialDot(target)}]:not(:disabled)').val()==='${value}'`)\n .join(\" && \"));\n/**\n * @param formStyle\n * @returns\n */\nconst isHoriz = (formStyle) => formStyle === \"horiz\";\n/**\n * @param hdr\n * @param inner\n * @param error\n * @param fStyle\n * @param labelCols\n * @returns\n */\nconst formRowWrap = (hdr, inner, error = \"\", fStyle, labelCols) => div({\n class: [\n \"form-group\",\n isHoriz(fStyle) && hdr.input_type !== \"dynamic_fields\" && \"row\",\n ],\n \"data-disabled\": hdr.disabled ? \"true\" : false,\n ...(hdr.showIf && {\n style: \"display: none;\",\n \"data-show-if\": mkShowIf(hdr.showIf),\n }),\n}, hdr.input_type === \"section_header\"\n ? div({\n class: hdr.attributes?.secondColHoriz && isHoriz(fStyle)\n ? `offset-sm-${labelCols} col-sm-${12 - labelCols}`\n : `col-sm-12`,\n }, h5(text(hdr.label)), hdr.help && !hdr.sublabel ? helpLink(hdr.help) : \"\", \n //hdr.sublabel && p(i(hdr.sublabel)),\n mkSubLabelAndHelp(hdr))\n : hdr.input_type === \"dynamic_fields\"\n ? inner\n : hdr.type?.name === \"Bool\" && fStyle === \"vert\"\n ? div({ class: \"form-check\" }, inner, label({\n for: `input${text_attr(hdr.form_name)}`,\n }, text(hdr.label)), hdr.help && !hdr.sublabel ? helpLink(hdr.help) : \"\") + mkSubLabelAndHelp(hdr)\n : [\n hdr.label !== \" \" &&\n div({\n class: [\n hdr.type?.name === \"Bool\" &&\n isHoriz(fStyle) &&\n labelCols &&\n `col-sm-${labelCols} text-md-end`,\n hdr.type?.name !== \"Bool\" &&\n isHoriz(fStyle) &&\n labelCols &&\n `col-sm-${labelCols} text-md-end`,\n labelCols === 0 && \"d-none\",\n ],\n }, label({\n for: `input${text_attr(hdr.form_name)}`,\n }, text(hdr.label)), hdr.help && !hdr.sublabel ? helpLink(hdr.help) : \"\"),\n div({\n class: [\n hdr.type?.name === \"Bool\" &&\n isHoriz(fStyle) &&\n `col-${12 - labelCols}`,\n hdr.type?.name !== \"Bool\" &&\n isHoriz(fStyle) &&\n `col-sm-${12 - labelCols}`,\n ],\n }, inner, text(error), mkSubLabelAndHelp(hdr)),\n ]);\n/**\n * builds dropdown submenus to select a field,\n * joined from the table of the current view template\n * @param joinsFromTbl\n * @returns\n */\nconst buildFieldsMenu = (joinsFromTbl) => {\n return div({\n class: \"dropdown-menu\",\n }, ul({ class: \"ps-0 mb-0\" }, joinsFromTbl.map((field) => {\n return field.subFields && field.subFields.length > 0\n ? li({ class: \"dropdown-item dropend\" }, div({\n id: `_field_${field.fieldPath}`,\n class: \"dropdown-toggle field-dropdown-submenu\",\n \"data-bs-toggle\": \"dropdown\",\n \"aria-expanded\": false,\n role: \"button\",\n }, field.name), div({ class: \"dropdown-menu\" }, h5({\n class: \"join-table-header\",\n }, field.table), ul({ class: \"ps-0\" }, field.subFields.map((subOne) => {\n return subOne.subFields && subOne.subFields.length > 0\n ? li({ class: \"dropdown-item dropend\" }, div({\n id: `_field_${subOne.fieldPath}`,\n class: \"dropdown-toggle field-dropdown-submenu\",\n \"data-bs-toggle\": \"dropdown\",\n \"aria-expanded\": false,\n role: \"button\",\n }, subOne.name), div({ class: \"dropdown-menu\" }, h5({\n class: \"join-table-header\",\n }, subOne.table), ul({ class: \"ps-0\" }, subOne.subFields.map((subTwo) => {\n return (subTwo.subFields &&\n subTwo.subFields.length) > 0\n ? li({ class: \"dropdown-item dropend\" }, div({\n id: `_field_${subTwo.fieldPath}`,\n class: \"dropdown-toggle field-dropdown-submenu\",\n \"data-bs-toggle\": \"dropdown\",\n \"aria-expanded\": false,\n role: \"button\",\n }, subTwo.name), div({ class: \"dropdown-menu\" }, h5({\n class: \"join-table-header\",\n }, subTwo.table), ul({ class: \"ps-0\" }, subTwo.subFields.map((subThree) => {\n return li({\n class: \"dropdown-item field-val-item\",\n onclick: `join_field_clicked(this, '${subThree.fieldPath}')`,\n role: \"button\",\n }, subThree.name);\n }))))\n : li({\n class: \"dropdown-item field-val-item\",\n onclick: `join_field_clicked(this, '${subTwo.fieldPath}')`,\n role: \"button\",\n }, subTwo.name);\n }))))\n : li({\n class: \"dropdown-item field-val-item\",\n onclick: `join_field_clicked(this, '${subOne.fieldPath}')`,\n role: \"button\",\n }, subOne.name);\n }))))\n : li({\n class: \"dropdown-item field-val-item\",\n onclick: `join_field_clicked(this, '${field.fieldPath}')`,\n role: \"button\",\n }, field.name);\n })));\n};\n/**\n * builds dropdown submenus to select a field,\n * joined from another table to the table of the current view template\n * @param relationJoins\n * @returns\n */\nconst buildRelationsMenu = (relationJoins) => {\n return div({\n class: \"dropdown-menu\",\n }, ul({ class: \"ps-0 mb-0\" }, relationJoins.map((join) => {\n return li({ class: \"dropdown-item dropend\" }, div({\n id: `_relation_${join.relationPath}`,\n class: \"dropdown-toggle relation-dropdown-submenu\",\n \"data-bs-toggle\": \"dropdown\",\n \"aria-expanded\": false,\n role: \"button\",\n }, join.relationPath), div({ class: \"dropdown-menu\" }, ul({ class: \"ps-0 mb-0\" }, join.relationFields.map((fName) => {\n return li({\n class: \"dropdown-item field-val-item\",\n onclick: `join_field_clicked(this, '${join.relationPath}->${fName}')`,\n role: \"button\",\n }, fName);\n }))));\n })));\n};\n/**\n * build a menu with submenus to navigate the table schema and select a join field\n * @param hdr options for direct join or relation join fields\n * @returns\n */\nconst buildJoinFieldPicker = (hdr) => {\n const joinAndRelFields = hdr.attributes.join_field_options?.length > 0 &&\n hdr.attributes.relation_options?.length > 0;\n return (div({\n class: \"d-flex\",\n }, hdr.attributes.join_field_options?.length > 0\n ? div({ class: \" dropdown\" }, button({\n type: \"button\",\n class: \"btn btn-outline-primary dropdown-toggle\",\n \"data-bs-toggle\": \"dropdown\",\n \"aria-expanded\": false,\n }, \"Fields\"), buildFieldsMenu(hdr.attributes.join_field_options))\n : \"\", hdr.attributes.relation_options?.length > 0\n ? div({ class: `dropdown ${joinAndRelFields ? \"ps-2\" : \"\"}` }, button({\n type: \"button\",\n class: \"btn btn-outline-primary dropdown-toggle\",\n \"data-bs-toggle\": \"dropdown\",\n \"aria-expanded\": false,\n }, \"Relations\"), buildRelationsMenu(hdr.attributes.relation_options))\n : \"\", div({ class: \"flex-grow-1 ps-2\" }, input({\n id: \"inputjoin_field\",\n type: \"text\",\n class: \"form-control bg-white item-menu\",\n name: \"join_field\",\n \"data-fieldname\": \"join_field\",\n readonly: \"readonly\",\n }))) +\n script(domReady(`\n $(\".join-table-header\").click(function(e) {\n e.stopPropagation();\n });\n $(\".field-dropdown-submenu\").click(function(e) {\n e.stopPropagation();\n const clickedField = e.target.id.replace(\"_field_\", \"\");\n $(\".field-dropdown-submenu.show\").each(function (index) {\n const openField = this.id.replace(\"_field_\", \"\");\n if (clickedField.indexOf(openField) < 0) {\n $(this).dropdown(\"toggle\");\n }\n });\n });\n $(\".relation-dropdown-submenu\").click(function(e) {\n e.stopPropagation();\n $(\".relation-dropdown-submenu.show\").each(function (index) {\n if(this.id !== e.target.id)\n $(this).dropdown(\"toggle\");\n });\n });\n const joinItems = $(\".field-val-item\");\n if (joinItems.length > 0) joinItems[0].click(); \n `)));\n};\n/**\n * @param v\n * @param errors\n * @param nameAdd\n * @returns\n */\nconst innerField = (v, errors, nameAdd = \"\", classAdd = \"\") => (hdr) => {\n const name = hdr.form_name + nameAdd;\n const validClass = errors[name] ? `is-invalid ${classAdd}` : classAdd;\n const maybe_disabled = hdr.disabled ? \" disabled data-disabled\" : \"\";\n switch (hdr.input_type) {\n case \"join_field_picker\":\n return buildJoinFieldPicker(hdr);\n case \"fromtype\":\n return displayEdit(hdr, name, hdr.parent_field && v && isdef(v[hdr.parent_field]?.[hdr.name])\n ? v[hdr.parent_field]?.[hdr.name]\n : v && isdef(v[hdr.form_name])\n ? v[hdr.form_name]\n : hdr.default, validClass, v);\n case \"hidden\":\n return input({\n type: \"hidden\",\n class: `form-control ${validClass} ${hdr.class || \"\"}`,\n name: text_attr(name),\n ...(v\n ? {\n value: v[hdr.form_name]?.constructor?.name === \"PlainDate\"\n ? v[hdr.form_name].toISOString()\n : text_attr(v[hdr.form_name]),\n }\n : {}),\n });\n case \"select\":\n const opts = select_options(v, hdr, false, \"\", false);\n return select({\n class: `form-control form-select ${validClass} ${hdr.class || \"\"}`,\n \"data-fieldname\": text_attr(hdr.form_name),\n ...(hdr.attributes.onChange\n ? { onchange: hdr.attributes.onChange }\n : {}),\n ...(hdr.attributes.explainers\n ? {\n \"data-explainers\": encodeURIComponent(JSON.stringify(hdr.attributes.explainers)),\n }\n : {}),\n ...(hdr.attributes.autocomplete\n ? { autocomplete: hdr.attributes.autocomplete }\n : {}),\n ...(hdr.attributes.multiple ? { multiple: \"multiple\" } : {}),\n ...(hdr.attributes.size ? { size: hdr.attributes.size } : {}),\n ...(maybe_disabled\n ? { disabled: true, \"data-disabled\": \"true\" }\n : {}),\n name: text_attr(name),\n id: `input${text_attr(name)}`,\n }, opts);\n case \"textarea\":\n return textarea({\n class: `form-control ${validClass} ${hdr.class || \"\"}`,\n ...(maybe_disabled\n ? { disabled: true, \"data-disabled\": \"true\" }\n : {}),\n \"data-fieldname\": text_attr(hdr.form_name),\n name: text_attr(name),\n id: `input${text_attr(name)}`,\n }, text(v[hdr.form_name] || \"\"));\n case \"code\":\n return textarea({\n mode: (hdr.attributes || {}).mode || \"\",\n codepage: (hdr.attributes || {}).codepage || false,\n tableName: (hdr.attributes || {}).table || false,\n singleline: (hdr.attributes || {}).singleline ? \"yes\" : false,\n compact: (hdr.attributes || {}).compact ? \"yes\" : false,\n user: (hdr.attributes || {}).user ? \"yes\" : false,\n workflow: (hdr.attributes || {}).workflow ? \"yes\" : false,\n nojoins: (hdr.attributes || {}).nojoins ? \"yes\" : false,\n class: `to-code form-control ${validClass} ${hdr.class || \"\"}`,\n ...(maybe_disabled\n ? { disabled: true, \"data-disabled\": \"true\" }\n : {}),\n ...(hdr.attributes?.onChange\n ? { onchange: hdr.attributes?.onChange }\n : {}),\n \"data-fieldname\": text_attr(hdr.form_name),\n name: text_attr(name),\n spellcheck: undefined,\n \"is-expression\": [\"row\", \"query\"].includes((hdr.attributes || {}).expression_type)\n ? \"yes\"\n : false,\n id: `input${text_attr(name)}`,\n }, escape(v[hdr.form_name] || \"\"));\n case \"time_of_day\":\n return [\n input({\n class: `form-control ${validClass} ${hdr.class || \"\"}`,\n ...(maybe_disabled\n ? { disabled: true, \"data-disabled\": \"true\" }\n : {}),\n \"data-fieldname\": text_attr(hdr.form_name),\n name: text_attr(name),\n id: `input${text_attr(name)}`,\n type: \"text\",\n placeholder: \"Select time of day..\",\n readonly: true,\n value: v && isdef(v[hdr.form_name]) ? text_attr(v[hdr.form_name]) : \"\",\n }),\n script(domReady(`$('#input${text_attr(name)}').flatpickr({\n noCalendar: true,\n enableTime: true,\n time_24hr: true,\n timeFormat: 'H:i'\n });`)),\n ].join(\"\");\n case \"time_of_week\":\n const tow_val = v[hdr.form_name];\n let tow_d, tow_h, tow_m;\n if (tow_val) {\n [tow_d, tow_h, tow_m] = tow_val.split(\" \");\n }\n return [\n input({\n type: \"hidden\",\n name: text_attr(name),\n id: `inputh${text_attr(name)}`,\n \"data-fieldname\": text_attr(hdr.form_name),\n value: text_attr(tow_val),\n }),\n div({ class: \"d-flex\" }, [\n select({\n class: \"form-control form-select\",\n id: `input${text_attr(name)}__day`,\n onchange: `update_time_of_week('${text_attr(name)}')(this)`,\n }, [\n option({ selected: tow_d === \"Monday\" }, \"Monday\"),\n option({ selected: tow_d === \"Tuesday\" }, \"Tuesday\"),\n option({ selected: tow_d === \"Wednesday\" }, \"Wednesday\"),\n option({ selected: tow_d === \"Thursday\" }, \"Thursday\"),\n option({ selected: tow_d === \"Friday\" }, \"Friday\"),\n option({ selected: tow_d === \"Saturday\" }, \"Saturday\"),\n option({ selected: tow_d === \"Sunday\" }, \"Sunday\"),\n ]),\n input({\n class: `form-control ${validClass} ${hdr.class || \"\"}`,\n ...(maybe_disabled\n ? { disabled: true, \"data-disabled\": \"true\" }\n : {}),\n id: `input${text_attr(name)}__time`,\n type: \"text\",\n placeholder: \"Select time of day..\",\n readonly: true,\n value: tow_h && tow_m ? `${tow_h}:${tow_m}` : \"12:00\",\n }),\n ]),\n script(domReady(`$('#input${text_attr(name)}__time').flatpickr({\n noCalendar: true,\n enableTime: true,\n time_24hr: true,\n timeFormat: 'H:i',\n onChange: update_time_of_week('${text_attr(name)}')\n });`)),\n ].join(\"\");\n case \"date\":\n return [\n input({\n class: `form-control ${validClass} ${hdr.class || \"\"}`,\n ...(maybe_disabled\n ? { disabled: true, \"data-disabled\": \"true\" }\n : {}),\n \"data-fieldname\": text_attr(hdr.form_name),\n name: text_attr(name),\n id: `input${text_attr(name)}`,\n type: \"text\",\n placeholder: \"Select date..\",\n readonly: true,\n value: v && isdef(v[hdr.form_name]) ? text_attr(v[hdr.form_name]) : \"\",\n }),\n script(domReady(`$('#input${text_attr(name)}').flatpickr({ \n enableTime: true,\n dateFormat: \"Z\",\n time_24hr: true,\n altFormat: \"Y-m-d H:i\",\n altInput: true,\n ${hdr.attributes.minDate\n ? `minDate: new Date(\"${hdr.attributes.minDate.toISOString()}\"),`\n : \"\"}\n ${hdr.attributes.maxDate\n ? `maxDate: new Date(\"${hdr.attributes.maxDate.toISOString()}\"),`\n : \"\"}\n });`)),\n ].join(\"\");\n case \"file\":\n if (hdr.attributes && hdr.attributes.select_file_where) {\n hdr.input_type = \"select\";\n return innerField(v, errors, nameAdd)(hdr);\n }\n else\n return [\n v && isdef(v[hdr.form_name]) ? text(v[hdr.form_name]) : \"\",\n input({\n type: \"file\",\n class: `form-control-file ${validClass} ${hdr.class || \"\"}`,\n ...(maybe_disabled\n ? { disabled: true, \"data-disabled\": \"true\" }\n : {}),\n name: text_attr(name),\n accept: hdr.attributes?.accept,\n id: `input${text_attr(name)}`,\n }),\n ].join(\"\");\n case \"search\":\n return search_bar(name, v && v[hdr.form_name]);\n case \"section_header\":\n return \"\";\n case \"dynamic_fields\":\n return div({\n \"data-source-url\": hdr.attributes.getFields,\n \"data-relevant-fields\": (hdr.attributes.relevantFields || []).join(\",\"),\n });\n case \"custom_html\":\n return hdr.attributes.html;\n default:\n const the_input = input({\n type: hdr.input_type,\n class: `form-control ${validClass} ${hdr.class || \"\"}`,\n ...(maybe_disabled\n ? { disabled: true, \"data-disabled\": \"true\" }\n : {}),\n ...(hdr.attributes?.autocomplete\n ? { autocomplete: hdr.attributes.autocomplete }\n : {}),\n \"data-fieldname\": text_attr(hdr.form_name),\n name: name,\n id: `input${text_attr(name)}`,\n ...(v && isdef(v[hdr.form_name])\n ? { value: text_attr(v[hdr.form_name]) }\n : {}),\n ...(hdr.attributes?.autofocus ? { autofocus: true } : {}),\n });\n const inner = hdr.postText\n ? div({ class: \"input-group\" }, the_input, span({ class: \"input-group-text\", id: \"basic-addon2\" }, hdr.postText))\n : the_input;\n return inner;\n }\n};\n/**\n * @param v\n * @param errors\n * @param formStyle\n * @param labelCols\n * @returns\n */\nconst mkFormRow = (v, errors, formStyle, labelCols) => (hdr) => hdr.isRepeat && hdr.fancyMenuEditor\n ? mkFormRowForRepeatFancy(v, errors, formStyle, labelCols, hdr)\n : hdr.isRepeat\n ? mkFormRowForRepeat(v, errors, formStyle, labelCols, hdr)\n : mkFormRowForField(v, errors, formStyle, labelCols)(hdr);\n/**\n * @param v\n * @param errors\n * @param formStyle\n * @param labelCols\n * @param hdr\n * @returns\n */\nconst mkFormRowForRepeatFancy = (v, errors, formStyle, labelCols, hdr) => {\n // console.log(v);\n const fldHtmls = [];\n hdr.fields.forEach((f) => {\n f.class = `${f.class || \"\"} item-menu`;\n });\n for (let i = 0; i < hdr.fields.length; i++) {\n const field = hdr.fields[i];\n if (field?.attributes?.asideNext) {\n fldHtmls.push(mkFormRowAside({}, errors, \"vert\", labelCols, \"\", field, hdr.fields[i + 1]));\n i++;\n }\n else {\n fldHtmls.push(mkFormRow({}, errors, \"vert\", labelCols)(field));\n }\n }\n return div({ class: \"row w-100\" }, div({ class: \"col-6 mb-3\" }, h5(\"Columns\"), // todo i18n\n div(ul({ id: \"myEditor\", class: \"sortableLists list-group\" }))), div({ class: \"col-6 mb-3\", id: \"menuForm\" }, h5(\"Column configuration\"), fldHtmls.join(\"\"), button({ type: \"button\", id: \"btnUpdate\", class: \"btn btn-primary me-2\" }, \"Update\"), button({ type: \"button\", id: \"btnAdd\", class: \"btn btn-primary\" }, \"Add\")), script(domReady(`\n var iconPickerOptions = {searchText: \"Search icon...\", labelHeader: \"{0}/{1}\"};\n\n var sortableListOptions = {\n placeholderCss: {'background-color': \"#cccccc\"},\n \n };\n let editor = new MenuEditor('myEditor', \n { \n listOptions: sortableListOptions, \n iconPicker: iconPickerOptions,\n getLabelText: columnSummary,\n onUpdate: ()=>{\n apply_showif();\n repeaterCopyValuesToForm($('#menuForm').closest(\"form\"), editor);\n },\n labelEdit: 'Edit <i class=\"fas fa-edit clickable\"></i>',\n maxLevel: 0 // (Optional) Default is -1 (no level limit)\n // Valid levels are from [0, 1, 2, 3,...N]\n });\n editor.setForm($('#menuForm'));\n editor.setUpdateButton($('#btnUpdate'));\n editor.setData(${JSON.stringify(v[hdr.form_name])});\n $('.btnEdit').click(()=>{setTimeout(()=>{apply_showif();apply_showif();},0)});\n $('#btnAdd').click(function(){\n editor.add();\n repeaterCopyValuesToForm($('#menuForm').closest(\"form\"), editor)\n });\n\n $(\"#btnUpdate\").click(function(){\n editor.update();\n repeaterCopyValuesToForm($('#menuForm').closest(\"form\"), editor)\n });\n $('#menuForm').closest(\"form\").submit(function(event) {\n event.preventDefault(); //this will prevent the default submit\n\n repeaterCopyValuesToForm($('#menuForm').closest(\"form\"), editor)\n $(this).unbind('submit').submit(); // continue the submit unbind preventDefault\n })\n setTimeout(()=>repeaterCopyValuesToForm($('#menuForm').closest(\"form\"), editor,true), 0);\n `)));\n};\nconst repeater_icons = div({ class: \"float-end\" }, span({ onclick: \"rep_up(this)\" }, i({ class: \"fa fa-arrow-up pull-right\" })), \" \", span({ onclick: \"rep_del(this)\" }, i({ class: \"fa fa-times pull-right\" })), \" \", span({ onclick: \"rep_down(this)\" }, i({ class: \"fa fa-arrow-down pull-right\" })));\nconst repeater_adder = (form_name) => a({\n class: \"btn btn-sm btn-outline-primary mb-3\",\n href: `javascript:void(0)`,\n onclick: `add_repeater('${form_name}', this)`,\n title: \"Add\",\n}, i({ class: \"fas fa-plus\" }));\n/**\n * @param v\n * @param errors\n * @param formStyle\n * @param labelCols\n * @param hdr\n * @returns\n */\nconst mkFormRowForRepeat = (v, errors, formStyle, labelCols, hdr, nameAdd = \"\") => {\n const adder = repeater_adder(hdr.form_name);\n if (Array.isArray(v[hdr.form_name]) && v[hdr.form_name].length > 0) {\n return div({\n ...(hdr.showIf\n ? {\n \"data-show-if\": mkShowIf(hdr.showIf),\n style: \"display: none;\",\n }\n : {}),\n class: \"field-repeat-wrapper\",\n }, div({\n class: `repeats-${hdr.form_name}`,\n }, v[hdr.form_name].map((vi, ix) => {\n return div({ class: `form-repeat form-namespace repeat-${hdr.form_name}` }, repeater_icons, hdr.fields.map((f) => {\n if (f.isRepeat)\n return mkFormRowForRepeat(vi, errors, formStyle, labelCols, f, nameAdd + \"_\" + ix);\n return mkFormRowForField(vi, errors, formStyle, labelCols, nameAdd + \"_\" + ix)(f);\n }));\n })), adder);\n }\n else if (hdr.defaultNone) {\n const rndid = `fldrep${Math.floor(Math.random() * 16777215).toString(16)}`;\n let inner = div({\n class: `repeats-${hdr.form_name}`,\n }, div({ class: `form-repeat form-namespace repeat-${hdr.form_name}` }, repeater_icons, hdr.fields.map((f) => {\n if (f.isRepeat)\n return mkFormRowForRepeat(v, errors, formStyle, labelCols, f, nameAdd + \"_0\");\n return mkFormRowForField(v, errors, formStyle, labelCols, nameAdd + \"_0\")(f);\n }))) + adder;\n return div({\n \"data-show-if\": hdr.showIf ? mkShowIf(hdr.showIf) : undefined,\n id: rndid,\n }, pre({ class: \"d-none\" }, encodeURIComponent(inner)), a({\n class: \"btn btn-sm btn-outline-primary mb-3\",\n onclick: `$('#${rndid}').html(decodeURIComponent($('#${rndid} pre').text()))`,\n href: `javascript:void(0)`,\n title: \"Add\",\n }, i({ class: \"fas fa-plus\" })));\n }\n else {\n return div(hdr.showIf\n ? {\n \"data-show-if\": mkShowIf(hdr.showIf),\n style: \"display: none;\",\n }\n : {}, div({\n class: `repeats-${hdr.form_name}`,\n }, div({ class: `form-repeat form-namespace repeat-${hdr.form_name}` }, repeater_icons, hdr.fields.map((f) => {\n if (f.isRepeat)\n return mkFormRowForRepeat(v, errors, formStyle, labelCols, f, nameAdd + \"_0\");\n return mkFormRowForField(v, errors, formStyle, labelCols, nameAdd + \"_0\")(f);\n }))), adder);\n }\n};\n/**\n * @param hdr\n * @param name\n * @param v\n * @param extracls\n * @returns\n */\nconst displayEdit = (hdr, name, v, extracls, row) => {\n let fieldview;\n const attributes = hdr.attributes;\n if (hdr.disabled)\n attributes.disabled = true;\n if (hdr.fieldviewObj) {\n fieldview = hdr.fieldviewObj;\n }\n else if (hdr.fieldview && hdr.type && hdr.type.fieldviews[hdr.fieldview])\n fieldview = hdr.type.fieldviews[hdr.fieldview];\n else if (hdr.type && hdr.type.fieldviews) {\n const found = Object.entries(hdr.type.fieldviews).find(([nm, fv]) => fv.isEdit);\n if (found) {\n fieldview = found[1];\n }\n }\n if (!fieldview) {\n if (hdr.typename === \"FieldRepeat\")\n return;\n if (!hdr.type)\n throw new Error(`Unknown type ${hdr.typename} in field ${name}`);\n else\n throw new Error(`Cannot find fieldview for field ${name}`);\n }\n if (fieldview.isEdit) {\n //use default if required\n const v_use = hdr.required &&\n typeof attributes.default !== \"undefined\" &&\n typeof v === \"undefined\"\n ? attributes.default\n : v;\n return fieldview.run(name, v_use, attributes, extracls + \" \" + hdr.class, hdr.required, hdr, row);\n }\n else\n return fieldview.run(v, undefined, attributes);\n};\n/**\n * @param v\n * @param errors\n * @param formStyle\n * @param labelCols\n * @param nameAdd\n * @returns\n */\nconst mkFormRowForField = (v, errors, formStyle, labelCols, nameAdd = \"\") => (hdr) => {\n const name = hdr.form_name + nameAdd;\n const errorFeedback = errors[name]\n ? div({\n class: \"invalid-feedback\",\n }, text(errors[name]))\n : \"\";\n if (hdr.input_type === \"hidden\" && hdr.showIf) {\n return span({ \"data-show-if\": mkShowIf(hdr.showIf) }, innerField(v, errors, nameAdd)(hdr));\n }\n else if (hdr.input_type === \"hidden\") {\n return innerField(v, errors, nameAdd)(hdr);\n }\n else\n return formRowWrap(hdr, innerField(v, errors, nameAdd, hdr.type?.name === \"Bool\" && formStyle === \"vert\"\n ? \"form-check-input\"\n : \"\")(hdr), errorFeedback, formStyle, labelCols);\n};\nconst helpLink = ({ topic, context, dynContext, plugin }) => {\n let qs = \"\";\n Object.keys(context || {}).forEach((k) => {\n qs += `${encodeURIComponent(k)}=${encodeURIComponent(context[k])}&`;\n });\n const basepath = plugin ? `/admin/help-plugin/${plugin}` : \"/admin/help\";\n return a({\n href: `javascript:ajax_modal('${basepath}/${topic}?${qs}')`,\n \"data-dyn-href\": !!dynContext &&\n `\\`javascript:ajax_modal('${basepath}/${topic}?${qs}&${dynContext\n .map((k) => `${k}=\\${${k}}`)\n .join(\"&\")}')\\``,\n }, i({ class: \"fas fa-question-circle ms-1\" }));\n};\nconst mkSubLabelAndHelp = (hdr) => {\n return ((hdr.sublabel ? i(hdr.sublabel) : \"\") +\n (hdr.help && hdr.sublabel ? helpLink(hdr.help) : \"\")\n //(hdr.help && !hdr.sublabel ? \"Help\" + helpLink(hdr.help) : \"\")\n );\n};\n/**\n * @param v\n * @param errors\n * @param formStyle\n * @param labelCols\n * @param nameAdd\n * @returns\n */\nconst mkFormRowAside = (v, errors, formStyle, labelCols, nameAdd = \"\", hdr1, hdr2) => {\n const name = hdr1.form_name + nameAdd;\n const inner1 = innerField(v, errors, nameAdd, \"\")(hdr1);\n const inner2 = innerField(v, errors, nameAdd, \"\")(hdr2);\n const inputCols = (12 - labelCols * 2) / 2;\n const mkLabel = (hdr) => label({\n for: `input${text_attr(hdr.form_name)}`,\n }, text(hdr.label), hdr.help && !hdr.sublabel ? helpLink(hdr.help) : \"\");\n const outerAttributes = {\n class: [\"form-group row\"],\n \"data-disabled\": hdr1.disabled ? \"true\" : false,\n ...(hdr1.showIf && {\n style: \"display: none;\",\n \"data-show-if\": mkShowIf(hdr1.showIf),\n }),\n };\n if (formStyle === \"vert\")\n return div(outerAttributes, div({ class: `col-sm-6` }, div(mkLabel(hdr1)), div(inner1, mkSubLabelAndHelp(hdr1))), div({ class: `col-sm-6` }, div(mkLabel(hdr2)), div(inner2, mkSubLabelAndHelp(hdr2))));\n else\n return div(outerAttributes, div({ class: `col-sm-${labelCols} text-end` }, mkLabel(hdr1)), div({ class: `col-sm-${inputCols}` }, inner1, mkSubLabelAndHelp(hdr1)), div({ class: `col-sm-${labelCols} text-end` }, mkLabel(hdr2)), div({ class: `col-sm-${inputCols}` }, inner2, mkSubLabelAndHelp(hdr2)));\n /*formRowWrap(\n hdr,\n \n errorFeedback,\n formStyle,\n labelCols\n );*/\n};\n/**\n * @param form\n * @returns\n */\nconst renderFormLayout = (form) => {\n const blockDispatch = {\n join_field(segment) {\n if (segment.sourceURL)\n return div({\n class: segment.block ? \"d-block\" : \"d-inline\",\n \"data-source-url\": segment.sourceURL,\n });\n return \"\";\n },\n tabs(segment, go) {\n if (segment.tabsStyle !== \"Value switch\")\n return false;\n return segment.titles\n .map((t, ix) => div({\n style: \"display: none;\",\n \"data-show-if\": mkShowIf({\n [segment.field]: typeof t.value === \"undefined\" ? t : t.value,\n }),\n }, go(segment.contents[ix])))\n .join(\"\");\n },\n field_repeat({ field_repeat }, go) {\n const hdr = field_repeat;\n return div(hdr.showIf\n ? {\n \"data-show-if\": mkShowIf(hdr.showIf),\n style: \"display: none;\",\n }\n : {}, div({\n class: `repeats-${hdr.form_name}`,\n }, field_repeat.metadata?.rows && field_repeat.metadata?.rows.length > 0\n ? field_repeat.metadata.rows.map((row, ix) => {\n field_repeat.metadata.current_row = row;\n field_repeat.metadata.current_ix = ix;\n return div({\n class: `form-repeat form-namespace repeat-${hdr.form_name}`,\n }, repeater_icons, go(field_repeat.layout), field_repeat.fields\n .filter((f) => f.input_type === \"hidden\" && f.name)\n .map((f) => innerField(row, [], `_${ix}`)(f)));\n })\n : div({ class: `form-repeat form-namespace repeat-${hdr.form_name}` }, repeater_icons, go(field_repeat.layout))), repeater_adder(hdr.form_name));\n //mkFormRowForRepeat({}, [], \"\", 3, field_repeat)\n },\n field(segment) {\n const [repeat_name, field_name] = segment.field_name.split(\".\");\n const in_repeat = !!field_name;\n const fields_match = segment.field_name.includes(\".\")\n ? form.fields.find((f) => f.name === repeat_name && f.isRepeat)?.fields.filter((f) => f.name === field_name)\n : form.fields.filter((f) => f.name === segment.field_name);\n let field0;\n if (fields_match.length === 1)\n field0 = fields_match[0];\n if (fields_match.length > 1) {\n const samefv = fields_match.find((f) => \"fieldview\" in f && f.fieldview === segment.fieldview);\n if (samefv)\n field0 = samefv;\n else\n field0 = fields_match[0];\n }\n const repeater = in_repeat\n ? form.fields.find((f) => f.name === repeat_name)\n : null;\n const field = { ...field0 };\n if ((0, abstract_field_1.instanceOfField)(field) && field.input_type !== \"hidden\") {\n if (field.sourceURL)\n return div({ \"data-source-url\": field.sourceURL });\n if ((0, abstract_field_1.instanceOfField)(field0))\n field.form_name = field0.form_name;\n const errorFeedback = form.errors[field.name]\n ? div({\n class: \"invalid-feedback\",\n }, text(form.errors[field.name]))\n : \"\";\n if (segment.fieldview)\n field.fieldview = segment.fieldview;\n field.attributes = { ...field.attributes, ...segment.configuration };\n if (segment.onchange_action)\n field.attributes.onChange = `view_post(this, 'run_action', {onchange_action: '${segment.onchange_action}', onchange_field:'${field.name}', ...get_form_record(this) })`;\n field.attributes.isMobile = !isNode || form.req?.smr;\n return (innerField(in_repeat\n ? repeater?.metadata?.current_row || {}\n : form.values, form.errors, in_repeat\n ? `_${repeater?.metadata?.current_ix || 0}`\n : undefined)(field) + errorFeedback);\n }\n else\n return \"\";\n },\n action({ action_link, action_name, action_label, action_url, confirm, action_style, action_size, action_icon, action_class, configuration, action_bgcol, action_bordercol, action_textcol, spinner, auth_method, }) {\n const isMobile = !isNode || form.req?.smr;\n let style = action_style === \"btn-custom-color\"\n ? `background-color: ${action_bgcol || \"#000000\"};border-color: ${action_bordercol || \"#000000\"}; color: ${action_textcol || \"#000000\"}`\n : null;\n const confirmStr = confirm\n ? `if(confirm('${form.req?.__?.(\"Are you sure?\") || \"Are you sure?\"}'))`\n : \"\";\n const spinnerStr = spinner ? `spin_action_link(this);` : \"\";\n if (action_name && action_name.startsWith(\"Login with \")) {\n const method_label = action_name.replace(\"Login with \", \"\");\n const dest = form.req?.query?.dest\n ? `?dest=${encodeURIComponent(form.req.query.dest)}`\n : \"\";\n const url = auth_method?.postUsernamePassword\n ? `javascript:$('form[action=\\\"/auth/login\\\"]').attr('action','/auth/login-with/${method_label}${dest}').submit();`\n : `/auth/login-with/${method_label}${dest}`;\n return a({\n href: url,\n //TODO get url through form.req to reduce coupling\n class: [\n action_style !== \"btn-link\" &&\n `btn ${action_style || \"btn-primary\"} ${action_size || \"\"}`,\n ],\n style,\n }, action_icon ? i({ class: action_icon }) + \" \" : false, action_label || action_name);\n }\n const mkBtn = (onclick_or_type) => `<button ${onclick_or_type} class=\"${action_style === \"btn-link\"\n ? \"\"\n : `btn ${action_style || \"btn-primary\"} ${action_size || \"\"}`}${action_class ? \" \" + action_class : \"\"}\"${style ? ` style=\"${style}\"` : \"\"}${spinner && !onclick_or_type?.startsWith?.(\"on\")\n ? ` onclick=\"spin_action_link(this)\"`\n : \"\"}>${action_icon ? `<i class=\"${text(action_icon)}\"></i> ` : \"\"}${text(action_label || form.submitLabel || action_name || \"Save\")}</button>`;\n if (action_name === \"Delete\") {\n if (action_url) {\n const dest = configuration && configuration.after_delete_url;\n if (isNode && !form.req?.smr) {\n return mkBtn(`onClick=\"${spinnerStr}${confirmStr}ajax_post('${action_url}', {success:()=>{${form.req?.xhr ? `close_saltcorn_modal();` : \"\"}${dest\n ? `window.location.href='${dest}';`\n : form.req?.xhr\n ? `location.reload();`\n : `history.back();`}}})\" type=\"button\"`);\n }\n else {\n return mkBtn(`onClick=\"${spinnerStr}${confirmStr}local_post('${action_url}', {after_delete_url:'${dest || \"/\"}'})\" type=\"button\"`);\n }\n }\n else\n return \"\";\n }\n if (action_name === \"Reset\") {\n return mkBtn(`onClick=\"${spinnerStr}${confirmStr}reset_nearest_form(this)\" type=\"button\"`);\n }\n if (action_name === \"Cancel\") {\n return mkBtn(`onClick=\"${spinnerStr}${confirmStr}cancel_form($(this).closest('form'))\" type=\"button\"`);\n }\n if (action_name === \"GoBack\") {\n const isWeb = isNode && !form.req?.smr;\n const reload = configuration.reload_after ? \"reload_on_init();\" : \"\";\n const doNav = !configuration.steps || configuration.steps === 1\n ? isWeb\n ? \"history.back()\"\n : \"parent.saltcorn.mobileApp.navigation.goBack()\"\n : isWeb\n ? `history.go(${-1 * configuration.steps})`\n : `parent.saltcorn.mobileApp.navigation.goBack(${configuration.steps})`;\n if (configuration.save_first) {\n const complete = `()=>${doNav}`;\n return mkBtn(`onClick=\"${spinnerStr}${reload}saveAndContinueDelayed(this,${isMobile ? `'${form.action}', ${complete}` : complete})\" type=\"button\"`);\n }\n else\n return mkBtn(`onClick=\"${spinnerStr}${reload}${doNav}\" type=\"button\"`);\n }\n if (action_name === \"SaveAndContinue\") {\n return (mkBtn(`onClick=\"${spinnerStr}saveAndContinueDelayed(this,${isMobile ? `'${form.action}'` : undefined})\" type=\"button\"`) +\n script(\n // cant use currentScript in callback\n `((myScript)=>{` +\n domReady(`\n $(myScript).closest('form').find('input').keydown(function (e) {\n if (e.keyCode == 13) {\n e.preventDefault();\n saveAndContinueDelayed(myScript,${isMobile ? `'${form.action}'` : undefined});\n return false;\n }\n });`) +\n `})(document.currentScript)`));\n }\n if (action_name === \"UpdateMatchingRows\")\n return mkBtn(`onClick=\"${spinnerStr}updateMatchingRows(this, '${form.viewname}')\" type=\"button\"`);\n if (action_name === \"SubmitWithAjax\")\n return mkBtn(`onClick=\"${spinnerStr}submitWithAjax(this)\" type=\"button\"`);\n if (action_name === \"Login\") {\n return mkBtn(`onClick=\"${spinnerStr}login_from_edit_view(event)\" type=\"button\"`);\n }\n if (action_name === \"Sign up\") {\n return mkBtn(`onClick=\"${spinnerStr}signup_from_edit_view(event)\" type=\"button\"`);\n }\n if (action_link)\n return action_link;\n if ((isNode && !form.req?.smr) || form.isWorkflow) {\n const submitAttr = form.xhrSubmit || form.isWorkflow\n ? `onClick=\"${spinnerStr}${form.onSubmit ? `${form.onSubmit};` : \"\"}ajaxSubmitForm(this, true)\" type=\"button\"`\n : `onClick=\"${spinnerStr}sc_form_submit_in_progress()\" type=\"submit\"`;\n return mkBtn(submitAttr);\n }\n return mkBtn(`onClick=\"${spinnerStr}sc_form_submit_in_progress()\" type=\"submit\"`);\n },\n };\n const role = form.req?.user?.role_id || 100;\n return renderLayout({\n blockDispatch,\n layout: form.layout,\n role,\n req: form.req,\n is_owner: form.isOwner,\n hints: form.req?.layout_hints,\n });\n};\nconst splitSnippet = (form) => form.splitPaste\n ? script({ id: \"splitPasteActivator\" }, domReady(`$(\"script#splitPasteActivator\").closest('form').find('input').on('paste',split_paste_handler);`))\n : \"\";\n/**\n * @param form\n * @param csrfToken0\n * @returns\n */\nconst renderForm = (form, csrfToken0) => {\n if (typeof form === \"string\")\n return form;\n const csrfToken = csrfToken0 === false || csrfToken0 === \"\"\n ? csrfToken0\n : csrfToken0 || (form.req && form.req.csrfToken && form.req.csrfToken());\n if (form.layout)\n return mkFormWithLayout(form, csrfToken);\n else\n return mkForm(form, csrfToken, form.errors);\n};\n/**\n * @param form\n * @param csrfToken\n * @returns\n */\nconst mkFormWithLayout = (form, csrfToken) => {\n const hasFile = form.fields.some((f) => f.multipartFormData ||\n (f.isRepeat && f.fields.some((f2) => f2.multipartFormData)));\n const csrfField = `<input type=\"hidden\" name=\"_csrf\" value=\"${csrfToken}\">`;\n const extraValues = {};\n if (form.pk_name)\n if (!form.values[form.pk_name])\n extraValues._creating = true;\n else\n extraValues._creating = false;\n if (form.req?.user)\n extraValues.user = form.req.user;\n if (form.pk_name)\n if (!form.values[form.pk_name])\n extraValues._creating = true;\n else\n extraValues._creating = false;\n if (Object.keys(form.values || {}).length > 1) {\n const formVals = new Set(form.fields\n .filter((f) => {\n if (f.input_type === \"hidden\")\n return true;\n if (f.fieldviewObj)\n return f.fieldviewObj.isEdit;\n if (!f?.type?.fieldviews)\n return false;\n const fv = f.type.fieldviews[f.fieldview];\n if (!fv)\n return false;\n return fv.isEdit;\n })\n .map((f) => f.name));\n Object.entries(form.values).forEach(([k, v]) => {\n if (!formVals.has(k))\n extraValues[k] = v;\n });\n }\n const hasValues = Object.keys(extraValues).length > 0;\n const isMobile = !isNode || form.req?.smr;\n const mobileWorkflow = isMobile && form.isWorkflow;\n const top = `<form data-viewname=\"${form.viewname}\" action=\"${buildActionAttribute(form)}\"${form.onSubmit || form.xhrSubmit || mobileWorkflow\n ? ` onsubmit=\"${form.onSubmit || \"\"}${(form.xhrSubmit && !isMobile) || mobileWorkflow\n ? `;ajaxSubmitForm(this, true, event)`\n : \"\"}\" `\n : \"\"}${form.onChange ? ` onchange=\"${form.onChange}\"` : \"\"} class=\"form-namespace ${form.class || \"\"}\" method=\"${form.methodGET ? \"get\" : \"post\"}\"${hasFile ? ' encType=\"multipart/form-data\" accept-charset=\"utf-8\"' : \"\"}${hasValues\n ? ` data-row-values=\"${encodeURIComponent(JSON.stringify(extraValues))}\"`\n : \"\"}${form.id ? ` id=\"${form.id}\"` : \"\"}>`;\n const blurbp = form.blurb\n ? Array.isArray(form.blurb)\n ? form.blurb.join(\"\")\n : p(text(form.blurb))\n : \"\";\n const hiddens = form.fields\n .filter((f) => f.input_type === \"hidden\")\n .map((f) => innerField(form.values, form.errors)(f))\n .join(\"\");\n const fullFormError = form.errors._form\n ? `<div class=\"form-group row\">\n <div class=\"col-sm-12\">\n <p class=\"text-danger\">${form.errors._form}\n </p>\n </div>\n </div>`\n : \"\";\n return (blurbp +\n top +\n csrfField +\n hiddens +\n renderFormLayout(form) +\n fullFormError +\n splitSnippet(form) +\n \"</form>\");\n};\n/**\n * @param additionalButtons\n * @returns\n */\nconst displayAdditionalButtons = (additionalButtons, afterSave) => additionalButtons\n .filter((btn) => !!btn.afterSave === !!afterSave)\n .map((btn) => button({\n type: btn.type || \"button\",\n id: btn.id,\n class: `${btn.class}${afterSave ? \" ms-2\" : \"\"}`,\n ...(btn.onclick ? { onclick: btn.onclick } : {}),\n ...(btn.disabled ? { disabled: true } : {}),\n}, text(btn.label)))\n .join(\" \");\nconst mkFormContentNoLayout = (form, errors = {}) => {\n const tabHtmls = {};\n const fldHtmls = [];\n for (let i = 0; i < form.fields.length; i++) {\n const field = form.fields[i];\n let fldHtml;\n if (field?.attributes?.asideNext) {\n // console.log(\"AsideNext\", field);\n fldHtml = mkFormRowAside(form.values, errors, form.formStyle, typeof form.labelCols === \"undefined\" ? 2 : form.labelCols, \"\", field, form.fields[i + 1]);\n i++;\n }\n else {\n fldHtml = mkFormRow(form.values, errors, form.formStyle, typeof form.labelCols === \"undefined\" ? 2 : form.labelCols)(field);\n }\n if (field.tab) {\n if (!tabHtmls[field.tab])\n tabHtmls[field.tab] = [];\n tabHtmls[field.tab].push(fldHtml);\n }\n else\n fldHtmls.push(fldHtml);\n }\n const flds = fldHtmls.join(\"\");\n const tabsHtml = Object.keys(tabHtmls).length > 0\n ? renderTabs({\n contents: Object.values(tabHtmls),\n titles: Object.keys(tabHtmls),\n tabsStyle: form.tabs?.tabsStyle || \"Tabs\",\n independent: false,\n bodyClass: \"mt-2\",\n outerClass: \"mb-3\",\n startClosed: true,\n }, (s) => s)\n : \"\";\n return flds + tabsHtml;\n};\n/**\n * @param form\n * @param csrfToken\n * @param errors\n * @returns\n */\nconst mkForm = (form, csrfToken, errors = {}) => {\n const hasFile = form.fields.some((f) => f.multipartFormData);\n const isMobile = !isNode || form.req?.smr;\n const csrfField = csrfToken === false\n ? \"\"\n : `<input type=\"hidden\" name=\"_csrf\" value=\"${csrfToken}\">`;\n const top = `<form data-viewname=\"${form.viewname}\" ${form.id ? `id=\"${form.id}\" ` : \"\"}action=\"${buildActionAttribute(form)}\"${form.onSubmit || form.xhrSubmit\n ? ` onsubmit=\"${form.onSubmit || \"\"}${(form.xhrSubmit && !isMobile) || form.isWorkflow\n ? `;ajaxSubmitForm(this, true, event)`\n : \"\"}\"`\n : \"\"} ${form.onChange ? ` onchange=\"${form.onChange}\"` : \"\"}class=\"form-namespace ${form.class || \"\"}\" method=\"${form.methodGET ? \"get\" : \"post\"}\"${hasFile ? ' encType=\"multipart/form-data\" accept-charset=\"utf-8\"' : \"\"}>`;\n //console.log(form.fields);\n const content = mkFormContentNoLayout(form, errors);\n const blurbp = form.blurb\n ? Array.isArray(form.blurb)\n ? form.blurb.join(\"\")\n : p(text(form.blurb))\n : \"\";\n const fullFormError = errors._form\n ? `<div class=\"form-group row\">\n <div class=\"col-sm-12\">\n <p class=\"text-danger\">${errors._form}\n </p>\n </div>\n </div>`\n : \"\";\n const bot = `<div class=\"form-group row\">\n ${form.formStyle !== \"vert\" && !form.noLabelCols ? `<div class=\"col-sm-${form.labelCols || 2}\"></div>` : \"\"}\n <div class=\"col-sm-${form.formStyle === \"vert\" ? \"12\" : 12 - (form.labelCols || 2)}\">\n ${form.additionalButtons\n ? displayAdditionalButtons(form.additionalButtons, false)\n : \"\"}\n ${form.noSubmitButton\n ? \"\"\n : form.xhrSubmit || form.isWorkflow\n ? `<button type=\"button\" class=\"btn ${form.submitButtonClass || \"btn-primary\"}\" onClick=\"${form.onSubmit ? `${form.onSubmit};` : \"\"}ajaxSubmitForm(this, true)\">${text(form.submitLabel || \"Save\")}</button>`\n : `<button onClick=\"sc_form_submit_in_progress()\" type=\"submit\" class=\"btn ${form.submitButtonClass || \"btn-primary\"}\">${text(form.submitLabel || \"Save\")}</button>`}${form.additionalButtons\n ? displayAdditionalButtons(form.additionalButtons, true)\n : \"\"}\n </div>\n</div>`;\n return (blurbp +\n top +\n csrfField +\n content +\n fullFormError +\n bot +\n splitSnippet(form) +\n \"</form>\");\n};\nmodule.exports = { renderForm, mkFormContentNoLayout, mkForm, renderFormLayout };\n//# sourceMappingURL=form.js.map\n\n//# sourceURL=webpack://saltcorn/../saltcorn-markup/dist/form.js?\n}");
|
|
40
|
+
|
|
41
|
+
/***/ },
|
|
42
|
+
|
|
43
|
+
/***/ "../saltcorn-markup/dist/helpers.js"
|
|
44
|
+
/*!******************************************!*\
|
|
45
|
+
!*** ../saltcorn-markup/dist/helpers.js ***!
|
|
46
|
+
\******************************************/
|
|
47
|
+
(module, __unused_webpack_exports, __webpack_require__) {
|
|
48
|
+
|
|
49
|
+
eval("{\n/**\n * @category saltcorn-markup\n * @module helpers\n */\nconst tags = __webpack_require__(/*! ./tags */ \"../saltcorn-markup/dist/tags.js\");\nconst { a, text, div, input, text_attr, ul, li, span, label, i, button, option, } = tags;\n/**\n * checks if x is defined\n * @param {any} x\n * @returns {boolean}\n */\nconst isdef = (x) => typeof x !== \"undefined\";\n/**\n * @param {object|string} v\n * @param {object} hdr\n * @param {boolean} force_required\n * @param {string} neutral_label\n * @returns {string}\n */\nconst select_options = (v, hdr, force_required, neutral_label = \"\", sort = true) => {\n const options0 = hdr.options || [];\n const options1 = force_required\n ? options0.filter((o) => typeof o === \"string\" || typeof o === \"number\" ? o : o.value)\n : options0;\n let options = options1.map((o) => ({\n label: typeof o === \"string\" || typeof o === \"number\" ? o : o.label,\n value: typeof o === \"string\" || typeof o === \"number\" ? o : o.value,\n }));\n if (sort)\n options.sort((a, b) => a.value === \"\"\n ? -1\n : b.value === \"\"\n ? 1\n : (a.label?.toLowerCase?.() || a.label) >\n (b.label?.toLowerCase?.() || b.label)\n ? 1\n : -1);\n options = options.map((o) => o.value === \"\" ? { ...o, label: neutral_label || o.label } : o);\n const selected = typeof v === \"object\" ? (v ? v[hdr.name] : undefined) : v;\n const isSelected = (value) => !selected\n ? false\n : Array.isArray(selected)\n ? selected.includes(value)\n : `${value}` === `${selected}`;\n return options.map((o) => {\n const label = o.label;\n const value = o.value;\n return option({\n value: text_attr(value),\n ...(isSelected(value) ? { selected: true } : {}),\n }, text(label));\n });\n};\n/**\n *\n * @param {object} opts\n * @param {string} opts.name\n * @param {object} [opts.options]\n * @param {string} opts.value\n * @param {object} opts.inline\n * @param {string} opts.form_name\n * @param {...*} opts.rest\n * @returns {string}\n */\nconst radio_group = ({ name, options, value, inline, form_name, onChange, required, ...rest }) => div((options || [])\n .filter((o) => (typeof o === \"string\" ? o : o.value))\n .map((o, ix) => {\n const myvalue = typeof o === \"string\" ? o : o.value;\n const id = `input${text_attr(name)}${ix}`;\n return div({ class: [\"form-check\", inline && \"form-check-inline\"] }, input({\n class: [\"form-check-input\", rest.class],\n type: \"radio\",\n name,\n onChange,\n required: !!required,\n \"data-fieldname\": form_name,\n id,\n value: text_attr(myvalue),\n checked: myvalue === value,\n }), label({ class: \"form-check-label\", for: id }, typeof o === \"string\" ? o : o.label));\n})\n .join(\"\"));\nconst checkbox_group = ({ name, options, value, inline, form_name, onChange, ...rest }) => div((options || [])\n .filter((o) => (typeof o === \"string\" ? o : o.value))\n .map((o, ix) => {\n const myvalue = typeof o === \"string\" ? o : o.value;\n const id = `input${text_attr(name)}${ix}`;\n return div({ class: [\"form-check\", inline && \"form-check-inline\"] }, input({\n class: [\"form-check-input\", rest.class],\n type: \"checkbox\",\n name,\n onChange: `check_state_field(this)`,\n \"data-fieldname\": form_name,\n id,\n value: text_attr(myvalue),\n checked: Array.isArray(value)\n ? value.includes(myvalue)\n : myvalue === value,\n }), label({ class: \"form-check-label\", for: id }, typeof o === \"string\" ? o : o.label));\n})\n .join(\"\"));\n/**\n * @param {object} opts\n * @param {number} opts.current_page\n * @param {number} opts.pages\n * @param {function} opts.get_page_link\n * @param {boolean} opts.trailing_ellipsis\n * @returns {string}\n */\nconst pagination = ({ current_page, pages, get_page_link, trailing_ellipsis, noMaxPage, }) => {\n const from = Math.max(1, current_page - 3);\n const to = Math.min(pages, current_page + 3);\n var lis = [];\n if (from > 1) {\n lis.push(li({ class: `page-item` }, span({\n class: \"page-link link-style\",\n onclick: get_page_link(1),\n role: \"link\",\n }, 1)));\n lis.push(li({ class: `page-item` }, span({ class: \"page-link\" }, \"...\")));\n }\n for (let index = from; index <= to; index++) {\n lis.push(li({ class: [\"page-item\", index === current_page && \"active\"] }, span({\n class: \"page-link link-style\",\n onclick: get_page_link(index),\n role: \"link\",\n }, index)));\n }\n if (to < pages) {\n lis.push(li({ class: `page-item` }, span({ class: \"page-link\" }, \"...\")));\n !noMaxPage &&\n lis.push(li({ class: `page-item` }, span({\n class: \"page-link link-style\",\n onclick: get_page_link(pages),\n role: \"link\",\n }, pages)));\n }\n if (trailing_ellipsis)\n lis.push(li({ class: `page-item` }, span({ class: \"page-link\" }, \"...\")));\n return ul({ class: \"pagination\" }, lis);\n};\n/**\n * @param {string} name\n * @param {object} v\n * @param {object} param2\n * @returns {string}\n */\nconst search_bar = (name, v, { placeHolder, has_dropdown, contents, badges, stateField, onClick, autofocus, hints, } = {}) => {\n const rndid = Math.floor(Math.random() * 16777215).toString(16);\n const input_id = `input${text_attr(name)}_${rndid}`;\n const clickHandler = stateField\n ? `(function(v, that){v ? set_state_field('${stateField}', v, that):unset_state_field('${stateField}', that);})($('#${input_id}').val(), this)`\n : onClick || \"\";\n return div({\n class: `${hints?.searchBar?.iconButton === false ? \"\" : \"input-group\"}${hints?.searchBar?.containerClass\n ? ` ${hints?.searchBar?.containerClass}`\n : \"\"} search-bar`,\n id: `search-input-group-${rndid}`,\n }, hints?.searchBar?.iconButton === false\n ? i({ class: [\"fas fa-search\", hints?.searchBar?.iconClass] })\n : button({\n class: \"btn btn-outline-secondary search-bar\",\n onClick: clickHandler || undefined,\n type: \"submit\",\n id: \"button-search-submit\",\n }, i({ class: \"fas fa-search\" })), input({\n type: \"search\",\n class: `form-control search-bar${(badges && badges.length > 0) || has_dropdown ? \" br-none\" : \"\"}${hints?.searchBar?.inputClass ? ` ${hints?.searchBar?.inputClass}` : \"\"}`,\n ...(autofocus ? { autofocus: true } : {}),\n placeholder: placeHolder || \"Search for...\",\n id: input_id,\n name,\n ...(clickHandler\n ? { onsearch: clickHandler, onChange: clickHandler }\n : {}),\n ...(v ? { value: text_attr(v) } : {}),\n \"aria-label\": \"Search\",\n \"aria-describedby\": \"button-search-submit\",\n }), badges && badges.length > 0\n ? div({ class: \"input-group-text\" }, badges.map((b) => span({ class: \"badge bg-primary\" }, b.text, b.onclick\n ? a({ href: `javascript:${b.onclick}` }, i({ class: \"ms-1 fas fa-lg fa-times\" }))\n : \"\")))\n : null, has_dropdown\n ? button({\n class: \"btn btn-outline-secondary dropdown-toggle search-bar\",\n id: `dd${rndid}`,\n type: \"button\",\n \"data-bs-toggle\": \"dropdown\",\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": \"false\",\n onclick: `align_dropdown('${rndid}')`,\n })\n : null, has_dropdown\n ? div({\n class: \"dropdown-menu search-bar p-2\",\n id: `dm${rndid}`,\n \"aria-labelledby\": `dd${rndid}`,\n }, contents)\n : null);\n};\nconst dropdown_checkboxes = ({ btnClass, btnLabel, items = [], checked = {}, onChange, }) => div({ class: \"dropdown\" }, button({\n class: `btn ${btnClass || \"btn-primary\"} dropdown-toggle`,\n type: \"button\",\n id: \"multiSelectDropdown\",\n \"data-bs-toggle\": \"dropdown\",\n \"aria-expanded\": \"false\",\n}, btnLabel), ul({ class: \"dropdown-menu\", \"aria-labelledby\": \"multiSelectDropdown\" }, items.map((item) => li({ class: \"dropdown-item\" }, div({ class: \"form-check\" }, input({\n class: \"form-check-input\",\n type: \"checkbox\",\n value: typeof item === \"string\" ? item : item.value,\n checked: checked[typeof item === \"string\" ? item : item.value],\n onChange,\n}), label({ class: \"form-check-label\" }, typeof item === \"string\" ? item : item.label))))));\nconst HelpersExports = {\n isdef,\n select_options,\n search_bar,\n pagination,\n radio_group,\n checkbox_group,\n dropdown_checkboxes,\n};\nmodule.exports = HelpersExports;\n//# sourceMappingURL=helpers.js.map\n\n//# sourceURL=webpack://saltcorn/../saltcorn-markup/dist/helpers.js?\n}");
|
|
50
|
+
|
|
51
|
+
/***/ },
|
|
52
|
+
|
|
53
|
+
/***/ "../saltcorn-markup/dist/index.js"
|
|
54
|
+
/*!****************************************!*\
|
|
55
|
+
!*** ../saltcorn-markup/dist/index.js ***!
|
|
56
|
+
\****************************************/
|
|
57
|
+
(module, __unused_webpack_exports, __webpack_require__) {
|
|
58
|
+
|
|
59
|
+
eval("{\n/**\n * This is the saltcorn-markup package\n * @module\n */\nconst renderFormModule = __webpack_require__(/*! ./form */ \"../saltcorn-markup/dist/form.js\");\nconst { renderForm, mkFormContentNoLayout, mkForm, renderFormLayout } = renderFormModule;\nconst renderBuilder = __webpack_require__(/*! ./builder */ \"../saltcorn-markup/dist/builder.js\");\nconst renderWorkflow = __webpack_require__(/*! ./workflow */ \"../saltcorn-markup/dist/workflow.js\");\nconst mkTable = __webpack_require__(/*! ./table */ \"../saltcorn-markup/dist/table.js\");\nconst tabs = __webpack_require__(/*! ./tabs */ \"../saltcorn-markup/dist/tabs.js\");\nconst tags = __webpack_require__(/*! ./tags */ \"../saltcorn-markup/dist/tags.js\");\nconst helpers = __webpack_require__(/*! ./helpers */ \"../saltcorn-markup/dist/helpers.js\");\nconst { a, text, div, button, hr, time, i, input, text_attr, form, span } = tags;\nconst layoutUtils = __webpack_require__(/*! ./layout_utils */ \"../saltcorn-markup/dist/layout_utils.js\");\nconst { alert, toast, show_icon_and_label, validID } = layoutUtils;\n/**\n * @param {string} href\n * @param {string} s\n * @returns {string}\n */\nconst link = (href, s, attributes = {}) => a({ href: text(href), ...attributes }, text(s));\nconst buildButtonCallback = (reload_on_done, reload_delay) => {\n const isNode = typeof window === \"undefined\";\n if (isNode)\n return `ajax_post_btn(this, ${reload_on_done}, ${reload_delay})`;\n else\n return \"local_post_btn(this)\";\n};\n/**\n * @param href\n * @param s\n * @param csrfToken\n * @param opts\n * @param opts.btnClass\n * @param opts.onClick\n * @param opts.small\n * @param opts.style\n * @param opts.ajax\n * @param opts.reload_on_done\n * @param opts.reload_delay\n * @param opts.klass\n * @param opts.formClass\n * @param opts.spinner\n * @param opts.req\n * @param opts.confirm\n * @param opts.icon\n * @returns\n */\nconst post_btn = (href, s, csrfToken, { btnClass = \"btn-primary\", onClick, small, style, ajax, reload_on_done, reload_delay, klass = \"\", formClass, spinner, req, confirm, icon, title, body, } = {}) => form({\n action: text(href),\n method: \"post\",\n ...(formClass ? { class: formClass } : {}),\n}, [\n ajax ? \"\" : input({ type: \"hidden\", name: \"_csrf\", value: csrfToken }),\n ...(!body\n ? []\n : Object.entries(body).map(([k, v]) => input({ type: \"hidden\", name: k, value: v }))),\n button({\n ...(ajax ? { type: \"button\" } : { type: \"submit\" }),\n ...(onClick && ajax\n ? {\n onclick: `${spinner ? \"spin_action_link(this);\" : \"\"}${buildButtonCallback(reload_on_done, reload_delay)};${onClick}`,\n }\n : {\n ...(onClick\n ? {\n onclick: `${spinner ? \"spin_action_link(this);\" : \"\"}${onClick}`,\n }\n : {\n ...(ajax && confirm\n ? {\n onclick: `if(confirm('${req.__(\"Are you sure?\")}')) {${spinner ? \"spin_action_link(this);\" : \"\"}${buildButtonCallback(reload_on_done, reload_delay)}}`,\n }\n : {\n ...(ajax\n ? {\n onclick: `${spinner ? \"spin_action_link(this);\" : \"\"}${buildButtonCallback(reload_on_done, reload_delay)}`,\n }\n : {\n ...(confirm && spinner\n ? {\n onclick: `if(confirm('${req.__(\"Are you sure?\")}')){spin_action_link(this);return truel}else return false`,\n }\n : confirm\n ? {\n onclick: `return confirm('${req.__(\"Are you sure?\")}')`,\n }\n : {\n ...(spinner\n ? {\n onclick: \"spin_action_link(this);\",\n }\n : {}),\n }),\n }),\n }),\n }),\n }),\n class: `${klass} btn ${small ? \"btn-sm\" : \"\"} ${btnClass} d-inline-block`,\n ...(style ? { style } : {}),\n ...(title ? { title: text_attr(title) } : {}),\n }, show_icon_and_label(icon, s)),\n]);\n/**\n * UI Form for Delete Item confirmation\n * @param href - href\n * @param req - Request\n * @param what- Item\n * @returns return html form\n */\nconst post_delete_btn = (href, req, what) => form({ action: text(href), method: \"post\" }, input({ type: \"hidden\", name: \"_csrf\", value: req.csrfToken() }), button({\n type: \"submit\",\n class: \"btn btn-danger btn-sm\",\n onclick: `return confirm('${what\n ? req.__(\"Are you sure you want to delete %s?\", what)\n : req.__(\"Are you sure?\")}')`,\n}, i({ class: \"fas fa-trash-alt\" })));\n/**\n * @param href\n * @param s\n * @param req\n * @param confirm\n * @param what\n * @returns\n */\nconst post_dropdown_item = (href, s, req, confirm, what) => {\n const id = validID(href\n .split(\"/\")\n .join(\"\")\n .split(\" \")\n .join(\"\")\n .split(\"?\")\n .join(\"\")\n .split(\"=\")\n .join(\"\")\n .split(\"%\")\n .join(\"\"));\n const confirmationScript = confirm\n ? `if(confirm('${what\n ? req.__(\"Are you sure you want to delete %s?\", what)\n : req.__(\"Are you sure?\")}')) `\n : \"\";\n return [\n a({\n class: \"dropdown-item\",\n onclick: `${confirmationScript}$('#${id}').submit()`,\n }, s),\n form({\n id,\n action: text(href),\n method: \"post\",\n }, [\n input({\n type: \"hidden\",\n name: \"_csrf\",\n value: req.csrfToken(),\n }),\n ]),\n ].join(\"\");\n};\n/**\n * @param id\n * @param elems\n * @returns\n */\nconst settingsDropdown = (id, elems) => div({ class: \"dropdown\" }, button({\n class: \"btn btn-sm btn-outline-secondary\",\n \"data-boundary\": \"viewport\",\n type: \"button\",\n id,\n \"data-bs-toggle\": \"dropdown\",\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": \"false\",\n}, i({ class: \"fas fa-ellipsis-h\" })), div({\n class: \"dropdown-menu dropdown-menu-end\",\n \"aria-labelledby\": id,\n}, elems));\n/**\n * @param date\n * @param options\n * @returns\n */\nconst localeTime = (date, options = { hour: \"2-digit\", minute: \"2-digit\" }, locale = \"en\") => date\n ? time({\n datetime: date.toISOString(),\n \"locale-time-options\": encodeURIComponent(JSON.stringify(options)),\n }, date.toLocaleTimeString(locale || \"en\", options))\n : \"\";\n/**\n * @param date\n * @param options\n * @returns\n */\nconst localeDateTime = (date, options = {}, locale = \"en\") => date?.toISOString\n ? time({\n datetime: date.toISOString(),\n \"locale-options\": encodeURIComponent(JSON.stringify(options)),\n }, date.toLocaleString(locale || \"en\", options))\n : \"\";\n/**\n * @param date\n * @param options\n * @returns\n */\nconst localeDate = (date, options = {}, locale = \"en\") => date\n ? time({\n datetime: date.toISOString(),\n \"locale-date-options\": encodeURIComponent(JSON.stringify(options)),\n }, date.toLocaleDateString(locale || \"en\", options))\n : \"\";\nconst badge = (col, lbl) => `${span({ class: `badge bg-${col}` }, lbl)} `;\nmodule.exports = {\n mkTable,\n badge,\n renderForm,\n mkFormContentNoLayout,\n mkForm,\n renderFormLayout,\n renderWorkflow,\n settingsDropdown,\n renderBuilder,\n link,\n post_btn,\n post_delete_btn,\n post_dropdown_item,\n tabs,\n localeTime,\n localeDate,\n localeDateTime,\n div,\n a,\n i,\n button,\n input,\n hr,\n tags,\n alert,\n toast,\n helpers,\n};\n//# sourceMappingURL=index.js.map\n\n//# sourceURL=webpack://saltcorn/../saltcorn-markup/dist/index.js?\n}");
|
|
60
|
+
|
|
61
|
+
/***/ },
|
|
62
|
+
|
|
63
|
+
/***/ "../saltcorn-markup/dist/layout.js"
|
|
64
|
+
/*!*****************************************!*\
|
|
65
|
+
!*** ../saltcorn-markup/dist/layout.js ***!
|
|
66
|
+
\*****************************************/
|
|
67
|
+
(module, __unused_webpack_exports, __webpack_require__) {
|
|
68
|
+
|
|
69
|
+
eval("{\n/**\n * @category saltcorn-markup\n * @module layout\n */\nconst tags = __webpack_require__(/*! ./tags */ \"../saltcorn-markup/dist/tags.js\");\nconst { div, a, span, text, img, p, h1, h2, h3, h4, h5, h6, label, ul, button, li, i, genericElement, table, tr, td, tbody, iframe, script, text_attr, form, } = tags;\nconst { toast, breadcrumbs, renderTabs, show_icon, show_icon_and_label, } = __webpack_require__(/*! ./layout_utils */ \"../saltcorn-markup/dist/layout_utils.js\");\nconst base_types_1 = __webpack_require__(/*! @saltcorn/types/base_types */ \"../saltcorn-types/dist/base_types.js\");\nconst helpers = __webpack_require__(/*! ./helpers */ \"../saltcorn-markup/dist/helpers.js\");\nconst mjml_layout_1 = __webpack_require__(/*! ./mjml-layout */ \"../saltcorn-markup/dist/mjml-layout.js\");\nconst { search_bar } = helpers;\n/**\n * @param {any|any[]} [alerts]\n * @returns {boolean}\n */\nconst couldHaveAlerts = (alerts) => alerts || Array.isArray(alerts);\n/**\n * @param {string|any} body\n * @param {object[]} [alerts]\n * @returns {object}\n */\nconst makeSegments = (body, isWeb, alerts) => {\n const toastSegments = couldHaveAlerts(alerts) && !body.noWrapTop\n ? [\n {\n type: \"blank\",\n contents: div({\n id: \"toasts-area\",\n class: `toast-container position-fixed ${isWeb\n ? \"top-0 end-0 p-2\"\n : \"bottom-0 start-50 p-0 mobile-toast-margin\"} `,\n style: \"z-index: 9999;\",\n \"aria-live\": \"polite\",\n \"aria-atomic\": \"true\",\n }, (alerts || []).map((a) => toast(a.type, a.msg))),\n },\n ]\n : [];\n if (typeof body === \"string\")\n return {\n above: [{ type: \"blank\", contents: body }, ...toastSegments],\n };\n else if (body.above) {\n if (couldHaveAlerts(alerts))\n body.above.push(toastSegments[0]);\n return body;\n }\n else\n return {\n above: [body, ...toastSegments],\n };\n};\n/**\n *\n * @param {any} segment\n * @param {string} inner\n * @returns {div|span|string}\n */\nconst selfStylingTypes = new Set([\"card\", \"container\", \"besides\", \"image\"]);\nconst textStyleToArray = (textStyle) => Array.isArray(textStyle) ? textStyle : !textStyle ? [] : [textStyle];\nconst applyTextStyle = (segment, inner) => {\n const to_bs5 = (s) => (s === \"font-italic\" ? \"fst-italic\" : s);\n const styleArray = textStyleToArray(segment.textStyle);\n const hs = styleArray.find((s) => s[0] === \"h\");\n const klasses = styleArray.filter((s) => s[0] !== \"h\").map(to_bs5);\n const inline_h = segment.textStyle && hs && segment.inline;\n const style = segment.font\n ? { fontFamily: segment.font, ...segment.style }\n : segment.style || {};\n const hasStyle = Object.keys(style).length > 0 && !selfStylingTypes.has(segment.type);\n if (inline_h)\n style.display = \"inline-block\";\n if (segment.customClass && segment.type !== \"container\")\n klasses.push(segment.customClass);\n // Per-device font size: generate scoped responsive CSS\n let responsiveFontStyle = \"\";\n if (segment.mobileFontSize || segment.tabletFontSize) {\n const rndCls = `fs-${Math.floor(Math.random() * 16777215).toString(16)}`;\n klasses.push(rndCls);\n const desktopFs = style[\"font-size\"];\n let css = \"\";\n if (segment.mobileFontSize)\n css += `.${rndCls}{font-size:${segment.mobileFontSize} !important}`;\n if (segment.tabletFontSize)\n css += `@media(min-width:768px){.${rndCls}{font-size:${segment.tabletFontSize} !important}}`;\n if (desktopFs)\n css += `@media(min-width:992px){.${rndCls}{font-size:${desktopFs} !important}}`;\n responsiveFontStyle = `<style>${css}</style>`;\n }\n const klass = klasses.join(\" \");\n let result;\n switch (hs) {\n case \"h1\":\n result = h1({ style, class: klass }, inner);\n break;\n case \"h2\":\n result = h2({ style, class: klass }, inner);\n break;\n case \"h3\":\n result = h3({ style, class: klass }, inner);\n break;\n case \"h4\":\n result = h4({ style, class: klass }, inner);\n break;\n case \"h5\":\n result = h5({ style, class: klass }, inner);\n break;\n case \"h6\":\n result = h6({ style, class: klass }, inner);\n break;\n default:\n result = segment.block || (segment.display === \"block\" && hasStyle)\n ? div({ class: klass, style }, inner)\n : segment.textStyle || hasStyle || klass\n ? span({ class: klass, style }, inner)\n : inner;\n }\n return responsiveFontStyle + result;\n};\nconst responsiveSizeStyle = (segment, desktopStyle) => {\n const { mobileWidth, tabletWidth, mobileHeight, tabletHeight } = segment;\n if (!mobileWidth && !tabletWidth && !mobileHeight && !tabletHeight)\n return { className: \"\", styleTag: \"\" };\n const rndCls = `rs-${Math.floor(Math.random() * 16777215).toString(16)}`;\n let css = \"\";\n // mobile only (< 768px)\n const mobileRules = [];\n if (mobileWidth)\n mobileRules.push(`width:${mobileWidth} !important`);\n if (mobileHeight)\n mobileRules.push(`height:${mobileHeight} !important`);\n if (mobileRules.length)\n css += `@media(max-width:767.98px){.${rndCls}{${mobileRules.join(\";\")}}}`;\n // tablet only (768px - 991.98px)\n const tabletRules = [];\n if (tabletWidth)\n tabletRules.push(`width:${tabletWidth} !important`);\n if (tabletHeight)\n tabletRules.push(`height:${tabletHeight} !important`);\n if (tabletRules.length)\n css += `@media(min-width:768px) and (max-width:991.98px){.${rndCls}{${tabletRules.join(\";\")}}}`;\n return { className: rndCls, styleTag: css ? `<style>${css}</style>` : \"\" };\n};\n/**\n * @param {object} opts\n * @param {object} opts.blockDispatch\n * @param {object|string} opts.layout\n * @param {object} [opts.role]\n * @param {object[]} [opts.alerts]\n * @param {boolean} opts.is_owner\n * @returns {string}\n */\nconst render = ({ blockDispatch, layout, role, alerts, is_owner, req, hints = {}, }) => {\n //console.log(JSON.stringify(layout, null, 2));\n const isWeb = typeof window === \"undefined\" && !req?.smr;\n //const hints = blockDispatch?.hints || {};\n function wrap(segment, isTop, ix, inner) {\n const iconTag = segment.icon\n ? show_icon(segment.icon, \"\", true) + \" \"\n : \"\";\n if (isTop && blockDispatch && blockDispatch.wrapTop && !layout?.noWrapTop)\n return blockDispatch.wrapTop(segment, ix, inner);\n else\n return segment.labelFor\n ? label({ for: `input${text(segment.labelFor)}` }, applyTextStyle(segment, iconTag + inner))\n : applyTextStyle(segment, iconTag + inner);\n }\n function go(segment, isTop = false, ix = 0) {\n if (!segment)\n return \"\";\n if (typeof segment === \"object\" &&\n Object.keys(segment).length === 0 &&\n segment.constructor === Object)\n return \"\";\n if (typeof segment === \"string\")\n return wrap(segment, isTop, ix, segment);\n if (Array.isArray(segment))\n return wrap(segment, isTop, ix, segment.map((s, jx) => go(s, isTop, jx + ix)).join(\"\"));\n if (segment.minRole && role > segment.minRole)\n return \"\";\n if (segment.type && blockDispatch && blockDispatch[segment.type]) {\n const resp = blockDispatch[segment.type](segment, go);\n if (resp !== false)\n return wrap(segment, isTop, ix, resp);\n //else continue below\n }\n if (segment.type === \"blank\") {\n return wrap(segment, isTop, ix, segment.contents || \"\");\n }\n if (segment.type === \"breadcrumbs\") {\n return wrap(segment, isTop, ix, breadcrumbs(segment.crumbs || [], segment.right, segment.after, segment.center));\n }\n if (segment.type === \"view\") {\n return wrap(segment, isTop, ix, segment.contents || \"\");\n }\n if (segment.type === \"page\") {\n return wrap(segment, isTop, ix, segment.contents || \"\");\n }\n if (segment.type === \"pageHeader\") {\n return wrap(segment, isTop, ix, h1(segment.title) + p(segment.blurb || \"\"));\n }\n if (segment.type === \"table\") {\n const ntimes = (n, f) => {\n const res = [];\n for (let index = 0; index < n; index++) {\n res.push(f(index));\n }\n return res;\n };\n const { bs_style, bs_small, bs_striped, bs_bordered, bs_borderless, bs_wauto, customClass, } = segment;\n const tabHtml = table({\n class: !bs_style\n ? customClass\n : [\n \"table\",\n bs_small && \"table-sm\",\n bs_striped && \"table-striped\",\n bs_bordered && \"table-bordered\",\n bs_borderless && \"table-borderless\",\n bs_wauto && \"w-auto\",\n customClass,\n ],\n }, tbody(ntimes(segment.rows, (ri) => tr(ntimes(segment.columns, (ci) => td(go(segment.contents?.[ri]?.[ci])))))));\n return wrap(segment, isTop, ix, tabHtml);\n }\n if (segment.type === \"image\") {\n const srctype = segment.srctype || \"File\";\n const src = isWeb\n ? srctype === \"File\"\n ? `/files/serve/${encodeURIComponent(segment.fileid)}`\n : segment.url\n : segment.encoded_image\n ? segment.encoded_image\n : segment.url;\n const imageCfg = {\n class: [\n segment.style && segment.style.width ? null : \"w-100\",\n segment.customClass,\n ],\n alt: segment.alt,\n style: segment.style,\n srcset: segment.imgResponsiveWidths &&\n segment.fileid &&\n (srctype === \"File\" || srctype === \"Field\")\n ? segment.imgResponsiveWidths\n .split(\",\")\n .map((w) => `/files/resize/${w.trim()}/0/${encodeURIComponent(segment.fileid)} ${w.trim()}w`)\n .join(\",\")\n : undefined,\n src,\n };\n if (!isWeb && !segment.encoded_image) {\n imageCfg[\"mobile-img-path\"] =\n srctype === \"File\"\n ? segment.fileid\n : segment.url?.startsWith(\"/files/serve/\")\n ? segment.url.substr(13)\n : undefined;\n }\n return wrap(segment, isTop, ix, img(imageCfg));\n }\n if (segment.type === \"dropdown_menu\") {\n const rndid = `actiondd${Math.floor(Math.random() * 16777215).toString(16)}`;\n let style = segment.action_style === \"btn-custom-color\"\n ? `background-color: ${segment.action_bgcol || \"#000000\"};border-color: ${segment.action_bordercol || \"#000000\"}; color: ${segment.action_textcol || \"#000000\"}`\n : null;\n return div({ class: [\"dropdown\", !segment.block && \"d-inline\"] }, button({\n class: segment.action_style === \"btn-link\"\n ? \"btn btn-link\"\n : `btn ${segment.action_style || \"btn-primary\"} ${segment.action_size || \"\"} d-inline-block dropdown-toggle`,\n \"data-boundary\": \"viewport\",\n type: \"button\",\n id: rndid,\n \"data-bs-toggle\": \"dropdown\",\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": \"false\",\n style,\n }, show_icon_and_label(segment.action_icon, segment.label ||\n (!segment.action_icon || segment.action_icon == \"empty\"\n ? \"Actions\"\n : \"\"), segment.label && \"me-1\")), div({\n class: [\n \"dropdown-menu\",\n segment.menu_direction === \"end\" && \"dropdown-menu-end\",\n ],\n \"aria-labelledby\": rndid,\n }, div({ class: \"d-flex flex-column px-2\" }, go(segment.contents))));\n }\n if (segment.type === \"link\") {\n let style = segment.link_style === \"btn btn-custom-color\"\n ? `background-color: ${segment.link_bgcol || \"#000000\"};border-color: ${segment.link_bordercol || \"#000000\"}; color: ${segment.link_textcol || \"#000000\"}`\n : null;\n return wrap(segment, isTop, ix, a({\n ...(isWeb\n ? {\n href: segment.in_modal\n ? `javascript:ajax_modal('${segment.url}');`\n : segment.url,\n }\n : {\n onclick: segment.in_modal\n ? `javascript:mobile_modal('${segment.url}');`\n : `execLink('${segment.url}', '${segment.link_src || \"URL\"}')`,\n }),\n class: [\n segment.link_style || \"\",\n segment.link_size || \"\",\n segment.link_class || \"\",\n segment.link_style &&\n segment.link_style.includes(\"btn\") &&\n \"d-inline-block\",\n ],\n target: isWeb && segment.target_blank ? \"_blank\" : false,\n title: segment.link_title,\n rel: segment.nofollow ? \"nofollow\" : false,\n style,\n }, show_icon_and_label(segment.link_icon, segment.text)));\n }\n if (segment.type === \"card\") {\n const { vAlign, hAlign, bgType, gradDirection, gradStartColor, gradEndColor, bgFileId, imageSize, imageLocation, } = segment;\n const cardSize = responsiveSizeStyle(segment);\n return wrap(segment, isTop, ix, cardSize.styleTag +\n div({\n class: [\n \"card\",\n !(segment.class || \"\").includes(\"mt-\") &&\n !segment.style?.[\"margin-top\"] &&\n \"mt-4\",\n segment.shadow === false ? false : \"shadow\",\n segment.class,\n segment.url && \"with-link\",\n hints.cardClass,\n hAlign && `text-${hAlign}`,\n cardSize.className,\n ],\n ...(segment.id ? { id: segment.id } : {}),\n onclick: segment.url\n ? isWeb\n ? segment.url?.startsWith?.(\"javascript:\")\n ? text_attr(segment.url.replace(\"javascript:\", \"\"))\n : `location.href='${segment.url}'`\n : `execLink('${segment.url}')`\n : false,\n style: {\n ...segment.style,\n ...(bgType === \"Color\"\n ? { backgroundColor: segment.bgColor }\n : bgType === \"Gradient\"\n ? {\n backgroundImage: `linear-gradient(${gradDirection || 0}deg, ${gradStartColor}, ${gradEndColor});`,\n }\n : bgType === \"Image\" && bgFileId && imageLocation === \"Card\"\n ? {\n backgroundImage: `url('/files/serve/${bgFileId}')`,\n backgroundSize: imageSize === \"repeat\"\n ? undefined\n : imageSize || \"contain\",\n backgroundRepeat: imageSize === \"repeat\" ? imageSize : \"no-repeat\",\n }\n : {}),\n },\n }, bgType === \"Image\" &&\n bgFileId &&\n imageLocation === \"Top\" &&\n img({\n src: `/files/serve/${bgFileId}`,\n class: \"card-img-top\",\n }), segment.title &&\n span({ class: [\"card-header\", segment.titleRight && \"right-section\"] }, typeof segment.title === \"string\"\n ? hints.cardTitleWrapDiv\n ? div({ class: \"card-title\" }, genericElement(`h${hints.cardTitleHeader || 5}`, segment.title))\n : genericElement(`h${hints.cardTitleHeader || 5}`, {\n class: hints.cardTitleClass ||\n \"m-0 fw-bold text-primary d-inline\",\n }, segment.title)\n : segment.title, segment.titleRight\n ? div({ class: \"title-right\" }, go(segment.titleRight))\n : \"\", segment.subtitle ? span(segment.subtitle) : \"\", segment.titleAjaxIndicator &&\n span({\n class: \"float-end ms-auto sc-ajax-indicator\",\n style: { display: \"none\" },\n }, i({ class: \"fas fa-save\" })), segment.titleErrorInidicator &&\n span({\n class: \"float-end sc-error-indicator\",\n style: { display: \"none\", color: \"#ff0033\" },\n }, i({ class: \"fas fa-exclamation-triangle\" }))), segment.tabContents && // TODO remove all calls to this, use tab in content instead\n div({ class: \"card-header\" }, ul({ class: [\"nav nav-tabs card-header-tabs\", hints.tabClass] }, Object.keys(segment.tabContents).map((title, ix) => li({ class: \"nav-item\" }, a({\n class: [\"nav-link\", ix === 0 && \"active\"],\n href: `#tab-${title}`,\n \"data-bs-toggle\": \"tab\",\n role: \"tab\",\n }, title))))) +\n div({\n class: [\n \"card-body\",\n segment.bodyClass,\n segment.noPadding && \"p-0\",\n ],\n }, div({ class: \"tab-content\", id: \"myTabContent\" }, Object.entries(segment.tabContents).map(([title, contents], ix) => div({\n class: [\"tab-pane\", ix == 0 && \"show active\"],\n id: `tab-${title}`,\n }, contents)))), segment.contents &&\n (segment.contents.type === \"tabs\" &&\n segment.contents.tabsStyle !== \"Value switch\"\n ? renderTabs({\n tabClass: \"card-header-tabs\",\n headerWrapperClass: \"card-header\",\n contentWrapperClass: [\n \"card-body\",\n segment.bodyClass,\n segment.noPadding && \"p-0\",\n ],\n ...segment.contents,\n }, go, segment.serverRendered\n ? req?.query?.[segment.tabId || \"_tab\"]\n : undefined, hints)\n : div({\n class: [\n \"card-body\",\n segment.bodyClass,\n segment.noPadding && \"p-0\",\n ],\n style: {\n ...(bgType === \"Image\" &&\n bgFileId &&\n imageLocation === \"Body\"\n ? {\n backgroundImage: `url('/files/serve/${bgFileId}')`,\n backgroundSize: imageSize === \"repeat\"\n ? undefined\n : imageSize || \"contain\",\n backgroundRepeat: imageSize === \"repeat\" ? imageSize : \"no-repeat\",\n }\n : {}),\n },\n }, go(segment.contents))), (segment.hasFooter ||\n (segment.footer && segment.hasFooter !== false)) &&\n div({ class: \"card-footer\" }, go(segment.footer))));\n }\n if (segment.type === \"tabs\") {\n return wrap(segment, isTop, ix, renderTabs(segment, go, segment.serverRendered\n ? req?.query?.[segment.tabId || \"_tab\"]\n : undefined, hints, !isWeb));\n }\n if (segment.type === \"container\") {\n const { bgFileId, bgType, bgColor, vAlign, hAlign, block, display, imageSize, borderWidth, borderStyle, setTextColor, textColor, showForRole, hide, customClass, customId, customCSS, minScreenWidth, maxScreenWidth, showIfFormulaInputs, showIfFormulaJoinFields, show_for_owner, borderDirection, borderColor, url, hoverColor, gradStartColor, gradEndColor, gradDirection, fullPageWidth, overflow, rotate, style, transform, imgResponsiveWidths, htmlElement, animateName, animateDelay, animateDuration, animateInitialHide, } = segment;\n if (hide)\n return \"\";\n if (showForRole &&\n showForRole[role] === false &&\n !(show_for_owner && is_owner))\n return \"\";\n const renderBg = true;\n const sizeProp = (segKey, cssNm, unit) => typeof segment[segKey] === \"undefined\"\n ? \"\"\n : `${cssNm}: ${segment[segKey]}${unit || segment[segKey + \"Unit\"] || \"px\"};`;\n const ppCustomCSS = (s) => s ? s.split(\"\\n\").join(\"\") + \";\" : \"\";\n const baseDisplayClass = block === false ? \"inline-block\" : display ? display : \"block\";\n let displayClass = minScreenWidth\n ? `d-none d-${minScreenWidth}-${baseDisplayClass}`\n : baseDisplayClass === \"block\"\n ? false // no need\n : `d-${baseDisplayClass}`;\n if (maxScreenWidth)\n displayClass = `${displayClass} d-${maxScreenWidth}-none`;\n const allZero = (xs) => xs.every((x) => +x === 0);\n const ppBox = (what) => !segment[what] || allZero(segment[what])\n ? \"\"\n : `${what}: ${segment[what].map((p) => p + \"px\").join(\" \")};`;\n let flexStyles = \"\";\n Object.keys(style || {}).forEach((k) => {\n if (fullPageWidth && k === \"position\")\n return;\n flexStyles += `${k}:${style[k]};`;\n });\n const to_bs5 = (s) => {\n if (s === \"left\")\n return \"start\";\n if (s === \"right\")\n return \"end\";\n return s;\n };\n const hasImgBg = renderBg && bgType === \"Image\" && bgFileId;\n const useImgTagAsBg = hasImgBg && imageSize !== \"repeat\" && isTop;\n let image = undefined;\n if (hasImgBg && useImgTagAsBg) {\n const imgCfg = {\n class: `containerbgimage `,\n srcset: imgResponsiveWidths\n ? imgResponsiveWidths\n .split(\",\")\n .map((w) => `/files/resize/${w.trim()}/0/${bgFileId} ${w.trim()}w`)\n .join(\",\")\n : undefined,\n style: { \"object-fit\": imageSize || \"contain\" },\n alt: \"\",\n };\n if (isWeb)\n imgCfg.src = `/files/serve/${bgFileId}`;\n else\n imgCfg[\"mobile-img-path\"] = bgFileId;\n image = img(imgCfg);\n }\n const legacyBorder = borderWidth\n ? `border${borderDirection ? `-${borderDirection}` : \"\"}: ${borderWidth || 0}px ${borderStyle || \"none\"} ${borderColor || \"black\"};`\n : \"\";\n const transforms = { ...transform };\n if (rotate && rotate !== \"0\")\n transforms.rotate = `${rotate}deg`;\n let stransform = Object.keys(transforms).length\n ? \"transform: \" +\n Object.entries(transforms)\n .filter(([k, v]) => v !== \"\")\n .map(([k, v]) => `${k}(${v})`)\n .join(\" \")\n : \"\";\n const containerSize = responsiveSizeStyle(segment, {\n width: segment.width ? `${segment.width}${segment.widthUnit || \"px\"}` : undefined,\n height: segment.height ? `${segment.height}${segment.heightUnit || \"px\"}` : undefined,\n });\n return wrap(segment, isTop, ix, containerSize.styleTag +\n genericElement(htmlElement || \"div\", {\n class: [\n customClass || false,\n hAlign && `text-${to_bs5(hAlign)}`,\n vAlign === \"middle\" && \"d-flex align-items-center\",\n vAlign === \"bottom\" && \"d-flex align-items-end\",\n vAlign === \"middle\" &&\n hAlign === \"center\" &&\n \"justify-content-center\",\n displayClass,\n url && \"with-link\",\n hoverColor && `hover-${hoverColor}`,\n fullPageWidth && \"full-page-width\",\n containerSize.className,\n ],\n id: customId || undefined,\n onclick: segment.url\n ? isWeb\n ? segment.url?.startsWith?.(\"javascript:\")\n ? text_attr(segment.url.replace(\"javascript:\", \"\"))\n : `location.href='${segment.url}'`\n : `execLink('${segment.url}')`\n : false,\n \"data-animate\": animateName && animateName !== \"None\" ? animateName : undefined,\n \"data-animate-delay\": animateDelay || undefined,\n \"data-animate-initial-hide\": animateInitialHide || undefined,\n \"data-animate-duration\": animateDuration || undefined,\n style: `${flexStyles}${ppCustomCSS(customCSS || \"\")}${sizeProp(\"minHeight\", \"min-height\")}${sizeProp(\"height\", \"height\")}${sizeProp(\"width\", \"width\")}${sizeProp(\"widthPct\", \"width\", \"%\")}${legacyBorder}${sizeProp(\"borderRadius\", \"border-radius\")}${ppBox(\"padding\")}${ppBox(\"margin\")}${overflow && overflow !== \"visible\"\n ? ` overflow: ${overflow};`\n : \"\"} ${hasImgBg && !useImgTagAsBg\n ? ` ${isWeb\n ? `background-image: url('/files/serve/${bgFileId}');`\n : \"\"} background-size: ${imageSize === \"repeat\" ? \"auto\" : imageSize || \"contain\"}; background-repeat: ${imageSize === \"repeat\" ? \"repeat\" : \"no-repeat\"};`\n : \"\"} ${renderBg && bgType === \"Color\"\n ? `background-color: ${bgColor};`\n : \"\"} ${renderBg && bgType === \"Gradient\"\n ? `background-image: linear-gradient(${gradDirection || 0}deg, ${gradStartColor}, ${gradEndColor});`\n : \"\"} ${setTextColor ? `color: ${textColor};` : \"\"}${stransform}${showIfFormulaInputs ? ` display: none;` : ``}`,\n ...(showIfFormulaInputs\n ? {\n \"data-show-if\": encodeURIComponent(`showIfFormulaInputs(e, '${showIfFormulaInputs.replaceAll(\"'\", \"\\\\'\")}')`),\n }\n : {}),\n ...(showIfFormulaJoinFields\n ? {\n \"data-show-if-joinfields\": encodeURIComponent(JSON.stringify(showIfFormulaJoinFields)),\n }\n : {}),\n ...(!isWeb && hasImgBg && !useImgTagAsBg\n ? { \"mobile-bg-img-path\": bgFileId }\n : {}),\n }, hasImgBg && useImgTagAsBg && image, go(segment.contents)));\n }\n if (segment.type === \"line_break\") {\n if (segment.hr)\n return \"<hr>\";\n if (segment.page_break_after)\n return '<div style=\"break-after:page\"></div>';\n return \"<br />\";\n }\n if (segment.type === \"search_bar\") {\n return form({\n action: \"/search\",\n method: \"get\",\n }, search_bar(\"q\", \"\", {\n has_dropdown: segment.has_dropdown,\n autofocus: segment.autofocus,\n contents: go(segment.contents),\n hints,\n }));\n }\n if (segment.above) {\n return segment.above\n .map((s, segmentIx) => go(s, isTop, segmentIx + ix))\n .join(\"\");\n }\n else if (segment.besides) {\n const colsSize = responsiveSizeStyle(segment);\n const defwidth = Math.round(12 / segment.besides.length);\n //legacy, for empty (null) in the columns\n const isOneCard = (segs) => segs.length === 1 && segs[0].type === \"card\";\n const onlyCard = (s) => (s && s.type === \"card\") ||\n (s.above && isOneCard(s.above.filter(Boolean)));\n const cardDeck = segment.besides\n .filter(Boolean) // allow blank\n .every(onlyCard);\n let markup;\n if (cardDeck) {\n const sameWidths = !segment.widths ||\n segment.widths.every((w) => w === defwidth);\n markup = colsSize.styleTag + div({\n class: [\n \"row\",\n segment.class,\n segment.customClass,\n sameWidths && `row-cols-1 row-cols-md-${segment.besides.length}`,\n typeof segment.gx !== \"undefined\" &&\n segment.gx !== null &&\n `gx-${segment.gx}`,\n typeof segment.gy !== \"undefined\" &&\n segment.gy !== null &&\n `gy-${segment.gy}`,\n !segment.style?.[\"margin-bottom\"] && `mb-3`,\n colsSize.className,\n ],\n style: segment.style,\n }, segment.besides.map((t, ixb) => {\n if (!t)\n return \"\"; //blank col\n const newt = { ...t };\n newt.class = t.class\n ? Array.isArray(t.class)\n ? [\"h-100\", ...t.class]\n : t.class + \" h-100\"\n : \"h-100\";\n return div({\n class: sameWidths\n ? \"col\"\n : `col-${segment.breakpoint\n ? segment.breakpoint + \"-\"\n : segment.breakpoints && segment.breakpoints[ixb]\n ? segment.breakpoints[ixb] + \"-\"\n : \"\"}${segment.widths ? segment.widths[ixb] : defwidth}`,\n }, go(newt, false, ixb));\n }));\n }\n else\n markup = colsSize.styleTag + div({\n class: [\n \"row\",\n segment.class,\n segment.customClass,\n typeof segment.gx !== \"undefined\" &&\n segment.gx !== null &&\n `gx-${segment.gx}`,\n typeof segment.gy !== \"undefined\" &&\n segment.gy !== null &&\n `gy-${segment.gy}`,\n colsSize.className,\n ],\n style: segment.style,\n }, segment.besides.map((t, ixb) => div({\n class: segment.widths === false\n ? \"\"\n : `col-${segment.breakpoint\n ? segment.breakpoint + \"-\"\n : segment.breakpoints && segment.breakpoints[ixb]\n ? segment.breakpoints[ixb] + \"-\"\n : \"\"}${segment.widths ? segment.widths[ixb] : defwidth}${(() => {\n const desktop = segment.aligns?.[ixb];\n const tablet = segment.tabletAligns?.[ixb];\n const mobile = segment.mobileAligns?.[ixb];\n if (!mobile && !tablet)\n return desktop ? \" text-\" + desktop : \"\";\n let cls = \"\";\n const base = mobile || desktop;\n if (base)\n cls += \" text-\" + base;\n if (tablet && tablet !== base)\n cls += \" text-md-\" + tablet;\n if (desktop && desktop !== (tablet || base))\n cls += \" text-lg-\" + desktop;\n return cls;\n })()}${segment.vAligns\n ? \" align-items-\" + segment.vAligns[ixb]\n : \"\"}${segment.colClasses?.[ixb]\n ? \" \" + segment.colClasses[ixb]\n : \"\"}`,\n style: segment.colStyles?.[ixb] || undefined,\n }, go(t, false, ixb))));\n return isTop\n ? wrap({ ...segment, customClass: null }, isTop, ix, markup)\n : markup;\n }\n else if (segment.type === \"prompt\") {\n // Prompt segments are builder-only placeholders, skip rendering\n return \"\";\n }\n else\n throw new Error(\"unknown layout segment\" + JSON.stringify(segment));\n }\n if ((0, base_types_1.instanceOWithHtmlFile)(layout)) {\n const rndid = `iframe_${Math.floor(Math.random() * 16777215).toString(16)}`;\n return `${iframe({\n id: rndid,\n src: `/files/serve/${encodeURIComponent(layout.html_file)}`,\n })} ${script(`\n (() => {\n const iframe = document.getElementById(\"${rndid}\");\n iframe.onload = () => {\n const _iframe = document.getElementById(\"${rndid}\");\n if (_iframe.contentWindow.document.body) {\n _iframe.width = _iframe.contentWindow.document.body.scrollWidth;\n _iframe.height = _iframe.contentWindow.document.body.scrollHeight;\n }\n }\n })();\n `)}`;\n }\n if (req && req.generate_email)\n return (0, mjml_layout_1.renderMJML)({\n blockDispatch,\n layout,\n role,\n alerts,\n is_owner,\n req,\n });\n else\n return go(makeSegments(layout, isWeb, alerts), true, 0);\n};\n// declaration merging\nconst LayoutExports = render;\nmodule.exports = LayoutExports;\n//# sourceMappingURL=layout.js.map\n\n//# sourceURL=webpack://saltcorn/../saltcorn-markup/dist/layout.js?\n}");
|
|
70
|
+
|
|
71
|
+
/***/ },
|
|
72
|
+
|
|
73
|
+
/***/ "../saltcorn-markup/dist/layout_utils.js"
|
|
74
|
+
/*!***********************************************!*\
|
|
75
|
+
!*** ../saltcorn-markup/dist/layout_utils.js ***!
|
|
76
|
+
\***********************************************/
|
|
77
|
+
(module, __unused_webpack_exports, __webpack_require__) {
|
|
78
|
+
|
|
79
|
+
eval("{\n/**\n * @category saltcorn-markup\n * @module layout_utils\n */\nconst tags = __webpack_require__(/*! ./tags */ \"../saltcorn-markup/dist/tags.js\");\nconst { ul, li, ol, a, span, hr, div, text, strong, img, button, nav, script, domReady, footer, i, small, br, form, h2, input, } = tags;\nconst isNode = typeof window === \"undefined\";\n/**\n * @param {string} item\n * @returns {string}\n */\nconst labelToId = (item) => text(item.replace(\" \", \"\"));\n/**\n * check if a link should be highlighted as active\n * @param link link to check\n * @param currentUrl current URL\n * @returns true if the link is active\n */\nconst activeChecker = (link, currentUrl) => new RegExp(`^${link}(\\\\/|\\\\?|#|$)`).test(currentUrl);\n/**\n * @param currentUrl\n * @param item\n * @returns\n */\nconst active = (currentUrl, item) => (item.link && activeChecker(item.link, currentUrl)) ||\n (item.subitems &&\n item.subitems.some((si) => si.link && activeChecker(si.link, currentUrl)));\n/**\n * @param {object[]} [sections]\n * @returns {object[]}\n */\nconst innerSections = (sections) => {\n const items = [];\n (sections || []).forEach((section) => {\n (section.items || []).forEach((item) => {\n items.push(item);\n });\n });\n return items;\n};\nconst makeTooltip = (text, placement = \"top\") => ({\n \"data-bs-toggle\": \"tooltip\",\n \"data-bs-placement\": placement,\n title: text,\n});\nconst show_icon = (icon, cls, no_fw) => icon && icon !== \"empty\"\n ? icon.startsWith(\"unicode\")\n ? i({ class: `${no_fw ? \"\" : \"fa-fw \"}fst-normal ${cls || \"\"}` }, String.fromCharCode(parseInt(icon.substring(8, 12), 16)))\n : i({ class: `${no_fw ? \"\" : \"fa-fw \"}${cls || \"\"} ${icon}` })\n : \"\";\nconst show_icon_and_label = (icon, label, cls) => (icon && icon !== \"empty\"\n ? (icon.startsWith(\"unicode\")\n ? i({ class: [`fst-normal`, cls] }, String.fromCharCode(parseInt(icon.substring(8, 12), 16)))\n : i({ class: [icon, cls] })) + (label === \" \" || !label ? \"\" : \" \")\n : \"\") + (label === \" \" && icon ? \"\" : label);\nconst navSubItemsIterator = (si) => si?.type === \"Separator\"\n ? hr({ class: \"mx-3 my-1\" })\n : si?.subitems\n ? div({\n class: \"dropdown-item btn-group dropstart\",\n ...(si.tooltip ? makeTooltip(si.tooltip) : {}),\n }, a({\n type: \"button\",\n class: \"dropdown-item dropdown-toggle p-0\",\n \"data-bs-toggle\": \"dropdown\",\n \"aria-expanded\": \"false\",\n }, si.label), ul({ class: \"dropdown-menu\" }, si?.subitems.map((si1) => li(navSubItemsIterator(si1)))))\n : a({\n class: [\"dropdown-item\", si.style || \"\", si.class],\n href: si.link,\n target: si.target_blank ? \"_blank\" : undefined,\n ...(si.tooltip ? makeTooltip(si.tooltip) : {}),\n }, show_icon(si.icon, \"mr-05\"), si.label);\n/**\n * @param {object} opts\n * @param {string} opts.label\n * @param {object[]} opts.subitems\n * @param {string} [opts.icon]\n * @param {boolean} opts.isUser\n * @returns {li}\n */\nconst navSubitems = ({ label, subitems, icon, isUser, tooltip, }) => {\n return li({ class: \"nav-item dropdown\", ...(tooltip ? makeTooltip(tooltip) : {}) }, a({\n class: [\"nav-link dropdown-toggle\", isUser && \"user-nav-section\"],\n href: \"#\",\n id: `dropdown${labelToId(label)}`,\n role: \"button\",\n \"data-bs-toggle\": \"dropdown\",\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": \"false\",\n \"data-bs-auto-close\": \"outside\",\n }, show_icon(icon, \"mr-05\"), label), div({\n class: [\"dropdown-menu\", isUser && \"dropdown-menu-end\"],\n \"aria-labelledby\": `dropdown${labelToId(label)}`,\n }, subitems?.map(navSubItemsIterator)));\n};\n/**\n * @param {string} currentUrl\n * @param {object[]} sections\n * @returns {div}\n */\nconst rightNavBar = (currentUrl, sections) => div({ class: \"collapse navbar-collapse\", id: \"navbarResponsive\" }, ul({ class: \"navbar-nav ms-auto my-2 my-lg-0\" }, innerSections(sections).map((s) => s.location === \"Mobile Bottom\"\n ? \"\"\n : s.subitems\n ? navSubitems(s)\n : s.link\n ? li({\n class: [\"nav-item\", active(currentUrl, s) && \"active\"],\n }, a({\n class: [\"nav-link js-scroll-trigger\", s.style || \"\"],\n href: text(s.link),\n target: s.target_blank ? \"_blank\" : undefined,\n ...(s.tooltip ? makeTooltip(s.tooltip) : {}),\n }, show_icon(s.icon, \"mr-05\"), text(s.label)))\n : s.type === \"Separator\"\n ? div({ class: \"border-start\", style: \"width:1px\" })\n : s.type === \"Search\"\n ? li(form({\n action: \"/search\",\n class: \"menusearch\",\n method: \"get\",\n }, div({ class: \"input-group search-bar\" }, input({\n type: \"search\",\n class: \"form-control search-bar ps-2 hasbl\",\n placeholder: s.label,\n id: \"inputq\",\n name: \"q\",\n \"aria-label\": \"Search\",\n \"aria-describedby\": \"button-search-submit\",\n }), button({\n class: \"btn btn-outline-secondary search-bar\",\n type: \"submit\",\n ...(s.tooltip ? makeTooltip(s.tooltip) : {}),\n }, i({ class: \"fas fa-search\" })))))\n : \"\")));\n/**\n * @param {object[]} sections\n * @returns {boolean}\n */\nconst hasMobileItems = (sections) => innerSections(sections).some((s) => s.location === \"Mobile Bottom\");\n/**\n * @param {string} currentUrl\n * @param {object[]} sections\n * @param {string} [cls = \"\"]\n * @param {string} [clsLink = \"\"]\n * @returns {footer|string}\n */\nconst mobileBottomNavBar = (currentUrl, sections, cls = \"\", clsLink = \"\") => hasMobileItems(sections)\n ? footer({\n class: \"bs-mobile-nav-footer d-flex justify-content-around d-sm-flex d-md-none \" +\n cls,\n }, innerSections(sections).map((s) => s.location !== \"Mobile Bottom\"\n ? \"\"\n : //: s.subitems\n //? navSubitems(s)\n s.link\n ? div({\n class: [\n \"mt-2 text-center\",\n active(currentUrl, s) ? \"active\" : \"opacity-50\",\n ],\n }, a({\n class: [s.style || \"\", clsLink],\n href: text(s.link),\n target: s.target_blank ? \"_blank\" : undefined,\n }, show_icon(s.icon, \"fa-lg\", true), br(), small(text(s.label))))\n : \"\"))\n : \"\";\n/**\n * @param {object} opts\n * @param {string} opts.name\n * @param {string} opts.logo\n * @returns {string[]}\n */\nconst leftNavBar = (namelogo) => {\n if (!namelogo)\n return [];\n const { name, logo } = namelogo;\n return [\n a({\n class: \"navbar-brand js-scroll-trigger\",\n href: isNode\n ? \"/\"\n : \"javascript:parent.saltcorn.mobileApp.navigation.gotoEntryView()\",\n }, logo &&\n img({\n src: logo,\n width: \"30\",\n height: \"30\",\n class: \"mx-1 d-inline-block align-top\",\n alt: \"Logo\",\n loading: \"lazy\",\n }), name),\n button({\n class: \"navbar-toggler navbar-toggler-right\",\n type: \"button\",\n \"data-bs-toggle\": \"collapse\",\n \"data-bs-target\": \"#navbarResponsive\",\n \"aria-controls\": \"navbarResponsive\",\n \"aria-expanded\": \"false\",\n \"aria-label\": \"Toggle navigation\",\n }, span({ class: \"navbar-toggler-icon\" })),\n ];\n};\n/**\n * @param {object} brand\n * @param {object[]} sections\n * @param {string} currentUrl\n * @param {object} opts\n * @param {boolean} [opts.fixedTop = true]\n * @returns {string}\n */\nconst navbar = (brand, sections, currentUrl, opts = { fixedTop: true }) => nav({\n class: `navbar d-print-none navbar-expand-md ${opts.class || \"\"} ${opts.colorscheme ? opts.colorscheme.toLowerCase() : \"navbar-light\"} ${opts.fixedTop ? \"fixed-top\" : \"\"}`,\n id: \"mainNav\",\n}, div({ class: opts.fluid ? \"container-fluid\" : \"container\" }, leftNavBar(brand), rightNavBar(currentUrl, sections)));\n/**\n * creates an alert div (deprecated, use toast)\n * @param type\n * @param s\n * @returns\n */\nconst alert = (type, s) => {\n //console.log(\"alert\", type, s,s.length)\n const realtype = type === \"error\" ? \"danger\" : type;\n const icon = realtype === \"success\"\n ? \"fa-check-circle\"\n : realtype === \"danger\"\n ? \"fa-times-circle\"\n : realtype === \"warning\"\n ? \"fa-exclamation-triangle\"\n : \"\";\n /* Will be using tag functions */\n return s && s.length > 0\n ? div({\n class: `alert alert-${realtype} alert-dismissible fade show`,\n role: \"alert\",\n }, icon ? i({ class: `fas ${icon} me-1` }) : \"\", s, button({\n type: \"button\",\n class: \"btn-close\",\n \"data-bs-dismiss\": \"alert\",\n \"aria-label\": \"Close\",\n }))\n : \"\";\n};\n/**\n * creates a toast div\n * @param type bootstrap type\n * @param s message to show\n * @param id optional id\n * @param title optional title (if not set, type or error for danger is used)\n * @returns\n */\nconst toast = (type, s, id, title) => {\n if (!s || s.length === 0)\n return \"\";\n else {\n const realtype = type === \"error\" ? \"danger\" : type;\n const icon = realtype === \"success\"\n ? \"fa-check-circle\"\n : realtype === \"danger\"\n ? \"fa-times-circle\"\n : realtype === \"warning\"\n ? \"fa-exclamation-triangle\"\n : \"\";\n return div({\n class: \"toast show\",\n ...(id ? { id: id } : {}),\n rendered: \"server-side\",\n type: type,\n role: \"alert\",\n ariaLive: \"assertive\",\n ariaAtomic: \"true\",\n style: `min-width: 350px; max-width: 50vw; width: auto; ${!isNode ? \"transform: translateX(-50%);\" : \"\"}`,\n }, div({ class: `toast-header bg-${realtype} text-white py-1` }, icon ? i({ class: `fas ${icon} me-2` }) : \"\", strong({ class: \"me-auto\" }, title ? title : type === \"danger\" ? \"error\" : type), button({\n type: \"button\",\n class: \"btn-close btn-close-white\",\n \"data-bs-dismiss\": \"toast\",\n \"aria-label\": \"Close\",\n style: \"font-size: 12px;\",\n })), div({ class: `toast-body py-2 fs-6 fw-bold` }, strong(s)));\n }\n};\n/**\n * @type {string}\n */\nconst navbarSolidOnScroll = script(domReady(`$(window).scroll(function () {\n if ($(window).scrollTop() >= 10) {\n $('.navbar').css('background','white');\n } else {\n $('.navbar').css('background','transparent');\n }\n });`));\n/**\n * @param x\n * @param s\n */\nconst logit = (x, s) => {\n if (s)\n console.log(s, x);\n else\n console.log(x);\n return x;\n};\n/**\n * @param len\n */\nconst standardBreadcrumbItem = (len) => ({ href, pageGroupLink, text, postLinkText, }, ix) => li({\n class: [\n \"breadcrumb-item\",\n ix == len - 1 && (href ? \"fw-bold\" : \"active\"),\n ],\n \"aria-current\": ix == len - 1 && \"page\",\n}, href ? a({ href }, text) : text, postLinkText ? \" \" + postLinkText : \"\");\n/**\n * @param {object} opts\n * @param {Workflow} opts.workflow\n * @param {object} opts.step\n * @returns {string}\n */\nconst workflowBreadcrumbItem = ({ workflow, step, }) => workflow.steps\n .map((wfstep, ix) => li({\n class: [\n \"breadcrumb-item breadcrumb-workflow\",\n step.currentStep - 1 === ix && \"active-step fw-bold\",\n ],\n}, workflow.startAtStepURL &&\n workflow.saveURL &&\n step.currentStep - 1 !== ix\n ? a({\n href: `javascript:applyViewConfig($('form.form-namespace,form#scbuildform'), '${workflow.saveURL}',()=>{location.href='${workflow.startAtStepURL(wfstep.name)}'})`,\n }, wfstep.name)\n : span(wfstep.name)))\n .join(\"\");\n/**\n * @param {object[]} crumbs\n * @returns {string}\n */\nconst breadcrumbs = (crumbs, right, after, center) => nav({ \"aria-label\": \"breadcrumb\" }, ol({ class: \"breadcrumb\" }, crumbs.map((c, ix) => c.workflow\n ? workflowBreadcrumbItem(c)\n : standardBreadcrumbItem(crumbs.length)(c, ix)), after ? li({ class: \"ms-3\" }, after) : \"\", center ? li({ class: \"ms-auto me-auto\" }, center) : \"\", right ? li({ class: center ? \"\" : \"ms-auto\" }, right) : \"\"));\nconst normaliseHeaderForMobile = (header) => {\n if (header.startsWith(\"/plugins\"))\n return header.replace(\"/plugins\", \"sc_plugins\");\n else\n return header;\n};\n/**\n * @param {object[]} headers\n * @returns {string}\n */\nconst headersInHead = (headers, isDark) => headers\n .filter((h) => h.css)\n .map((h) => `<link href=\"${isNode ? h.css : normaliseHeaderForMobile(h.css)}\" rel=\"stylesheet\">`)\n .join(\"\") +\n (isDark\n ? headers\n .filter((h) => h.cssDark)\n .map((h) => `<link href=\"${isNode ? h.cssDark : normaliseHeaderForMobile(h.cssDark)}\" rel=\"stylesheet\">`)\n .join(\"\")\n : \"\") +\n headers\n .filter((h) => h.style)\n .map((h) => `<style>${h.style}</style>`)\n .join(\"\") +\n headers\n .filter((h) => h.headerTag)\n .map((h) => h.headerTag)\n .join(\"\");\n/**\n * @param {object[]} headers\n * @returns {string}\n */\nconst headersInBody = (headers = []) => headers\n .filter((h) => h.script)\n .map((h) => script({\n ...(h.defer ? { defer: true } : {}),\n src: isNode ? h.script : normaliseHeaderForMobile(h.script),\n ...(h.integrity\n ? {\n integrity: h.integrity,\n crossorigin: \"anonymous\",\n }\n : {}),\n}, \"\"))\n .join(\"\") +\n headers\n .filter((h) => h.scriptBody)\n .map((h) => script(h.scriptBody))\n .join(\"\");\n/**\n * @param {object[]} tabList\n * @returns {ul}\n */\nconst cardHeaderTabs = (tabList) => ul({ class: \"nav nav-tabs card-header-tabs\" }, tabList.map(({ href, label, active, }) => li({ class: \"nav-item\" }, a({ class: [\"nav-link\", active && \"active\"], href }, label))));\nfunction validID(s) {\n return s\n ? s\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/^[^a-z]+|[^\\w:.-]+/gi, \"\")\n : s;\n}\n/**\n * @param {object} opts\n * @param {object[]} opts.contents\n * @param {string[]} opts.titles\n * @param {string} opts.tabsStyle\n * @param {*} opts.ntabs\n * @param {independent} boolean\n * @param {function} go\n * @returns {ul_div}\n */\nconst renderTabs = ({ contents, titles, tabsStyle, ntabs, independent, bodyClass, outerClass, deeplink, disable_inactive, startClosed, acc_init_opens, serverRendered, lazyLoadViews, tabId, tabClass, contentWrapperClass, headerWrapperClass, }, go, activeTabTitle, hints, isMobile) => {\n const rndid = `tab${Math.floor(Math.random() * 16777215).toString(16)}`;\n if (tabsStyle === \"Accordion\")\n return (div({ class: [\"accordion\", lazyLoadViews && \"lazy-accoordion\", outerClass], id: `${rndid}top` }, contents.map((t, ix) => div({ class: \"accordion-item\" }, h2({ class: \"accordion-header\", id: `${rndid}head${ix}` }, button({\n class: [\n \"accordion-button\",\n acc_init_opens?.[ix] !== true &&\n (ix > 0 || startClosed) &&\n \"collapsed\",\n ],\n type: \"button\",\n onclick: disable_inactive\n ? `disable_inactive_tab_inputs('${rndid}top')`\n : undefined,\n \"data-bs-toggle\": \"collapse\",\n \"data-bs-target\": `#${rndid}tab${ix}`,\n \"aria-expanded\": ix === 0 ? \"true\" : \"false\",\n \"aria-controls\": `${rndid}tab${ix}`,\n }, titles[ix])), div({\n class: [\n \"accordion-collapse\",\n \"collapse\",\n (acc_init_opens?.[ix] === true ||\n (!startClosed && ix === 0)) &&\n \"show\",\n ],\n id: `${rndid}tab${ix}`,\n \"aria-labelledby\": `${rndid}head${ix}`,\n \"data-bs-parent\": independent ? undefined : `#${rndid}top`,\n \"data-mdb-parent\": independent ? undefined : `#${rndid}top`, //TODO fix in material instead, remove here\n }, div({ class: [\"accordion-body\", bodyClass || \"\"] }, go(t, false, ix)))))) +\n (disable_inactive\n ? script(domReady(`disable_inactive_tab_inputs('${rndid}top')`))\n : \"\"));\n else {\n let activeIx = serverRendered && activeTabTitle ? +activeTabTitle : 0;\n if (activeIx === -1)\n activeIx = 0;\n const maybeWrapContent = (s) => contentWrapperClass ? div({ class: contentWrapperClass }, s) : s;\n const maybeWrapHeader = (s) => headerWrapperClass ? div({ class: headerWrapperClass }, s) : s;\n const buildOnClick = (ix) => {\n const execLink = isMobile ? `execLink('#${validID(titles[ix])}');` : \"\";\n let result = disable_inactive\n ? `disable_inactive_tab_inputs('${rndid}'); `\n : \"\";\n result += execLink;\n return result ? result : undefined;\n };\n return (maybeWrapHeader(ul({\n role: \"tablist\",\n id: `${rndid}`,\n class: [\n \"nav\",\n lazyLoadViews && \"lazy-tabs\",\n tabsStyle === \"Tabs\" ? \"nav-tabs\" : \"nav-pills\",\n tabClass,\n hints?.tabClass && tabsStyle === \"Tabs\" && hints?.tabClass,\n ],\n }, contents.map((t, ix) => li({ class: \"nav-item\", role: \"presentation\" }, a({\n class: [\n \"nav-link\",\n ix === activeIx && \"active\",\n deeplink && \"deeplink\",\n ],\n onclick: buildOnClick(ix),\n id: `${rndid}link${ix}`,\n \"data-bs-toggle\": serverRendered ? undefined : \"tab\",\n href: serverRendered\n ? `javascript:set_state_field('${tabId || \"_tab\"}', ${ix})`\n : `#${validID(titles[ix])}`,\n role: \"tab\",\n \"aria-controls\": `${rndid}tab${ix}`,\n \"aria-selected\": ix === 0 ? \"true\" : \"false\",\n }, titles[ix]))))) +\n maybeWrapContent(div({ class: \"tab-content\", id: `${rndid}content` }, serverRendered\n ? div({\n class: [\"tab-pane\", bodyClass || \"\", \"show active\"],\n role: \"tabpanel\",\n id: `${validID(titles[activeIx])}`,\n \"aria-labelledby\": `${rndid}link${activeIx}`,\n }, go(contents[activeIx], false, activeIx))\n : contents.map((t, ix) => div({\n class: [\n \"tab-pane fade\",\n bodyClass || \"\",\n ix === activeIx && \"show active\",\n ],\n role: \"tabpanel\",\n id: `${validID(titles[ix])}`,\n \"aria-labelledby\": `${rndid}link${ix}`,\n }, go(t, false, ix))))) +\n (disable_inactive\n ? script(domReady(`disable_inactive_tab_inputs('${rndid}')`))\n : \"\"));\n }\n};\nmodule.exports = {\n navbar,\n alert,\n toast,\n logit,\n navbarSolidOnScroll,\n breadcrumbs,\n headersInHead,\n headersInBody,\n cardHeaderTabs,\n mobileBottomNavBar,\n renderTabs,\n show_icon,\n show_icon_and_label,\n activeChecker,\n validID,\n navSubItemsIterator,\n navSubitems,\n rightNavBar,\n leftNavBar,\n innerSections,\n};\n//# sourceMappingURL=layout_utils.js.map\n\n//# sourceURL=webpack://saltcorn/../saltcorn-markup/dist/layout_utils.js?\n}");
|
|
80
|
+
|
|
81
|
+
/***/ },
|
|
82
|
+
|
|
83
|
+
/***/ "../saltcorn-markup/dist/mjml-layout.js"
|
|
84
|
+
/*!**********************************************!*\
|
|
85
|
+
!*** ../saltcorn-markup/dist/mjml-layout.js ***!
|
|
86
|
+
\**********************************************/
|
|
87
|
+
(module, __unused_webpack_exports, __webpack_require__) {
|
|
88
|
+
|
|
89
|
+
eval("{\nconst tags = __webpack_require__(/*! ./tags */ \"../saltcorn-markup/dist/tags.js\");\nconst { table, tr, td, tbody } = tags;\nconst mjml = __webpack_require__(/*! ./mjml-tags */ \"../saltcorn-markup/dist/mjml-tags.js\");\nconst { div, a, img, p, h1, h2, h3, h4, h5, h6, label, ul, li, i, span, text, genericElement, } = tags;\nconst isBlock = (segment) => {\n if ([\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\"].indexOf(segment.textStyle) >= 0) {\n return !segment.inline;\n }\n else {\n return segment.block;\n }\n};\nconst transformTextStyle = (textStyle) => {\n switch (textStyle) {\n case \"h1\":\n return {\n \"font-size\": \"2em\",\n \"margin-top\": \"0.67em\",\n \"margin-bottom\": \"0.67em\",\n \"margin-left\": 0,\n \"margin-right\": 0,\n \"font-weight\": \"bold\",\n };\n case \"h2\":\n return {\n \"font-size\": \"1.5em\",\n \"margin-top\": \"0.83em\",\n \"margin-bottom\": \"0.83em\",\n \"margin-left\": \"0\",\n \"margin-right\": \"0\",\n \"font-weight\": \"bold\",\n };\n case \"h3\":\n return {\n \"font-size\": \"1.17em\",\n \"margin-top\": \"1em\",\n \"margin-bottom\": \"1em\",\n \"margin-left\": \"0\",\n \"margin-right\": \"0\",\n \"font-weight\": \"bold\",\n };\n case \"h4\":\n return {\n \"font-size\": \"1em\",\n \"margin-top\": \"1.33em\",\n \"margin-bottom\": \"1.33em\",\n \"margin-left\": \"0\",\n \"margin-right\": \"0\",\n \"font-weight\": \"bold\",\n };\n case \"h5\":\n return {\n \"font-size\": \".83em\",\n \"margin-top\": \"1.67em\",\n \"margin-bottom\": \"1.67em\",\n \"margin-left\": \"0\",\n \"margin-right\": \"0\",\n \"font-weight\": \"bold\",\n };\n case \"h6\":\n return {\n \"font-size\": \".67em\",\n \"margin-top\": \"2.33em\",\n \"margin-bottom\": \"2.33em\",\n \"margin-left\": \"0\",\n \"margin-right\": \"0\",\n \"font-weight\": \"bold\",\n };\n case \"fw-bold\":\n return { \"font-weight\": \"700 !important\" };\n case \"fst-italic\":\n return { \"font-style\": \"italic !important\" };\n case \"small\":\n return { \"font-size\": \"0.875em\" };\n case \"text-muted\":\n return {\n \"--bs-text-opacity\": \"1\",\n color: \"#858796 !important\",\n };\n case \"text-underline\":\n return {\n \"text-decoration\": \"underline\",\n };\n case \"font-monospace\":\n return {\n \"font-family\": \"monospace !important\",\n };\n default:\n return {};\n }\n};\nconst transformLinkSize = (linkSize) => {\n switch (linkSize) {\n case \"btn-lg\":\n case \"btn-block btn-lg\":\n return {\n padding: \"0.5rem 1rem\",\n \"font-size\": \"1.25rem\",\n };\n case \"btn-sm\":\n return {\n padding: \"0.25rem 0.5rem\",\n \"font-size\": \"0.875rem\",\n };\n case \"btn-block\":\n default:\n return {};\n }\n};\n/**\n *\n * @param segment\n * @param inner\n * @returns\n */\nconst applyTextStyle = (segment, inner) => {\n const style = segment.font\n ? { fontFamily: segment.font, ...segment.style }\n : segment.style || {};\n const hasStyle = Object.entries(style).filter(([k, v]) => {\n return v && v !== \"\" && v !== \"px\";\n }).length > 0;\n const textStyle = transformTextStyle(segment.textStyle);\n const linkSize = transformLinkSize(segment.link_size);\n const _style = { ...style, ...textStyle, ...linkSize };\n return isBlock(segment)\n ? div({ style: _style }, inner)\n : segment.textStyle || hasStyle\n ? span({ style: _style }, inner)\n : inner;\n};\n/**\n * @param opts\n * @param opts.blockDispatch\n * @param opts.layout\n * @param opts.role\n * @param opts.alerts\n * @param opts.is_owner\n * @prams req\n * @returns\n */\nconst render = ({ blockDispatch, layout, role, alerts, is_owner, req, }) => {\n //console.log(JSON.stringify(layout, null, 2));\n function wrap(segment, isTop, ix, inner) {\n const iconTag = segment.icon ? i({ class: segment.icon }) + \" \" : \"\";\n const content = applyTextStyle(segment, iconTag + inner);\n return content;\n }\n function go(segment, isTop = false, ix = 0) {\n if (!segment)\n return \"\";\n if (typeof segment === \"object\" &&\n Object.keys(segment).length === 0 &&\n segment.constructor === Object)\n return \"\";\n if (typeof segment === \"string\")\n return wrap(segment, isTop, ix, segment);\n if (Array.isArray(segment))\n return wrap(segment, isTop, ix, segment.map((s, jx) => go(s, isTop, jx + ix)).join(\"\"));\n if (segment.minRole && role > segment.minRole)\n return \"\";\n if (segment.type && blockDispatch && blockDispatch[segment.type]) {\n const rendered = blockDispatch[segment.type](segment, go);\n if (rendered !== false) {\n return wrap(segment, isTop, ix, rendered);\n }\n }\n if (segment.type === \"blank\") {\n return wrap(segment, isTop, ix, segment.contents || \"\");\n }\n if (segment.type === \"view\") {\n return wrap(segment, isTop, ix, segment.contents || \"\");\n }\n if (segment.type === \"pageHeader\") {\n return wrap(segment, isTop, ix, h1(segment.title) + p(segment.blurb || \"\"));\n }\n if (segment.type === \"image\") {\n const { alt, fileid, url } = segment;\n const srctype = segment.srctype || \"File\";\n const urlFromReq = req.get_base_url();\n const base_url = urlFromReq.endsWith(\"/\")\n ? urlFromReq.substring(0, urlFromReq.length - 1)\n : urlFromReq;\n const style = segment.style ? segment.style : {};\n if (!style.width)\n style.width = \"100% !important\";\n const inner = img({\n style: style,\n alt: alt,\n src: srctype === \"File\" ? `${base_url}/files/serve/${fileid}` : url,\n });\n return segment.block ? div(inner) : inner;\n }\n if (segment.type === \"link\") {\n let style = segment.link_style === \"btn btn-custom-color\"\n ? `background-color: ${segment.link_bgcol || \"#000000\"};border-color: ${segment.link_bordercol || \"#000000\"}; color: ${segment.link_textcol || \"#000000\"}`\n : null;\n if ((segment.link_style || \"\").includes(\"btn\")) {\n return wrap(segment, isTop, ix, mjml.emailButton({ href: segment.url, btnStyle: segment.link_style, style }, segment.text));\n }\n return wrap(segment, isTop, ix, a({\n href: segment.url,\n target: segment.target_blank ? \"_blank\" : false,\n rel: segment.nofollow ? \"nofollow\" : false,\n style,\n }, segment.link_icon ? i({ class: segment.link_icon }) + \" \" : \"\", segment.text));\n }\n if (segment.type === \"tabs\") {\n let ss = [];\n for (let jx = 0; jx < segment.ntabs; jx++) {\n ss.push(div({ style: transformTextStyle(\"h4\") }, segment.titles[jx]));\n ss.push(go(segment.contents[jx], isTop, jx + ix));\n }\n return wrap(segment, isTop, ix, ss.join(\"\"));\n }\n if (segment.type === \"card\") {\n return wrap(segment, isTop, ix, div({\n class: [\n \"card mt-4\",\n segment.shadow === false ? false : \"shadow\",\n segment.class,\n segment.url && \"with-link\",\n ],\n onclick: segment.url ? `location.href='${segment.url}'` : false,\n style: segment.style,\n }, segment.title &&\n div({ class: \"card-header\" }, typeof segment.title === \"string\"\n ? h6({ class: \"m-0 fw-bold text-primary\" }, segment.title)\n : segment.title), segment.tabContents &&\n div({ class: \"card-header\" }, ul({ class: \"nav nav-tabs card-header-tabs\" }, Object.keys(segment.tabContents).map((title, ix) => li({ class: \"nav-item\" }, a({\n class: [\"nav-link\", ix === 0 && \"active\"],\n href: `#tab-${title}`,\n \"data-bs-toggle\": \"tab\",\n role: \"tab\",\n }, title))))) +\n div({\n class: [\n \"card-body\",\n segment.bodyClass,\n segment.noPadding && \"p-0\",\n ],\n }, div({ class: \"tab-content\", id: \"myTabContent\" }, Object.entries(segment.tabContents).map(([title, contents], ix) => div({\n class: [\"tab-pane\", ix == 0 && \"show active\"],\n id: `tab-${title}`,\n }, contents)))), segment.contents &&\n div({\n class: [\n \"card-body\",\n segment.bodyClass,\n segment.noPadding && \"p-0\",\n ],\n }, go(segment.contents)), segment.footer && div({ class: \"card-footer\" }, go(segment.footer))));\n }\n if (segment.type === \"container\") {\n const { bgFileId, bgType, bgColor, vAlign, hAlign, block, display, imageSize, borderWidth, borderStyle, setTextColor, textColor, showForRole, hide, customClass, customCSS, minScreenWidth, maxScreenWidth, showIfFormulaInputs, show_for_owner, borderDirection, borderRadius, borderRadiusUnit, borderColor, url, hoverColor, gradStartColor, gradEndColor, gradDirection, fullPageWidth, overflow, rotate, style, htmlElement, } = segment;\n if (hide)\n return \"\";\n if (showForRole &&\n showForRole[role] === false &&\n !(show_for_owner && is_owner))\n return \"\";\n const renderBg = true;\n const sizeProp = (segKey, cssNm, unit) => typeof segment[segKey] === \"undefined\"\n ? \"\"\n : `${cssNm}: ${segment[segKey]}${unit || segment[segKey + \"Unit\"] || \"px\"};`;\n const ppCustomCSS = (s) => s ? s.split(\"\\n\").join(\"\") + \";\" : \"\";\n const allZero = (xs) => xs.every((x) => +x === 0);\n const ppBox = (what) => !segment[what] || allZero(segment[what])\n ? \"\"\n : `${what}: ${segment[what].map((p) => p + \"px\").join(\" \")};`;\n let flexStyles = \"\";\n Object.keys(style || {}).forEach((k) => {\n if (style[k])\n flexStyles += `${k}:${style[k]};`;\n });\n let styleString = `${flexStyles}${ppCustomCSS(customCSS || \"\")}${sizeProp(\"minHeight\", \"min-height\")}${sizeProp(\"height\", \"height\")}${sizeProp(\"width\", \"width\")}${sizeProp(\"widthPct\", \"width\", \"%\")}\n ${ppBox(\"padding\")}${ppBox(\"margin\")}${overflow && overflow !== \"visible\" ? ` overflow: ${overflow};` : \"\"} ${renderBg && bgType === \"Image\" && bgFileId && +bgFileId\n ? `background-image: url('/files/serve/${bgFileId}'); background-size: ${imageSize === \"repeat\" ? \"auto\" : imageSize || \"contain\"}; background-repeat: ${imageSize === \"repeat\" ? \"repeat\" : \"no-repeat\"};`\n : \"\"} ${renderBg && bgType === \"Color\" ? `background-color: ${bgColor};` : \"\"} ${renderBg && bgType === \"Gradient\"\n ? `background-image: linear-gradient(${gradDirection || 0}deg, ${gradStartColor}, ${gradEndColor});`\n : \"\"} ${setTextColor ? `color: ${textColor};` : \"\"}${rotate ? `transform: rotate(${rotate}deg);` : \"\"} ${display === \"none\" ? \"display: none; \" : \"\"}`;\n if (!style || !(style[\"border-width\"] && style[\"border-style\"])) {\n styleString += `border${borderDirection ? `-${borderDirection}` : \"\"}: ${borderWidth || 0}px ${borderStyle ? borderStyle : \"none\"} ${borderColor || \"black\"};${sizeProp(\"borderRadius\", \"border-radius\")}`;\n }\n return genericElement(display === \"inline\" || display === \"inline-block\" ? \"span\" : \"div\", {\n style: styleString,\n }, go(segment.contents, false, ix));\n // const bg =\n // renderBg &&\n // bgType === \"Image\" &&\n // bgFileId &&\n // +bgFileId &&\n // div(\n // { style: \"display:none\" },\n // img({\n // height: \"1\",\n // width: \"1\",\n // alt: \"\",\n // src: `/files/serve/${bgFileId}`,\n // })\n // );\n }\n if (segment.type === \"line_break\") {\n return \"<br />\";\n }\n if (segment.type === \"dropdown_menu\") {\n return \"\";\n }\n if (segment.type === \"table\") {\n const ntimes = (n, f) => {\n const res = [];\n for (let index = 0; index < n; index++) {\n res.push(f(index));\n }\n return res;\n };\n const tabHtml = table({\n class: segment.customClass || undefined,\n }, tbody(ntimes(segment.rows, (ri) => tr(ntimes(segment.columns, (ci) => td(go(segment.contents?.[ri]?.[ci])))))));\n return tabHtml;\n }\n if (segment.above) {\n return segment.above\n .map((s, ix) => go(s, isTop, ix))\n .join(\"\");\n }\n else if (segment.besides) {\n const defwidth = Math.round(12 / segment.besides.length);\n return table({ width: \"100%\", style: segment.style }, tr(segment.besides.map((t, ixb) => {\n return td({\n width: `${Math.round((100 * (segment.widths ? segment.widths[ixb] : defwidth)) / 12)}%`,\n }, go(t, false, ixb));\n })));\n }\n else if (segment.type === \"prompt\") {\n // Prompt segments are builder-only placeholders, skip rendering\n return \"\";\n }\n else\n throw new Error(\"unknown layout segment\" + JSON.stringify(segment));\n }\n if (req?.isSubView) {\n return go(layout, true, 0);\n }\n else if (layout.type === \"container\") {\n const inner = div({ style: \"text-align: left !important; font-size: 16px;\" }, go(layout.contents, true, 0));\n return {\n markup: mjml.section(mjml.raw(inner)),\n backgroundColor: layout.bgColor,\n };\n }\n else {\n const inner = div({ style: \"text-align: left !important; font-size: 16px;\" }, go(layout, true, 0));\n return { markup: mjml.section(mjml.raw(inner)) };\n }\n};\n// declaration merging\n// const LayoutExports = render;\n// export = LayoutExports;\nconst LayoutExports = {\n renderMJML: render,\n transformLinkSize,\n transformTextStyle,\n applyTextStyle,\n isBlock,\n};\nmodule.exports = LayoutExports;\n//# sourceMappingURL=mjml-layout.js.map\n\n//# sourceURL=webpack://saltcorn/../saltcorn-markup/dist/mjml-layout.js?\n}");
|
|
90
|
+
|
|
91
|
+
/***/ },
|
|
92
|
+
|
|
93
|
+
/***/ "../saltcorn-markup/dist/mjml-tags.js"
|
|
94
|
+
/*!********************************************!*\
|
|
95
|
+
!*** ../saltcorn-markup/dist/mjml-tags.js ***!
|
|
96
|
+
\********************************************/
|
|
97
|
+
(module, __unused_webpack_exports, __webpack_require__) {
|
|
98
|
+
|
|
99
|
+
eval("{\n/**\n * @category saltcorn-markup\n * @module mjml-tags\n */\nconst mkTag = __webpack_require__(/*! ./mktag */ \"../saltcorn-markup/dist/mktag.js\");\nconst tags = [\n \"head\",\n \"style\",\n \"body\",\n \"section\",\n \"column\",\n \"image\",\n \"text\",\n \"divider\",\n \"raw\",\n \"button\",\n \"group\",\n \"attributes\",\n];\nconst allTags = Object.fromEntries(tags.map((tag) => [tag, mkTag(`mj-${tag}`)]));\nconst mjml = mkTag(\"mjml\");\n//https://www.litmus.com/blog/a-guide-to-bulletproof-buttons-in-email-design\nconst emailButton = ({ href, title, btnStyle, style, }, label) => {\n const rawType = (btnStyle || \"\").replace(\"btn \", \"\");\n let bgColor = (btnStyle || \"\").includes(\"outline\")\n ? \"transparent\"\n : `#6c757d`;\n let color = `#ffffff`;\n let borderColor = null;\n switch (rawType) {\n case \"btn-primary\":\n bgColor = `#0d6efd`;\n break;\n case \"btn-secondary\":\n bgColor = `#6c757d`;\n break;\n case \"btn-success\":\n bgColor = `#198754`;\n break;\n case \"btn-danger\":\n bgColor = `#dc3545`;\n break;\n case \"btn-warning\":\n bgColor = `#ffc107`;\n break;\n case \"btn-info\":\n bgColor = `#0dcaf0`;\n break;\n case \"btn-outline-primary\":\n color = borderColor = `#0d6efd`;\n break;\n case \"btn-outline-secondary\":\n color = borderColor = `#6c757d`;\n break;\n case \"btn-outline-success\":\n color = borderColor = `#198754`;\n break;\n case \"btn-outline-danger\":\n color = borderColor = `#dc3545`;\n break;\n case \"btn-outline-warning\":\n color = borderColor = `#ffc107`;\n break;\n case \"btn-outline-info\":\n color = borderColor = `#0dcaf0`;\n break;\n }\n // console.log({ href, btnStyle, rawType, label, style, borderColor, color });\n return `<a rel=\"noopener\" target=\"_blank\" ${title ? `title=\"${title}\" ` : \"\"}href=\"${href}\" style=\"${style && style.includes(\"color\") ? `${style}; border-width: 1px; border-style: solid;` : `background-color: ${bgColor}; color: ${color};`} ${borderColor ? `border-color: ${borderColor};border-width:1px; border-style: solid; ` : \"\"}font-size: 18px; font-family: Helvetica, Arial, sans-serif; font-weight: bold; text-decoration: none; padding: 14px 20px; border-radius: 5px; display: inline-block; mso-padding-alt: 0;\">\n <!--[if mso]>\n <i style=\"letter-spacing: 25px; mso-font-width: -100%; mso-text-raise: 30pt;\"> </i>\n <![endif]-->\n <span style=\"mso-text-raise: 15pt;\">${label}</span>\n <!--[if mso]>\n <i style=\"letter-spacing: 25px; mso-font-width: -100%;\"> </i>\n <![endif]-->\n</a>`;\n};\nconst tagsExports = {\n ...allTags,\n mjml,\n emailButton,\n};\nmodule.exports = tagsExports;\n//# sourceMappingURL=mjml-tags.js.map\n\n//# sourceURL=webpack://saltcorn/../saltcorn-markup/dist/mjml-tags.js?\n}");
|
|
100
|
+
|
|
101
|
+
/***/ },
|
|
102
|
+
|
|
103
|
+
/***/ "../saltcorn-markup/dist/mktag.js"
|
|
104
|
+
/*!****************************************!*\
|
|
105
|
+
!*** ../saltcorn-markup/dist/mktag.js ***!
|
|
106
|
+
\****************************************/
|
|
107
|
+
(module) {
|
|
108
|
+
|
|
109
|
+
eval("{\n/**\n * @category saltcorn-markup\n * @module mktag\n */\n//https://stackoverflow.com/a/54246501\n/**\n * @param {string} str\n * @returns {string}\n */\nconst camelToCssCase = (str) => str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n/**\n * @param {string|string[]} c\n * @returns {string}\n */\nconst ppClass = (cs) => {\n const clss = typeof cs === \"string\" ? cs : !cs ? \"\" : cs.filter((c) => c).join(\" \");\n return clss ? `class=\"${clss}\"` : \"\";\n};\n/**\n * @param {string|string[]|object} [cs]\n * @returns {string}\n */\nconst ppStyle = (cs) => {\n const clss = typeof cs === \"string\"\n ? cs\n : !cs\n ? \"\"\n : Array.isArray(cs)\n ? cs.filter((c) => c).join(\";\")\n : typeof cs === \"object\"\n ? Object.entries(cs)\n .filter(([k, v]) => v || v === 0)\n .map(([k, v]) => `${camelToCssCase(k)}:${v}`)\n .join(\";\")\n : \"\";\n return clss ? `style=\"${clss}\"` : \"\";\n};\n/**\n * @param {object[]} opts\n * @param {string} opts.k\n * @param {boolean} [opts.v]\n * @returns {string}\n */\nconst ppAttrib = ([k, v]) => typeof v === \"boolean\"\n ? v\n ? k\n : \"\"\n : typeof v === \"undefined\"\n ? \"\"\n : k === \"class\"\n ? ppClass(v)\n : k === \"style\"\n ? ppStyle(v)\n : typeof v === \"string\"\n ? `${k}=\"${v.replaceAll('\"', \""\")}\"`\n : `${k}=\"${v}\"`;\n/**\n * @param {string} tnm\n * @param {boolean} voidTag\n * @returns {function}\n */\nconst mkTag = (tnm, voidTag) => (attributes_or_first_child, ...children) => {\n var body = \"\";\n var attribs = \" \";\n const argIter = (arg) => {\n if (typeof arg === \"undefined\" || arg === null || arg === false) {\n //do nothing\n }\n else if (typeof arg === \"string\") {\n body += arg;\n }\n else if (Array.isArray(arg)) {\n arg.forEach(argIter);\n }\n else\n body += arg;\n };\n if (typeof attributes_or_first_child === \"object\" &&\n !Array.isArray(attributes_or_first_child) &&\n attributes_or_first_child !== null) {\n attribs += Object.entries(attributes_or_first_child)\n .map(ppAttrib)\n .filter((s) => s)\n .join(\" \");\n children.forEach(argIter);\n }\n else {\n [attributes_or_first_child, ...children].forEach(argIter);\n }\n if (attribs === \" \")\n attribs = \"\";\n return voidTag\n ? `<${tnm}${attribs}>`\n : `<${tnm}${attribs}>${body}</${tnm}>`;\n};\nmodule.exports = mkTag;\n//# sourceMappingURL=mktag.js.map\n\n//# sourceURL=webpack://saltcorn/../saltcorn-markup/dist/mktag.js?\n}");
|
|
110
|
+
|
|
111
|
+
/***/ },
|
|
112
|
+
|
|
113
|
+
/***/ "../saltcorn-markup/dist/table.js"
|
|
114
|
+
/*!****************************************!*\
|
|
115
|
+
!*** ../saltcorn-markup/dist/table.js ***!
|
|
116
|
+
\****************************************/
|
|
117
|
+
(module, __unused_webpack_exports, __webpack_require__) {
|
|
118
|
+
|
|
119
|
+
eval("{\n/**\n * @category saltcorn-markup\n * @module table\n */\nconst tags = __webpack_require__(/*! ./tags */ \"../saltcorn-markup/dist/tags.js\");\nconst { a, td, tr, th, text, div, table, thead, tbody, ul, li, span, h4, style, i, button, } = tags;\nconst helpers = __webpack_require__(/*! ./helpers */ \"../saltcorn-markup/dist/helpers.js\");\nconst { pagination } = helpers;\n/**\n * @param {any} hdr\n * @returns {th}\n */\nconst headerCell = (hdr, opts, ix) => {\n const is_open = opts.header_filters_open?.has?.(hdr.row_key) ||\n opts.header_filters_open?.has?.(hdr.statekey) ||\n opts.header_filters_open?.has?.(`_fromdate_${hdr.row_key}`) ||\n opts.header_filters_open?.has?.(`_todate_${hdr.row_key}`) ||\n opts.header_filters_open?.has?.(`_gte_${hdr.row_key}`) ||\n opts.header_filters_open?.has?.(`_lte_${hdr.row_key}`);\n const rndid = opts.header_filters_dropdown &&\n `hfdd${Math.floor(Math.random() * 16777215).toString(16)}`;\n return th((hdr.align ||\n hdr.width ||\n (opts.header_filters_dropdown && hdr.header_filter)) && {\n style: {\n width: hdr.width || null,\n position: opts.header_filters_dropdown && hdr.header_filter ? \"relative\" : null,\n },\n ...(hdr.align ? { class: `text-align-${hdr.align}` } : {}),\n }, hdr.sortlink\n ? span({ onclick: hdr.sortlink, class: \"link-style\" }, hdr.label)\n : hdr.label, opts.header_filters_dropdown &&\n hdr.header_filter &&\n span({ class: \"dropdown float-end\" }, button({\n class: [\n `btn btn-${is_open ? \"\" : \"outline-\"}secondary btn-sm btn-xs dropdown-toggle`,\n is_open && \"hdr-open\",\n ],\n \"data-boundary\": \"viewport\",\n type: \"button\",\n \"data-bs-toggle\": \"dropdown\",\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": \"false\",\n id: rndid,\n }), div({\n class: [\"hdrfiltdrop dropdown-menu\", ix > 0 && \"dropdown-menu-end\"],\n \"aria-labelledby\": rndid,\n }, div({ class: \"p-2\" }, div(\"Filter \", hdr.row_label || \"\"), hdr.header_filter(rndid), button({\n type: \"button\",\n class: \"btn btn-secondary btn-sm mt-1\",\n onclick: `clear_state('', ${rndid ? `document.getElementById('${rndid}')` : \"this\"})`,\n }, \"Clear all\")))));\n};\nconst headerFilter = (hdr, isLast) => th((hdr.align || hdr.width) && {\n style: hdr.width ? `width: ` + hdr.width : \"\",\n ...(hdr.align ? { class: `text-align-${hdr.align}` } : {}),\n}, isLast\n ? div({ class: \"d-flex\" }, hdr.header_filter?.() || null, button({\n type: \"button\",\n class: \"btn btn-xs btn-outline-secondary\",\n onclick: \"clear_state('', this)\",\n }, i({ class: \"fas fa-times\" })))\n : hdr.header_filter?.() || null);\nconst headerCellWithToggle = (hdr, opts, isLast, ix) => {\n if (!(isLast && opts.header_filters && opts.header_filters_toggle))\n return headerCell(hdr, opts, ix);\n const content = hdr.sortlink\n ? span({ onclick: hdr.sortlink, class: \"link-style\" }, hdr.label)\n : hdr.label;\n const toggleIcon = span({\n class: \"header-filter-toggle link-style float-end\",\n title: \"Show/Hide filters\",\n onclick: `toggle_header_filters(this)`,\n style: \"cursor:pointer;margin-left:1rem;display:inline-flex;align-items:center;\",\n }, i({ class: \"fas fa-chevron-down\" }));\n return th((hdr.align || hdr.width) && {\n style: hdr.width ? `width: ` + hdr.width : \"\",\n ...(hdr.align ? { class: `text-align-${hdr.align}` } : {}),\n }, content, toggleIcon);\n};\n/**\n * @function\n * @param {object[]} hdrs\n * @param {object[]} vs\n * @param {object} [opts]\n * @returns {string}\n */\nconst transposedBody = (hdrs, vs, opts = {}) => hdrs.map((hdr, ix) => {\n const row_key = hdr.row_key || (typeof hdr.key === \"string\" ? hdr.key : null);\n return tr(row_key ? { \"row-key\": row_key } : {}, !opts.noHeader && th(hdr.label), (vs || []).map((v) => td(ix === 0 && opts.transpose_width\n ? {\n style: {\n width: `${opts.transpose_width}${opts.transpose_width_units}`,\n },\n }\n : null, typeof hdr.key === \"string\" ? text(v[hdr.key]) : hdr.key(v))));\n});\n/**\n * @function\n * @param {object[]} hdrs\n * @param {object[]} vs\n * @param {object} [opts]\n * @returns {string}\n */\nconst mkTable = (hdrs, vs, opts = {}) => {\n const pk_name = opts.pk_name || \"id\";\n const val_row = (v) => {\n let rowColor;\n if (opts.row_color_function) {\n try {\n rowColor = opts.row_color_function?.(v);\n }\n catch {\n rowColor = undefined;\n }\n }\n const cellWrapper = opts.rowAnchorLink\n ? (val) => {\n const href = opts.onRowSelect(v);\n if (!href)\n return val;\n return a({ class: \"anchor-row-link\", href }, val || \" \");\n }\n : (val) => val;\n return tr({\n ...(v[pk_name] ? { \"data-row-id\": v[pk_name] } : {}),\n ...mkClickHandler(opts, v),\n ...(rowColor ? { style: { backgroundColor: rowColor } } : {}),\n }, hdrs.map((hdr, hdr_ix) => td({\n style: {\n ...(hdr.width && opts.noHeader ? { width: hdr.width } : {}),\n ...(rowColor ? { backgroundColor: rowColor } : {}),\n },\n ...(hdr.align ? { class: `text-align-${hdr.align}` } : {}),\n }, hdr_ix == 0 && opts.level_indicator && v._level\n ? \" \".repeat(v._level) + \"└ \"\n : null, cellWrapper(typeof hdr.key === \"string\" ? text(v[hdr.key]) : hdr.key(v)))));\n };\n const groupedBody = (groups) => Object.entries(groups).map(([group, rows]) => tr(td({ colspan: \"1000\" }, h4({ class: \"list-group-header\" }, group))) +\n rows.map(val_row).join(\"\"));\n return div({\n class: [!opts.sticky_header && \"table-responsive\", opts.tableClass],\n id: opts.tableId,\n }, table({\n class: [\n \"table table-sm\",\n opts.class,\n ((hdrs.some((h) => h.width) &&\n opts.table_layout !== \"Auto\") ||\n opts.table_layout === \"Fixed\") &&\n \"table-layout-fixed\",\n (opts.onRowSelect || (opts.hover && vs && vs.length > 1)) &&\n \"table-hover\",\n ],\n style: opts.style,\n }, !opts.noHeader &&\n !opts.transpose &&\n thead(opts.sticky_header || opts.header_filters_dropdown\n ? {\n class: [\n opts.sticky_header && \"sticky-top\",\n opts.header_filters_dropdown && \"header-filter-dropdown\",\n ],\n }\n : \"\", tr(hdrs.map((hdr, ix) => headerCellWithToggle(hdr, opts, ix === hdrs.length - 1, ix))), opts.header_filters && !opts.header_filters_dropdown\n ? tr({\n class: \"header-filters\",\n id: opts.header_filters_toggle\n ? `${opts.tableId || \"table\"}_header_filters_row`\n : null,\n ...(opts.header_filters_toggle &&\n !opts.header_filters_open?.size\n ? { style: \"display:none;\" }\n : {}),\n }, hdrs.map((hdr, ix) => headerFilter(hdr, ix === hdrs.length - 1)))\n : null), tbody(opts.transpose\n ? transposedBody(hdrs, vs, opts)\n : opts.grouped\n ? groupedBody(vs)\n : (vs || []).map(val_row))), opts.pagination && pagination(opts.pagination), \n //https://css-tricks.com/responsive-data-tables/\n opts.responsiveCollapse &&\n opts.tableId &&\n style(`@media \nonly screen and (max-width: ${opts.collapse_breakpoint_px || 760}px) {\n\t#${opts.tableId} table, #${opts.tableId} thead, #${opts.tableId} tbody, #${opts.tableId} th, #${opts.tableId} td, #${opts.tableId} tr { \n\t\tdisplay: block; \n\t}\n\n #${opts.tableId} tr.header-filter {\n display: none;\n }\n #${opts.tableId} td.text-align-right,\n #${opts.tableId} td.text-align-center,\n #${opts.tableId} th.text-align-right,\n #${opts.tableId} th.text-align-center {\n text-align: left !important;\n }\n\n\t#${opts.tableId} thead tr { \n\t\tposition: absolute;\n\t\ttop: -9999px;\n\t\tleft: -9999px;\n\t}\n \n\t\n\t#${opts.tableId} tr { border: 1px solid #ccc; }\n\t#${opts.tableId} tr:not(:first-child) { border-top-width: 3px }\n\t\n\t#${opts.tableId} td { \n\t\tborder: none;\n\t\tborder-bottom: 1px solid #eee; \n\t\tposition: relative;\n\t\tpadding-left: 50%;\n min-height: 1.5lh;\n\t}\n\t\n\t#${opts.tableId} td:before { \n\t\tposition: absolute;\n\t\ttop: 6px;\n\t\tleft: 6px;\n\t\twidth: 45%; \n\t\tpadding-right: 10px; \n\t\twhite-space: nowrap;\n\t}\n\n ${hdrs.map((hdr, ix) => `#${opts.tableId} td:nth-of-type(${ix + 1}):before { content: \"${hdr.label}\"; }`).join(\"\\n\")}\t\n}`), opts.header_filters_toggle &&\n style(`#${opts.tableId || \"table\"} .header-filter-toggle i{transition:transform .2s;}\n#${opts.tableId || \"table\"} .header-filter-toggle .fa-chevron-up{transform:rotate(0deg);}\n#${opts.tableId || \"table\"} .header-filter-toggle .fa-chevron-down{transform:rotate(180deg);}`));\n};\n/**\n * @param {object} opts\n * @param {object} v\n * @returns {object}\n */\nconst mkClickHandler = (opts, v) => {\n var attrs = {};\n if (opts.onRowSelect && !opts.rowAnchorLink)\n attrs.onclick =\n typeof opts.onRowSelect === \"function\"\n ? opts.onRowSelect(v)\n : opts.onRowSelect;\n if (opts.selectedId && v.id && +v.id === +opts.selectedId)\n attrs.class = \"table-active\";\n return attrs;\n};\n// declaration merging\nconst TableExports = mkTable;\nmodule.exports = TableExports;\n//# sourceMappingURL=table.js.map\n\n//# sourceURL=webpack://saltcorn/../saltcorn-markup/dist/table.js?\n}");
|
|
120
|
+
|
|
121
|
+
/***/ },
|
|
122
|
+
|
|
123
|
+
/***/ "../saltcorn-markup/dist/tabs.js"
|
|
124
|
+
/*!***************************************!*\
|
|
125
|
+
!*** ../saltcorn-markup/dist/tabs.js ***!
|
|
126
|
+
\***************************************/
|
|
127
|
+
(module, __unused_webpack_exports, __webpack_require__) {
|
|
128
|
+
|
|
129
|
+
eval("{\n/**\n * @category saltcorn-markup\n * @module tabs\n */\nconst tags = __webpack_require__(/*! ./tags */ \"../saltcorn-markup/dist/tags.js\");\nconst { a, text, div, ul, li } = tags;\n/**\n * @param {string} str\n * @returns {string}\n */\nconst mkId = (str) => text(str.split(\" \").join(\"_\"));\n/**\n * @param {object} obj\n * @returns {object}\n */\nconst tabs = (obj) => {\n const entries = Array.isArray(obj) ? obj : Object.entries(obj);\n const lis = entries.map((e, ix) => li({ class: \"nav-item\" }, a({\n class: [\"nav-link\", ix == 0 && \"active\"],\n \"data-bs-toggle\": \"tab\",\n href: `#${mkId(e[0])}`,\n id: `${mkId(e[0])}-tab`,\n role: \"tab\",\n \"aria-controls\": \"home\",\n \"aria-selected\": \"true\",\n }, text(e[0]))));\n const divs = entries.map((e, ix) => div({\n class: [\"tab-pane fade\", ix == 0 && \"show active\"],\n id: `${mkId(e[0])}`,\n role: \"tabpanel\",\n \"aria-labelledby\": `${mkId(e[0])}-tab`,\n }, e[1]));\n return (ul({ class: \"nav nav-tabs\", role: \"tablist\" }, lis) +\n div({ class: \"tab-content\" }, divs));\n};\nmodule.exports = tabs;\n//# sourceMappingURL=tabs.js.map\n\n//# sourceURL=webpack://saltcorn/../saltcorn-markup/dist/tabs.js?\n}");
|
|
130
|
+
|
|
131
|
+
/***/ },
|
|
132
|
+
|
|
133
|
+
/***/ "../saltcorn-markup/dist/tags.js"
|
|
134
|
+
/*!***************************************!*\
|
|
135
|
+
!*** ../saltcorn-markup/dist/tags.js ***!
|
|
136
|
+
\***************************************/
|
|
137
|
+
(module, __unused_webpack_exports, __webpack_require__) {
|
|
138
|
+
|
|
139
|
+
eval("{\n/**\n * @category saltcorn-markup\n * @module tags\n */\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || (function () {\n var ownKeys = function(o) {\n ownKeys = Object.getOwnPropertyNames || function (o) {\n var ar = [];\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n return ar;\n };\n return ownKeys(o);\n };\n return function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n __setModuleDefault(result, mod);\n return result;\n };\n})();\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nconst mkTag = __webpack_require__(/*! ./mktag */ \"../saltcorn-markup/dist/mktag.js\");\nconst xss_1 = __importStar(__webpack_require__(/*! xss */ \"../../node_modules/xss/lib/index.js\"));\nconst escape_html_1 = __importDefault(__webpack_require__(/*! escape-html */ \"../../node_modules/escape-html/index.js\"));\nconst html_tags_1 = __importDefault(__webpack_require__(/*! html-tags */ \"../../node_modules/html-tags/index.js\"));\nconst void_1 = __importDefault(__webpack_require__(/*! html-tags/void */ \"../../node_modules/html-tags/void.js\"));\nconst voidHtmlTagsSet = new Set(void_1.default);\n//https://stackoverflow.com/a/59220393\n/**\n * @param {string} js\n * @returns {string}\n */\nconst domReady = (js) => `(function(f){if (document.readyState === \"complete\") f(); else document.addEventListener('DOMContentLoaded',()=>setTimeout(f),false)})(function(){${js}});`;\nconst with_curScript = (js) => `((curScript)=>{${js}})(document.currentScript)`;\nxss_1.whiteList.kbd = [];\nxss_1.whiteList.span = [\"style\"];\nxss_1.whiteList.div = [\"style\"];\nxss_1.whiteList.td = [\"style\"];\nconst mergeWhiteList = (customWhiteList) => {\n const res = JSON.parse(JSON.stringify(xss_1.whiteList));\n for (const [k, v] of Object.entries(customWhiteList)) {\n if (!v)\n continue;\n if (res[k])\n res[k].push(...v);\n else\n res[k] = v;\n }\n return res;\n};\n/**\n * @param {string|number} t\n * @returns {string}\n */\nconst text = (t, customWhiteList) => t === 0\n ? \"0\"\n : (0, xss_1.default)(t, customWhiteList\n ? { whiteList: mergeWhiteList(customWhiteList) }\n : undefined);\n/**\n * @param {string|number} t\n * @returns {string}\n */\nconst text_attr = (t) => (t === 0 ? \"0\" : (0, escape_html_1.default)(t));\n/**\n */\nconst allTags = Object.fromEntries(html_tags_1.default.map((tag) => [tag, mkTag(tag, voidHtmlTagsSet.has(tag))]));\nconst tagsExports = {\n ...allTags,\n /**\n * @param {string} tagName\n * @param {...*} rest\n * @returns {string}\n */\n genericElement: (tagName, attributes_or_first_child, ...children) => mkTag(tagName, false)(attributes_or_first_child, ...children),\n domReady,\n with_curScript,\n text,\n text_attr,\n /** @type {string} */\n nbsp: \" \",\n /** @type {module:mktag} */\n mkTag,\n escape: escape_html_1.default,\n};\nmodule.exports = tagsExports;\n//# sourceMappingURL=tags.js.map\n\n//# sourceURL=webpack://saltcorn/../saltcorn-markup/dist/tags.js?\n}");
|
|
140
|
+
|
|
141
|
+
/***/ },
|
|
142
|
+
|
|
143
|
+
/***/ "../saltcorn-markup/dist/workflow.js"
|
|
144
|
+
/*!*******************************************!*\
|
|
145
|
+
!*** ../saltcorn-markup/dist/workflow.js ***!
|
|
146
|
+
\*******************************************/
|
|
147
|
+
(module, __unused_webpack_exports, __webpack_require__) {
|
|
148
|
+
|
|
149
|
+
eval("{\n/**\n * @category saltcorn-markup\n * @module workflow\n */\nconst tags = __webpack_require__(/*! ./tags */ \"../saltcorn-markup/dist/tags.js\");\nconst { div, script, style } = tags;\nconst encode = (x) => encodeURIComponent(JSON.stringify(x));\n/**\n * Render the workflow editor shell\n * @param workflowData\n * @param version_tag\n * @returns {string}\n */\nconst renderWorkflow = (workflowData, version_tag) => div({ class: \"workflow-editor-wrapper\" }, style(/*css*/ `\n .workflow-editor-wrapper {\n display: flex;\n flex-direction: column;\n }\n #saltcorn-workflow-editor {\n flex: 1;\n min-height: 0px;\n }\n `), script({\n src: version_tag\n ? `/static_assets/${version_tag}/workflow_bundle.js`\n : \"/workflow_bundle.js\",\n}), div({ id: \"saltcorn-workflow-editor\" }), script(`workflow.renderWorkflowEditor(\"saltcorn-workflow-editor\", \"${encode(workflowData)}\");`));\nmodule.exports = renderWorkflow;\n//# sourceMappingURL=workflow.js.map\n\n//# sourceURL=webpack://saltcorn/../saltcorn-markup/dist/workflow.js?\n}");
|
|
150
|
+
|
|
151
|
+
/***/ },
|
|
152
|
+
|
|
153
|
+
/***/ "../saltcorn-types/dist/base_types.js"
|
|
154
|
+
/*!********************************************!*\
|
|
155
|
+
!*** ../saltcorn-types/dist/base_types.js ***!
|
|
156
|
+
\********************************************/
|
|
157
|
+
(__unused_webpack_module, exports, __webpack_require__) {
|
|
158
|
+
|
|
159
|
+
eval("{\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.instanceOfPack = void 0;\nexports.instanceOWithHtmlFile = instanceOWithHtmlFile;\nexports.instanceOfFieldViewEdit = instanceOfFieldViewEdit;\nexports.instanceOfFieldViewShow = instanceOfFieldViewShow;\nconst abstract_table_1 = __webpack_require__(/*! ./model-abstracts/abstract_table */ \"../saltcorn-types/dist/model-abstracts/abstract_table.js\");\nconst abstract_view_1 = __webpack_require__(/*! ./model-abstracts/abstract_view */ \"../saltcorn-types/dist/model-abstracts/abstract_view.js\");\nconst abstract_plugin_1 = __webpack_require__(/*! ./model-abstracts/abstract_plugin */ \"../saltcorn-types/dist/model-abstracts/abstract_plugin.js\");\nfunction instanceOWithHtmlFile(object) {\n return object && typeof object !== \"string\" && \"html_file\" in object;\n}\nfunction instanceOfFieldViewEdit(object) {\n return object && typeof object !== \"string\" && object.isEdit === true;\n}\nfunction instanceOfFieldViewShow(object) {\n return object && typeof object !== \"string\" && object.isEdit === false;\n}\nconst instanceOfPack = (object) => {\n return (object &&\n \"tables\" in object &&\n Array.isArray(object.tables) &&\n object.tables.every((t) => (0, abstract_table_1.instanceOfTable)(t)) &&\n \"views\" in object &&\n Array.isArray(object.views) &&\n object.views.every((v) => (0, abstract_view_1.instanceOfView)(v)) &&\n \"plugins\" in object &&\n Array.isArray(object.plugins) &&\n object.plugins.every((p) => (0, abstract_plugin_1.instanceOfPlugin)(p)));\n};\nexports.instanceOfPack = instanceOfPack;\n//# sourceMappingURL=base_types.js.map\n\n//# sourceURL=webpack://saltcorn/../saltcorn-types/dist/base_types.js?\n}");
|
|
160
|
+
|
|
161
|
+
/***/ },
|
|
162
|
+
|
|
163
|
+
/***/ "../saltcorn-types/dist/model-abstracts/abstract_field.js"
|
|
164
|
+
/*!****************************************************************!*\
|
|
165
|
+
!*** ../saltcorn-types/dist/model-abstracts/abstract_field.js ***!
|
|
166
|
+
\****************************************************************/
|
|
167
|
+
(__unused_webpack_module, exports) {
|
|
168
|
+
|
|
169
|
+
eval("{\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.instanceOfField = void 0;\nconst instanceOfField = (object) => {\n return object && \"name\" in object && \"input_type\" in object;\n};\nexports.instanceOfField = instanceOfField;\n//# sourceMappingURL=abstract_field.js.map\n\n//# sourceURL=webpack://saltcorn/../saltcorn-types/dist/model-abstracts/abstract_field.js?\n}");
|
|
170
|
+
|
|
171
|
+
/***/ },
|
|
172
|
+
|
|
173
|
+
/***/ "../saltcorn-types/dist/model-abstracts/abstract_plugin.js"
|
|
174
|
+
/*!*****************************************************************!*\
|
|
175
|
+
!*** ../saltcorn-types/dist/model-abstracts/abstract_plugin.js ***!
|
|
176
|
+
\*****************************************************************/
|
|
177
|
+
(__unused_webpack_module, exports) {
|
|
178
|
+
|
|
179
|
+
eval("{\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.instanceOfPlugin = void 0;\nconst instanceOfPlugin = (object) => {\n return (object && \"name\" in object && \"location\" in object && \"source\" in object);\n};\nexports.instanceOfPlugin = instanceOfPlugin;\n//# sourceMappingURL=abstract_plugin.js.map\n\n//# sourceURL=webpack://saltcorn/../saltcorn-types/dist/model-abstracts/abstract_plugin.js?\n}");
|
|
180
|
+
|
|
181
|
+
/***/ },
|
|
182
|
+
|
|
183
|
+
/***/ "../saltcorn-types/dist/model-abstracts/abstract_table.js"
|
|
184
|
+
/*!****************************************************************!*\
|
|
185
|
+
!*** ../saltcorn-types/dist/model-abstracts/abstract_table.js ***!
|
|
186
|
+
\****************************************************************/
|
|
187
|
+
(__unused_webpack_module, exports) {
|
|
188
|
+
|
|
189
|
+
eval("{\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.instanceOfTable = void 0;\nconst instanceOfTable = (object) => {\n return (object &&\n \"name\" in object &&\n \"fields\" in object &&\n Array.isArray(object.fields));\n};\nexports.instanceOfTable = instanceOfTable;\n//# sourceMappingURL=abstract_table.js.map\n\n//# sourceURL=webpack://saltcorn/../saltcorn-types/dist/model-abstracts/abstract_table.js?\n}");
|
|
190
|
+
|
|
191
|
+
/***/ },
|
|
192
|
+
|
|
193
|
+
/***/ "../saltcorn-types/dist/model-abstracts/abstract_view.js"
|
|
194
|
+
/*!***************************************************************!*\
|
|
195
|
+
!*** ../saltcorn-types/dist/model-abstracts/abstract_view.js ***!
|
|
196
|
+
\***************************************************************/
|
|
197
|
+
(__unused_webpack_module, exports) {
|
|
198
|
+
|
|
199
|
+
eval("{\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.instanceOfView = void 0;\nconst instanceOfView = (object) => {\n return object && \"name\" in object && \"viewtemplate\" in object;\n};\nexports.instanceOfView = instanceOfView;\n//# sourceMappingURL=abstract_view.js.map\n\n//# sourceURL=webpack://saltcorn/../saltcorn-types/dist/model-abstracts/abstract_view.js?\n}");
|
|
200
|
+
|
|
201
|
+
/***/ }
|
|
202
|
+
|
|
203
|
+
/******/ });
|
|
204
|
+
/************************************************************************/
|
|
205
|
+
/******/ // The module cache
|
|
206
|
+
/******/ var __webpack_module_cache__ = {};
|
|
207
|
+
/******/
|
|
208
|
+
/******/ // The require function
|
|
209
|
+
/******/ function __webpack_require__(moduleId) {
|
|
210
|
+
/******/ // Check if module is in cache
|
|
211
|
+
/******/ var cachedModule = __webpack_module_cache__[moduleId];
|
|
212
|
+
/******/ if (cachedModule !== undefined) {
|
|
213
|
+
/******/ return cachedModule.exports;
|
|
214
|
+
/******/ }
|
|
215
|
+
/******/ // Create a new module (and put it into the cache)
|
|
216
|
+
/******/ var module = __webpack_module_cache__[moduleId] = {
|
|
217
|
+
/******/ id: moduleId,
|
|
218
|
+
/******/ loaded: false,
|
|
219
|
+
/******/ exports: {}
|
|
220
|
+
/******/ };
|
|
221
|
+
/******/
|
|
222
|
+
/******/ // Execute the module function
|
|
223
|
+
/******/ if (!(moduleId in __webpack_modules__)) {
|
|
224
|
+
/******/ delete __webpack_module_cache__[moduleId];
|
|
225
|
+
/******/ var e = new Error("Cannot find module '" + moduleId + "'");
|
|
226
|
+
/******/ e.code = 'MODULE_NOT_FOUND';
|
|
227
|
+
/******/ throw e;
|
|
228
|
+
/******/ }
|
|
229
|
+
/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
|
230
|
+
/******/
|
|
231
|
+
/******/ // Flag the module as loaded
|
|
232
|
+
/******/ module.loaded = true;
|
|
233
|
+
/******/
|
|
234
|
+
/******/ // Return the exports of the module
|
|
235
|
+
/******/ return module.exports;
|
|
236
|
+
/******/ }
|
|
237
|
+
/******/
|
|
238
|
+
/******/ // expose the modules object (__webpack_modules__)
|
|
239
|
+
/******/ __webpack_require__.m = __webpack_modules__;
|
|
240
|
+
/******/
|
|
241
|
+
/******/ // expose the module cache
|
|
242
|
+
/******/ __webpack_require__.c = __webpack_module_cache__;
|
|
243
|
+
/******/
|
|
244
|
+
/************************************************************************/
|
|
245
|
+
/******/ /* webpack/runtime/chunk loaded */
|
|
246
|
+
/******/ (() => {
|
|
247
|
+
/******/ var deferred = [];
|
|
248
|
+
/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => {
|
|
249
|
+
/******/ if(chunkIds) {
|
|
250
|
+
/******/ priority = priority || 0;
|
|
251
|
+
/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];
|
|
252
|
+
/******/ deferred[i] = [chunkIds, fn, priority];
|
|
253
|
+
/******/ return;
|
|
254
|
+
/******/ }
|
|
255
|
+
/******/ var notFulfilled = Infinity;
|
|
256
|
+
/******/ for (var i = 0; i < deferred.length; i++) {
|
|
257
|
+
/******/ var [chunkIds, fn, priority] = deferred[i];
|
|
258
|
+
/******/ var fulfilled = true;
|
|
259
|
+
/******/ for (var j = 0; j < chunkIds.length; j++) {
|
|
260
|
+
/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {
|
|
261
|
+
/******/ chunkIds.splice(j--, 1);
|
|
262
|
+
/******/ } else {
|
|
263
|
+
/******/ fulfilled = false;
|
|
264
|
+
/******/ if(priority < notFulfilled) notFulfilled = priority;
|
|
265
|
+
/******/ }
|
|
266
|
+
/******/ }
|
|
267
|
+
/******/ if(fulfilled) {
|
|
268
|
+
/******/ deferred.splice(i--, 1)
|
|
269
|
+
/******/ var r = fn();
|
|
270
|
+
/******/ if (r !== undefined) result = r;
|
|
271
|
+
/******/ }
|
|
272
|
+
/******/ }
|
|
273
|
+
/******/ return result;
|
|
274
|
+
/******/ };
|
|
275
|
+
/******/ })();
|
|
276
|
+
/******/
|
|
277
|
+
/******/ /* webpack/runtime/create fake namespace object */
|
|
278
|
+
/******/ (() => {
|
|
279
|
+
/******/ var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);
|
|
280
|
+
/******/ var leafPrototypes;
|
|
281
|
+
/******/ // create a fake namespace object
|
|
282
|
+
/******/ // mode & 1: value is a module id, require it
|
|
283
|
+
/******/ // mode & 2: merge all properties of value into the ns
|
|
284
|
+
/******/ // mode & 4: return value when already ns object
|
|
285
|
+
/******/ // mode & 16: return value when it's Promise-like
|
|
286
|
+
/******/ // mode & 8|1: behave like require
|
|
287
|
+
/******/ __webpack_require__.t = function(value, mode) {
|
|
288
|
+
/******/ if(mode & 1) value = this(value);
|
|
289
|
+
/******/ if(mode & 8) return value;
|
|
290
|
+
/******/ if(typeof value === 'object' && value) {
|
|
291
|
+
/******/ if((mode & 4) && value.__esModule) return value;
|
|
292
|
+
/******/ if((mode & 16) && typeof value.then === 'function') return value;
|
|
293
|
+
/******/ }
|
|
294
|
+
/******/ var ns = Object.create(null);
|
|
295
|
+
/******/ __webpack_require__.r(ns);
|
|
296
|
+
/******/ var def = {};
|
|
297
|
+
/******/ leafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];
|
|
298
|
+
/******/ for(var current = mode & 2 && value; (typeof current == 'object' || typeof current == 'function') && !~leafPrototypes.indexOf(current); current = getProto(current)) {
|
|
299
|
+
/******/ Object.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));
|
|
300
|
+
/******/ }
|
|
301
|
+
/******/ def['default'] = () => (value);
|
|
302
|
+
/******/ __webpack_require__.d(ns, def);
|
|
303
|
+
/******/ return ns;
|
|
304
|
+
/******/ };
|
|
305
|
+
/******/ })();
|
|
306
|
+
/******/
|
|
307
|
+
/******/ /* webpack/runtime/define property getters */
|
|
308
|
+
/******/ (() => {
|
|
309
|
+
/******/ // define getter functions for harmony exports
|
|
310
|
+
/******/ __webpack_require__.d = (exports, definition) => {
|
|
311
|
+
/******/ for(var key in definition) {
|
|
312
|
+
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
|
|
313
|
+
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
|
|
314
|
+
/******/ }
|
|
315
|
+
/******/ }
|
|
316
|
+
/******/ };
|
|
317
|
+
/******/ })();
|
|
318
|
+
/******/
|
|
319
|
+
/******/ /* webpack/runtime/ensure chunk */
|
|
320
|
+
/******/ (() => {
|
|
321
|
+
/******/ __webpack_require__.f = {};
|
|
322
|
+
/******/ // This file contains only the entry chunk.
|
|
323
|
+
/******/ // The chunk loading function for additional chunks
|
|
324
|
+
/******/ __webpack_require__.e = (chunkId) => {
|
|
325
|
+
/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {
|
|
326
|
+
/******/ __webpack_require__.f[key](chunkId, promises);
|
|
327
|
+
/******/ return promises;
|
|
328
|
+
/******/ }, []));
|
|
329
|
+
/******/ };
|
|
330
|
+
/******/ })();
|
|
331
|
+
/******/
|
|
332
|
+
/******/ /* webpack/runtime/get javascript chunk filename */
|
|
333
|
+
/******/ (() => {
|
|
334
|
+
/******/ // This function allow to reference async chunks
|
|
335
|
+
/******/ __webpack_require__.u = (chunkId) => {
|
|
336
|
+
/******/ // return url for filenames based on template
|
|
337
|
+
/******/ return undefined;
|
|
338
|
+
/******/ };
|
|
339
|
+
/******/ })();
|
|
340
|
+
/******/
|
|
341
|
+
/******/ /* webpack/runtime/global */
|
|
342
|
+
/******/ (() => {
|
|
343
|
+
/******/ __webpack_require__.g = (function() {
|
|
344
|
+
/******/ if (typeof globalThis === 'object') return globalThis;
|
|
345
|
+
/******/ try {
|
|
346
|
+
/******/ return this || new Function('return this')();
|
|
347
|
+
/******/ } catch (e) {
|
|
348
|
+
/******/ if (typeof window === 'object') return window;
|
|
349
|
+
/******/ }
|
|
350
|
+
/******/ })();
|
|
351
|
+
/******/ })();
|
|
352
|
+
/******/
|
|
353
|
+
/******/ /* webpack/runtime/hasOwnProperty shorthand */
|
|
354
|
+
/******/ (() => {
|
|
355
|
+
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
|
|
356
|
+
/******/ })();
|
|
357
|
+
/******/
|
|
358
|
+
/******/ /* webpack/runtime/load script */
|
|
359
|
+
/******/ (() => {
|
|
360
|
+
/******/ var inProgress = {};
|
|
361
|
+
/******/ var dataWebpackPrefix = "saltcorn:";
|
|
362
|
+
/******/ // loadScript function to load a script via script tag
|
|
363
|
+
/******/ __webpack_require__.l = (url, done, key, chunkId) => {
|
|
364
|
+
/******/ if(inProgress[url]) { inProgress[url].push(done); return; }
|
|
365
|
+
/******/ var script, needAttach;
|
|
366
|
+
/******/ if(key !== undefined) {
|
|
367
|
+
/******/ var scripts = document.getElementsByTagName("script");
|
|
368
|
+
/******/ for(var i = 0; i < scripts.length; i++) {
|
|
369
|
+
/******/ var s = scripts[i];
|
|
370
|
+
/******/ if(s.getAttribute("src") == url || s.getAttribute("data-webpack") == dataWebpackPrefix + key) { script = s; break; }
|
|
371
|
+
/******/ }
|
|
372
|
+
/******/ }
|
|
373
|
+
/******/ if(!script) {
|
|
374
|
+
/******/ needAttach = true;
|
|
375
|
+
/******/ script = document.createElement('script');
|
|
376
|
+
/******/
|
|
377
|
+
/******/ script.charset = 'utf-8';
|
|
378
|
+
/******/ if (__webpack_require__.nc) {
|
|
379
|
+
/******/ script.setAttribute("nonce", __webpack_require__.nc);
|
|
380
|
+
/******/ }
|
|
381
|
+
/******/ script.setAttribute("data-webpack", dataWebpackPrefix + key);
|
|
382
|
+
/******/
|
|
383
|
+
/******/ script.src = url;
|
|
384
|
+
/******/ }
|
|
385
|
+
/******/ inProgress[url] = [done];
|
|
386
|
+
/******/ var onScriptComplete = (prev, event) => {
|
|
387
|
+
/******/ // avoid mem leaks in IE.
|
|
388
|
+
/******/ script.onerror = script.onload = null;
|
|
389
|
+
/******/ clearTimeout(timeout);
|
|
390
|
+
/******/ var doneFns = inProgress[url];
|
|
391
|
+
/******/ delete inProgress[url];
|
|
392
|
+
/******/ script.parentNode && script.parentNode.removeChild(script);
|
|
393
|
+
/******/ doneFns && doneFns.forEach((fn) => (fn(event)));
|
|
394
|
+
/******/ if(prev) return prev(event);
|
|
395
|
+
/******/ }
|
|
396
|
+
/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);
|
|
397
|
+
/******/ script.onerror = onScriptComplete.bind(null, script.onerror);
|
|
398
|
+
/******/ script.onload = onScriptComplete.bind(null, script.onload);
|
|
399
|
+
/******/ needAttach && document.head.appendChild(script);
|
|
400
|
+
/******/ };
|
|
401
|
+
/******/ })();
|
|
402
|
+
/******/
|
|
403
|
+
/******/ /* webpack/runtime/make namespace object */
|
|
404
|
+
/******/ (() => {
|
|
405
|
+
/******/ // define __esModule on exports
|
|
406
|
+
/******/ __webpack_require__.r = (exports) => {
|
|
407
|
+
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
|
408
|
+
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
409
|
+
/******/ }
|
|
410
|
+
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
|
411
|
+
/******/ };
|
|
412
|
+
/******/ })();
|
|
413
|
+
/******/
|
|
414
|
+
/******/ /* webpack/runtime/node module decorator */
|
|
415
|
+
/******/ (() => {
|
|
416
|
+
/******/ __webpack_require__.nmd = (module) => {
|
|
417
|
+
/******/ module.paths = [];
|
|
418
|
+
/******/ if (!module.children) module.children = [];
|
|
419
|
+
/******/ return module;
|
|
420
|
+
/******/ };
|
|
421
|
+
/******/ })();
|
|
422
|
+
/******/
|
|
423
|
+
/******/ /* webpack/runtime/publicPath */
|
|
424
|
+
/******/ (() => {
|
|
425
|
+
/******/ var scriptUrl;
|
|
426
|
+
/******/ if (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + "";
|
|
427
|
+
/******/ var document = __webpack_require__.g.document;
|
|
428
|
+
/******/ if (!scriptUrl && document) {
|
|
429
|
+
/******/ if (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')
|
|
430
|
+
/******/ scriptUrl = document.currentScript.src;
|
|
431
|
+
/******/ if (!scriptUrl) {
|
|
432
|
+
/******/ var scripts = document.getElementsByTagName("script");
|
|
433
|
+
/******/ if(scripts.length) {
|
|
434
|
+
/******/ var i = scripts.length - 1;
|
|
435
|
+
/******/ while (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;
|
|
436
|
+
/******/ }
|
|
437
|
+
/******/ }
|
|
438
|
+
/******/ }
|
|
439
|
+
/******/ // When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration
|
|
440
|
+
/******/ // or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic.
|
|
441
|
+
/******/ if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser");
|
|
442
|
+
/******/ scriptUrl = scriptUrl.replace(/^blob:/, "").replace(/#.*$/, "").replace(/\?.*$/, "").replace(/\/[^\/]+$/, "/");
|
|
443
|
+
/******/ __webpack_require__.p = scriptUrl + "../";
|
|
444
|
+
/******/ })();
|
|
445
|
+
/******/
|
|
446
|
+
/******/ /* webpack/runtime/jsonp chunk loading */
|
|
447
|
+
/******/ (() => {
|
|
448
|
+
/******/ // no baseURI
|
|
449
|
+
/******/
|
|
450
|
+
/******/ // object to store loaded and loading chunks
|
|
451
|
+
/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
|
|
452
|
+
/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded
|
|
453
|
+
/******/ var installedChunks = {
|
|
454
|
+
/******/ "markup": 0
|
|
455
|
+
/******/ };
|
|
456
|
+
/******/
|
|
457
|
+
/******/ __webpack_require__.f.j = (chunkId, promises) => {
|
|
458
|
+
/******/ // JSONP chunk loading for javascript
|
|
459
|
+
/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;
|
|
460
|
+
/******/ if(installedChunkData !== 0) { // 0 means "already installed".
|
|
461
|
+
/******/
|
|
462
|
+
/******/ // a Promise means "currently loading".
|
|
463
|
+
/******/ if(installedChunkData) {
|
|
464
|
+
/******/ promises.push(installedChunkData[2]);
|
|
465
|
+
/******/ } else {
|
|
466
|
+
/******/ if(true) { // all chunks have JS
|
|
467
|
+
/******/ // setup Promise in chunk cache
|
|
468
|
+
/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));
|
|
469
|
+
/******/ promises.push(installedChunkData[2] = promise);
|
|
470
|
+
/******/
|
|
471
|
+
/******/ // start chunk loading
|
|
472
|
+
/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId);
|
|
473
|
+
/******/ // create error before stack unwound to get useful stacktrace later
|
|
474
|
+
/******/ var error = new Error();
|
|
475
|
+
/******/ var loadingEnded = (event) => {
|
|
476
|
+
/******/ if(__webpack_require__.o(installedChunks, chunkId)) {
|
|
477
|
+
/******/ installedChunkData = installedChunks[chunkId];
|
|
478
|
+
/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined;
|
|
479
|
+
/******/ if(installedChunkData) {
|
|
480
|
+
/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type);
|
|
481
|
+
/******/ var realSrc = event && event.target && event.target.src;
|
|
482
|
+
/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')';
|
|
483
|
+
/******/ error.name = 'ChunkLoadError';
|
|
484
|
+
/******/ error.type = errorType;
|
|
485
|
+
/******/ error.request = realSrc;
|
|
486
|
+
/******/ installedChunkData[1](error);
|
|
487
|
+
/******/ }
|
|
488
|
+
/******/ }
|
|
489
|
+
/******/ };
|
|
490
|
+
/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId);
|
|
491
|
+
/******/ }
|
|
492
|
+
/******/ }
|
|
493
|
+
/******/ }
|
|
494
|
+
/******/ };
|
|
495
|
+
/******/
|
|
496
|
+
/******/ // no prefetching
|
|
497
|
+
/******/
|
|
498
|
+
/******/ // no preloaded
|
|
499
|
+
/******/
|
|
500
|
+
/******/ // no HMR
|
|
501
|
+
/******/
|
|
502
|
+
/******/ // no HMR manifest
|
|
503
|
+
/******/
|
|
504
|
+
/******/ __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);
|
|
505
|
+
/******/
|
|
506
|
+
/******/ // install a JSONP callback for chunk loading
|
|
507
|
+
/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => {
|
|
508
|
+
/******/ var [chunkIds, moreModules, runtime] = data;
|
|
509
|
+
/******/ // add "moreModules" to the modules object,
|
|
510
|
+
/******/ // then flag all "chunkIds" as loaded and fire callback
|
|
511
|
+
/******/ var moduleId, chunkId, i = 0;
|
|
512
|
+
/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) {
|
|
513
|
+
/******/ for(moduleId in moreModules) {
|
|
514
|
+
/******/ if(__webpack_require__.o(moreModules, moduleId)) {
|
|
515
|
+
/******/ __webpack_require__.m[moduleId] = moreModules[moduleId];
|
|
516
|
+
/******/ }
|
|
517
|
+
/******/ }
|
|
518
|
+
/******/ if(runtime) var result = runtime(__webpack_require__);
|
|
519
|
+
/******/ }
|
|
520
|
+
/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data);
|
|
521
|
+
/******/ for(;i < chunkIds.length; i++) {
|
|
522
|
+
/******/ chunkId = chunkIds[i];
|
|
523
|
+
/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {
|
|
524
|
+
/******/ installedChunks[chunkId][0]();
|
|
525
|
+
/******/ }
|
|
526
|
+
/******/ installedChunks[chunkId] = 0;
|
|
527
|
+
/******/ }
|
|
528
|
+
/******/ return __webpack_require__.O(result);
|
|
529
|
+
/******/ }
|
|
530
|
+
/******/
|
|
531
|
+
/******/ var chunkLoadingGlobal = self["webpackChunksaltcorn"] = self["webpackChunksaltcorn"] || [];
|
|
532
|
+
/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));
|
|
533
|
+
/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));
|
|
534
|
+
/******/ })();
|
|
535
|
+
/******/
|
|
536
|
+
/************************************************************************/
|
|
537
|
+
/******/
|
|
538
|
+
/******/ // module cache are used so entry inlining is disabled
|
|
539
|
+
/******/ // startup
|
|
540
|
+
/******/ // Load entry module and return exports
|
|
541
|
+
/******/ var __webpack_exports__ = __webpack_require__.O(undefined, ["common_chunks"], () => (__webpack_require__(__webpack_require__.s = "../saltcorn-markup/dist/index.js")))
|
|
542
|
+
/******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__);
|
|
543
|
+
/******/
|
|
544
|
+
/******/ return __webpack_exports__;
|
|
545
|
+
/******/ })()
|
|
546
|
+
;
|
|
547
|
+
});
|