@fieldia/designer 0.26.0 → 0.27.0
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/README.md +75 -0
- package/package.json +4 -4
- package/src/lib/answer-picker.d.mts +22 -0
- package/src/lib/answer-picker.d.ts +22 -0
- package/src/lib/answer-picker.js +104 -0
- package/src/lib/answer-picker.js.map +1 -0
- package/src/lib/answer-picker.mjs +99 -0
- package/src/lib/answer-picker.mjs.map +1 -0
- package/src/lib/canvas-form.js +2 -1
- package/src/lib/canvas-form.js.map +1 -1
- package/src/lib/canvas-form.mjs +2 -1
- package/src/lib/canvas-form.mjs.map +1 -1
- package/src/lib/chrome.js +15 -4
- package/src/lib/chrome.js.map +1 -1
- package/src/lib/chrome.mjs +15 -4
- package/src/lib/chrome.mjs.map +1 -1
- package/src/lib/clipboard-names.d.mts +1 -1
- package/src/lib/clipboard-names.d.ts +1 -1
- package/src/lib/clipboard-names.js +25 -4
- package/src/lib/clipboard-names.js.map +1 -1
- package/src/lib/clipboard-names.mjs +25 -4
- package/src/lib/clipboard-names.mjs.map +1 -1
- package/src/lib/columns-editor.d.mts +5 -2
- package/src/lib/columns-editor.d.ts +5 -2
- package/src/lib/columns-editor.js +144 -3
- package/src/lib/columns-editor.js.map +1 -1
- package/src/lib/columns-editor.mjs +144 -3
- package/src/lib/columns-editor.mjs.map +1 -1
- package/src/lib/condition-editor.d.mts +5 -1
- package/src/lib/condition-editor.d.ts +5 -1
- package/src/lib/condition-editor.js +5 -2
- package/src/lib/condition-editor.js.map +1 -1
- package/src/lib/condition-editor.mjs +5 -2
- package/src/lib/condition-editor.mjs.map +1 -1
- package/src/lib/conditions.d.mts +6 -2
- package/src/lib/conditions.d.ts +6 -2
- package/src/lib/conditions.js +9 -3
- package/src/lib/conditions.js.map +1 -1
- package/src/lib/conditions.mjs +9 -3
- package/src/lib/conditions.mjs.map +1 -1
- package/src/lib/designer.d.mts +43 -2
- package/src/lib/designer.d.ts +43 -2
- package/src/lib/designer.js +111 -14
- package/src/lib/designer.js.map +1 -1
- package/src/lib/designer.mjs +113 -16
- package/src/lib/designer.mjs.map +1 -1
- package/src/lib/endings-commands.d.mts +27 -0
- package/src/lib/endings-commands.d.ts +27 -0
- package/src/lib/endings-commands.js +58 -0
- package/src/lib/endings-commands.js.map +1 -0
- package/src/lib/endings-commands.mjs +55 -0
- package/src/lib/endings-commands.mjs.map +1 -0
- package/src/lib/endings-editor.d.mts +14 -0
- package/src/lib/endings-editor.d.ts +14 -0
- package/src/lib/endings-editor.js +131 -0
- package/src/lib/endings-editor.js.map +1 -0
- package/src/lib/endings-editor.mjs +128 -0
- package/src/lib/endings-editor.mjs.map +1 -0
- package/src/lib/head-parts.js +1 -1
- package/src/lib/head-parts.js.map +1 -1
- package/src/lib/head-parts.mjs +2 -2
- package/src/lib/head-parts.mjs.map +1 -1
- package/src/lib/json-checks.d.mts +2 -1
- package/src/lib/json-checks.d.ts +2 -1
- package/src/lib/json-checks.js +3 -3
- package/src/lib/json-checks.js.map +1 -1
- package/src/lib/json-checks.mjs +3 -3
- package/src/lib/json-checks.mjs.map +1 -1
- package/src/lib/json-view.js +1 -1
- package/src/lib/json-view.js.map +1 -1
- package/src/lib/json-view.mjs +1 -1
- package/src/lib/json-view.mjs.map +1 -1
- package/src/lib/kind-commands.d.mts +4 -0
- package/src/lib/kind-commands.d.ts +4 -0
- package/src/lib/kind-commands.js +19 -0
- package/src/lib/kind-commands.js.map +1 -1
- package/src/lib/kind-commands.mjs +19 -0
- package/src/lib/kind-commands.mjs.map +1 -1
- package/src/lib/kind-settings-structures.js +50 -3
- package/src/lib/kind-settings-structures.js.map +1 -1
- package/src/lib/kind-settings-structures.mjs +50 -3
- package/src/lib/kind-settings-structures.mjs.map +1 -1
- package/src/lib/kind-settings.js +48 -0
- package/src/lib/kind-settings.js.map +1 -1
- package/src/lib/kind-settings.mjs +48 -0
- package/src/lib/kind-settings.mjs.map +1 -1
- package/src/lib/kinds.d.mts +3 -2
- package/src/lib/kinds.d.ts +3 -2
- package/src/lib/kinds.js +3 -1
- package/src/lib/kinds.js.map +1 -1
- package/src/lib/kinds.mjs +3 -1
- package/src/lib/kinds.mjs.map +1 -1
- package/src/lib/limits-settings.d.mts +14 -0
- package/src/lib/limits-settings.d.ts +14 -0
- package/src/lib/limits-settings.js +66 -0
- package/src/lib/limits-settings.js.map +1 -0
- package/src/lib/limits-settings.mjs +63 -0
- package/src/lib/limits-settings.mjs.map +1 -0
- package/src/lib/list-commands.d.mts +21 -3
- package/src/lib/list-commands.d.ts +21 -3
- package/src/lib/list-commands.js +61 -9
- package/src/lib/list-commands.js.map +1 -1
- package/src/lib/list-commands.mjs +60 -8
- package/src/lib/list-commands.mjs.map +1 -1
- package/src/lib/list-properties.js +51 -4
- package/src/lib/list-properties.js.map +1 -1
- package/src/lib/list-properties.mjs +53 -6
- package/src/lib/list-properties.mjs.map +1 -1
- package/src/lib/list-rows-settings.js +1 -1
- package/src/lib/list-rows-settings.js.map +1 -1
- package/src/lib/list-rows-settings.mjs +1 -1
- package/src/lib/list-rows-settings.mjs.map +1 -1
- package/src/lib/list-source.d.mts +2 -2
- package/src/lib/list-source.d.ts +2 -2
- package/src/lib/list-source.js +55 -9
- package/src/lib/list-source.js.map +1 -1
- package/src/lib/list-source.mjs +55 -9
- package/src/lib/list-source.mjs.map +1 -1
- package/src/lib/locales/ar/changes.js +2 -0
- package/src/lib/locales/ar/changes.js.map +1 -1
- package/src/lib/locales/ar/changes.mjs +2 -0
- package/src/lib/locales/ar/changes.mjs.map +1 -1
- package/src/lib/locales/ar/checks.js +1 -0
- package/src/lib/locales/ar/checks.js.map +1 -1
- package/src/lib/locales/ar/checks.mjs +1 -0
- package/src/lib/locales/ar/checks.mjs.map +1 -1
- package/src/lib/locales/ar/endings.d.mts +3 -0
- package/src/lib/locales/ar/endings.d.ts +3 -0
- package/src/lib/locales/ar/endings.js +40 -0
- package/src/lib/locales/ar/endings.js.map +1 -0
- package/src/lib/locales/ar/endings.mjs +37 -0
- package/src/lib/locales/ar/endings.mjs.map +1 -0
- package/src/lib/locales/ar/index.js +2 -1
- package/src/lib/locales/ar/index.js.map +1 -1
- package/src/lib/locales/ar/index.mjs +2 -1
- package/src/lib/locales/ar/index.mjs.map +1 -1
- package/src/lib/locales/ar/list.js +9 -1
- package/src/lib/locales/ar/list.js.map +1 -1
- package/src/lib/locales/ar/list.mjs +9 -1
- package/src/lib/locales/ar/list.mjs.map +1 -1
- package/src/lib/locales/ar/options.js +4 -0
- package/src/lib/locales/ar/options.js.map +1 -1
- package/src/lib/locales/ar/options.mjs +4 -0
- package/src/lib/locales/ar/options.mjs.map +1 -1
- package/src/lib/locales/ar/panel.js +20 -0
- package/src/lib/locales/ar/panel.js.map +1 -1
- package/src/lib/locales/ar/panel.mjs +20 -0
- package/src/lib/locales/ar/panel.mjs.map +1 -1
- package/src/lib/locales/ar/questions.js +24 -1
- package/src/lib/locales/ar/questions.js.map +1 -1
- package/src/lib/locales/ar/questions.mjs +24 -1
- package/src/lib/locales/ar/questions.mjs.map +1 -1
- package/src/lib/locales/ar/refusals.js +15 -2
- package/src/lib/locales/ar/refusals.js.map +1 -1
- package/src/lib/locales/ar/refusals.mjs +15 -2
- package/src/lib/locales/ar/refusals.mjs.map +1 -1
- package/src/lib/locales/ar/rules-ui.js +21 -1
- package/src/lib/locales/ar/rules-ui.js.map +1 -1
- package/src/lib/locales/ar/rules-ui.mjs +21 -1
- package/src/lib/locales/ar/rules-ui.mjs.map +1 -1
- package/src/lib/locales/ar/rules.js +4 -0
- package/src/lib/locales/ar/rules.js.map +1 -1
- package/src/lib/locales/ar/rules.mjs +4 -0
- package/src/lib/locales/ar/rules.mjs.map +1 -1
- package/src/lib/locales/en/changes.d.mts +2 -0
- package/src/lib/locales/en/changes.d.ts +2 -0
- package/src/lib/locales/en/changes.js +2 -0
- package/src/lib/locales/en/changes.js.map +1 -1
- package/src/lib/locales/en/changes.mjs +2 -0
- package/src/lib/locales/en/changes.mjs.map +1 -1
- package/src/lib/locales/en/checks.d.mts +2 -0
- package/src/lib/locales/en/checks.d.ts +2 -0
- package/src/lib/locales/en/checks.js +2 -0
- package/src/lib/locales/en/checks.js.map +1 -1
- package/src/lib/locales/en/checks.mjs +2 -0
- package/src/lib/locales/en/checks.mjs.map +1 -1
- package/src/lib/locales/en/endings.d.mts +38 -0
- package/src/lib/locales/en/endings.d.ts +38 -0
- package/src/lib/locales/en/endings.js +44 -0
- package/src/lib/locales/en/endings.js.map +1 -0
- package/src/lib/locales/en/endings.mjs +41 -0
- package/src/lib/locales/en/endings.mjs.map +1 -0
- package/src/lib/locales/en/index.d.mts +127 -1
- package/src/lib/locales/en/index.d.ts +127 -1
- package/src/lib/locales/en/index.js +2 -1
- package/src/lib/locales/en/index.js.map +1 -1
- package/src/lib/locales/en/index.mjs +2 -1
- package/src/lib/locales/en/index.mjs.map +1 -1
- package/src/lib/locales/en/list.d.mts +8 -0
- package/src/lib/locales/en/list.d.ts +8 -0
- package/src/lib/locales/en/list.js +9 -1
- package/src/lib/locales/en/list.js.map +1 -1
- package/src/lib/locales/en/list.mjs +9 -1
- package/src/lib/locales/en/list.mjs.map +1 -1
- package/src/lib/locales/en/options.d.mts +6 -0
- package/src/lib/locales/en/options.d.ts +6 -0
- package/src/lib/locales/en/options.js +6 -0
- package/src/lib/locales/en/options.js.map +1 -1
- package/src/lib/locales/en/options.mjs +6 -0
- package/src/lib/locales/en/options.mjs.map +1 -1
- package/src/lib/locales/en/panel.d.mts +13 -0
- package/src/lib/locales/en/panel.d.ts +13 -0
- package/src/lib/locales/en/panel.js +13 -0
- package/src/lib/locales/en/panel.js.map +1 -1
- package/src/lib/locales/en/panel.mjs +13 -0
- package/src/lib/locales/en/panel.mjs.map +1 -1
- package/src/lib/locales/en/questions.d.mts +25 -0
- package/src/lib/locales/en/questions.d.ts +25 -0
- package/src/lib/locales/en/questions.js +25 -1
- package/src/lib/locales/en/questions.js.map +1 -1
- package/src/lib/locales/en/questions.mjs +25 -1
- package/src/lib/locales/en/questions.mjs.map +1 -1
- package/src/lib/locales/en/refusals.d.mts +13 -0
- package/src/lib/locales/en/refusals.d.ts +13 -0
- package/src/lib/locales/en/refusals.js +15 -2
- package/src/lib/locales/en/refusals.js.map +1 -1
- package/src/lib/locales/en/refusals.mjs +15 -2
- package/src/lib/locales/en/refusals.mjs.map +1 -1
- package/src/lib/locales/en/rules-ui.d.mts +29 -1
- package/src/lib/locales/en/rules-ui.d.ts +29 -1
- package/src/lib/locales/en/rules-ui.js +23 -1
- package/src/lib/locales/en/rules-ui.js.map +1 -1
- package/src/lib/locales/en/rules-ui.mjs +23 -1
- package/src/lib/locales/en/rules-ui.mjs.map +1 -1
- package/src/lib/locales/en/rules.d.mts +3 -0
- package/src/lib/locales/en/rules.d.ts +3 -0
- package/src/lib/locales/en/rules.js +4 -0
- package/src/lib/locales/en/rules.js.map +1 -1
- package/src/lib/locales/en/rules.mjs +4 -0
- package/src/lib/locales/en/rules.mjs.map +1 -1
- package/src/lib/option-when.d.mts +32 -0
- package/src/lib/option-when.d.ts +32 -0
- package/src/lib/option-when.js +110 -0
- package/src/lib/option-when.js.map +1 -0
- package/src/lib/option-when.mjs +106 -0
- package/src/lib/option-when.mjs.map +1 -0
- package/src/lib/page-checks.d.mts +2 -1
- package/src/lib/page-checks.d.ts +2 -1
- package/src/lib/page-checks.js +14 -2
- package/src/lib/page-checks.js.map +1 -1
- package/src/lib/page-checks.mjs +15 -3
- package/src/lib/page-checks.mjs.map +1 -1
- package/src/lib/page-json.d.mts +5 -3
- package/src/lib/page-json.d.ts +5 -3
- package/src/lib/page-json.js +4 -4
- package/src/lib/page-json.js.map +1 -1
- package/src/lib/page-json.mjs +4 -4
- package/src/lib/page-json.mjs.map +1 -1
- package/src/lib/page-tree.js +3 -3
- package/src/lib/page-tree.js.map +1 -1
- package/src/lib/page-tree.mjs +4 -4
- package/src/lib/page-tree.mjs.map +1 -1
- package/src/lib/panel-block.js +3 -1
- package/src/lib/panel-block.js.map +1 -1
- package/src/lib/panel-block.mjs +3 -1
- package/src/lib/panel-block.mjs.map +1 -1
- package/src/lib/panel-field.js +4 -1
- package/src/lib/panel-field.js.map +1 -1
- package/src/lib/panel-field.mjs +4 -1
- package/src/lib/panel-field.mjs.map +1 -1
- package/src/lib/panel-page.js +16 -2
- package/src/lib/panel-page.js.map +1 -1
- package/src/lib/panel-page.mjs +16 -2
- package/src/lib/panel-page.mjs.map +1 -1
- package/src/lib/placeholder-when.js +2 -2
- package/src/lib/placeholder-when.js.map +1 -1
- package/src/lib/placeholder-when.mjs +2 -2
- package/src/lib/placeholder-when.mjs.map +1 -1
- package/src/lib/rules-answers.js +10 -4
- package/src/lib/rules-answers.js.map +1 -1
- package/src/lib/rules-answers.mjs +11 -5
- package/src/lib/rules-answers.mjs.map +1 -1
- package/src/lib/rules-checks.d.mts +2 -2
- package/src/lib/rules-checks.d.ts +2 -2
- package/src/lib/rules-checks.js +23 -3
- package/src/lib/rules-checks.js.map +1 -1
- package/src/lib/rules-checks.mjs +24 -4
- package/src/lib/rules-checks.mjs.map +1 -1
- package/src/lib/rules-commands.d.mts +5 -3
- package/src/lib/rules-commands.d.ts +5 -3
- package/src/lib/rules-commands.js +17 -17
- package/src/lib/rules-commands.js.map +1 -1
- package/src/lib/rules-commands.mjs +17 -17
- package/src/lib/rules-commands.mjs.map +1 -1
- package/src/lib/rules-defaults.js +3 -1
- package/src/lib/rules-defaults.js.map +1 -1
- package/src/lib/rules-defaults.mjs +3 -1
- package/src/lib/rules-defaults.mjs.map +1 -1
- package/src/lib/rules-formula-box.d.mts +4 -2
- package/src/lib/rules-formula-box.d.ts +4 -2
- package/src/lib/rules-formula-box.js +3 -1
- package/src/lib/rules-formula-box.js.map +1 -1
- package/src/lib/rules-formula-box.mjs +3 -1
- package/src/lib/rules-formula-box.mjs.map +1 -1
- package/src/lib/rules-formula.d.mts +13 -6
- package/src/lib/rules-formula.d.ts +13 -6
- package/src/lib/rules-formula.js +65 -24
- package/src/lib/rules-formula.js.map +1 -1
- package/src/lib/rules-formula.mjs +65 -25
- package/src/lib/rules-formula.mjs.map +1 -1
- package/src/lib/rules-sample.d.mts +4 -2
- package/src/lib/rules-sample.d.ts +4 -2
- package/src/lib/rules-sample.js +5 -4
- package/src/lib/rules-sample.js.map +1 -1
- package/src/lib/rules-sample.mjs +5 -4
- package/src/lib/rules-sample.mjs.map +1 -1
- package/src/lib/rules-worked-out.js +72 -17
- package/src/lib/rules-worked-out.js.map +1 -1
- package/src/lib/rules-worked-out.mjs +73 -18
- package/src/lib/rules-worked-out.mjs.map +1 -1
- package/src/lib/screen-canvas.js +3 -1
- package/src/lib/screen-canvas.js.map +1 -1
- package/src/lib/screen-canvas.mjs +3 -1
- package/src/lib/screen-canvas.mjs.map +1 -1
- package/src/lib/steps-commands.d.mts +5 -3
- package/src/lib/steps-commands.d.ts +5 -3
- package/src/lib/steps-commands.js +5 -5
- package/src/lib/steps-commands.js.map +1 -1
- package/src/lib/steps-commands.mjs +5 -5
- package/src/lib/steps-commands.mjs.map +1 -1
- package/src/lib/steps-editor.js +3 -2
- package/src/lib/steps-editor.js.map +1 -1
- package/src/lib/steps-editor.mjs +3 -2
- package/src/lib/steps-editor.mjs.map +1 -1
- package/src/lib/steps-map.d.mts +3 -1
- package/src/lib/steps-map.d.ts +3 -1
- package/src/lib/steps-map.js +1 -1
- package/src/lib/steps-map.js.map +1 -1
- package/src/lib/steps-map.mjs +1 -1
- package/src/lib/steps-map.mjs.map +1 -1
- package/src/lib/steps-settings.d.mts +3 -1
- package/src/lib/steps-settings.d.ts +3 -1
- package/src/lib/steps-settings.js +5 -2
- package/src/lib/steps-settings.js.map +1 -1
- package/src/lib/steps-settings.mjs +5 -2
- package/src/lib/steps-settings.mjs.map +1 -1
- package/src/lib/styles-endings.d.mts +6 -0
- package/src/lib/styles-endings.d.ts +6 -0
- package/src/lib/styles-endings.js +42 -0
- package/src/lib/styles-endings.js.map +1 -0
- package/src/lib/styles-endings.mjs +39 -0
- package/src/lib/styles-endings.mjs.map +1 -0
- package/src/lib/styles-kinds.d.mts +1 -1
- package/src/lib/styles-kinds.d.ts +1 -1
- package/src/lib/styles-kinds.js +1 -0
- package/src/lib/styles-kinds.js.map +1 -1
- package/src/lib/styles-kinds.mjs +1 -0
- package/src/lib/styles-kinds.mjs.map +1 -1
- package/src/lib/styles-rules.d.mts +1 -1
- package/src/lib/styles-rules.d.ts +1 -1
- package/src/lib/styles-rules.js +6 -1
- package/src/lib/styles-rules.js.map +1 -1
- package/src/lib/styles-rules.mjs +6 -1
- package/src/lib/styles-rules.mjs.map +1 -1
- package/src/lib/styles.d.mts +1 -1
- package/src/lib/styles.d.ts +1 -1
- package/src/lib/styles.js +18 -2
- package/src/lib/styles.js.map +1 -1
- package/src/lib/styles.mjs +18 -2
- package/src/lib/styles.mjs.map +1 -1
- package/src/lib/survey-editor.js +14 -4
- package/src/lib/survey-editor.js.map +1 -1
- package/src/lib/survey-editor.mjs +14 -4
- package/src/lib/survey-editor.mjs.map +1 -1
- package/src/lib/table-commands.d.mts +4 -2
- package/src/lib/table-commands.d.ts +4 -2
- package/src/lib/table-commands.js +4 -3
- package/src/lib/table-commands.js.map +1 -1
- package/src/lib/table-commands.mjs +4 -3
- package/src/lib/table-commands.mjs.map +1 -1
- package/src/lib/try-it.js +2 -0
- package/src/lib/try-it.js.map +1 -1
- package/src/lib/try-it.mjs +2 -0
- package/src/lib/try-it.mjs.map +1 -1
- package/src/lib/uncalled.d.mts +7 -0
- package/src/lib/uncalled.d.ts +7 -0
- package/src/lib/uncalled.js +21 -0
- package/src/lib/uncalled.js.map +1 -0
- package/src/lib/uncalled.mjs +18 -0
- package/src/lib/uncalled.mjs.map +1 -0
- package/src/lib/validate-edit.d.mts +3 -2
- package/src/lib/validate-edit.d.ts +3 -2
- package/src/lib/validate-edit.js +4 -3
- package/src/lib/validate-edit.js.map +1 -1
- package/src/lib/validate-edit.mjs +4 -3
- package/src/lib/validate-edit.mjs.map +1 -1
package/src/lib/designer.mjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { validatePage, wideColumns, } from '@fieldia/core';
|
|
1
|
+
import { functionTable, functionsPart, optionsField, optionsList, limitInstant, validatePage, wideColumns, } from '@fieldia/core';
|
|
2
2
|
import { comparable, FIELD_NAME, FORMAT_VERSION, upgradePage } from '@fieldia/core';
|
|
3
3
|
import { conditionToHide, conditionToHold, splitShownWhile, withShownWhile } from './conditions.mjs';
|
|
4
4
|
import { findHeaderPart, headerCommands } from './header-commands.mjs';
|
|
5
5
|
import { listCommands, setRowRules } from './list-commands.mjs';
|
|
6
|
-
import { kindCommands } from './kind-commands.mjs';
|
|
6
|
+
import { kindCommands, relabel } from './kind-commands.mjs';
|
|
7
7
|
import { choiceCommands } from './choice-commands.mjs';
|
|
8
8
|
import { inputCommands } from './input-commands.mjs';
|
|
9
9
|
import { structureCommands } from './structure-commands.mjs';
|
|
@@ -25,6 +25,7 @@ import { rulesCommands } from './rules-commands.mjs';
|
|
|
25
25
|
import { headCommands } from './head-commands.mjs';
|
|
26
26
|
import { keepWhatRulesRead } from './rules-reads.mjs';
|
|
27
27
|
import { stepsCommands } from './steps-commands.mjs';
|
|
28
|
+
import { endingsCommands } from './endings-commands.mjs';
|
|
28
29
|
import { forgetGoneTargets } from './steps-places.mjs';
|
|
29
30
|
import { forgetGoneCounts } from './head-parts.mjs';
|
|
30
31
|
import * as clipboard from './clipboard-ops.mjs';
|
|
@@ -153,6 +154,9 @@ export function createMemoryPageStore() {
|
|
|
153
154
|
}
|
|
154
155
|
const clone = (value) => JSON.parse(JSON.stringify(value));
|
|
155
156
|
export function createDesigner(options) {
|
|
157
|
+
// The formula boxes work a formula out on made-up values with each of Fieldia's functions: their bodies beyond the
|
|
158
|
+
// plain ones are @fieldia/core's functions part, asked for at once.
|
|
159
|
+
functionsPart.load().catch(() => undefined);
|
|
156
160
|
const store = options.store;
|
|
157
161
|
/** How each editor reads a setting typed and not yet left (`settling`): publish runs them first. */
|
|
158
162
|
const readers = new Set();
|
|
@@ -244,7 +248,10 @@ export function createDesigner(options) {
|
|
|
244
248
|
})();
|
|
245
249
|
}
|
|
246
250
|
/** An edit's page checked as validatePage would, at the cost of what it changed. */
|
|
247
|
-
|
|
251
|
+
// The app's functions: a name no page may call is refused now, as a form refuses it.
|
|
252
|
+
const functions = options.functions;
|
|
253
|
+
functionTable(functions);
|
|
254
|
+
const checkEdit = editChecker(functions);
|
|
248
255
|
/**
|
|
249
256
|
* Apply an edit to a copy, validate it, and keep it — or refuse it, saying
|
|
250
257
|
* why. `after` runs once it is kept, before anyone is told: what the edit
|
|
@@ -354,6 +361,7 @@ export function createDesigner(options) {
|
|
|
354
361
|
});
|
|
355
362
|
const list = listCommands({
|
|
356
363
|
apply,
|
|
364
|
+
functions,
|
|
357
365
|
select(id) {
|
|
358
366
|
selected = id;
|
|
359
367
|
notify();
|
|
@@ -372,7 +380,8 @@ export function createDesigner(options) {
|
|
|
372
380
|
...choices,
|
|
373
381
|
...inputs,
|
|
374
382
|
...structures,
|
|
375
|
-
...tableCommands({ apply }),
|
|
383
|
+
...tableCommands({ apply, functions }),
|
|
384
|
+
...endingsCommands({ apply }),
|
|
376
385
|
words,
|
|
377
386
|
locale,
|
|
378
387
|
getPage: () => page,
|
|
@@ -1036,6 +1045,36 @@ export function createDesigner(options) {
|
|
|
1036
1045
|
delete draft.lowerLabels;
|
|
1037
1046
|
}, 'lowerLabels');
|
|
1038
1047
|
},
|
|
1048
|
+
setPageLimits(patch) {
|
|
1049
|
+
return apply((draft) => {
|
|
1050
|
+
if (draft.data.kind !== 'responses')
|
|
1051
|
+
throw new Refusal((w) => w.refusals.limitsForResponses);
|
|
1052
|
+
const limits = { ...(draft.limits ?? {}) };
|
|
1053
|
+
for (const [key, value] of Object.entries(patch)) {
|
|
1054
|
+
if (value === null || value === undefined || value === false || (typeof value === 'string' && !value.trim()))
|
|
1055
|
+
delete limits[key];
|
|
1056
|
+
else
|
|
1057
|
+
limits[key] = value;
|
|
1058
|
+
}
|
|
1059
|
+
const opens = typeof limits['opens'] === 'string' ? limitInstant(limits['opens'], draft.timeZone) : null;
|
|
1060
|
+
const closes = typeof limits['closes'] === 'string' ? limitInstant(limits['closes'], draft.timeZone, true) : null;
|
|
1061
|
+
if (opens !== null && closes !== null && closes <= opens)
|
|
1062
|
+
throw new Refusal((w) => w.refusals.closesBeforeOpens);
|
|
1063
|
+
// Its words alone say nothing of when: they go with the last of the rest.
|
|
1064
|
+
if (Object.keys(limits).some((key) => key !== 'message'))
|
|
1065
|
+
draft.limits = limits;
|
|
1066
|
+
else
|
|
1067
|
+
delete draft.limits;
|
|
1068
|
+
}, `limits:${Object.keys(patch).join(',')}`);
|
|
1069
|
+
},
|
|
1070
|
+
setContinueLater(on) {
|
|
1071
|
+
return apply((draft) => {
|
|
1072
|
+
if (on)
|
|
1073
|
+
draft.continueLater = true;
|
|
1074
|
+
else
|
|
1075
|
+
delete draft.continueLater;
|
|
1076
|
+
}, 'continueLater');
|
|
1077
|
+
},
|
|
1039
1078
|
setDuplicates(patch) {
|
|
1040
1079
|
return apply((draft) => {
|
|
1041
1080
|
if (patch.fields !== undefined && !patch.fields?.length)
|
|
@@ -1226,6 +1265,9 @@ export function createDesigner(options) {
|
|
|
1226
1265
|
fields[name] = { ...kept, label: column.label };
|
|
1227
1266
|
else if (column.kind === 'other')
|
|
1228
1267
|
throw new Refusal((w) => w.refusals.newColumnKind);
|
|
1268
|
+
// A new choice starts with one option, to be written over.
|
|
1269
|
+
else if (column.kind === 'choice')
|
|
1270
|
+
fields[name] = { type: 'selection', label: column.label, options: [{ value: 'option_1', label: words.defaults.option(1) }] };
|
|
1229
1271
|
else
|
|
1230
1272
|
fields[name] = { type: COLUMN_TYPES[column.kind], label: column.label };
|
|
1231
1273
|
}
|
|
@@ -1234,6 +1276,48 @@ export function createDesigner(options) {
|
|
|
1234
1276
|
// Typing in a column's label is one undo step, as in an option.
|
|
1235
1277
|
`columns:${id}:${columns.length}`);
|
|
1236
1278
|
},
|
|
1279
|
+
setColumnChoices(id, column, choices) {
|
|
1280
|
+
return apply((draft) => {
|
|
1281
|
+
const lines = fieldOfType(draft, id, ['one2many'], (w) => w.refusals.onlyLinesColumns, (w, label) => w.refusals.columnsFromModel(label));
|
|
1282
|
+
const field = lines.fields[column];
|
|
1283
|
+
if (field?.type !== 'selection')
|
|
1284
|
+
throw new Refusal((w) => w.refusals.notAChoiceColumn(field?.label ?? column));
|
|
1285
|
+
if (choices.labels) {
|
|
1286
|
+
const options = relabel(field.options, choices.labels, 'option');
|
|
1287
|
+
if (!options.length && !field.optionsFrom)
|
|
1288
|
+
throw new Refusal((w) => w.refusals.columnNeedsOption(field.label));
|
|
1289
|
+
field.options = options;
|
|
1290
|
+
}
|
|
1291
|
+
if (choices.from === null) {
|
|
1292
|
+
delete field.optionsFrom;
|
|
1293
|
+
// Written again: one option to start from, when there were none.
|
|
1294
|
+
if (!field.options.length)
|
|
1295
|
+
field.options = [{ value: 'option_1', label: words.defaults.option(1) }];
|
|
1296
|
+
}
|
|
1297
|
+
else if (choices.from) {
|
|
1298
|
+
// What it changes with: the line's other columns, and the record's fields.
|
|
1299
|
+
const on = (choices.from.dependsOn ?? []).filter((name) => (name.startsWith('parent.') ? !!draft.fields[name.slice(7)] : name !== column && !!lines.fields[name]));
|
|
1300
|
+
field.optionsFrom = { list: choices.from.list, ...(on.length ? { dependsOn: on } : {}) };
|
|
1301
|
+
}
|
|
1302
|
+
},
|
|
1303
|
+
// Typing an option's words, or a list's name, is one step.
|
|
1304
|
+
choices.labels ? `column-options:${id}:${column}:${choices.labels.length}` : choices.from ? `column-list:${id}:${column}:${JSON.stringify(choices.from.dependsOn ?? [])}` : null);
|
|
1305
|
+
},
|
|
1306
|
+
setColumnOptionWhen(id, column, index, invisible) {
|
|
1307
|
+
return apply((draft) => {
|
|
1308
|
+
const lines = fieldOfType(draft, id, ['one2many'], (w) => w.refusals.onlyLinesColumns, (w, label) => w.refusals.columnsFromModel(label));
|
|
1309
|
+
const field = lines.fields[column];
|
|
1310
|
+
if (field?.type !== 'selection')
|
|
1311
|
+
throw new Refusal((w) => w.refusals.notAChoiceColumn(field?.label ?? column));
|
|
1312
|
+
const option = field.options[index];
|
|
1313
|
+
if (!option)
|
|
1314
|
+
throw new Refusal((w) => w.refusals.noOption(index + 1));
|
|
1315
|
+
if (invisible === null || !invisible.trim())
|
|
1316
|
+
delete option.invisible;
|
|
1317
|
+
else
|
|
1318
|
+
option.invisible = invisible.trim();
|
|
1319
|
+
});
|
|
1320
|
+
},
|
|
1237
1321
|
undo() {
|
|
1238
1322
|
const previous = past[past.length - 1];
|
|
1239
1323
|
if (!previous)
|
|
@@ -1266,7 +1350,7 @@ export function createDesigner(options) {
|
|
|
1266
1350
|
// A setting still typed is read first, as leaving its box reads it: what is published is what the boxes show.
|
|
1267
1351
|
for (const read of [...readers])
|
|
1268
1352
|
read();
|
|
1269
|
-
const checked = validatePage(page);
|
|
1353
|
+
const checked = validatePage(page, { functions });
|
|
1270
1354
|
if (!checked.ok)
|
|
1271
1355
|
throw new Error(words.refusals.cannotPublish);
|
|
1272
1356
|
const version = store ? await store.publish(clone(page)) : versions.length + 1;
|
|
@@ -1276,7 +1360,7 @@ export function createDesigner(options) {
|
|
|
1276
1360
|
},
|
|
1277
1361
|
checks() {
|
|
1278
1362
|
if (checksOf?.page !== page || checksOf.forms !== formsCame)
|
|
1279
|
-
checksOf = { page, forms: formsCame, checks: pageChecks(page, { valid: checkEdit.passed(page), forms, words }) };
|
|
1363
|
+
checksOf = { page, forms: formsCame, checks: pageChecks(page, { valid: checkEdit.passed(page), forms, words, functions }) };
|
|
1280
1364
|
return [...checksOf.checks];
|
|
1281
1365
|
},
|
|
1282
1366
|
fixCheck: (check) => fixCheck(designer, check),
|
|
@@ -1299,13 +1383,15 @@ export function createDesigner(options) {
|
|
|
1299
1383
|
// panel lane
|
|
1300
1384
|
setEach: (ids, change) => apply((draft) => several.setEach(draft, ids, change, fromModel)),
|
|
1301
1385
|
// json lane
|
|
1302
|
-
...pageJsonCommands({ getPage: () => page, apply, words }),
|
|
1386
|
+
...pageJsonCommands({ getPage: () => page, apply, words, functions }),
|
|
1303
1387
|
lists: () => clone(options.lists ?? []),
|
|
1388
|
+
functions: () => functions,
|
|
1304
1389
|
setOptionsFrom(id, from) {
|
|
1305
1390
|
const found = findNode(page, id);
|
|
1306
|
-
const was = found?.node.type === 'field' ? page.fields[found.node.field]?.optionsFrom : undefined;
|
|
1391
|
+
const was = optionsList(found?.node.type === 'field' ? page.fields[found.node.field]?.optionsFrom : undefined);
|
|
1392
|
+
const list = optionsList(from ?? undefined);
|
|
1307
1393
|
// Typing a list's name is one step, as typing a label is.
|
|
1308
|
-
const naming = !!
|
|
1394
|
+
const naming = !!list && !!was && JSON.stringify(was.dependsOn ?? []) === JSON.stringify(list.dependsOn ?? []);
|
|
1309
1395
|
return apply((draft) => {
|
|
1310
1396
|
const field = fieldOfType(draft, id, ['selection'], (w) => w.refusals.onlyChoiceFromList, (w, label) => w.refusals.choicesFromModel(label));
|
|
1311
1397
|
if (!from) {
|
|
@@ -1315,7 +1401,18 @@ export function createDesigner(options) {
|
|
|
1315
1401
|
field.options = [{ value: 'option_1', label: words.defaults.option(1) }];
|
|
1316
1402
|
return;
|
|
1317
1403
|
}
|
|
1318
|
-
|
|
1404
|
+
const carried = optionsField(from);
|
|
1405
|
+
if (carried) {
|
|
1406
|
+
const source = draft.fields[carried.field];
|
|
1407
|
+
if (carried.field === fieldNode(draft, id).field || source?.type !== 'selection')
|
|
1408
|
+
throw new Refusal((w) => w.refusals.carriedFromChoice);
|
|
1409
|
+
field.optionsFrom = { field: carried.field, ...(carried.picked === false ? { picked: false } : {}) };
|
|
1410
|
+
// Its own options follow those carried: none until some are written.
|
|
1411
|
+
field.options = field.options.filter((o) => !/^option_\d+$/.test(String(o.value)) || !isDefaultOption(o.label));
|
|
1412
|
+
return;
|
|
1413
|
+
}
|
|
1414
|
+
if (list)
|
|
1415
|
+
field.optionsFrom = { list: list.list, ...(list.dependsOn?.length ? { dependsOn: [...list.dependsOn] } : {}) };
|
|
1319
1416
|
}, naming ? `list-name:${id}` : null);
|
|
1320
1417
|
},
|
|
1321
1418
|
// canvas lane
|
|
@@ -1353,11 +1450,11 @@ export function createDesigner(options) {
|
|
|
1353
1450
|
const node = findNode(draft, id)?.node;
|
|
1354
1451
|
if (!node || node.type !== 'related')
|
|
1355
1452
|
throw new Refusal((w) => w.layout.noPart(id));
|
|
1356
|
-
changeRelated(draft, node, patch);
|
|
1453
|
+
changeRelated(draft, node, patch, functions);
|
|
1357
1454
|
}, `related:${id}:${Object.keys(patch).join(',')}`),
|
|
1358
1455
|
setWidths: (widths, options) => apply((draft) => settings.setWidths(draft, widths, options?.twelfths)),
|
|
1359
1456
|
// rules lane
|
|
1360
|
-
...rulesCommands({ apply, getPage: () => page, fromModel }),
|
|
1457
|
+
...rulesCommands({ apply, getPage: () => page, fromModel, functions }),
|
|
1361
1458
|
// A record's head, and the parts it brought: a button's icon alone, toggle and menu; a tab's count; a field's access key.
|
|
1362
1459
|
...headCommands({ apply, select: (id) => designer.select(id), model, words }),
|
|
1363
1460
|
// extend lane
|
|
@@ -1444,7 +1541,7 @@ export function createDesigner(options) {
|
|
|
1444
1541
|
canOpenForm: () => typeof options.openForm === 'function',
|
|
1445
1542
|
openForm: (id) => options.openForm?.(id),
|
|
1446
1543
|
// steps lane
|
|
1447
|
-
...stepsCommands({ apply, getPage: () => page }),
|
|
1544
|
+
...stepsCommands({ apply, getPage: () => page, functions }),
|
|
1448
1545
|
};
|
|
1449
1546
|
return designer;
|
|
1450
1547
|
}
|
|
@@ -1454,14 +1551,14 @@ createDesigner.open = async (id, store, options = {}) => {
|
|
|
1454
1551
|
const page = draft ?? versions[versions.length - 1]?.page;
|
|
1455
1552
|
if (!page)
|
|
1456
1553
|
throw new Error(`The store has no page "${id}"`);
|
|
1457
|
-
return createDesigner({ page, store, versions, model: options.model, lists: options.lists, kinds: options.kinds, looks: options.looks, openForm: options.openForm, locale: options.locale, regionSets: options.regionSets });
|
|
1554
|
+
return createDesigner({ page, store, versions, model: options.model, lists: options.lists, functions: options.functions, kinds: options.kinds, looks: options.looks, openForm: options.openForm, locale: options.locale, regionSets: options.regionSets });
|
|
1458
1555
|
};
|
|
1459
1556
|
/** A sheet's status steps, by the id the designer picks them by: they show for some records only, and to some roles, as any part. */
|
|
1460
1557
|
function statusbarOf(page, id) {
|
|
1461
1558
|
return id === '#statusbar' && page.layout.type === 'sheet' ? page.layout.statusbar : undefined;
|
|
1462
1559
|
}
|
|
1463
1560
|
/** A related list changed as asked: names that are no field's refused, and what named a column taken away gone with it. */
|
|
1464
|
-
function changeRelated(draft, node, patch) {
|
|
1561
|
+
function changeRelated(draft, node, patch, functions) {
|
|
1465
1562
|
const named = (name) => {
|
|
1466
1563
|
if (!FIELD_NAME.test(name))
|
|
1467
1564
|
throw new Refusal((w) => w.relatedPart.notAName(name));
|
|
@@ -1541,7 +1638,7 @@ function changeRelated(draft, node, patch) {
|
|
|
1541
1638
|
node.card = JSON.parse(JSON.stringify(patch.card));
|
|
1542
1639
|
}
|
|
1543
1640
|
// Its rows' own rules, as a list's: each condition read on a row's record — its own fields, its id, the person.
|
|
1544
|
-
setRowRules(node, patch, draft, { ...draft, fields: node.fields });
|
|
1641
|
+
setRowRules(node, patch, draft, { ...draft, fields: node.fields }, functions);
|
|
1545
1642
|
// A field taken away with its column goes from the card too: its lines, its title, picture and status.
|
|
1546
1643
|
if (patch.columns !== undefined && node.card) {
|
|
1547
1644
|
const card = node.card;
|