@fieldia/designer 0.11.0 → 0.13.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/package.json +4 -4
- package/src/lib/canvas-form.js +9 -0
- package/src/lib/canvas-form.js.map +1 -1
- package/src/lib/canvas-form.mjs +9 -0
- package/src/lib/canvas-form.mjs.map +1 -1
- package/src/lib/canvas-header.d.mts +4 -1
- package/src/lib/canvas-header.d.ts +4 -1
- package/src/lib/canvas-header.js +56 -17
- package/src/lib/canvas-header.js.map +1 -1
- package/src/lib/canvas-header.mjs +56 -17
- package/src/lib/canvas-header.mjs.map +1 -1
- package/src/lib/choice-commands.d.mts +5 -1
- package/src/lib/choice-commands.d.ts +5 -1
- package/src/lib/choice-commands.js +41 -0
- package/src/lib/choice-commands.js.map +1 -1
- package/src/lib/choice-commands.mjs +41 -0
- package/src/lib/choice-commands.mjs.map +1 -1
- package/src/lib/clipboard-names.js +21 -4
- package/src/lib/clipboard-names.js.map +1 -1
- package/src/lib/clipboard-names.mjs +21 -4
- package/src/lib/clipboard-names.mjs.map +1 -1
- package/src/lib/conditions.d.mts +14 -2
- package/src/lib/conditions.d.ts +14 -2
- package/src/lib/conditions.js +25 -2
- package/src/lib/conditions.js.map +1 -1
- package/src/lib/conditions.mjs +23 -2
- package/src/lib/conditions.mjs.map +1 -1
- package/src/lib/designer.d.mts +20 -15
- package/src/lib/designer.d.ts +20 -15
- package/src/lib/designer.js +67 -3
- package/src/lib/designer.js.map +1 -1
- package/src/lib/designer.mjs +68 -4
- package/src/lib/designer.mjs.map +1 -1
- package/src/lib/header-commands.d.mts +69 -11
- package/src/lib/header-commands.d.ts +69 -11
- package/src/lib/header-commands.js +299 -20
- package/src/lib/header-commands.js.map +1 -1
- package/src/lib/header-commands.mjs +297 -20
- package/src/lib/header-commands.mjs.map +1 -1
- package/src/lib/header-properties.js +171 -20
- package/src/lib/header-properties.js.map +1 -1
- package/src/lib/header-properties.mjs +172 -21
- package/src/lib/header-properties.mjs.map +1 -1
- package/src/lib/hotkey-setting.d.mts +8 -0
- package/src/lib/hotkey-setting.d.ts +8 -0
- package/src/lib/hotkey-setting.js +25 -0
- package/src/lib/hotkey-setting.js.map +1 -0
- package/src/lib/hotkey-setting.mjs +20 -0
- package/src/lib/hotkey-setting.mjs.map +1 -0
- package/src/lib/icons.js +15 -0
- package/src/lib/icons.js.map +1 -1
- package/src/lib/icons.mjs +15 -0
- package/src/lib/icons.mjs.map +1 -1
- package/src/lib/inline-settings.js +32 -4
- package/src/lib/inline-settings.js.map +1 -1
- package/src/lib/inline-settings.mjs +33 -5
- package/src/lib/inline-settings.mjs.map +1 -1
- package/src/lib/input-changes.js +12 -0
- package/src/lib/input-changes.js.map +1 -1
- package/src/lib/input-changes.mjs +12 -0
- package/src/lib/input-changes.mjs.map +1 -1
- package/src/lib/kind-settings-choices.js +30 -0
- package/src/lib/kind-settings-choices.js.map +1 -1
- package/src/lib/kind-settings-choices.mjs +30 -0
- package/src/lib/kind-settings-choices.mjs.map +1 -1
- package/src/lib/kind-settings-inputs.js +80 -0
- package/src/lib/kind-settings-inputs.js.map +1 -1
- package/src/lib/kind-settings-inputs.mjs +80 -0
- package/src/lib/kind-settings-inputs.mjs.map +1 -1
- package/src/lib/kinds.d.mts +2 -0
- package/src/lib/kinds.d.ts +2 -0
- package/src/lib/kinds.js +71 -7
- package/src/lib/kinds.js.map +1 -1
- package/src/lib/kinds.mjs +70 -6
- package/src/lib/kinds.mjs.map +1 -1
- package/src/lib/layout-settings.d.mts +7 -1
- package/src/lib/layout-settings.d.ts +7 -1
- package/src/lib/layout-settings.js +36 -2
- package/src/lib/layout-settings.js.map +1 -1
- package/src/lib/layout-settings.mjs +35 -2
- package/src/lib/layout-settings.mjs.map +1 -1
- package/src/lib/locales/ar/canvas.js +6 -0
- package/src/lib/locales/ar/canvas.js.map +1 -1
- package/src/lib/locales/ar/canvas.mjs +6 -0
- package/src/lib/locales/ar/canvas.mjs.map +1 -1
- package/src/lib/locales/ar/changes.js +2 -2
- package/src/lib/locales/ar/changes.js.map +1 -1
- package/src/lib/locales/ar/changes.mjs +2 -2
- package/src/lib/locales/ar/changes.mjs.map +1 -1
- package/src/lib/locales/ar/defaults.js +7 -0
- package/src/lib/locales/ar/defaults.js.map +1 -1
- package/src/lib/locales/ar/defaults.mjs +7 -0
- package/src/lib/locales/ar/defaults.mjs.map +1 -1
- 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/kinds.js +15 -0
- package/src/lib/locales/ar/kinds.js.map +1 -1
- package/src/lib/locales/ar/kinds.mjs +15 -0
- package/src/lib/locales/ar/kinds.mjs.map +1 -1
- package/src/lib/locales/ar/layout.js +2 -0
- package/src/lib/locales/ar/layout.js.map +1 -1
- package/src/lib/locales/ar/layout.mjs +2 -0
- package/src/lib/locales/ar/layout.mjs.map +1 -1
- package/src/lib/locales/ar/panel.js +85 -1
- package/src/lib/locales/ar/panel.js.map +1 -1
- package/src/lib/locales/ar/panel.mjs +85 -1
- package/src/lib/locales/ar/panel.mjs.map +1 -1
- package/src/lib/locales/ar/questions.js +20 -0
- package/src/lib/locales/ar/questions.js.map +1 -1
- package/src/lib/locales/ar/questions.mjs +20 -0
- package/src/lib/locales/ar/questions.mjs.map +1 -1
- package/src/lib/locales/ar/refusals.js +23 -1
- package/src/lib/locales/ar/refusals.js.map +1 -1
- package/src/lib/locales/ar/refusals.mjs +23 -1
- package/src/lib/locales/ar/refusals.mjs.map +1 -1
- package/src/lib/locales/ar/rules-ui.js +19 -0
- package/src/lib/locales/ar/rules-ui.js.map +1 -1
- package/src/lib/locales/ar/rules-ui.mjs +19 -0
- package/src/lib/locales/ar/rules-ui.mjs.map +1 -1
- package/src/lib/locales/ar/rules.js +7 -0
- package/src/lib/locales/ar/rules.js.map +1 -1
- package/src/lib/locales/ar/rules.mjs +7 -0
- package/src/lib/locales/ar/rules.mjs.map +1 -1
- package/src/lib/locales/ar/settings-changes.js +20 -0
- package/src/lib/locales/ar/settings-changes.js.map +1 -1
- package/src/lib/locales/ar/settings-changes.mjs +20 -0
- package/src/lib/locales/ar/settings-changes.mjs.map +1 -1
- package/src/lib/locales/ar/steps.js +31 -1
- package/src/lib/locales/ar/steps.js.map +1 -1
- package/src/lib/locales/ar/steps.mjs +31 -1
- package/src/lib/locales/ar/steps.mjs.map +1 -1
- package/src/lib/locales/ar/tables.d.mts +2 -0
- package/src/lib/locales/ar/tables.d.ts +2 -0
- package/src/lib/locales/ar/tables.js +69 -0
- package/src/lib/locales/ar/tables.js.map +1 -0
- package/src/lib/locales/ar/tables.mjs +66 -0
- package/src/lib/locales/ar/tables.mjs.map +1 -0
- package/src/lib/locales/en/canvas.d.mts +13 -0
- package/src/lib/locales/en/canvas.d.ts +13 -0
- package/src/lib/locales/en/canvas.js +6 -0
- package/src/lib/locales/en/canvas.js.map +1 -1
- package/src/lib/locales/en/canvas.mjs +6 -0
- package/src/lib/locales/en/canvas.mjs.map +1 -1
- package/src/lib/locales/en/changes.d.mts +2 -2
- package/src/lib/locales/en/changes.d.ts +2 -2
- package/src/lib/locales/en/changes.js +1 -1
- package/src/lib/locales/en/changes.js.map +1 -1
- package/src/lib/locales/en/changes.mjs +1 -1
- package/src/lib/locales/en/changes.mjs.map +1 -1
- package/src/lib/locales/en/defaults.d.mts +8 -0
- package/src/lib/locales/en/defaults.d.ts +8 -0
- package/src/lib/locales/en/defaults.js +8 -0
- package/src/lib/locales/en/defaults.js.map +1 -1
- package/src/lib/locales/en/defaults.mjs +8 -0
- package/src/lib/locales/en/defaults.mjs.map +1 -1
- package/src/lib/locales/en/index.d.mts +311 -4
- package/src/lib/locales/en/index.d.ts +311 -4
- 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/kinds.d.mts +15 -0
- package/src/lib/locales/en/kinds.d.ts +15 -0
- package/src/lib/locales/en/kinds.js +15 -0
- package/src/lib/locales/en/kinds.js.map +1 -1
- package/src/lib/locales/en/kinds.mjs +15 -0
- package/src/lib/locales/en/kinds.mjs.map +1 -1
- package/src/lib/locales/en/layout.d.mts +2 -0
- package/src/lib/locales/en/layout.d.ts +2 -0
- package/src/lib/locales/en/layout.js +2 -0
- package/src/lib/locales/en/layout.js.map +1 -1
- package/src/lib/locales/en/layout.mjs +2 -0
- package/src/lib/locales/en/layout.mjs.map +1 -1
- package/src/lib/locales/en/panel.d.mts +84 -0
- package/src/lib/locales/en/panel.d.ts +84 -0
- package/src/lib/locales/en/panel.js +66 -1
- package/src/lib/locales/en/panel.js.map +1 -1
- package/src/lib/locales/en/panel.mjs +66 -1
- package/src/lib/locales/en/panel.mjs.map +1 -1
- package/src/lib/locales/en/questions.d.mts +20 -0
- package/src/lib/locales/en/questions.d.ts +20 -0
- package/src/lib/locales/en/questions.js +21 -0
- package/src/lib/locales/en/questions.js.map +1 -1
- package/src/lib/locales/en/questions.mjs +21 -0
- package/src/lib/locales/en/questions.mjs.map +1 -1
- package/src/lib/locales/en/refusals.d.mts +22 -0
- package/src/lib/locales/en/refusals.d.ts +22 -0
- package/src/lib/locales/en/refusals.js +24 -1
- package/src/lib/locales/en/refusals.js.map +1 -1
- package/src/lib/locales/en/refusals.mjs +24 -1
- package/src/lib/locales/en/refusals.mjs.map +1 -1
- package/src/lib/locales/en/rules-ui.d.mts +24 -0
- package/src/lib/locales/en/rules-ui.d.ts +24 -0
- package/src/lib/locales/en/rules-ui.js +20 -0
- package/src/lib/locales/en/rules-ui.js.map +1 -1
- package/src/lib/locales/en/rules-ui.mjs +20 -0
- package/src/lib/locales/en/rules-ui.mjs.map +1 -1
- package/src/lib/locales/en/rules.d.mts +8 -0
- package/src/lib/locales/en/rules.d.ts +8 -0
- package/src/lib/locales/en/rules.js +8 -0
- package/src/lib/locales/en/rules.js.map +1 -1
- package/src/lib/locales/en/rules.mjs +9 -1
- package/src/lib/locales/en/rules.mjs.map +1 -1
- package/src/lib/locales/en/settings-changes.d.mts +20 -0
- package/src/lib/locales/en/settings-changes.d.ts +20 -0
- package/src/lib/locales/en/settings-changes.js +21 -0
- package/src/lib/locales/en/settings-changes.js.map +1 -1
- package/src/lib/locales/en/settings-changes.mjs +21 -0
- package/src/lib/locales/en/settings-changes.mjs.map +1 -1
- package/src/lib/locales/en/steps.d.mts +35 -0
- package/src/lib/locales/en/steps.d.ts +35 -0
- package/src/lib/locales/en/steps.js +32 -1
- package/src/lib/locales/en/steps.js.map +1 -1
- package/src/lib/locales/en/steps.mjs +32 -1
- package/src/lib/locales/en/steps.mjs.map +1 -1
- package/src/lib/locales/en/tables.d.mts +73 -0
- package/src/lib/locales/en/tables.d.ts +73 -0
- package/src/lib/locales/en/tables.js +85 -0
- package/src/lib/locales/en/tables.js.map +1 -0
- package/src/lib/locales/en/tables.mjs +82 -0
- package/src/lib/locales/en/tables.mjs.map +1 -0
- package/src/lib/page-checks.js +6 -3
- package/src/lib/page-checks.js.map +1 -1
- package/src/lib/page-checks.mjs +6 -3
- package/src/lib/page-checks.mjs.map +1 -1
- package/src/lib/page-tree.d.mts +5 -1
- package/src/lib/page-tree.d.ts +5 -1
- package/src/lib/page-tree.js +29 -3
- package/src/lib/page-tree.js.map +1 -1
- package/src/lib/page-tree.mjs +28 -3
- package/src/lib/page-tree.mjs.map +1 -1
- package/src/lib/panel-block.js +22 -3
- package/src/lib/panel-block.js.map +1 -1
- package/src/lib/panel-block.mjs +22 -3
- package/src/lib/panel-block.mjs.map +1 -1
- package/src/lib/panel-field.js +22 -2
- package/src/lib/panel-field.js.map +1 -1
- package/src/lib/panel-field.mjs +22 -2
- package/src/lib/panel-field.mjs.map +1 -1
- package/src/lib/panel-group.js +7 -1
- package/src/lib/panel-group.js.map +1 -1
- package/src/lib/panel-group.mjs +7 -1
- package/src/lib/panel-group.mjs.map +1 -1
- package/src/lib/panel-layout.js +7 -1
- package/src/lib/panel-layout.js.map +1 -1
- package/src/lib/panel-layout.mjs +7 -1
- package/src/lib/panel-layout.mjs.map +1 -1
- package/src/lib/panel-look.js +25 -5
- package/src/lib/panel-look.js.map +1 -1
- package/src/lib/panel-look.mjs +27 -7
- package/src/lib/panel-look.mjs.map +1 -1
- package/src/lib/panel-page.d.mts +4 -2
- package/src/lib/panel-page.d.ts +4 -2
- package/src/lib/panel-page.js +41 -3
- package/src/lib/panel-page.js.map +1 -1
- package/src/lib/panel-page.mjs +41 -3
- package/src/lib/panel-page.mjs.map +1 -1
- package/src/lib/panel-screen.js +2 -2
- package/src/lib/panel-screen.js.map +1 -1
- package/src/lib/panel-screen.mjs +3 -3
- package/src/lib/panel-screen.mjs.map +1 -1
- package/src/lib/placeholder-when.d.mts +13 -0
- package/src/lib/placeholder-when.d.ts +13 -0
- package/src/lib/placeholder-when.js +83 -0
- package/src/lib/placeholder-when.js.map +1 -0
- package/src/lib/placeholder-when.mjs +80 -0
- package/src/lib/placeholder-when.mjs.map +1 -0
- package/src/lib/roles-setting.d.mts +18 -0
- package/src/lib/roles-setting.d.ts +18 -0
- package/src/lib/roles-setting.js +48 -0
- package/src/lib/roles-setting.js.map +1 -0
- package/src/lib/roles-setting.mjs +43 -0
- package/src/lib/roles-setting.mjs.map +1 -0
- package/src/lib/rules-answers.js +22 -7
- package/src/lib/rules-answers.js.map +1 -1
- package/src/lib/rules-answers.mjs +22 -7
- package/src/lib/rules-answers.mjs.map +1 -1
- package/src/lib/rules-changes.js +1 -1
- package/src/lib/rules-changes.js.map +1 -1
- package/src/lib/rules-changes.mjs +2 -2
- package/src/lib/rules-changes.mjs.map +1 -1
- package/src/lib/rules-checks.js +1 -1
- package/src/lib/rules-checks.js.map +1 -1
- package/src/lib/rules-checks.mjs +1 -1
- package/src/lib/rules-checks.mjs.map +1 -1
- package/src/lib/rules-commands.d.mts +6 -0
- package/src/lib/rules-commands.d.ts +6 -0
- package/src/lib/rules-commands.js +63 -3
- package/src/lib/rules-commands.js.map +1 -1
- package/src/lib/rules-commands.mjs +63 -3
- package/src/lib/rules-commands.mjs.map +1 -1
- package/src/lib/rules-defaults.d.mts +8 -0
- package/src/lib/rules-defaults.d.ts +8 -0
- package/src/lib/rules-defaults.js +77 -0
- package/src/lib/rules-defaults.js.map +1 -0
- package/src/lib/rules-defaults.mjs +74 -0
- package/src/lib/rules-defaults.mjs.map +1 -0
- package/src/lib/rules-formula.js +12 -3
- package/src/lib/rules-formula.js.map +1 -1
- package/src/lib/rules-formula.mjs +12 -3
- package/src/lib/rules-formula.mjs.map +1 -1
- package/src/lib/rules-panel.js +4 -1
- package/src/lib/rules-panel.js.map +1 -1
- package/src/lib/rules-panel.mjs +4 -1
- package/src/lib/rules-panel.mjs.map +1 -1
- package/src/lib/rules-words.d.mts +10 -3
- package/src/lib/rules-words.d.ts +10 -3
- package/src/lib/rules-words.js +18 -3
- package/src/lib/rules-words.js.map +1 -1
- package/src/lib/rules-words.mjs +17 -3
- package/src/lib/rules-words.mjs.map +1 -1
- package/src/lib/rules-worked-out.js +31 -6
- package/src/lib/rules-worked-out.js.map +1 -1
- package/src/lib/rules-worked-out.mjs +31 -6
- package/src/lib/rules-worked-out.mjs.map +1 -1
- package/src/lib/shown-while.d.mts +16 -0
- package/src/lib/shown-while.d.ts +16 -0
- package/src/lib/shown-while.js +28 -0
- package/src/lib/shown-while.js.map +1 -0
- package/src/lib/shown-while.mjs +25 -0
- package/src/lib/shown-while.mjs.map +1 -0
- package/src/lib/steps-commands.d.mts +2 -2
- package/src/lib/steps-commands.d.ts +2 -2
- package/src/lib/steps-commands.js +3 -0
- package/src/lib/steps-commands.js.map +1 -1
- package/src/lib/steps-commands.mjs +3 -0
- package/src/lib/steps-commands.mjs.map +1 -1
- package/src/lib/steps-editor.js +12 -3
- package/src/lib/steps-editor.js.map +1 -1
- package/src/lib/steps-editor.mjs +12 -3
- package/src/lib/steps-editor.mjs.map +1 -1
- package/src/lib/steps-places.d.mts +3 -3
- package/src/lib/steps-places.d.ts +3 -3
- package/src/lib/steps-places.js +15 -4
- package/src/lib/steps-places.js.map +1 -1
- package/src/lib/steps-places.mjs +15 -4
- package/src/lib/steps-places.mjs.map +1 -1
- package/src/lib/steps-settings.js +75 -1
- package/src/lib/steps-settings.js.map +1 -1
- package/src/lib/steps-settings.mjs +75 -1
- package/src/lib/steps-settings.mjs.map +1 -1
- package/src/lib/steps-words.js +24 -3
- package/src/lib/steps-words.js.map +1 -1
- package/src/lib/steps-words.mjs +24 -3
- package/src/lib/steps-words.mjs.map +1 -1
- package/src/lib/structure-changes.js +6 -0
- package/src/lib/structure-changes.js.map +1 -1
- package/src/lib/structure-changes.mjs +6 -0
- package/src/lib/structure-changes.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 +12 -0
- package/src/lib/styles-rules.js.map +1 -1
- package/src/lib/styles-rules.mjs +12 -0
- 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 +7 -0
- package/src/lib/styles.js.map +1 -1
- package/src/lib/styles.mjs +7 -0
- package/src/lib/styles.mjs.map +1 -1
- package/src/lib/table-commands.d.mts +76 -0
- package/src/lib/table-commands.d.ts +76 -0
- package/src/lib/table-commands.js +248 -0
- package/src/lib/table-commands.js.map +1 -0
- package/src/lib/table-commands.mjs +244 -0
- package/src/lib/table-commands.mjs.map +1 -0
- package/src/lib/table-panel.d.mts +8 -0
- package/src/lib/table-panel.d.ts +8 -0
- package/src/lib/table-panel.js +276 -0
- package/src/lib/table-panel.js.map +1 -0
- package/src/lib/table-panel.mjs +273 -0
- package/src/lib/table-panel.mjs.map +1 -0
- package/src/lib/toolbox.js +1 -0
- package/src/lib/toolbox.js.map +1 -1
- package/src/lib/toolbox.mjs +1 -0
- package/src/lib/toolbox.mjs.map +1 -1
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.tableSettings = tableSettings;
|
|
4
|
+
const chrome_1 = require("./chrome");
|
|
5
|
+
const page_tree_1 = require("./page-tree");
|
|
6
|
+
const panel_controls_1 = require("./panel-controls");
|
|
7
|
+
const rules_formula_1 = require("./rules-formula");
|
|
8
|
+
const rules_formula_box_1 = require("./rules-formula-box");
|
|
9
|
+
const table_commands_1 = require("./table-commands");
|
|
10
|
+
/**
|
|
11
|
+
* A field's tone and a table's own rules in the panel: its value's tones and
|
|
12
|
+
* bold (Rules); a table's lines' tones and bold, and each column's cells by
|
|
13
|
+
* their line — blank, read-only, required, bold, toned, a pill, a width — and
|
|
14
|
+
* the column hidden by the record (Rules); its buttons on each line, for the
|
|
15
|
+
* lines chosen and beside Add a line (Content); how a line opens, how it shows
|
|
16
|
+
* on a phone, its columns' widths, a line copied (Layout); and the widths of
|
|
17
|
+
* the form a field is hidden at (Layout). Each a row the panel's search finds.
|
|
18
|
+
*/
|
|
19
|
+
const TONES = ['danger', 'warning', 'success', 'info', 'muted'];
|
|
20
|
+
const WIDTHS = ['narrow', 'medium', 'wide'];
|
|
21
|
+
/** The page a line's conditions read: its fields, and the record as parent. */
|
|
22
|
+
const linePage = (page, def) => ({ ...page, fields: { ...def.fields, parent: { type: 'json', label: 'parent' } } });
|
|
23
|
+
function tableSettings(el, designer, id) {
|
|
24
|
+
const words = designer.words;
|
|
25
|
+
const w = words.tables;
|
|
26
|
+
const focused = (node) => node.ownerDocument.activeElement === node;
|
|
27
|
+
let page = designer.getPage();
|
|
28
|
+
let node = null;
|
|
29
|
+
let lines = null;
|
|
30
|
+
/** A condition's box: its fields suggested, what is wrong said under it, handed on as it reads. */
|
|
31
|
+
function whenBox(label, scope, save, placeholder = w.whenPlaceholder) {
|
|
32
|
+
const box = (0, rules_formula_box_1.formulaBox)(el, { words, label, placeholder, check: (on, source) => (0, rules_formula_1.formulaProblem)(on, source, words), commit: (source) => save(source || null) });
|
|
33
|
+
const element = el('div', { class: 'fd-answer-rule-field fd-table-when' }, el('span', { class: 'fd-answer-rule-word' }, label), box.element, box.problem);
|
|
34
|
+
return { element, box, show: (source) => box.update(scope(), source ?? '') };
|
|
35
|
+
}
|
|
36
|
+
/** Tones, each a colour while its condition holds, the first that holds; a new one kept once its condition reads. */
|
|
37
|
+
function toneList(scope, read, save) {
|
|
38
|
+
const list = el('ul', { class: 'fd-table-tones' });
|
|
39
|
+
const add = el('button', { type: 'button', class: 'fd-button fd-button-link fd-table-add-tone' }, w.addTone);
|
|
40
|
+
let drafting = false;
|
|
41
|
+
const rows = [];
|
|
42
|
+
add.addEventListener('click', () => {
|
|
43
|
+
drafting = true;
|
|
44
|
+
draw();
|
|
45
|
+
rows[rows.length - 1]?.when.input.focus();
|
|
46
|
+
});
|
|
47
|
+
function row(index) {
|
|
48
|
+
const tone = el('select', { class: 'fd-input fd-select fd-table-tone', 'aria-label': w.toneOf }, ...TONES.map((t) => el('option', { value: t }, w.tones[t])));
|
|
49
|
+
const keep = (when) => {
|
|
50
|
+
if (!when)
|
|
51
|
+
return;
|
|
52
|
+
const items = [...read()];
|
|
53
|
+
items[index] = { tone: tone.value, when };
|
|
54
|
+
const begun = index >= read().length;
|
|
55
|
+
if (begun)
|
|
56
|
+
drafting = false;
|
|
57
|
+
if (!save(items) && begun)
|
|
58
|
+
drafting = true;
|
|
59
|
+
};
|
|
60
|
+
const when = (0, rules_formula_box_1.formulaBox)(el, { words, label: w.when, placeholder: w.whenPlaceholder, check: (on, source) => (0, rules_formula_1.formulaProblem)(on, source, words), commit: (source) => keep(source) });
|
|
61
|
+
tone.addEventListener('change', () => keep(when.input.value.trim()));
|
|
62
|
+
const remove = (0, chrome_1.iconButton)(el, w.removeTone(index + 1), '×', () => {
|
|
63
|
+
if (index >= read().length) {
|
|
64
|
+
drafting = false;
|
|
65
|
+
return draw();
|
|
66
|
+
}
|
|
67
|
+
const items = read().filter((_, i) => i !== index);
|
|
68
|
+
save(items.length ? items : null);
|
|
69
|
+
});
|
|
70
|
+
const element = el('li', { class: 'fd-table-tone-row' }, tone, el('div', { class: 'fd-table-tone-when' }, when.element, when.problem), remove);
|
|
71
|
+
return { element, tone, when, remove };
|
|
72
|
+
}
|
|
73
|
+
function draw() {
|
|
74
|
+
const items = read();
|
|
75
|
+
const count = items.length + (drafting ? 1 : 0);
|
|
76
|
+
while (rows.length > count)
|
|
77
|
+
rows.pop()?.element.remove();
|
|
78
|
+
while (rows.length < count) {
|
|
79
|
+
const made = row(rows.length);
|
|
80
|
+
rows.push(made);
|
|
81
|
+
list.append(made.element);
|
|
82
|
+
}
|
|
83
|
+
rows.forEach((r, i) => {
|
|
84
|
+
const item = items[i];
|
|
85
|
+
if (!focused(r.tone))
|
|
86
|
+
r.tone.value = item?.tone ?? 'danger';
|
|
87
|
+
r.when.update(scope(), item && typeof item.when === 'string' ? item.when : item ? String(item.when) : r.when.input.value);
|
|
88
|
+
});
|
|
89
|
+
list.hidden = !count;
|
|
90
|
+
add.hidden = drafting;
|
|
91
|
+
}
|
|
92
|
+
return { element: el('div', { class: 'fd-table-tone-list' }, list, add), draw };
|
|
93
|
+
}
|
|
94
|
+
// ---- Rules: a field's value in a tone ----
|
|
95
|
+
const fieldTones = toneList(() => page, () => node?.tones ?? [], (tones) => designer.setFieldTones(id, tones));
|
|
96
|
+
const fieldBold = whenBox(w.boldWhen, () => page, (source) => designer.setFieldBold(id, source));
|
|
97
|
+
const toneRow = (0, panel_controls_1.onTab)(el('div', { class: 'fd-prop fd-table-setting' }, el('span', { class: 'fd-prop-name' }, w.tone), fieldTones.element, fieldBold.element, el('p', { class: 'fd-properties-hint fd-set-hint' }, w.toneHint)), 'rules', 'Tone');
|
|
98
|
+
// ---- Rules: a table's lines, and each column's cells ----
|
|
99
|
+
const lineScope = () => (lines ? linePage(page, lines) : page);
|
|
100
|
+
const rowTones = toneList(lineScope, () => node?.rowTones ?? [], (tones) => designer.setRowTones(id, tones));
|
|
101
|
+
const rowBold = whenBox(w.boldWhen, lineScope, (source) => designer.setRowBold(id, source));
|
|
102
|
+
const lineDelete = whenBox(w.deletedOnlyWhen, lineScope, (source) => designer.setLineDelete(id, source));
|
|
103
|
+
const column = el('select', { class: 'fd-input fd-select fd-table-column', 'aria-label': w.column });
|
|
104
|
+
const current = () => column.value;
|
|
105
|
+
const rule = (key, label) => {
|
|
106
|
+
const box = whenBox(label, key === 'hidden' ? () => page : lineScope, (source) => designer.setCellRule(id, current(), key, source));
|
|
107
|
+
box.element.dataset['cellRule'] = key;
|
|
108
|
+
return { key, box };
|
|
109
|
+
};
|
|
110
|
+
const cellRules = [rule('invisible', w.hiddenOnLineWhen), rule('readonly', w.readonlyWhen), rule('required', w.requiredWhen), rule('bold', w.boldWhen), rule('hidden', w.columnHiddenWhen)];
|
|
111
|
+
const cellTones = toneList(lineScope, () => node?.cells?.[current()]?.tones ?? [], (tones) => designer.setCellTones(id, current(), tones));
|
|
112
|
+
const badge = el('input', { type: 'checkbox', class: 'fd-checkbox', 'aria-label': w.badge });
|
|
113
|
+
badge.addEventListener('change', () => designer.setCellLook(id, current(), { badge: badge.checked || null }));
|
|
114
|
+
// Its cells drawn by a widget that suits what the column holds: hours as HH:MM, stars, a bar…
|
|
115
|
+
const cellWidget = el('select', { class: 'fd-input fd-select fd-table-cell-widget', 'aria-label': w.shownAs });
|
|
116
|
+
cellWidget.addEventListener('change', () => designer.setCellLook(id, current(), { widget: cellWidget.value || null }));
|
|
117
|
+
const width = el('input', { type: 'number', class: 'fd-input fd-inline-number', min: '1', max: '200', step: '1', 'aria-label': w.width });
|
|
118
|
+
// The roles the column shows to: kept once it is left or Enter is pressed, a role half typed being no role.
|
|
119
|
+
const columnRoles = el('input', { class: 'fd-input fd-answer-rule-code fd-table-column-roles', 'aria-label': w.columnShownTo, placeholder: words.rulesUi.rolesPlaceholder, spellcheck: 'false', autocomplete: 'off' });
|
|
120
|
+
const keepRoles = () => {
|
|
121
|
+
const typed = columnRoles.value.split(/[\s,]+/).filter(Boolean);
|
|
122
|
+
if (typed.join(',') === (node?.cells?.[current()]?.roles ?? []).join(','))
|
|
123
|
+
return;
|
|
124
|
+
if (!designer.setCellLook(id, current(), { roles: typed.length ? typed : null }))
|
|
125
|
+
columnRoles.value = (node?.cells?.[current()]?.roles ?? []).join(', ');
|
|
126
|
+
};
|
|
127
|
+
columnRoles.addEventListener('change', keepRoles);
|
|
128
|
+
columnRoles.addEventListener('keydown', (event) => event.key === 'Enter' && (event.preventDefault(), keepRoles()));
|
|
129
|
+
width.addEventListener('change', () => designer.setCellLook(id, current(), { width: width.value.trim() ? Number(width.value) : null }));
|
|
130
|
+
column.addEventListener('change', () => drawColumn());
|
|
131
|
+
const columnBox = el('div', { class: 'fd-table-column-rules' }, el('label', { class: 'fd-answer-rule-field' }, el('span', { class: 'fd-answer-rule-word' }, w.column), column), ...cellRules.map((r) => r.box.element), el('p', { class: 'fd-properties-hint fd-set-hint' }, w.columnHiddenHint), el('label', { class: 'fd-answer-rule-field' }, el('span', { class: 'fd-answer-rule-word' }, w.columnShownTo), columnRoles), el('span', { class: 'fd-answer-rule-word' }, w.toneOf), cellTones.element, el('label', { class: 'fd-inline-setting' }, badge, el('span', {}, w.badge)), el('label', { class: 'fd-answer-rule-field' }, el('span', { class: 'fd-answer-rule-word' }, w.shownAs), cellWidget), el('label', { class: 'fd-answer-rule-field' }, el('span', { class: 'fd-answer-rule-word' }, w.width), width));
|
|
132
|
+
const linesRow = (0, panel_controls_1.onTab)(el('div', { class: 'fd-prop fd-table-setting' }, el('span', { class: 'fd-prop-name' }, w.lineRules), el('span', { class: 'fd-answer-rule-word' }, w.linesTone), rowTones.element, rowBold.element, lineDelete.element, el('p', { class: 'fd-properties-hint fd-set-hint' }, w.linesHint), columnBox), 'rules', 'Line rules');
|
|
133
|
+
function drawColumn() {
|
|
134
|
+
const rules = node?.cells?.[current()] ?? {};
|
|
135
|
+
for (const r of cellRules)
|
|
136
|
+
r.box.show(typeof rules[r.key] === 'string' ? rules[r.key] : undefined);
|
|
137
|
+
cellTones.draw();
|
|
138
|
+
badge.checked = rules.badge === true;
|
|
139
|
+
const type = lines?.fields[current()]?.type ?? '';
|
|
140
|
+
const offered = table_commands_1.CELL_WIDGETS[type] ?? [];
|
|
141
|
+
const names = designer.words.kinds.names;
|
|
142
|
+
cellWidget.replaceChildren(el('option', { value: '' }, w.asItsType), ...offered.map((widget) => el('option', { value: widget }, names[table_commands_1.CELL_WIDGET_KINDS[widget]] ?? widget)));
|
|
143
|
+
cellWidget.value = rules.widget && offered.includes(rules.widget) ? rules.widget : '';
|
|
144
|
+
cellWidget.parentElement.hidden = !offered.length;
|
|
145
|
+
if (!focused(width))
|
|
146
|
+
width.value = rules.width ? String(rules.width) : '';
|
|
147
|
+
if (!focused(columnRoles))
|
|
148
|
+
columnRoles.value = (rules.roles ?? []).join(', ');
|
|
149
|
+
}
|
|
150
|
+
// ---- Content: the table's buttons ----
|
|
151
|
+
function buttonList(place, title) {
|
|
152
|
+
const list = el('ul', { class: 'fd-table-buttons', 'data-place': place });
|
|
153
|
+
const add = el('button', { type: 'button', class: 'fd-button fd-button-link' }, w.addButton);
|
|
154
|
+
const read = () => node?.[place] ?? [];
|
|
155
|
+
const save = (items) => designer.setTableButtons(id, place, items.map((b) => ({ id: b.id, label: b.label, action: b.action, invisible: typeof b.invisible === 'string' ? b.invisible : undefined })));
|
|
156
|
+
add.addEventListener('click', () => {
|
|
157
|
+
save([...read(), { type: 'button', id: '', label: w.newButton }]);
|
|
158
|
+
list.lastElementChild?.querySelector('input')?.focus();
|
|
159
|
+
});
|
|
160
|
+
const drawn = [];
|
|
161
|
+
function draw() {
|
|
162
|
+
const items = read();
|
|
163
|
+
while (drawn.length > items.length)
|
|
164
|
+
drawn.pop()?.element.remove();
|
|
165
|
+
while (drawn.length < items.length) {
|
|
166
|
+
const index = drawn.length;
|
|
167
|
+
const change = (patch) => save(read().map((b, i) => (i === index ? { ...b, ...patch } : b)));
|
|
168
|
+
const words = el('input', { class: 'fd-input', 'aria-label': w.buttonWords });
|
|
169
|
+
words.addEventListener('input', () => words.value.trim() && change({ label: words.value }));
|
|
170
|
+
const action = el('input', { class: 'fd-input fd-answer-rule-code', 'aria-label': w.action, spellcheck: 'false', autocomplete: 'off' });
|
|
171
|
+
action.addEventListener('change', () => change({ action: action.value.trim() || undefined }));
|
|
172
|
+
const hidden = whenBox(w.hiddenWhen, place === 'rowButtons' ? lineScope : () => page, (source) => change({ invisible: source ?? undefined }));
|
|
173
|
+
const remove = (0, chrome_1.iconButton)(el, w.removeButton(read()[index]?.label ?? ''), '×', () => {
|
|
174
|
+
const kept = read().filter((_, i) => i !== index);
|
|
175
|
+
designer.setTableButtons(id, place, kept.length ? kept.map((b) => ({ id: b.id, label: b.label, action: b.action, invisible: typeof b.invisible === 'string' ? b.invisible : undefined })) : null);
|
|
176
|
+
});
|
|
177
|
+
const element = el('li', { class: 'fd-table-button' }, el('label', { class: 'fd-answer-rule-field' }, el('span', { class: 'fd-answer-rule-word' }, w.buttonWords), words), el('label', { class: 'fd-answer-rule-field' }, el('span', { class: 'fd-answer-rule-word' }, w.action), action), hidden.element, remove);
|
|
178
|
+
drawn.push({ element, words, action, hidden, remove });
|
|
179
|
+
list.append(element);
|
|
180
|
+
}
|
|
181
|
+
drawn.forEach((d, i) => {
|
|
182
|
+
const item = items[i];
|
|
183
|
+
if (!focused(d.words))
|
|
184
|
+
d.words.value = item.label;
|
|
185
|
+
if (!focused(d.action))
|
|
186
|
+
d.action.value = item.action ?? '';
|
|
187
|
+
d.hidden.show(typeof item.invisible === 'string' ? item.invisible : undefined);
|
|
188
|
+
d.remove.setAttribute('aria-label', w.removeButton(item.label));
|
|
189
|
+
d.remove.title = w.removeButton(item.label);
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
return { element: el('div', { class: 'fd-table-button-place' }, el('span', { class: 'fd-answer-rule-word' }, title), list, add), draw };
|
|
193
|
+
}
|
|
194
|
+
const buttonPlaces = [buttonList('rowButtons', w.onEachLine), buttonList('selectedButtons', w.forChosenLines), buttonList('controlButtons', w.besideAdd)];
|
|
195
|
+
const buttonsRow = (0, panel_controls_1.onTab)(el('div', { class: 'fd-prop fd-table-setting' }, el('span', { class: 'fd-prop-name' }, w.tableButtons), ...buttonPlaces.map((p) => p.element)), 'content', 'Table buttons');
|
|
196
|
+
// ---- Layout: the table's shape, and the widths a field is hidden at ----
|
|
197
|
+
const select = (label, choices, change) => {
|
|
198
|
+
const box = el('select', { class: 'fd-input fd-select', 'aria-label': label }, ...choices.map(([value, text]) => el('option', { value }, text)));
|
|
199
|
+
box.addEventListener('change', () => change(box.value));
|
|
200
|
+
return box;
|
|
201
|
+
};
|
|
202
|
+
// Its fields, a form of its own laid out of them (lineForm, arranged in the page's JSON), or its own page.
|
|
203
|
+
const opens = select(w.lineOpens, [['', w.opensFields], ['form', w.opensForm], ['record', w.opensRecord]], (value) => designer.setTableShape(id, { lineOpens: value === 'record' ? 'record' : null, lineForm: value === 'form' ? true : null }));
|
|
204
|
+
const phone = select(w.onAPhone, [['', w.rows], ['narrow', w.cardsOnPhone], ['always', w.cardsAlways]], (value) => designer.setTableShape(id, { cards: (value || null) }));
|
|
205
|
+
const fit = select(w.columnWidths, [['', w.shareWidth], ['content', w.fitContent], ['shrink', w.shrinkToFit]], (value) => designer.setTableShape(id, { fit: (value || null) }));
|
|
206
|
+
// The order lines load in: their fields' names, apart by commas, "desc" after one turning it round.
|
|
207
|
+
const order = el('input', { class: 'fd-input fd-answer-rule-code fd-table-order', 'aria-label': w.linesOrder, placeholder: w.linesOrderPlaceholder, spellcheck: 'false', autocomplete: 'off' });
|
|
208
|
+
const orderText = (items) => (items ?? []).map((item) => `${item.field}${item.desc ? ' desc' : ''}`).join(', ');
|
|
209
|
+
const keepOrder = () => {
|
|
210
|
+
const typed = order.value.split(',').map((part) => part.trim().split(/\s+/)).filter((words) => words[0]).map(([field, way]) => ({ field, ...(way?.toLowerCase() === 'desc' ? { desc: true } : {}) }));
|
|
211
|
+
if (orderText(typed) === orderText(node?.order))
|
|
212
|
+
return;
|
|
213
|
+
if (!designer.setTableShape(id, { order: typed.length ? typed : null }))
|
|
214
|
+
order.value = orderText(node?.order);
|
|
215
|
+
};
|
|
216
|
+
order.addEventListener('change', keepOrder);
|
|
217
|
+
order.addEventListener('keydown', (event) => event.key === 'Enter' && (event.preventDefault(), keepOrder()));
|
|
218
|
+
const copy = el('input', { type: 'checkbox', class: 'fd-checkbox', 'aria-label': w.copyLine });
|
|
219
|
+
copy.addEventListener('change', () => designer.setTableShape(id, { copy: copy.checked || null }));
|
|
220
|
+
const field = (label, control) => el('label', { class: 'fd-answer-rule-field' }, el('span', { class: 'fd-answer-rule-word' }, label), control);
|
|
221
|
+
const shapeRow = (0, panel_controls_1.onTab)(el('div', { class: 'fd-prop fd-table-setting' }, el('span', { class: 'fd-prop-name' }, w.table), field(w.lineOpens, opens), field(w.onAPhone, phone), field(w.columnWidths, fit), field(w.linesOrder, order), el('label', { class: 'fd-inline-setting' }, copy, el('span', {}, w.copyLine))), 'layout', 'Table');
|
|
222
|
+
const chips = WIDTHS.map((width) => {
|
|
223
|
+
const chip = el('button', { type: 'button', class: 'fd-inline-chip', 'aria-pressed': 'false', 'data-width': width }, w.widths[width]);
|
|
224
|
+
chip.addEventListener('click', () => {
|
|
225
|
+
const now = node?.hideOn ?? [];
|
|
226
|
+
designer.setHideOn(id, now.includes(width) ? now.filter((x) => x !== width) : [...now, width]);
|
|
227
|
+
});
|
|
228
|
+
return chip;
|
|
229
|
+
});
|
|
230
|
+
const hiddenOnRow = (0, panel_controls_1.onTab)(el('div', { class: 'fd-prop fd-table-setting' }, el('span', { class: 'fd-prop-name' }, w.hiddenOn), el('div', { class: 'fd-inline-chips', role: 'group', 'aria-label': w.hiddenOn }, ...chips), el('p', { class: 'fd-properties-hint fd-set-hint' }, w.hiddenOnHint)), 'layout', 'Hidden on');
|
|
231
|
+
return {
|
|
232
|
+
rows: [toneRow, linesRow, buttonsRow, shapeRow, hiddenOnRow],
|
|
233
|
+
update(next) {
|
|
234
|
+
page = next;
|
|
235
|
+
const found = (0, page_tree_1.findField)(page, id);
|
|
236
|
+
node = found?.node ?? null;
|
|
237
|
+
if (!node)
|
|
238
|
+
return;
|
|
239
|
+
const def = page.fields[node.field];
|
|
240
|
+
lines = def?.type === 'one2many' ? def : null;
|
|
241
|
+
// A value's tone is for a field that shows one value; a table has its lines'.
|
|
242
|
+
toneRow.hidden = !def || ['one2many', 'many2many', 'binary', 'image', 'html', 'matrix', 'properties', 'json'].includes(def.type);
|
|
243
|
+
linesRow.hidden = buttonsRow.hidden = shapeRow.hidden = !lines;
|
|
244
|
+
if (!toneRow.hidden) {
|
|
245
|
+
fieldTones.draw();
|
|
246
|
+
fieldBold.show(typeof node.bold === 'string' ? node.bold : undefined);
|
|
247
|
+
}
|
|
248
|
+
if (lines) {
|
|
249
|
+
rowTones.draw();
|
|
250
|
+
rowBold.show(typeof node.rowBold === 'string' ? node.rowBold : undefined);
|
|
251
|
+
lineDelete.show(typeof node.lineDelete === 'string' ? node.lineDelete : undefined);
|
|
252
|
+
const names = Object.keys(lines.fields).filter((name) => name !== lines.sequenceField && name !== lines.lineKinds?.field);
|
|
253
|
+
const key = JSON.stringify(names.map((name) => [name, lines.fields[name].label]));
|
|
254
|
+
if (column.dataset['drawn'] !== key) {
|
|
255
|
+
const was = column.value;
|
|
256
|
+
column.dataset['drawn'] = key;
|
|
257
|
+
column.replaceChildren(...names.map((name) => el('option', { value: name }, lines.fields[name].label)));
|
|
258
|
+
if (names.includes(was))
|
|
259
|
+
column.value = was;
|
|
260
|
+
}
|
|
261
|
+
drawColumn();
|
|
262
|
+
for (const place of buttonPlaces)
|
|
263
|
+
place.draw();
|
|
264
|
+
opens.value = node.lineOpens === 'record' ? 'record' : node.lineForm ? 'form' : '';
|
|
265
|
+
phone.value = node.cards ?? '';
|
|
266
|
+
fit.value = node.fit ?? '';
|
|
267
|
+
copy.checked = node.options?.['copy'] === true;
|
|
268
|
+
if (!focused(order))
|
|
269
|
+
order.value = orderText(node.order);
|
|
270
|
+
}
|
|
271
|
+
for (const chip of chips)
|
|
272
|
+
chip.setAttribute('aria-pressed', String(node.hideOn?.includes(chip.dataset['width']) ?? false));
|
|
273
|
+
},
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=table-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-panel.js","sourceRoot":"","sources":["../../../../../libs/designer/src/lib/table-panel.ts"],"names":[],"mappings":";;AA+BA,sCA0RC;AAxTD,qCAA2D;AAE3D,2CAAwC;AACxC,qDAAyC;AACzC,mDAAiD;AACjD,2DAAkE;AAClE,qDAAyG;AAEzG;;;;;;;;GAQG;AAEH,MAAM,KAAK,GAAW,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AACxE,MAAM,MAAM,GAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AAG3D,+EAA+E;AAC/E,MAAM,QAAQ,GAAG,CAAC,IAAU,EAAE,GAAU,EAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAoB,CAAC;AAO1J,SAAgB,aAAa,CAAC,EAAkB,EAAE,QAAkB,EAAE,EAAU;IAC9E,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;IAC7B,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,MAAM,OAAO,GAAG,CAAC,IAAa,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa,KAAK,IAAI,CAAC;IAC7E,IAAI,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC9B,IAAI,IAAI,GAAqB,IAAI,CAAC;IAClC,IAAI,KAAK,GAAiB,IAAI,CAAC;IAE/B,mGAAmG;IACnG,SAAS,OAAO,CAAC,KAAa,EAAE,KAAiB,EAAE,IAAqC,EAAE,WAAW,GAAG,CAAC,CAAC,eAAe;QACvH,MAAM,GAAG,GAAG,IAAA,8BAAU,EAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,IAAA,8BAAc,EAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9J,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,oCAAoC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,KAAK,CAAC,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1J,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,MAA0B,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;IACnG,CAAC;IAED,qHAAqH;IACrH,SAAS,QAAQ,CAAC,KAAiB,EAAE,IAAsB,EAAE,IAA2C;QACtG,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC;QACnD,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,4CAA4C,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QAC7G,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,IAAI,GAAqG,EAAE,CAAC;QAClH,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACjC,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,EAAE,CAAC;YACP,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAC5C,CAAC,CAAC,CAAC;QACH,SAAS,GAAG,CAAC,KAAa;YACxB,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,kCAAkC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAsB,CAAC;YACnL,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE;gBAC5B,IAAI,CAAC,IAAI;oBAAE,OAAO;gBAClB,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;gBAC1B,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,KAAa,EAAE,IAAI,EAAE,CAAC;gBAClD,MAAM,KAAK,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC,MAAM,CAAC;gBACrC,IAAI,KAAK;oBAAE,QAAQ,GAAG,KAAK,CAAC;gBAC5B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK;oBAAE,QAAQ,GAAG,IAAI,CAAC;YAC7C,CAAC,CAAC;YACF,MAAM,IAAI,GAAG,IAAA,8BAAU,EAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,IAAA,8BAAc,EAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAClL,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACrE,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE;gBAC/D,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;oBAC3B,QAAQ,GAAG,KAAK,CAAC;oBACjB,OAAO,IAAI,EAAE,CAAC;gBAChB,CAAC;gBACD,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;gBACnD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;YAC/I,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACzC,CAAC;QACD,SAAS,IAAI;YACX,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChD,OAAO,IAAI,CAAC,MAAM,GAAG,KAAK;gBAAE,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;YACzD,OAAO,IAAI,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;gBAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACpB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;oBAAE,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,EAAE,IAAI,IAAI,QAAQ,CAAC;gBAC5D,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC5H,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC;YACrB,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC;QACxB,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;IAClF,CAAC;IAED,6CAA6C;IAC7C,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IAC/G,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IACjG,MAAM,OAAO,GAAG,IAAA,sBAAK,EAAC,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,0BAA0B,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,gCAAgC,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAEjP,4DAA4D;IAC5D,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7G,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5F,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IACzG,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,oCAAoC,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAsB,CAAC;IAC1H,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;IACnC,MAAM,IAAI,GAAG,CAAC,GAAa,EAAE,KAAa,EAAE,EAAE;QAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;QACpI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC;QACtC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACtB,CAAC,CAAC;IACF,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC5L,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3I,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC,KAAK,EAAE,CAAqB,CAAC;IACjH,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9G,8FAA8F;IAC9F,MAAM,UAAU,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,yCAAyC,EAAE,YAAY,EAAE,CAAC,CAAC,OAAO,EAAE,CAAsB,CAAC;IACpI,UAAU,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;IACvH,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,2BAA2B,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC,KAAK,EAAE,CAAqB,CAAC;IAC9J,4GAA4G;IAC5G,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,oDAAoD,EAAE,YAAY,EAAE,CAAC,CAAC,aAAa,EAAE,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAqB,CAAC;IAC3O,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChE,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO;QAClF,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAAE,WAAW,CAAC,KAAK,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3J,CAAC,CAAC;IACF,WAAW,CAAC,gBAAgB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAClD,WAAW,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IACnH,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACxI,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,EAAE,CAClB,KAAK,EACL,EAAE,KAAK,EAAE,uBAAuB,EAAE,EAClC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAC9G,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EACtC,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,gCAAgC,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,EACxE,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,WAAW,CAAC,EAC1H,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EACtD,SAAS,CAAC,OAAO,EACjB,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAC3E,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,EACnH,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAC7G,CAAC;IACF,MAAM,QAAQ,GAAG,IAAA,sBAAK,EACpB,EAAE,CACA,KAAK,EACL,EAAE,KAAK,EAAE,0BAA0B,EAAE,EACrC,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,EAClD,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,EACzD,QAAQ,CAAC,OAAO,EAChB,OAAO,CAAC,OAAO,EACf,UAAU,CAAC,OAAO,EAClB,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,gCAAgC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,EACjE,SAAS,CACV,EACD,OAAO,EACP,YAAY,CACb,CAAC;IACF,SAAS,UAAU;QACjB,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,SAAS;YAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC/G,SAAS,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;QACrC,MAAM,IAAI,GAAG,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,6BAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACzC,MAAM,KAAK,GAA2B,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;QACjE,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,kCAAiB,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9K,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACrF,UAAU,CAAC,aAA6B,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;QACnE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;YAAE,WAAW,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChF,CAAC;IAED,yCAAyC;IACzC,SAAS,UAAU,CAAC,KAAuB,EAAE,KAAa;QACxD,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1E,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,0BAA0B,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;QAC7F,MAAM,IAAI,GAAG,GAAiB,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,CAAC,KAAmB,EAAE,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;QACpN,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACjC,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YACjE,IAAI,CAAC,gBAAgB,EAAE,aAAa,CAAC,OAAO,CAA6B,EAAE,KAAK,EAAE,CAAC;QACtF,CAAC,CAAC,CAAC;QACH,MAAM,KAAK,GAAiJ,EAAE,CAAC;QAC/J,SAAS,IAAI;YACX,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC;YACrB,OAAO,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;gBAAE,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;YAClE,OAAO,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBACnC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC3B,MAAM,MAAM,GAAG,CAAC,KAA0B,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClH,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,CAAC,WAAW,EAAE,CAAqB,CAAC;gBAClG,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC5F,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,8BAA8B,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAqB,CAAC;gBAC5J,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;gBAC9F,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,KAAK,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;gBAC9I,MAAM,MAAM,GAAG,IAAA,mBAAU,EAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE;oBAClF,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;oBAClD,QAAQ,CAAC,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACpM,CAAC,CAAC,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAChB,IAAI,EACJ,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAC5B,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,EAClH,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,EAC9G,MAAM,CAAC,OAAO,EACd,MAAM,CACP,CAAC;gBACF,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;gBACvD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;YACD,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACrB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;oBAAE,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;gBAClD,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;oBAAE,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;gBAC3D,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBAC/E,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBAChE,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;IAC1I,CAAC;IACD,MAAM,YAAY,GAAG,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,gBAAgB,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1J,MAAM,UAAU,GAAG,IAAA,sBAAK,EAAC,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,0BAA0B,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IAErM,2EAA2E;IAC3E,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,OAA2B,EAAE,MAA+B,EAAE,EAAE;QAC7F,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC,CAAsB,CAAC;QACtK,GAAG,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QACxD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;IACF,2GAA2G;IAC3G,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CACnH,QAAQ,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAC1H,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,KAAK,IAAI,IAAI,CAA+B,EAAE,CAAC,CAAC,CAAC;IACzM,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,IAAI,CAAgC,EAAE,CAAC,CAAC,CAAC;IAC/M,oGAAoG;IACpG,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,6CAA6C,EAAE,YAAY,EAAE,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC,qBAAqB,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAqB,CAAC;IACpN,MAAM,SAAS,GAAG,CAAC,KAAyB,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpI,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACtM,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC;YAAE,OAAO;QACxD,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAAE,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAChH,CAAC,CAAC;IACF,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC5C,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IAC7G,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAqB,CAAC;IACnH,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;IAClG,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,OAAoB,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;IACpK,MAAM,QAAQ,GAAG,IAAA,sBAAK,EACpB,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,0BAA0B,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAC5R,QAAQ,EACR,OAAO,CACR,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACjC,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAsB,CAAC;QAC3J,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YAClC,MAAM,GAAG,GAAG,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC;YAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QACjG,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,IAAA,sBAAK,EACvB,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,0BAA0B,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,gCAAgC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,EACrQ,QAAQ,EACR,WAAW,CACZ,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC;QAC5D,MAAM,CAAC,IAAI;YACT,IAAI,GAAG,IAAI,CAAC;YACZ,MAAM,KAAK,GAAG,IAAA,qBAAS,EAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAClC,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC;YAC3B,IAAI,CAAC,IAAI;gBAAE,OAAO;YAClB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,KAAK,GAAG,GAAG,EAAE,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9C,8EAA8E;YAC9E,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjI,QAAQ,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC;YAC/D,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACpB,UAAU,CAAC,IAAI,EAAE,CAAC;gBAClB,SAAS,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YACxE,CAAC;YACD,IAAI,KAAK,EAAE,CAAC;gBACV,QAAQ,CAAC,IAAI,EAAE,CAAC;gBAChB,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBAC1E,UAAU,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBACnF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,KAAM,CAAC,aAAa,IAAI,IAAI,KAAK,KAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAC5H,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,KAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACnF,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC;oBACpC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;oBACzB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC;oBAC9B,MAAM,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,KAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBACzG,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;wBAAE,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC;gBAC9C,CAAC;gBACD,UAAU,EAAE,CAAC;gBACb,KAAK,MAAM,KAAK,IAAI,YAAY;oBAAE,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC/C,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnF,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC/B,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;gBAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;gBAC/C,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;oBAAE,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3D,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAgB,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC;QAC5I,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import { iconButton } from './chrome.mjs';
|
|
2
|
+
import { findField } from './page-tree.mjs';
|
|
3
|
+
import { onTab } from './panel-controls.mjs';
|
|
4
|
+
import { formulaProblem } from './rules-formula.mjs';
|
|
5
|
+
import { formulaBox } from './rules-formula-box.mjs';
|
|
6
|
+
import { CELL_WIDGET_KINDS, CELL_WIDGETS } from './table-commands.mjs';
|
|
7
|
+
/**
|
|
8
|
+
* A field's tone and a table's own rules in the panel: its value's tones and
|
|
9
|
+
* bold (Rules); a table's lines' tones and bold, and each column's cells by
|
|
10
|
+
* their line — blank, read-only, required, bold, toned, a pill, a width — and
|
|
11
|
+
* the column hidden by the record (Rules); its buttons on each line, for the
|
|
12
|
+
* lines chosen and beside Add a line (Content); how a line opens, how it shows
|
|
13
|
+
* on a phone, its columns' widths, a line copied (Layout); and the widths of
|
|
14
|
+
* the form a field is hidden at (Layout). Each a row the panel's search finds.
|
|
15
|
+
*/
|
|
16
|
+
const TONES = ['danger', 'warning', 'success', 'info', 'muted'];
|
|
17
|
+
const WIDTHS = ['narrow', 'medium', 'wide'];
|
|
18
|
+
/** The page a line's conditions read: its fields, and the record as parent. */
|
|
19
|
+
const linePage = (page, def) => ({ ...page, fields: { ...def.fields, parent: { type: 'json', label: 'parent' } } });
|
|
20
|
+
export function tableSettings(el, designer, id) {
|
|
21
|
+
const words = designer.words;
|
|
22
|
+
const w = words.tables;
|
|
23
|
+
const focused = (node) => node.ownerDocument.activeElement === node;
|
|
24
|
+
let page = designer.getPage();
|
|
25
|
+
let node = null;
|
|
26
|
+
let lines = null;
|
|
27
|
+
/** A condition's box: its fields suggested, what is wrong said under it, handed on as it reads. */
|
|
28
|
+
function whenBox(label, scope, save, placeholder = w.whenPlaceholder) {
|
|
29
|
+
const box = formulaBox(el, { words, label, placeholder, check: (on, source) => formulaProblem(on, source, words), commit: (source) => save(source || null) });
|
|
30
|
+
const element = el('div', { class: 'fd-answer-rule-field fd-table-when' }, el('span', { class: 'fd-answer-rule-word' }, label), box.element, box.problem);
|
|
31
|
+
return { element, box, show: (source) => box.update(scope(), source ?? '') };
|
|
32
|
+
}
|
|
33
|
+
/** Tones, each a colour while its condition holds, the first that holds; a new one kept once its condition reads. */
|
|
34
|
+
function toneList(scope, read, save) {
|
|
35
|
+
const list = el('ul', { class: 'fd-table-tones' });
|
|
36
|
+
const add = el('button', { type: 'button', class: 'fd-button fd-button-link fd-table-add-tone' }, w.addTone);
|
|
37
|
+
let drafting = false;
|
|
38
|
+
const rows = [];
|
|
39
|
+
add.addEventListener('click', () => {
|
|
40
|
+
drafting = true;
|
|
41
|
+
draw();
|
|
42
|
+
rows[rows.length - 1]?.when.input.focus();
|
|
43
|
+
});
|
|
44
|
+
function row(index) {
|
|
45
|
+
const tone = el('select', { class: 'fd-input fd-select fd-table-tone', 'aria-label': w.toneOf }, ...TONES.map((t) => el('option', { value: t }, w.tones[t])));
|
|
46
|
+
const keep = (when) => {
|
|
47
|
+
if (!when)
|
|
48
|
+
return;
|
|
49
|
+
const items = [...read()];
|
|
50
|
+
items[index] = { tone: tone.value, when };
|
|
51
|
+
const begun = index >= read().length;
|
|
52
|
+
if (begun)
|
|
53
|
+
drafting = false;
|
|
54
|
+
if (!save(items) && begun)
|
|
55
|
+
drafting = true;
|
|
56
|
+
};
|
|
57
|
+
const when = formulaBox(el, { words, label: w.when, placeholder: w.whenPlaceholder, check: (on, source) => formulaProblem(on, source, words), commit: (source) => keep(source) });
|
|
58
|
+
tone.addEventListener('change', () => keep(when.input.value.trim()));
|
|
59
|
+
const remove = iconButton(el, w.removeTone(index + 1), '×', () => {
|
|
60
|
+
if (index >= read().length) {
|
|
61
|
+
drafting = false;
|
|
62
|
+
return draw();
|
|
63
|
+
}
|
|
64
|
+
const items = read().filter((_, i) => i !== index);
|
|
65
|
+
save(items.length ? items : null);
|
|
66
|
+
});
|
|
67
|
+
const element = el('li', { class: 'fd-table-tone-row' }, tone, el('div', { class: 'fd-table-tone-when' }, when.element, when.problem), remove);
|
|
68
|
+
return { element, tone, when, remove };
|
|
69
|
+
}
|
|
70
|
+
function draw() {
|
|
71
|
+
const items = read();
|
|
72
|
+
const count = items.length + (drafting ? 1 : 0);
|
|
73
|
+
while (rows.length > count)
|
|
74
|
+
rows.pop()?.element.remove();
|
|
75
|
+
while (rows.length < count) {
|
|
76
|
+
const made = row(rows.length);
|
|
77
|
+
rows.push(made);
|
|
78
|
+
list.append(made.element);
|
|
79
|
+
}
|
|
80
|
+
rows.forEach((r, i) => {
|
|
81
|
+
const item = items[i];
|
|
82
|
+
if (!focused(r.tone))
|
|
83
|
+
r.tone.value = item?.tone ?? 'danger';
|
|
84
|
+
r.when.update(scope(), item && typeof item.when === 'string' ? item.when : item ? String(item.when) : r.when.input.value);
|
|
85
|
+
});
|
|
86
|
+
list.hidden = !count;
|
|
87
|
+
add.hidden = drafting;
|
|
88
|
+
}
|
|
89
|
+
return { element: el('div', { class: 'fd-table-tone-list' }, list, add), draw };
|
|
90
|
+
}
|
|
91
|
+
// ---- Rules: a field's value in a tone ----
|
|
92
|
+
const fieldTones = toneList(() => page, () => node?.tones ?? [], (tones) => designer.setFieldTones(id, tones));
|
|
93
|
+
const fieldBold = whenBox(w.boldWhen, () => page, (source) => designer.setFieldBold(id, source));
|
|
94
|
+
const toneRow = onTab(el('div', { class: 'fd-prop fd-table-setting' }, el('span', { class: 'fd-prop-name' }, w.tone), fieldTones.element, fieldBold.element, el('p', { class: 'fd-properties-hint fd-set-hint' }, w.toneHint)), 'rules', 'Tone');
|
|
95
|
+
// ---- Rules: a table's lines, and each column's cells ----
|
|
96
|
+
const lineScope = () => (lines ? linePage(page, lines) : page);
|
|
97
|
+
const rowTones = toneList(lineScope, () => node?.rowTones ?? [], (tones) => designer.setRowTones(id, tones));
|
|
98
|
+
const rowBold = whenBox(w.boldWhen, lineScope, (source) => designer.setRowBold(id, source));
|
|
99
|
+
const lineDelete = whenBox(w.deletedOnlyWhen, lineScope, (source) => designer.setLineDelete(id, source));
|
|
100
|
+
const column = el('select', { class: 'fd-input fd-select fd-table-column', 'aria-label': w.column });
|
|
101
|
+
const current = () => column.value;
|
|
102
|
+
const rule = (key, label) => {
|
|
103
|
+
const box = whenBox(label, key === 'hidden' ? () => page : lineScope, (source) => designer.setCellRule(id, current(), key, source));
|
|
104
|
+
box.element.dataset['cellRule'] = key;
|
|
105
|
+
return { key, box };
|
|
106
|
+
};
|
|
107
|
+
const cellRules = [rule('invisible', w.hiddenOnLineWhen), rule('readonly', w.readonlyWhen), rule('required', w.requiredWhen), rule('bold', w.boldWhen), rule('hidden', w.columnHiddenWhen)];
|
|
108
|
+
const cellTones = toneList(lineScope, () => node?.cells?.[current()]?.tones ?? [], (tones) => designer.setCellTones(id, current(), tones));
|
|
109
|
+
const badge = el('input', { type: 'checkbox', class: 'fd-checkbox', 'aria-label': w.badge });
|
|
110
|
+
badge.addEventListener('change', () => designer.setCellLook(id, current(), { badge: badge.checked || null }));
|
|
111
|
+
// Its cells drawn by a widget that suits what the column holds: hours as HH:MM, stars, a bar…
|
|
112
|
+
const cellWidget = el('select', { class: 'fd-input fd-select fd-table-cell-widget', 'aria-label': w.shownAs });
|
|
113
|
+
cellWidget.addEventListener('change', () => designer.setCellLook(id, current(), { widget: cellWidget.value || null }));
|
|
114
|
+
const width = el('input', { type: 'number', class: 'fd-input fd-inline-number', min: '1', max: '200', step: '1', 'aria-label': w.width });
|
|
115
|
+
// The roles the column shows to: kept once it is left or Enter is pressed, a role half typed being no role.
|
|
116
|
+
const columnRoles = el('input', { class: 'fd-input fd-answer-rule-code fd-table-column-roles', 'aria-label': w.columnShownTo, placeholder: words.rulesUi.rolesPlaceholder, spellcheck: 'false', autocomplete: 'off' });
|
|
117
|
+
const keepRoles = () => {
|
|
118
|
+
const typed = columnRoles.value.split(/[\s,]+/).filter(Boolean);
|
|
119
|
+
if (typed.join(',') === (node?.cells?.[current()]?.roles ?? []).join(','))
|
|
120
|
+
return;
|
|
121
|
+
if (!designer.setCellLook(id, current(), { roles: typed.length ? typed : null }))
|
|
122
|
+
columnRoles.value = (node?.cells?.[current()]?.roles ?? []).join(', ');
|
|
123
|
+
};
|
|
124
|
+
columnRoles.addEventListener('change', keepRoles);
|
|
125
|
+
columnRoles.addEventListener('keydown', (event) => event.key === 'Enter' && (event.preventDefault(), keepRoles()));
|
|
126
|
+
width.addEventListener('change', () => designer.setCellLook(id, current(), { width: width.value.trim() ? Number(width.value) : null }));
|
|
127
|
+
column.addEventListener('change', () => drawColumn());
|
|
128
|
+
const columnBox = el('div', { class: 'fd-table-column-rules' }, el('label', { class: 'fd-answer-rule-field' }, el('span', { class: 'fd-answer-rule-word' }, w.column), column), ...cellRules.map((r) => r.box.element), el('p', { class: 'fd-properties-hint fd-set-hint' }, w.columnHiddenHint), el('label', { class: 'fd-answer-rule-field' }, el('span', { class: 'fd-answer-rule-word' }, w.columnShownTo), columnRoles), el('span', { class: 'fd-answer-rule-word' }, w.toneOf), cellTones.element, el('label', { class: 'fd-inline-setting' }, badge, el('span', {}, w.badge)), el('label', { class: 'fd-answer-rule-field' }, el('span', { class: 'fd-answer-rule-word' }, w.shownAs), cellWidget), el('label', { class: 'fd-answer-rule-field' }, el('span', { class: 'fd-answer-rule-word' }, w.width), width));
|
|
129
|
+
const linesRow = onTab(el('div', { class: 'fd-prop fd-table-setting' }, el('span', { class: 'fd-prop-name' }, w.lineRules), el('span', { class: 'fd-answer-rule-word' }, w.linesTone), rowTones.element, rowBold.element, lineDelete.element, el('p', { class: 'fd-properties-hint fd-set-hint' }, w.linesHint), columnBox), 'rules', 'Line rules');
|
|
130
|
+
function drawColumn() {
|
|
131
|
+
const rules = node?.cells?.[current()] ?? {};
|
|
132
|
+
for (const r of cellRules)
|
|
133
|
+
r.box.show(typeof rules[r.key] === 'string' ? rules[r.key] : undefined);
|
|
134
|
+
cellTones.draw();
|
|
135
|
+
badge.checked = rules.badge === true;
|
|
136
|
+
const type = lines?.fields[current()]?.type ?? '';
|
|
137
|
+
const offered = CELL_WIDGETS[type] ?? [];
|
|
138
|
+
const names = designer.words.kinds.names;
|
|
139
|
+
cellWidget.replaceChildren(el('option', { value: '' }, w.asItsType), ...offered.map((widget) => el('option', { value: widget }, names[CELL_WIDGET_KINDS[widget]] ?? widget)));
|
|
140
|
+
cellWidget.value = rules.widget && offered.includes(rules.widget) ? rules.widget : '';
|
|
141
|
+
cellWidget.parentElement.hidden = !offered.length;
|
|
142
|
+
if (!focused(width))
|
|
143
|
+
width.value = rules.width ? String(rules.width) : '';
|
|
144
|
+
if (!focused(columnRoles))
|
|
145
|
+
columnRoles.value = (rules.roles ?? []).join(', ');
|
|
146
|
+
}
|
|
147
|
+
// ---- Content: the table's buttons ----
|
|
148
|
+
function buttonList(place, title) {
|
|
149
|
+
const list = el('ul', { class: 'fd-table-buttons', 'data-place': place });
|
|
150
|
+
const add = el('button', { type: 'button', class: 'fd-button fd-button-link' }, w.addButton);
|
|
151
|
+
const read = () => node?.[place] ?? [];
|
|
152
|
+
const save = (items) => designer.setTableButtons(id, place, items.map((b) => ({ id: b.id, label: b.label, action: b.action, invisible: typeof b.invisible === 'string' ? b.invisible : undefined })));
|
|
153
|
+
add.addEventListener('click', () => {
|
|
154
|
+
save([...read(), { type: 'button', id: '', label: w.newButton }]);
|
|
155
|
+
list.lastElementChild?.querySelector('input')?.focus();
|
|
156
|
+
});
|
|
157
|
+
const drawn = [];
|
|
158
|
+
function draw() {
|
|
159
|
+
const items = read();
|
|
160
|
+
while (drawn.length > items.length)
|
|
161
|
+
drawn.pop()?.element.remove();
|
|
162
|
+
while (drawn.length < items.length) {
|
|
163
|
+
const index = drawn.length;
|
|
164
|
+
const change = (patch) => save(read().map((b, i) => (i === index ? { ...b, ...patch } : b)));
|
|
165
|
+
const words = el('input', { class: 'fd-input', 'aria-label': w.buttonWords });
|
|
166
|
+
words.addEventListener('input', () => words.value.trim() && change({ label: words.value }));
|
|
167
|
+
const action = el('input', { class: 'fd-input fd-answer-rule-code', 'aria-label': w.action, spellcheck: 'false', autocomplete: 'off' });
|
|
168
|
+
action.addEventListener('change', () => change({ action: action.value.trim() || undefined }));
|
|
169
|
+
const hidden = whenBox(w.hiddenWhen, place === 'rowButtons' ? lineScope : () => page, (source) => change({ invisible: source ?? undefined }));
|
|
170
|
+
const remove = iconButton(el, w.removeButton(read()[index]?.label ?? ''), '×', () => {
|
|
171
|
+
const kept = read().filter((_, i) => i !== index);
|
|
172
|
+
designer.setTableButtons(id, place, kept.length ? kept.map((b) => ({ id: b.id, label: b.label, action: b.action, invisible: typeof b.invisible === 'string' ? b.invisible : undefined })) : null);
|
|
173
|
+
});
|
|
174
|
+
const element = el('li', { class: 'fd-table-button' }, el('label', { class: 'fd-answer-rule-field' }, el('span', { class: 'fd-answer-rule-word' }, w.buttonWords), words), el('label', { class: 'fd-answer-rule-field' }, el('span', { class: 'fd-answer-rule-word' }, w.action), action), hidden.element, remove);
|
|
175
|
+
drawn.push({ element, words, action, hidden, remove });
|
|
176
|
+
list.append(element);
|
|
177
|
+
}
|
|
178
|
+
drawn.forEach((d, i) => {
|
|
179
|
+
const item = items[i];
|
|
180
|
+
if (!focused(d.words))
|
|
181
|
+
d.words.value = item.label;
|
|
182
|
+
if (!focused(d.action))
|
|
183
|
+
d.action.value = item.action ?? '';
|
|
184
|
+
d.hidden.show(typeof item.invisible === 'string' ? item.invisible : undefined);
|
|
185
|
+
d.remove.setAttribute('aria-label', w.removeButton(item.label));
|
|
186
|
+
d.remove.title = w.removeButton(item.label);
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
return { element: el('div', { class: 'fd-table-button-place' }, el('span', { class: 'fd-answer-rule-word' }, title), list, add), draw };
|
|
190
|
+
}
|
|
191
|
+
const buttonPlaces = [buttonList('rowButtons', w.onEachLine), buttonList('selectedButtons', w.forChosenLines), buttonList('controlButtons', w.besideAdd)];
|
|
192
|
+
const buttonsRow = onTab(el('div', { class: 'fd-prop fd-table-setting' }, el('span', { class: 'fd-prop-name' }, w.tableButtons), ...buttonPlaces.map((p) => p.element)), 'content', 'Table buttons');
|
|
193
|
+
// ---- Layout: the table's shape, and the widths a field is hidden at ----
|
|
194
|
+
const select = (label, choices, change) => {
|
|
195
|
+
const box = el('select', { class: 'fd-input fd-select', 'aria-label': label }, ...choices.map(([value, text]) => el('option', { value }, text)));
|
|
196
|
+
box.addEventListener('change', () => change(box.value));
|
|
197
|
+
return box;
|
|
198
|
+
};
|
|
199
|
+
// Its fields, a form of its own laid out of them (lineForm, arranged in the page's JSON), or its own page.
|
|
200
|
+
const opens = select(w.lineOpens, [['', w.opensFields], ['form', w.opensForm], ['record', w.opensRecord]], (value) => designer.setTableShape(id, { lineOpens: value === 'record' ? 'record' : null, lineForm: value === 'form' ? true : null }));
|
|
201
|
+
const phone = select(w.onAPhone, [['', w.rows], ['narrow', w.cardsOnPhone], ['always', w.cardsAlways]], (value) => designer.setTableShape(id, { cards: (value || null) }));
|
|
202
|
+
const fit = select(w.columnWidths, [['', w.shareWidth], ['content', w.fitContent], ['shrink', w.shrinkToFit]], (value) => designer.setTableShape(id, { fit: (value || null) }));
|
|
203
|
+
// The order lines load in: their fields' names, apart by commas, "desc" after one turning it round.
|
|
204
|
+
const order = el('input', { class: 'fd-input fd-answer-rule-code fd-table-order', 'aria-label': w.linesOrder, placeholder: w.linesOrderPlaceholder, spellcheck: 'false', autocomplete: 'off' });
|
|
205
|
+
const orderText = (items) => (items ?? []).map((item) => `${item.field}${item.desc ? ' desc' : ''}`).join(', ');
|
|
206
|
+
const keepOrder = () => {
|
|
207
|
+
const typed = order.value.split(',').map((part) => part.trim().split(/\s+/)).filter((words) => words[0]).map(([field, way]) => ({ field, ...(way?.toLowerCase() === 'desc' ? { desc: true } : {}) }));
|
|
208
|
+
if (orderText(typed) === orderText(node?.order))
|
|
209
|
+
return;
|
|
210
|
+
if (!designer.setTableShape(id, { order: typed.length ? typed : null }))
|
|
211
|
+
order.value = orderText(node?.order);
|
|
212
|
+
};
|
|
213
|
+
order.addEventListener('change', keepOrder);
|
|
214
|
+
order.addEventListener('keydown', (event) => event.key === 'Enter' && (event.preventDefault(), keepOrder()));
|
|
215
|
+
const copy = el('input', { type: 'checkbox', class: 'fd-checkbox', 'aria-label': w.copyLine });
|
|
216
|
+
copy.addEventListener('change', () => designer.setTableShape(id, { copy: copy.checked || null }));
|
|
217
|
+
const field = (label, control) => el('label', { class: 'fd-answer-rule-field' }, el('span', { class: 'fd-answer-rule-word' }, label), control);
|
|
218
|
+
const shapeRow = onTab(el('div', { class: 'fd-prop fd-table-setting' }, el('span', { class: 'fd-prop-name' }, w.table), field(w.lineOpens, opens), field(w.onAPhone, phone), field(w.columnWidths, fit), field(w.linesOrder, order), el('label', { class: 'fd-inline-setting' }, copy, el('span', {}, w.copyLine))), 'layout', 'Table');
|
|
219
|
+
const chips = WIDTHS.map((width) => {
|
|
220
|
+
const chip = el('button', { type: 'button', class: 'fd-inline-chip', 'aria-pressed': 'false', 'data-width': width }, w.widths[width]);
|
|
221
|
+
chip.addEventListener('click', () => {
|
|
222
|
+
const now = node?.hideOn ?? [];
|
|
223
|
+
designer.setHideOn(id, now.includes(width) ? now.filter((x) => x !== width) : [...now, width]);
|
|
224
|
+
});
|
|
225
|
+
return chip;
|
|
226
|
+
});
|
|
227
|
+
const hiddenOnRow = onTab(el('div', { class: 'fd-prop fd-table-setting' }, el('span', { class: 'fd-prop-name' }, w.hiddenOn), el('div', { class: 'fd-inline-chips', role: 'group', 'aria-label': w.hiddenOn }, ...chips), el('p', { class: 'fd-properties-hint fd-set-hint' }, w.hiddenOnHint)), 'layout', 'Hidden on');
|
|
228
|
+
return {
|
|
229
|
+
rows: [toneRow, linesRow, buttonsRow, shapeRow, hiddenOnRow],
|
|
230
|
+
update(next) {
|
|
231
|
+
page = next;
|
|
232
|
+
const found = findField(page, id);
|
|
233
|
+
node = found?.node ?? null;
|
|
234
|
+
if (!node)
|
|
235
|
+
return;
|
|
236
|
+
const def = page.fields[node.field];
|
|
237
|
+
lines = def?.type === 'one2many' ? def : null;
|
|
238
|
+
// A value's tone is for a field that shows one value; a table has its lines'.
|
|
239
|
+
toneRow.hidden = !def || ['one2many', 'many2many', 'binary', 'image', 'html', 'matrix', 'properties', 'json'].includes(def.type);
|
|
240
|
+
linesRow.hidden = buttonsRow.hidden = shapeRow.hidden = !lines;
|
|
241
|
+
if (!toneRow.hidden) {
|
|
242
|
+
fieldTones.draw();
|
|
243
|
+
fieldBold.show(typeof node.bold === 'string' ? node.bold : undefined);
|
|
244
|
+
}
|
|
245
|
+
if (lines) {
|
|
246
|
+
rowTones.draw();
|
|
247
|
+
rowBold.show(typeof node.rowBold === 'string' ? node.rowBold : undefined);
|
|
248
|
+
lineDelete.show(typeof node.lineDelete === 'string' ? node.lineDelete : undefined);
|
|
249
|
+
const names = Object.keys(lines.fields).filter((name) => name !== lines.sequenceField && name !== lines.lineKinds?.field);
|
|
250
|
+
const key = JSON.stringify(names.map((name) => [name, lines.fields[name].label]));
|
|
251
|
+
if (column.dataset['drawn'] !== key) {
|
|
252
|
+
const was = column.value;
|
|
253
|
+
column.dataset['drawn'] = key;
|
|
254
|
+
column.replaceChildren(...names.map((name) => el('option', { value: name }, lines.fields[name].label)));
|
|
255
|
+
if (names.includes(was))
|
|
256
|
+
column.value = was;
|
|
257
|
+
}
|
|
258
|
+
drawColumn();
|
|
259
|
+
for (const place of buttonPlaces)
|
|
260
|
+
place.draw();
|
|
261
|
+
opens.value = node.lineOpens === 'record' ? 'record' : node.lineForm ? 'form' : '';
|
|
262
|
+
phone.value = node.cards ?? '';
|
|
263
|
+
fit.value = node.fit ?? '';
|
|
264
|
+
copy.checked = node.options?.['copy'] === true;
|
|
265
|
+
if (!focused(order))
|
|
266
|
+
order.value = orderText(node.order);
|
|
267
|
+
}
|
|
268
|
+
for (const chip of chips)
|
|
269
|
+
chip.setAttribute('aria-pressed', String(node.hideOn?.includes(chip.dataset['width']) ?? false));
|
|
270
|
+
},
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=table-panel.mjs.map
|