@fieldia/core 0.26.1 → 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 +307 -3
- package/package.json +1 -1
- package/schema/page.schema.json +227 -23
- package/src/index.d.mts +8 -2
- package/src/index.d.ts +8 -2
- package/src/index.js +22 -1
- package/src/index.js.map +1 -1
- package/src/index.mjs +9 -2
- package/src/index.mjs.map +1 -1
- package/src/lib/expression/app-functions.d.mts +47 -0
- package/src/lib/expression/app-functions.d.ts +47 -0
- package/src/lib/expression/app-functions.js +64 -0
- package/src/lib/expression/app-functions.js.map +1 -0
- package/src/lib/expression/app-functions.mjs +58 -0
- package/src/lib/expression/app-functions.mjs.map +1 -0
- package/src/lib/expression/dates.d.mts +21 -0
- package/src/lib/expression/dates.d.ts +21 -0
- package/src/lib/expression/dates.js +73 -0
- package/src/lib/expression/dates.js.map +1 -0
- package/src/lib/expression/dates.mjs +67 -0
- package/src/lib/expression/dates.mjs.map +1 -0
- package/src/lib/expression/evaluator.js +12 -6
- package/src/lib/expression/evaluator.js.map +1 -1
- package/src/lib/expression/evaluator.mjs +12 -6
- package/src/lib/expression/evaluator.mjs.map +1 -1
- package/src/lib/expression/expression.d.mts +7 -3
- package/src/lib/expression/expression.d.ts +7 -3
- package/src/lib/expression/expression.js +8 -2
- package/src/lib/expression/expression.js.map +1 -1
- package/src/lib/expression/expression.mjs +7 -2
- package/src/lib/expression/expression.mjs.map +1 -1
- package/src/lib/expression/functions-part.d.mts +7 -0
- package/src/lib/expression/functions-part.d.ts +7 -0
- package/src/lib/expression/functions-part.js +13 -0
- package/src/lib/expression/functions-part.js.map +1 -0
- package/src/lib/expression/functions-part.mjs +8 -0
- package/src/lib/expression/functions-part.mjs.map +1 -0
- package/src/lib/expression/functions.d.mts +60 -3
- package/src/lib/expression/functions.d.ts +60 -3
- package/src/lib/expression/functions.js +109 -15
- package/src/lib/expression/functions.js.map +1 -1
- package/src/lib/expression/functions.mjs +103 -16
- package/src/lib/expression/functions.mjs.map +1 -1
- package/src/lib/expression/kinds.d.mts +31 -0
- package/src/lib/expression/kinds.d.ts +31 -0
- package/src/lib/expression/kinds.js +159 -0
- package/src/lib/expression/kinds.js.map +1 -0
- package/src/lib/expression/kinds.mjs +151 -0
- package/src/lib/expression/kinds.mjs.map +1 -0
- package/src/lib/expression/modifier.d.mts +4 -3
- package/src/lib/expression/modifier.d.ts +4 -3
- package/src/lib/expression/modifier.js +4 -3
- package/src/lib/expression/modifier.js.map +1 -1
- package/src/lib/expression/modifier.mjs +4 -3
- package/src/lib/expression/modifier.mjs.map +1 -1
- package/src/lib/expression/more-functions.d.mts +8 -0
- package/src/lib/expression/more-functions.d.ts +8 -0
- package/src/lib/expression/more-functions.js +235 -0
- package/src/lib/expression/more-functions.js.map +1 -0
- package/src/lib/expression/more-functions.mjs +230 -0
- package/src/lib/expression/more-functions.mjs.map +1 -0
- package/src/lib/expression/parser.d.mts +4 -1
- package/src/lib/expression/parser.d.ts +4 -1
- package/src/lib/expression/parser.js +6 -3
- package/src/lib/expression/parser.js.map +1 -1
- package/src/lib/expression/parser.mjs +6 -3
- package/src/lib/expression/parser.mjs.map +1 -1
- package/src/lib/expression/reads.d.mts +2 -2
- package/src/lib/expression/reads.d.ts +2 -2
- package/src/lib/expression/reads.js +6 -4
- package/src/lib/expression/reads.js.map +1 -1
- package/src/lib/expression/reads.mjs +6 -4
- package/src/lib/expression/reads.mjs.map +1 -1
- package/src/lib/format/actions.d.mts +16 -16
- package/src/lib/format/actions.d.ts +16 -16
- package/src/lib/format/check-page.d.mts +7 -2
- package/src/lib/format/check-page.d.ts +7 -2
- package/src/lib/format/check-page.js +10 -4
- package/src/lib/format/check-page.js.map +1 -1
- package/src/lib/format/check-page.mjs +10 -4
- package/src/lib/format/check-page.mjs.map +1 -1
- package/src/lib/format/choice-options.d.mts +34 -0
- package/src/lib/format/choice-options.d.ts +34 -0
- package/src/lib/format/choice-options.js +60 -0
- package/src/lib/format/choice-options.js.map +1 -0
- package/src/lib/format/choice-options.mjs +51 -0
- package/src/lib/format/choice-options.mjs.map +1 -0
- package/src/lib/format/endings-checks.d.mts +8 -0
- package/src/lib/format/endings-checks.d.ts +8 -0
- package/src/lib/format/endings-checks.js +23 -0
- package/src/lib/format/endings-checks.js.map +1 -0
- package/src/lib/format/endings-checks.mjs +20 -0
- package/src/lib/format/endings-checks.mjs.map +1 -0
- package/src/lib/format/endings.d.mts +40 -0
- package/src/lib/format/endings.d.ts +40 -0
- package/src/lib/format/endings.js +15 -0
- package/src/lib/format/endings.js.map +1 -0
- package/src/lib/format/endings.mjs +12 -0
- package/src/lib/format/endings.mjs.map +1 -0
- package/src/lib/format/field.d.mts +151 -16
- package/src/lib/format/field.d.ts +151 -16
- package/src/lib/format/field.js +64 -11
- package/src/lib/format/field.js.map +1 -1
- package/src/lib/format/field.mjs +63 -10
- package/src/lib/format/field.mjs.map +1 -1
- package/src/lib/format/head-checks.d.mts +2 -0
- package/src/lib/format/head-checks.d.ts +2 -0
- package/src/lib/format/head-checks.js +2 -59
- package/src/lib/format/head-checks.js.map +1 -1
- package/src/lib/format/head-checks.mjs +1 -58
- package/src/lib/format/head-checks.mjs.map +1 -1
- package/src/lib/format/later-checks.d.mts +17 -0
- package/src/lib/format/later-checks.d.ts +17 -0
- package/src/lib/format/later-checks.js +20 -0
- package/src/lib/format/later-checks.js.map +1 -0
- package/src/lib/format/later-checks.mjs +17 -0
- package/src/lib/format/later-checks.mjs.map +1 -0
- package/src/lib/format/layout.d.mts +241 -188
- package/src/lib/format/layout.d.ts +241 -188
- package/src/lib/format/layout.js +33 -28
- package/src/lib/format/layout.js.map +1 -1
- package/src/lib/format/layout.mjs +13 -3
- package/src/lib/format/layout.mjs.map +1 -1
- package/src/lib/format/layout.types.d.mts +2 -1
- package/src/lib/format/layout.types.d.ts +2 -1
- package/src/lib/format/limits-checks.d.mts +14 -0
- package/src/lib/format/limits-checks.d.ts +14 -0
- package/src/lib/format/limits-checks.js +36 -0
- package/src/lib/format/limits-checks.js.map +1 -0
- package/src/lib/format/limits-checks.mjs +33 -0
- package/src/lib/format/limits-checks.mjs.map +1 -0
- package/src/lib/format/limits.d.mts +24 -0
- package/src/lib/format/limits.d.ts +24 -0
- package/src/lib/format/limits.js +35 -0
- package/src/lib/format/limits.js.map +1 -0
- package/src/lib/format/limits.mjs +32 -0
- package/src/lib/format/limits.mjs.map +1 -0
- package/src/lib/format/list-checks.d.mts +44 -0
- package/src/lib/format/list-checks.d.ts +44 -0
- package/src/lib/format/list-checks.js +340 -0
- package/src/lib/format/list-checks.js.map +1 -0
- package/src/lib/format/list-checks.mjs +336 -0
- package/src/lib/format/list-checks.mjs.map +1 -0
- package/src/lib/format/map-checks.d.mts +33 -0
- package/src/lib/format/map-checks.d.ts +33 -0
- package/src/lib/format/map-checks.js +180 -0
- package/src/lib/format/map-checks.js.map +1 -0
- package/src/lib/format/map-checks.mjs +175 -0
- package/src/lib/format/map-checks.mjs.map +1 -0
- package/src/lib/format/mapchecks-part.d.mts +5 -0
- package/src/lib/format/mapchecks-part.d.ts +5 -0
- package/src/lib/format/mapchecks-part.js +11 -0
- package/src/lib/format/mapchecks-part.js.map +1 -0
- package/src/lib/format/mapchecks-part.mjs +6 -0
- package/src/lib/format/mapchecks-part.mjs.map +1 -0
- package/src/lib/format/option-checks.d.mts +16 -0
- package/src/lib/format/option-checks.d.ts +16 -0
- package/src/lib/format/option-checks.js +39 -0
- package/src/lib/format/option-checks.js.map +1 -0
- package/src/lib/format/option-checks.mjs +36 -0
- package/src/lib/format/option-checks.mjs.map +1 -0
- package/src/lib/format/options-part.d.mts +6 -0
- package/src/lib/format/options-part.d.ts +6 -0
- package/src/lib/format/options-part.js +11 -0
- package/src/lib/format/options-part.js.map +1 -0
- package/src/lib/format/options-part.mjs +7 -0
- package/src/lib/format/options-part.mjs.map +1 -0
- package/src/lib/format/page.d.mts +147 -71
- package/src/lib/format/page.d.ts +147 -71
- package/src/lib/format/page.js +5 -0
- package/src/lib/format/page.js.map +1 -1
- package/src/lib/format/page.mjs +5 -0
- package/src/lib/format/page.mjs.map +1 -1
- package/src/lib/format/part-checks.d.mts +20 -0
- package/src/lib/format/part-checks.d.ts +20 -0
- package/src/lib/format/part-checks.js +3 -0
- package/src/lib/format/part-checks.js.map +1 -0
- package/src/lib/format/part-checks.mjs +2 -0
- package/src/lib/format/part-checks.mjs.map +1 -0
- package/src/lib/format/references.d.mts +71 -65
- package/src/lib/format/references.d.ts +71 -65
- package/src/lib/format/references.js +194 -631
- package/src/lib/format/references.js.map +1 -1
- package/src/lib/format/references.mjs +194 -631
- package/src/lib/format/references.mjs.map +1 -1
- package/src/lib/format/seats-checks.d.mts +3 -0
- package/src/lib/format/seats-checks.d.ts +3 -0
- package/src/lib/format/seats-checks.js +13 -0
- package/src/lib/format/seats-checks.js.map +1 -0
- package/src/lib/format/seats-checks.mjs +10 -0
- package/src/lib/format/seats-checks.mjs.map +1 -0
- package/src/lib/format/sheet-head-checks.d.mts +4 -0
- package/src/lib/format/sheet-head-checks.d.ts +4 -0
- package/src/lib/format/sheet-head-checks.js +68 -0
- package/src/lib/format/sheet-head-checks.js.map +1 -0
- package/src/lib/format/sheet-head-checks.mjs +65 -0
- package/src/lib/format/sheet-head-checks.mjs.map +1 -0
- package/src/lib/format/signature-checks.d.mts +7 -0
- package/src/lib/format/signature-checks.d.ts +7 -0
- package/src/lib/format/signature-checks.js +32 -0
- package/src/lib/format/signature-checks.js.map +1 -0
- package/src/lib/format/signature-checks.mjs +29 -0
- package/src/lib/format/signature-checks.mjs.map +1 -0
- package/src/lib/format/signature-options.d.mts +24 -0
- package/src/lib/format/signature-options.d.ts +24 -0
- package/src/lib/format/signature-options.js +30 -0
- package/src/lib/format/signature-options.js.map +1 -0
- package/src/lib/format/signature-options.mjs +26 -0
- package/src/lib/format/signature-options.mjs.map +1 -0
- package/src/lib/format/slots-checks.d.mts +4 -0
- package/src/lib/format/slots-checks.d.ts +4 -0
- package/src/lib/format/slots-checks.js +21 -0
- package/src/lib/format/slots-checks.js.map +1 -0
- package/src/lib/format/slots-checks.mjs +18 -0
- package/src/lib/format/slots-checks.mjs.map +1 -0
- package/src/lib/format/statusbar-checks.d.mts +8 -0
- package/src/lib/format/statusbar-checks.d.ts +8 -0
- package/src/lib/format/statusbar-checks.js +35 -0
- package/src/lib/format/statusbar-checks.js.map +1 -0
- package/src/lib/format/statusbar-checks.mjs +32 -0
- package/src/lib/format/statusbar-checks.mjs.map +1 -0
- package/src/lib/format/table-checks.d.mts +21 -0
- package/src/lib/format/table-checks.d.ts +21 -0
- package/src/lib/format/table-checks.js +86 -0
- package/src/lib/format/table-checks.js.map +1 -0
- package/src/lib/format/table-checks.mjs +82 -0
- package/src/lib/format/table-checks.mjs.map +1 -0
- package/src/lib/format/translate.js +2 -2
- package/src/lib/format/translate.js.map +1 -1
- package/src/lib/format/translate.mjs +2 -2
- package/src/lib/format/translate.mjs.map +1 -1
- package/src/lib/format/upgrade.d.mts +6 -3
- package/src/lib/format/upgrade.d.ts +6 -3
- package/src/lib/format/upgrade.js +6 -3
- package/src/lib/format/upgrade.js.map +1 -1
- package/src/lib/format/upgrade.mjs +6 -3
- package/src/lib/format/upgrade.mjs.map +1 -1
- package/src/lib/format/validate.d.mts +18 -2
- package/src/lib/format/validate.d.ts +18 -2
- package/src/lib/format/validate.js +36 -3
- package/src/lib/format/validate.js.map +1 -1
- package/src/lib/format/validate.mjs +35 -3
- package/src/lib/format/validate.mjs.map +1 -1
- package/src/lib/format/version.d.mts +2 -2
- package/src/lib/format/version.d.ts +2 -2
- package/src/lib/format/version.js +2 -2
- package/src/lib/format/version.js.map +1 -1
- package/src/lib/format/version.mjs +2 -2
- package/src/lib/format/version.mjs.map +1 -1
- package/src/lib/format/words.d.mts +6 -2
- package/src/lib/format/words.d.ts +6 -2
- package/src/lib/format/words.js +13 -7
- package/src/lib/format/words.js.map +1 -1
- package/src/lib/format/words.mjs +13 -7
- package/src/lib/format/words.mjs.map +1 -1
- package/src/lib/parts.d.mts +45 -0
- package/src/lib/parts.d.ts +45 -0
- package/src/lib/parts.js +60 -0
- package/src/lib/parts.js.map +1 -0
- package/src/lib/parts.mjs +53 -0
- package/src/lib/parts.mjs.map +1 -0
- package/src/lib/record/cells.d.mts +3 -3
- package/src/lib/record/cells.d.ts +3 -3
- package/src/lib/record/cells.js +16 -15
- package/src/lib/record/cells.js.map +1 -1
- package/src/lib/record/cells.mjs +16 -15
- package/src/lib/record/cells.mjs.map +1 -1
- package/src/lib/record/compute.d.mts +16 -5
- package/src/lib/record/compute.d.ts +16 -5
- package/src/lib/record/compute.js +57 -16
- package/src/lib/record/compute.js.map +1 -1
- package/src/lib/record/compute.mjs +57 -16
- package/src/lib/record/compute.mjs.map +1 -1
- package/src/lib/record/data-source.d.mts +140 -3
- package/src/lib/record/data-source.d.ts +140 -3
- package/src/lib/record/data-source.js.map +1 -1
- package/src/lib/record/data-source.mjs.map +1 -1
- package/src/lib/record/drafts.d.mts +19 -0
- package/src/lib/record/drafts.d.ts +19 -0
- package/src/lib/record/drafts.js +35 -0
- package/src/lib/record/drafts.js.map +1 -0
- package/src/lib/record/drafts.mjs +31 -0
- package/src/lib/record/drafts.mjs.map +1 -0
- package/src/lib/record/env.d.mts +5 -1
- package/src/lib/record/env.d.ts +5 -1
- package/src/lib/record/env.js +9 -1
- package/src/lib/record/env.js.map +1 -1
- package/src/lib/record/env.mjs +8 -1
- package/src/lib/record/env.mjs.map +1 -1
- package/src/lib/record/form-limits.d.mts +81 -0
- package/src/lib/record/form-limits.d.ts +81 -0
- package/src/lib/record/form-limits.js +231 -0
- package/src/lib/record/form-limits.js.map +1 -0
- package/src/lib/record/form-limits.mjs +224 -0
- package/src/lib/record/form-limits.mjs.map +1 -0
- package/src/lib/record/form.d.mts +173 -4
- package/src/lib/record/form.d.ts +173 -4
- package/src/lib/record/form.js +792 -88
- package/src/lib/record/form.js.map +1 -1
- package/src/lib/record/form.mjs +792 -88
- package/src/lib/record/form.mjs.map +1 -1
- package/src/lib/record/limits-part.d.mts +6 -0
- package/src/lib/record/limits-part.d.ts +6 -0
- package/src/lib/record/limits-part.js +12 -0
- package/src/lib/record/limits-part.js.map +1 -0
- package/src/lib/record/limits-part.mjs +7 -0
- package/src/lib/record/limits-part.mjs.map +1 -0
- package/src/lib/record/line-choices.d.mts +30 -0
- package/src/lib/record/line-choices.d.ts +30 -0
- package/src/lib/record/line-choices.js +42 -0
- package/src/lib/record/line-choices.js.map +1 -0
- package/src/lib/record/line-choices.mjs +36 -0
- package/src/lib/record/line-choices.mjs.map +1 -0
- package/src/lib/record/locales/ar.js +10 -0
- package/src/lib/record/locales/ar.js.map +1 -1
- package/src/lib/record/locales/ar.mjs +10 -0
- package/src/lib/record/locales/ar.mjs.map +1 -1
- package/src/lib/record/locales/de.js +10 -0
- package/src/lib/record/locales/de.js.map +1 -1
- package/src/lib/record/locales/de.mjs +10 -0
- package/src/lib/record/locales/de.mjs.map +1 -1
- package/src/lib/record/locales/fr.js +10 -0
- package/src/lib/record/locales/fr.js.map +1 -1
- package/src/lib/record/locales/fr.mjs +10 -0
- package/src/lib/record/locales/fr.mjs.map +1 -1
- package/src/lib/record/memory-data-source.d.mts +44 -3
- package/src/lib/record/memory-data-source.d.ts +44 -3
- package/src/lib/record/memory-data-source.js +102 -40
- package/src/lib/record/memory-data-source.js.map +1 -1
- package/src/lib/record/memory-data-source.mjs +101 -40
- package/src/lib/record/memory-data-source.mjs.map +1 -1
- package/src/lib/record/memory-kept.d.mts +20 -0
- package/src/lib/record/memory-kept.d.ts +20 -0
- package/src/lib/record/memory-kept.js +46 -0
- package/src/lib/record/memory-kept.js.map +1 -0
- package/src/lib/record/memory-kept.mjs +43 -0
- package/src/lib/record/memory-kept.mjs.map +1 -0
- package/src/lib/record/memory-later.d.mts +19 -0
- package/src/lib/record/memory-later.d.ts +19 -0
- package/src/lib/record/memory-later.js +39 -0
- package/src/lib/record/memory-later.js.map +1 -0
- package/src/lib/record/memory-later.mjs +35 -0
- package/src/lib/record/memory-later.mjs.map +1 -0
- package/src/lib/record/memory-part.d.mts +7 -0
- package/src/lib/record/memory-part.d.ts +7 -0
- package/src/lib/record/memory-part.js +13 -0
- package/src/lib/record/memory-part.js.map +1 -0
- package/src/lib/record/memory-part.mjs +8 -0
- package/src/lib/record/memory-part.mjs.map +1 -0
- package/src/lib/record/messages.d.mts +17 -0
- package/src/lib/record/messages.d.ts +17 -0
- package/src/lib/record/messages.js +10 -0
- package/src/lib/record/messages.js.map +1 -1
- package/src/lib/record/messages.mjs +10 -0
- package/src/lib/record/messages.mjs.map +1 -1
- package/src/lib/record/option-rules.d.mts +50 -0
- package/src/lib/record/option-rules.d.ts +50 -0
- package/src/lib/record/option-rules.js +137 -0
- package/src/lib/record/option-rules.js.map +1 -0
- package/src/lib/record/option-rules.mjs +134 -0
- package/src/lib/record/option-rules.mjs.map +1 -0
- package/src/lib/record/rules.d.mts +2 -2
- package/src/lib/record/rules.d.ts +2 -2
- package/src/lib/record/rules.js +3 -3
- package/src/lib/record/rules.js.map +1 -1
- package/src/lib/record/rules.mjs +3 -3
- package/src/lib/record/rules.mjs.map +1 -1
- package/src/lib/record/run.js +9 -7
- package/src/lib/record/run.js.map +1 -1
- package/src/lib/record/run.mjs +9 -7
- package/src/lib/record/run.mjs.map +1 -1
- package/src/lib/record/search.d.mts +12 -2
- package/src/lib/record/search.d.ts +12 -2
- package/src/lib/record/search.js +29 -4
- package/src/lib/record/search.js.map +1 -1
- package/src/lib/record/search.mjs +29 -4
- package/src/lib/record/search.mjs.map +1 -1
- package/src/lib/record/set-when.d.mts +3 -3
- package/src/lib/record/set-when.d.ts +3 -3
- package/src/lib/record/set-when.js +9 -9
- package/src/lib/record/set-when.js.map +1 -1
- package/src/lib/record/set-when.mjs +9 -9
- package/src/lib/record/set-when.mjs.map +1 -1
- package/src/lib/record/signed.d.mts +21 -0
- package/src/lib/record/signed.d.ts +21 -0
- package/src/lib/record/signed.js +62 -0
- package/src/lib/record/signed.js.map +1 -0
- package/src/lib/record/signed.mjs +57 -0
- package/src/lib/record/signed.mjs.map +1 -0
- package/src/lib/record/taking.d.mts +60 -0
- package/src/lib/record/taking.d.ts +60 -0
- package/src/lib/record/taking.js +58 -0
- package/src/lib/record/taking.js.map +1 -0
- package/src/lib/record/taking.mjs +50 -0
- package/src/lib/record/taking.mjs.map +1 -0
- package/src/lib/record/value-map.js +11 -4
- package/src/lib/record/value-map.js.map +1 -1
- package/src/lib/record/value-map.mjs +11 -4
- package/src/lib/record/value-map.mjs.map +1 -1
- package/src/lib/record/values.d.mts +20 -0
- package/src/lib/record/values.d.ts +20 -0
- package/src/lib/record/values.js.map +1 -1
- package/src/lib/record/values.mjs.map +1 -1
- package/src/lib/record/waits.d.mts +6 -1
- package/src/lib/record/waits.d.ts +6 -1
- package/src/lib/record/waits.js +2 -2
- package/src/lib/record/waits.js.map +1 -1
- package/src/lib/record/waits.mjs +2 -2
- package/src/lib/record/waits.mjs.map +1 -1
- package/src/runtime.d.mts +16 -5
- package/src/runtime.d.ts +16 -5
- package/src/runtime.js +41 -3
- package/src/runtime.js.map +1 -1
- package/src/runtime.mjs +13 -0
- package/src/runtime.mjs.map +1 -1
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import { BULK_KINDS, bulkSettable } from './bulk-edit.mjs';
|
|
2
|
+
import { IMPORT_KINDS, importable } from './import-fields.mjs';
|
|
3
|
+
/** The kinds of field a list's filter bar can list the values of. */
|
|
4
|
+
const LISTS_ITS_VALUES = new Set(['selection', 'many2one', 'many2many', 'boolean', 'char', 'integer']);
|
|
5
|
+
/** The kinds of field a list's filter bar filters by their range, From and To: a whole number where the page says so. */
|
|
6
|
+
const HAS_A_RANGE = new Set(['integer', 'float', 'monetary', 'date', 'datetime']);
|
|
7
|
+
/** The kinds whose range is all a filter can take of them: no list of their values. */
|
|
8
|
+
const RANGE_ONLY = new Set(['float', 'monetary', 'date', 'datetime']);
|
|
9
|
+
/** What a calendar's start and end can be: a day, or a day and a time. */
|
|
10
|
+
const CALENDAR_TIMES = new Set(['date', 'datetime']);
|
|
11
|
+
/** What a record's words on a calendar can be. */
|
|
12
|
+
const CALENDAR_WORDS = new Set(['char', 'text', 'selection', 'many2one', 'integer', 'float', 'monetary', 'date', 'datetime']);
|
|
13
|
+
/** What a calendar's columns come from: a value that repeats. */
|
|
14
|
+
const CALENDAR_COLUMNS = new Set(['many2one', 'selection', 'char', 'integer']);
|
|
15
|
+
/** What a record's colour comes from. */
|
|
16
|
+
const CALENDAR_COLOURS = new Set(['many2one', 'selection', 'char', 'integer', 'boolean']);
|
|
17
|
+
export function checkList(list, path, tools) {
|
|
18
|
+
if (tools.page.data.kind !== 'record')
|
|
19
|
+
tools.report('data', 'a list shows records: its data needs kind "record" and a model');
|
|
20
|
+
checkListed(list, tools.page.fields, path, tools);
|
|
21
|
+
list.groupBy?.forEach((name, i) => tools.need(name, `${path}.groupBy[${i}]`));
|
|
22
|
+
// A list's filters are about its own records: their fields are the page's, and there is no record to take a value from.
|
|
23
|
+
const walk = (item, at) => {
|
|
24
|
+
if ('any' in item)
|
|
25
|
+
return item.any.forEach((inner, i) => walk(inner, `${at}.any[${i}]`));
|
|
26
|
+
if ('all' in item)
|
|
27
|
+
return item.all.forEach((inner, i) => walk(inner, `${at}.all[${i}]`));
|
|
28
|
+
tools.need(item.field, `${at}.field`);
|
|
29
|
+
if (item.valueFrom !== undefined)
|
|
30
|
+
tools.report(`${at}.valueFrom`, "a list's filter compares with values, not with another field");
|
|
31
|
+
};
|
|
32
|
+
const named = new Set();
|
|
33
|
+
list.filters?.forEach((filter, i) => {
|
|
34
|
+
tools.claim(filter.id, `${path}.filters[${i}]`);
|
|
35
|
+
named.add(filter.id);
|
|
36
|
+
filter.filter?.forEach((item, j) => walk(item, `${path}.filters[${i}].filter[${j}]`));
|
|
37
|
+
// A period is of a date, or a date and time.
|
|
38
|
+
const dated = filter.period ? tools.need(filter.period.field, `${path}.filters[${i}].period.field`) : undefined;
|
|
39
|
+
if (dated && dated.type !== 'date' && dated.type !== 'datetime')
|
|
40
|
+
tools.report(`${path}.filters[${i}].period.field`, `"${filter.period?.field}" is a ${dated.type}; a period is of a date, or a date and time`);
|
|
41
|
+
});
|
|
42
|
+
list.defaultFilters?.forEach((id, i) => {
|
|
43
|
+
if (!named.has(id))
|
|
44
|
+
tools.report(`${path}.defaultFilters[${i}]`, `no filter "${id}" in this list`);
|
|
45
|
+
});
|
|
46
|
+
list.actions?.forEach((button, i) => {
|
|
47
|
+
tools.claim(button.id, `${path}.actions[${i}]`);
|
|
48
|
+
tools.checkPress(button, `${path}.actions[${i}]`);
|
|
49
|
+
});
|
|
50
|
+
if (list.map)
|
|
51
|
+
checkListMap(list.map, `${path}.map`, tools);
|
|
52
|
+
if (list.calendar)
|
|
53
|
+
checkListCalendar(list, `${path}.calendar`, tools);
|
|
54
|
+
checkListCells(list, path, tools);
|
|
55
|
+
checkListRows(list, path, tools);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* A list's cards, gallery, columns people choose and rows' own rules: a
|
|
59
|
+
* card's fields the page's, its picture one that can hold a picture; the
|
|
60
|
+
* optional columns among the columns; a row's tones, bold and buttons
|
|
61
|
+
* reading the list's record (its fields, `id`, `user`); and the list
|
|
62
|
+
* opening on one thing.
|
|
63
|
+
*/
|
|
64
|
+
function checkListRows(list, path, tools) {
|
|
65
|
+
if (list.card)
|
|
66
|
+
checkListCard(list.card, `${path}.card`, tools.page.fields, tools);
|
|
67
|
+
for (const column of Object.keys(list.optionalColumns ?? {})) {
|
|
68
|
+
if (!list.columns.includes(column))
|
|
69
|
+
tools.report(`${path}.optionalColumns.${column}`, `"${column}" is no column of this list: a person shows or hides its columns`);
|
|
70
|
+
}
|
|
71
|
+
// A column a person may hide, every one hidden at first: the list would open with no column but its own.
|
|
72
|
+
if (list.optionalColumns && list.columns.every((column) => list.optionalColumns?.[column] === 'hide'))
|
|
73
|
+
tools.report(`${path}.optionalColumns`, 'every column starts hidden: show one at least, as the list opens');
|
|
74
|
+
if (list.gallery?.opens === 'gallery') {
|
|
75
|
+
if (list.map?.view && list.map.view !== 'list')
|
|
76
|
+
tools.report(`${path}.gallery.opens`, 'the list opens on its map (map.view) and on its gallery: say one');
|
|
77
|
+
if (list.calendar?.opens === 'calendar')
|
|
78
|
+
tools.report(`${path}.gallery.opens`, 'the list opens on its calendar and on its gallery: say one');
|
|
79
|
+
}
|
|
80
|
+
list.rowTones?.forEach((tone, i) => tools.checkModifiers(tone, `${path}.rowTones[${i}]`, ['when']));
|
|
81
|
+
tools.checkModifiers(list, path, ['rowBold']);
|
|
82
|
+
list.rowButtons?.forEach((button, i) => {
|
|
83
|
+
tools.claim(button.id, `${path}.rowButtons[${i}]`);
|
|
84
|
+
tools.checkPress(button, `${path}.rowButtons[${i}]`);
|
|
85
|
+
// Shown by a condition on each row's record.
|
|
86
|
+
tools.checkModifiers(button, `${path}.rowButtons[${i}]`, ['invisible']);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* A list's calendar: when each record starts (a date, or a date and time)
|
|
91
|
+
* and ends (the same kind), its words, its colour and its columns, each
|
|
92
|
+
* from a field that can; the view it opens on is one it offers, its hours
|
|
93
|
+
* run forward, and the list opens on one thing.
|
|
94
|
+
*/
|
|
95
|
+
function checkListCalendar(list, path, tools) {
|
|
96
|
+
const calendar = list.calendar;
|
|
97
|
+
const typed = (name, key, ok, says) => {
|
|
98
|
+
if (name === undefined)
|
|
99
|
+
return undefined;
|
|
100
|
+
const def = tools.need(name, `${path}.${key}`);
|
|
101
|
+
if (def && !ok.has(def.type))
|
|
102
|
+
tools.report(`${path}.${key}`, `"${name}" is a ${def.type}; ${says}`);
|
|
103
|
+
return def;
|
|
104
|
+
};
|
|
105
|
+
const start = typed(calendar.start, 'start', CALENDAR_TIMES, "a calendar's start is a date, or a date and time");
|
|
106
|
+
const end = typed(calendar.end, 'end', CALENDAR_TIMES, "a calendar's end is a date, or a date and time");
|
|
107
|
+
if (start && end && CALENDAR_TIMES.has(start.type) && CALENDAR_TIMES.has(end.type) && start.type !== end.type) {
|
|
108
|
+
tools.report(`${path}.end`, `"${calendar.end}" is a ${end.type}; an end is the same kind of field as its start, a ${start.type}`);
|
|
109
|
+
}
|
|
110
|
+
typed(calendar.title, 'title', CALENDAR_WORDS, "a record's words on a calendar are a field that can be said");
|
|
111
|
+
typed(calendar.colour, 'colour', CALENDAR_COLOURS, 'a colour comes from a link, a choice, text, a whole number or a yes or no');
|
|
112
|
+
typed(calendar.resource, 'resource', CALENDAR_COLUMNS, 'a column for each comes from a link, a choice, text or a whole number');
|
|
113
|
+
const views = calendar.views ?? ['day', 'week', 'month', 'agenda'];
|
|
114
|
+
views.forEach((view, i) => {
|
|
115
|
+
if (views.indexOf(view) !== i)
|
|
116
|
+
tools.report(`${path}.views[${i}]`, `"${view}" is offered twice`);
|
|
117
|
+
});
|
|
118
|
+
if (calendar.view && !views.includes(calendar.view))
|
|
119
|
+
tools.report(`${path}.view`, `"${calendar.view}" is not one of its views (${views.join(', ')})`);
|
|
120
|
+
if (calendar.hours && calendar.hours.end <= calendar.hours.start)
|
|
121
|
+
tools.report(`${path}.hours`, `the hours end at ${calendar.hours.end}, before they start at ${calendar.hours.start}`);
|
|
122
|
+
if (calendar.opens === 'calendar' && list.map?.view && list.map.view !== 'list')
|
|
123
|
+
tools.report(`${path}.opens`, 'the list opens on its map (map.view) and on its calendar: say one');
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* A list drawn as a backlog: each column's cells are a column's, a lead's
|
|
127
|
+
* icon is by a field's values; the filter bar's fields can list their
|
|
128
|
+
* values; rows nest under a link to the list's own records; and buttons for
|
|
129
|
+
* the rows chosen need a box to choose one.
|
|
130
|
+
*/
|
|
131
|
+
function checkListCells(list, path, tools) {
|
|
132
|
+
if (list.filterFields && list.search !== 'fields')
|
|
133
|
+
tools.report(`${path}.filterFields`, 'the filter fields are for the "fields" search: add "search": "fields"');
|
|
134
|
+
list.filterFields?.forEach((name, i) => {
|
|
135
|
+
const def = tools.need(name, `${path}.filterFields[${i}]`);
|
|
136
|
+
if (def && !LISTS_ITS_VALUES.has(def.type) && !RANGE_ONLY.has(def.type)) {
|
|
137
|
+
tools.report(`${path}.filterFields[${i}]`, `"${name}" is a ${def.type}; a filter lists the values of a choice, a link, links, a yes or no, text or a whole number, or takes the range of a number or a date`);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
// A filter's own name is for a filter the bar offers.
|
|
141
|
+
for (const name of Object.keys(list.filterLabels ?? {})) {
|
|
142
|
+
if (!list.filterFields?.includes(name))
|
|
143
|
+
tools.report(`${path}.filterLabels.${name}`, `"${name}" is no field of filterFields: its name is for a filter the bar offers`);
|
|
144
|
+
}
|
|
145
|
+
// A range is a number's or a date's the bar offers; the presses for its least values are a number's, in order.
|
|
146
|
+
for (const [name, range] of Object.entries(list.filterRanges ?? {})) {
|
|
147
|
+
const at = `${path}.filterRanges.${name}`;
|
|
148
|
+
if (!list.filterFields?.includes(name)) {
|
|
149
|
+
tools.report(at, `"${name}" is no field of filterFields: a range is for a filter the bar offers`);
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
const def = tools.page.fields[name];
|
|
153
|
+
if (!def)
|
|
154
|
+
continue;
|
|
155
|
+
if (!HAS_A_RANGE.has(def.type)) {
|
|
156
|
+
tools.report(at, `"${name}" is a ${def.type}; a range is a number's or a date's`);
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
const least = range.atLeast ?? [];
|
|
160
|
+
if (least.length && (def.type === 'date' || def.type === 'datetime'))
|
|
161
|
+
tools.report(`${at}.atLeast`, `"${name}" is a ${def.type}; the presses for a least value are a number's`);
|
|
162
|
+
else if (def.type === 'integer' && least.some((n) => !Number.isInteger(n)))
|
|
163
|
+
tools.report(`${at}.atLeast`, `"${name}" holds whole numbers: each least value is one`);
|
|
164
|
+
else if (least.some((n, i) => i > 0 && n <= least[i - 1]))
|
|
165
|
+
tools.report(`${at}.atLeast`, 'the least values go from the smallest to the largest, each once');
|
|
166
|
+
}
|
|
167
|
+
if (list.filterSheet && list.search !== 'fields')
|
|
168
|
+
tools.report(`${path}.filterSheet`, 'the filter sheet is the filter bar\'s on a phone: add "search": "fields"');
|
|
169
|
+
if (list.parentField !== undefined) {
|
|
170
|
+
const def = tools.need(list.parentField, `${path}.parentField`);
|
|
171
|
+
const model = tools.page.data.kind === 'record' ? tools.page.data.model : '';
|
|
172
|
+
if (def && (def.type !== 'many2one' || def.relation !== model)) {
|
|
173
|
+
tools.report(`${path}.parentField`, `"${list.parentField}" ${def.type === 'many2one' ? `links to ${def.relation}` : `is a ${def.type}`}; a parent is a many2one to the list’s own model, ${model}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (list.choose === false && list.actions?.length)
|
|
177
|
+
tools.report(`${path}.actions`, 'a list’s buttons act on the rows chosen: with "choose": false there is no way to choose one');
|
|
178
|
+
checkBulkEdit(list, path, tools);
|
|
179
|
+
checkImport(list, path, tools);
|
|
180
|
+
}
|
|
181
|
+
/** A list's Edit: each field it names one value can set in many records, and rows to choose to set it on. */
|
|
182
|
+
function checkBulkEdit(list, path, tools) {
|
|
183
|
+
if (!list.bulkEdit)
|
|
184
|
+
return;
|
|
185
|
+
if (list.choose === false)
|
|
186
|
+
tools.report(`${path}.bulkEdit`, 'Edit changes the rows chosen: with "choose": false there is no way to choose one');
|
|
187
|
+
if (list.bulkEdit === true) {
|
|
188
|
+
if (!list.columns.some((name) => bulkSettable(tools.page.fields[name])))
|
|
189
|
+
tools.report(`${path}.bulkEdit`, 'Edit offers the columns one value can set, and none of these can: name the fields it offers');
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const named = list.bulkEdit;
|
|
193
|
+
named.forEach((name, i) => {
|
|
194
|
+
const at = `${path}.bulkEdit[${i}]`;
|
|
195
|
+
if (named.indexOf(name) !== i)
|
|
196
|
+
tools.report(at, `"${name}" is offered twice`);
|
|
197
|
+
const def = tools.need(name, at);
|
|
198
|
+
if (!def)
|
|
199
|
+
return;
|
|
200
|
+
if (!BULK_KINDS.has(def.type))
|
|
201
|
+
tools.report(at, `"${name}" is a ${def.type}; one value set in many records is words, a number, money, a yes or no, a date, a choice or a link`);
|
|
202
|
+
else if (def.readonly === true || def.compute)
|
|
203
|
+
tools.report(at, `"${name}" is ${def.compute ? 'worked out from other fields' : 'read-only'}; Edit sets a field people can change`);
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
/** A list's Import: each field it names one a file's cell can fill, and at least one such field on the page. */
|
|
207
|
+
function checkImport(list, path, tools) {
|
|
208
|
+
if (!list.import)
|
|
209
|
+
return;
|
|
210
|
+
if (list.import === true) {
|
|
211
|
+
if (!Object.values(tools.page.fields).some((def) => importable(def)))
|
|
212
|
+
tools.report(`${path}.import`, 'Import fills the fields a file’s cell can, and this page has none: words, a number, money, yes or no, a date, a choice or a link people can change');
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const named = list.import;
|
|
216
|
+
named.forEach((name, i) => {
|
|
217
|
+
const at = `${path}.import[${i}]`;
|
|
218
|
+
if (named.indexOf(name) !== i)
|
|
219
|
+
tools.report(at, `"${name}" is offered twice`);
|
|
220
|
+
const def = tools.need(name, at);
|
|
221
|
+
if (!def)
|
|
222
|
+
return;
|
|
223
|
+
if (!IMPORT_KINDS.has(def.type))
|
|
224
|
+
tools.report(at, `"${name}" is a ${def.type}; a file's cell fills words, a number, money, a yes or no, a date, a choice, or a link or links by name`);
|
|
225
|
+
else if (def.readonly === true || def.compute)
|
|
226
|
+
tools.report(at, `"${name}" is ${def.compute ? 'worked out from other fields' : 'read-only'}; Import fills a field people can change`);
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
/** A list's map: where each record is, and the fields its pin and its card show, each of a type that can. */
|
|
230
|
+
function checkListMap(map, path, tools) {
|
|
231
|
+
const pair = map.latitude !== undefined || map.longitude !== undefined;
|
|
232
|
+
if (map.point !== undefined && pair)
|
|
233
|
+
tools.report(path, 'a map takes point, or latitude and longitude, not both');
|
|
234
|
+
else if (map.point === undefined && (map.latitude === undefined || map.longitude === undefined))
|
|
235
|
+
tools.report(path, 'a map needs where each record is: point, or latitude and longitude');
|
|
236
|
+
tools.checkPlace(map, path, tools.here(), map.pin, map.card);
|
|
237
|
+
if (map.regions)
|
|
238
|
+
tools.need(map.regions.field, `${path}.regions.field`);
|
|
239
|
+
if (typeof map.heat === 'object' && map.heat.weight !== undefined) {
|
|
240
|
+
const def = tools.need(map.heat.weight, `${path}.heat.weight`);
|
|
241
|
+
if (def && def.type !== 'float' && def.type !== 'integer' && def.type !== 'monetary')
|
|
242
|
+
tools.report(`${path}.heat.weight`, `"${map.heat.weight}" is a ${def.type}; a weight is a number field`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/** Whether a record holds a key of its own. */
|
|
246
|
+
const has = (record, key) => Object.prototype.hasOwnProperty.call(record, key);
|
|
247
|
+
/**
|
|
248
|
+
* A related list: on a record's page, its columns, order, search, cells, card and rows' rules of its own records'
|
|
249
|
+
* fields, its link to this record a link of theirs to this model where its fields name it, and its filter's
|
|
250
|
+
* `valueFrom` this record's.
|
|
251
|
+
*/
|
|
252
|
+
export function checkRelated(node, path, tools) {
|
|
253
|
+
// The quick check reads no shapes: a part with nothing to go by is said here.
|
|
254
|
+
if (typeof node.model !== 'string' || typeof node.field !== 'string' || !Array.isArray(node.columns) || !node.fields || typeof node.fields !== 'object') {
|
|
255
|
+
return tools.report(path, 'a related list needs the model of its records, their link to this record (field), their fields and its columns');
|
|
256
|
+
}
|
|
257
|
+
const model = tools.page.data.kind === 'record' ? tools.page.data.model : null;
|
|
258
|
+
if (!model || tools.onLine)
|
|
259
|
+
tools.report(path, 'a related list shows the records that point at a record: it belongs on a record’s page');
|
|
260
|
+
const fields = node.fields;
|
|
261
|
+
checkListed(node, fields, path, tools);
|
|
262
|
+
// On a phone its rows are cards, as a list's: of its own records' fields.
|
|
263
|
+
if (node.card)
|
|
264
|
+
checkListCard(node.card, `${path}.card`, fields, tools);
|
|
265
|
+
// Its rows' own rules, as a list's, each read on the row's record: its own fields, its id, the person, the context.
|
|
266
|
+
const row = { fields };
|
|
267
|
+
node.rowTones?.forEach((tone, i) => tools.checkModifiers(tone, `${path}.rowTones[${i}]`, ['when'], row));
|
|
268
|
+
tools.checkModifiers(node, path, ['rowBold'], row);
|
|
269
|
+
node.rowButtons?.forEach((button, i) => {
|
|
270
|
+
tools.claim(button.id, `${path}.rowButtons[${i}]`);
|
|
271
|
+
tools.checkPress(button, `${path}.rowButtons[${i}]`);
|
|
272
|
+
tools.checkModifiers(button, `${path}.rowButtons[${i}]`, ['invisible'], row);
|
|
273
|
+
});
|
|
274
|
+
const link = has(fields, node.field) ? fields[node.field] : undefined;
|
|
275
|
+
if (link && model && (link.type !== 'many2one' || link.relation !== model)) {
|
|
276
|
+
tools.report(`${path}.field`, `"${node.field}" ${link.type === 'many2one' ? `links to ${link.relation}` : `is a ${link.type}`}; the records listed point at this one by a many2one to ${model}`);
|
|
277
|
+
}
|
|
278
|
+
for (const [name, def] of Object.entries(fields)) {
|
|
279
|
+
if (def.type === 'monetary' && def.currencyField !== undefined)
|
|
280
|
+
tools.checkCurrency(def.currencyField, `${path}.fields.${name}.currencyField`, fields, undefined, fields);
|
|
281
|
+
if (def.type === 'datetime' && def.timeZone !== undefined)
|
|
282
|
+
tools.checkZone(def.timeZone, `${path}.fields.${name}.timeZone`);
|
|
283
|
+
}
|
|
284
|
+
// Its filter is about its records, by their fields; what it compares with may be read from this record.
|
|
285
|
+
node.filter?.forEach((item, i) => tools.checkFilterItem(item, `${path}.filter[${i}]`, tools.here()));
|
|
286
|
+
if (node.viewAll && node.viewAll.page === tools.page.id)
|
|
287
|
+
tools.report(`${path}.viewAll.page`, 'View all opens a list of the records related: this page is the record they point at');
|
|
288
|
+
}
|
|
289
|
+
/** Kinds of field a list's card shows as its picture: a picture held, or text holding a picture's address. */
|
|
290
|
+
const PICTURES = new Set(['image', 'binary', 'char']);
|
|
291
|
+
/**
|
|
292
|
+
* What a list shows of its records — a list page's, or a related list's of its own records' fields: its columns, its
|
|
293
|
+
* order and the fields its search looks in, each a field; each column's cells for a column of it, a sum, an average,
|
|
294
|
+
* the lowest and the highest of a number column (any column's count), a lead's icon by a field's values.
|
|
295
|
+
*/
|
|
296
|
+
function checkListed(list, fields, path, tools) {
|
|
297
|
+
list.columns.forEach((name, i) => tools.need(name, `${path}.columns[${i}]`, fields));
|
|
298
|
+
list.sort?.forEach((order, i) => tools.need(order.field, `${path}.sort[${i}].field`, fields));
|
|
299
|
+
list.searchFields?.forEach((name, i) => tools.need(name, `${path}.searchFields[${i}]`, fields));
|
|
300
|
+
for (const [column, cell] of Object.entries(list.cells ?? {})) {
|
|
301
|
+
const at = `${path}.cells.${column}`;
|
|
302
|
+
if (!list.columns.includes(column)) {
|
|
303
|
+
tools.report(at, `"${column}" is no column of this list: its cells are for its columns`);
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
const kind = has(fields, column) ? fields[column].type : undefined;
|
|
307
|
+
if (cell.total && cell.total !== 'count' && kind && kind !== 'integer' && kind !== 'float' && kind !== 'monetary') {
|
|
308
|
+
tools.report(`${at}.total`, `"${column}" is a ${kind}; its total "${cell.total}" is of numbers — an integer, a float or an amount — and any column's is "count"`);
|
|
309
|
+
}
|
|
310
|
+
if (!cell.lead)
|
|
311
|
+
continue;
|
|
312
|
+
const def = tools.need(cell.lead.field, `${at}.lead.field`, fields);
|
|
313
|
+
if (def?.type !== 'selection')
|
|
314
|
+
continue;
|
|
315
|
+
const values = new Set(def.options.map((option) => String(option.value)));
|
|
316
|
+
for (const value of Object.keys(cell.lead.looks))
|
|
317
|
+
if (!values.has(value))
|
|
318
|
+
tools.report(`${at}.lead.looks.${value}`, `"${value}" is no value of "${cell.lead.field}"`);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* What a list's card shows — a list page's, or a related list's of its own records' fields: its title, subtitle,
|
|
323
|
+
* status and lines each a field, its picture one that can hold a picture.
|
|
324
|
+
*/
|
|
325
|
+
function checkListCard(card, at, fields, tools) {
|
|
326
|
+
for (const key of ['title', 'subtitle', 'status'])
|
|
327
|
+
if (card[key] !== undefined)
|
|
328
|
+
tools.need(card[key], `${at}.${key}`, fields);
|
|
329
|
+
if (card.image !== undefined) {
|
|
330
|
+
const def = tools.need(card.image, `${at}.image`, fields);
|
|
331
|
+
if (def && !PICTURES.has(def.type))
|
|
332
|
+
tools.report(`${at}.image`, `"${card.image}" is a ${def.type}; a card's picture is an image or binary field, or text holding a picture's address`);
|
|
333
|
+
}
|
|
334
|
+
card.fields?.forEach((line, i) => (Array.isArray(line) ? line : [line]).forEach((part, j) => tools.need(typeof part === 'string' ? part : part.field, `${at}.fields[${i}]${Array.isArray(line) ? `[${j}]` : ''}${typeof part === 'string' ? '' : '.field'}`, fields)));
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=list-checks.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-checks.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/format/list-checks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ActionStep } from './actions.mjs';
|
|
2
|
+
import type { Field, LineField } from './field.mjs';
|
|
3
|
+
import type { FieldNode, MapCard, MapNode, Pin } from './layout.mjs';
|
|
4
|
+
import type { Page } from './page.mjs';
|
|
5
|
+
import type { Scope } from './references.mjs';
|
|
6
|
+
export interface MapTools {
|
|
7
|
+
readonly page: Page;
|
|
8
|
+
need(name: string, path: string, scope?: Record<string, Field | LineField>): Field | LineField | undefined;
|
|
9
|
+
report(path: string, message: string): void;
|
|
10
|
+
checkModifiers(owner: object, path: string, keys?: readonly string[], scope?: Scope): void;
|
|
11
|
+
checkSteps(steps: ActionStep[], path: string): void;
|
|
12
|
+
/** Where the page's own expressions read. */
|
|
13
|
+
here(): Scope;
|
|
14
|
+
/** Said where checks come in a part that has not come (the one-tag script's): they are owed. */
|
|
15
|
+
owe(part: string): void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Where a place is kept, and the fields its pin and its card show, each of a
|
|
19
|
+
* type that can: a page's fields, or a line's when the place is a line's.
|
|
20
|
+
*/
|
|
21
|
+
export declare function checkPlace(at: {
|
|
22
|
+
point?: string;
|
|
23
|
+
latitude?: string;
|
|
24
|
+
longitude?: string;
|
|
25
|
+
}, path: string, scope: Scope, pin: Pin | undefined, card: MapCard | undefined, tools: MapTools): void;
|
|
26
|
+
/**
|
|
27
|
+
* A form's map: each layer one kind — the record's place, a place for each
|
|
28
|
+
* of its lines, a route between layers, or the reader's own place — its
|
|
29
|
+
* fields where that kind keeps them, and a route's ends layers it can join.
|
|
30
|
+
*/
|
|
31
|
+
export declare function checkMap(node: MapNode, path: string, tools: MapTools): void;
|
|
32
|
+
/** An address with suggestions: a char field, its place kept as a place field keeps one, its parts in a json field. */
|
|
33
|
+
export declare function checkAddressSearch(node: FieldNode, def: Field | LineField | undefined, path: string, tools: MapTools): void;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ActionStep } from './actions';
|
|
2
|
+
import type { Field, LineField } from './field';
|
|
3
|
+
import type { FieldNode, MapCard, MapNode, Pin } from './layout';
|
|
4
|
+
import type { Page } from './page';
|
|
5
|
+
import type { Scope } from './references';
|
|
6
|
+
export interface MapTools {
|
|
7
|
+
readonly page: Page;
|
|
8
|
+
need(name: string, path: string, scope?: Record<string, Field | LineField>): Field | LineField | undefined;
|
|
9
|
+
report(path: string, message: string): void;
|
|
10
|
+
checkModifiers(owner: object, path: string, keys?: readonly string[], scope?: Scope): void;
|
|
11
|
+
checkSteps(steps: ActionStep[], path: string): void;
|
|
12
|
+
/** Where the page's own expressions read. */
|
|
13
|
+
here(): Scope;
|
|
14
|
+
/** Said where checks come in a part that has not come (the one-tag script's): they are owed. */
|
|
15
|
+
owe(part: string): void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Where a place is kept, and the fields its pin and its card show, each of a
|
|
19
|
+
* type that can: a page's fields, or a line's when the place is a line's.
|
|
20
|
+
*/
|
|
21
|
+
export declare function checkPlace(at: {
|
|
22
|
+
point?: string;
|
|
23
|
+
latitude?: string;
|
|
24
|
+
longitude?: string;
|
|
25
|
+
}, path: string, scope: Scope, pin: Pin | undefined, card: MapCard | undefined, tools: MapTools): void;
|
|
26
|
+
/**
|
|
27
|
+
* A form's map: each layer one kind — the record's place, a place for each
|
|
28
|
+
* of its lines, a route between layers, or the reader's own place — its
|
|
29
|
+
* fields where that kind keeps them, and a route's ends layers it can join.
|
|
30
|
+
*/
|
|
31
|
+
export declare function checkMap(node: MapNode, path: string, tools: MapTools): void;
|
|
32
|
+
/** An address with suggestions: a char field, its place kept as a place field keeps one, its parts in a json field. */
|
|
33
|
+
export declare function checkAddressSearch(node: FieldNode, def: Field | LineField | undefined, path: string, tools: MapTools): void;
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.checkPlace = checkPlace;
|
|
4
|
+
exports.checkMap = checkMap;
|
|
5
|
+
exports.checkAddressSearch = checkAddressSearch;
|
|
6
|
+
/**
|
|
7
|
+
* The checks of a map — a form's (`type: "map"`), and where a list's records are on one (`map`, list-checks.ts): its
|
|
8
|
+
* layers, places, routes, reachable areas and fences, and the fields a pin and a card show — and of an address with
|
|
9
|
+
* suggestions (`address-search`). A map is drawn by the app's
|
|
10
|
+
* maps (@fieldia/map); in the one-tag script its checks come in a part of their own a page with a map asks for, run
|
|
11
|
+
* once it came (later-checks.ts). The packages' checks run them at once.
|
|
12
|
+
*/
|
|
13
|
+
/** Whether a record holds a key of its own. */
|
|
14
|
+
const has = (record, key) => Object.prototype.hasOwnProperty.call(record, key);
|
|
15
|
+
/**
|
|
16
|
+
* Where a place is kept, and the fields its pin and its card show, each of a
|
|
17
|
+
* type that can: a page's fields, or a line's when the place is a line's.
|
|
18
|
+
*/
|
|
19
|
+
function checkPlace(at, path, scope, pin, card, tools) {
|
|
20
|
+
const typed = (name, where, ok, says) => {
|
|
21
|
+
if (name === undefined)
|
|
22
|
+
return;
|
|
23
|
+
const def = tools.need(name, where, scope.fields);
|
|
24
|
+
if (def && !ok(def.type))
|
|
25
|
+
tools.report(where, `"${name}" is a ${def.type}; ${says}`);
|
|
26
|
+
};
|
|
27
|
+
const number = (type) => type === 'float' || type === 'integer';
|
|
28
|
+
const picture = (type) => type === 'image' || type === 'binary';
|
|
29
|
+
typed(at.point, `${path}.point`, (type) => type === 'json', 'a point is kept in a json field');
|
|
30
|
+
typed(at.latitude, `${path}.latitude`, number, 'a latitude is a number field (float or integer)');
|
|
31
|
+
typed(at.longitude, `${path}.longitude`, number, 'a longitude is a number field (float or integer)');
|
|
32
|
+
if (pin) {
|
|
33
|
+
typed(pin.image, `${path}.pin.image`, picture, "a pin's photo is an image or binary field");
|
|
34
|
+
typed(pin.turn, `${path}.pin.turn`, number, 'a turn is a number field, in degrees');
|
|
35
|
+
if (pin.iconField !== undefined)
|
|
36
|
+
tools.need(pin.iconField, `${path}.pin.iconField`, scope.fields);
|
|
37
|
+
if (pin.label !== undefined)
|
|
38
|
+
tools.need(pin.label, `${path}.pin.label`, scope.fields);
|
|
39
|
+
pin.tones?.forEach((tone, i) => tools.checkModifiers(tone, `${path}.pin.tones[${i}]`, ['when'], scope));
|
|
40
|
+
pin.money?.per?.forEach((item, i) => tools.checkModifiers(item, `${path}.pin.money.per[${i}]`, ['when'], scope));
|
|
41
|
+
}
|
|
42
|
+
if (card) {
|
|
43
|
+
if (card.title !== undefined)
|
|
44
|
+
tools.need(card.title, `${path}.card.title`, scope.fields);
|
|
45
|
+
typed(card.image, `${path}.card.image`, picture, "a card's picture is an image or binary field");
|
|
46
|
+
// A line is a part, or several on one line; a part a field's name, or a field with its words.
|
|
47
|
+
card.fields?.forEach((line, i) => (Array.isArray(line) ? line : [line]).forEach((part, j) => {
|
|
48
|
+
const at = `${path}.card.fields[${i}]${Array.isArray(line) ? `[${j}]` : ''}${typeof part === 'string' ? '' : '.field'}`;
|
|
49
|
+
tools.need(typeof part === 'string' ? part : part.field, at, scope.fields);
|
|
50
|
+
}));
|
|
51
|
+
typed(card.href, `${path}.card.href`, (type) => type === 'char' || type === 'text', "a card's link is a text field holding a web address");
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* A form's map: each layer one kind — the record's place, a place for each
|
|
56
|
+
* of its lines, a route between layers, or the reader's own place — its
|
|
57
|
+
* fields where that kind keeps them, and a route's ends layers it can join.
|
|
58
|
+
*/
|
|
59
|
+
function checkMap(node, path, tools) {
|
|
60
|
+
const layers = new Map();
|
|
61
|
+
node.layers.forEach((layer, i) => {
|
|
62
|
+
const at = `${path}.layers[${i}]`;
|
|
63
|
+
if (layers.has(layer.id))
|
|
64
|
+
tools.report(`${at}.id`, `two layers are called "${layer.id}"`);
|
|
65
|
+
const pair = layer.latitude !== undefined || layer.longitude !== undefined;
|
|
66
|
+
const placed = layer.point !== undefined || pair;
|
|
67
|
+
const kinds = [placed, !!layer.route, !!layer.myLocation, !!layer.regions, !!layer.reachable].filter(Boolean).length;
|
|
68
|
+
if (kinds !== 1)
|
|
69
|
+
tools.report(at, 'a layer is one of: a place (point, or latitude and longitude, for the record or for each of its lines), a route, myLocation, regions, or reachable');
|
|
70
|
+
if (layer.regions?.choose !== undefined)
|
|
71
|
+
tools.need(layer.regions.choose, `${at}.regions.choose`);
|
|
72
|
+
if (layer.point !== undefined && pair)
|
|
73
|
+
tools.report(at, 'a layer takes point, or latitude and longitude, not both');
|
|
74
|
+
else if (layer.point === undefined && pair && (layer.latitude === undefined || layer.longitude === undefined))
|
|
75
|
+
tools.report(at, 'a layer needs both latitude and longitude');
|
|
76
|
+
if (layer.lines !== undefined && !placed)
|
|
77
|
+
tools.report(`${at}.lines`, "a layer of lines needs where each line is: point, or latitude and longitude, of the line's fields");
|
|
78
|
+
if (layer.live && (!placed || layer.lines !== undefined))
|
|
79
|
+
tools.report(`${at}.live`, "live is for a layer of the record's own place: it moves as its fields change");
|
|
80
|
+
tools.checkModifiers(layer, at, ['invisible']);
|
|
81
|
+
layers.set(layer.id, { lines: layer.lines !== undefined, place: placed || !!layer.myLocation });
|
|
82
|
+
if (!placed)
|
|
83
|
+
return;
|
|
84
|
+
if (layer.lines === undefined)
|
|
85
|
+
return checkPlace(layer, at, tools.here(), layer.pin, layer.card, tools);
|
|
86
|
+
const def = tools.need(layer.lines, `${at}.lines`);
|
|
87
|
+
if (!def)
|
|
88
|
+
return;
|
|
89
|
+
if (def.type !== 'one2many')
|
|
90
|
+
return tools.report(`${at}.lines`, `"${layer.lines}" is a ${def.type}; a layer of lines is a one2many field`);
|
|
91
|
+
checkPlace(layer, at, { fields: def.fields, lines: layer.lines, parent: tools.page.fields }, layer.pin, layer.card, tools);
|
|
92
|
+
});
|
|
93
|
+
node.layers.forEach((layer, i) => {
|
|
94
|
+
const route = layer.route;
|
|
95
|
+
if (!route)
|
|
96
|
+
return;
|
|
97
|
+
const at = `${path}.layers[${i}].route`;
|
|
98
|
+
const end = (id, key) => {
|
|
99
|
+
if (id === undefined)
|
|
100
|
+
return;
|
|
101
|
+
const found = layers.get(id);
|
|
102
|
+
if (!found)
|
|
103
|
+
tools.report(`${at}.${key}`, `no layer "${id}" on this map`);
|
|
104
|
+
else if (!found.place || found.lines)
|
|
105
|
+
tools.report(`${at}.${key}`, `a route's ${key} is a layer of one place, or the reader's own; "${id}" is not`);
|
|
106
|
+
};
|
|
107
|
+
end(route.from, 'from');
|
|
108
|
+
end(route.to, 'to');
|
|
109
|
+
if (route.through !== undefined) {
|
|
110
|
+
const found = layers.get(route.through);
|
|
111
|
+
if (!found)
|
|
112
|
+
tools.report(`${at}.through`, `no layer "${route.through}" on this map`);
|
|
113
|
+
else if (!found.lines)
|
|
114
|
+
tools.report(`${at}.through`, `a route goes through a layer of lines; "${route.through}" is not one`);
|
|
115
|
+
}
|
|
116
|
+
if (route.to === undefined && route.through === undefined)
|
|
117
|
+
tools.report(at, 'a route needs where it goes: to, or through');
|
|
118
|
+
const written = (name, key, ok, says) => {
|
|
119
|
+
if (name === undefined)
|
|
120
|
+
return;
|
|
121
|
+
const def = tools.need(name, `${at}.write.${key}`);
|
|
122
|
+
if (def && !ok(def.type))
|
|
123
|
+
tools.report(`${at}.write.${key}`, `"${name}" is a ${def.type}; ${says}`);
|
|
124
|
+
};
|
|
125
|
+
const number = (type) => type === 'float' || type === 'integer';
|
|
126
|
+
written(route.write?.seconds, 'seconds', number, 'seconds are a number field');
|
|
127
|
+
written(route.write?.metres, 'metres', number, 'metres are a number field');
|
|
128
|
+
written(route.write?.line, 'line', (type) => type === 'json', 'a line is kept in a json field');
|
|
129
|
+
});
|
|
130
|
+
node.layers.forEach((layer, i) => {
|
|
131
|
+
if (!layer.reachable)
|
|
132
|
+
return;
|
|
133
|
+
const found = layers.get(layer.reachable.from);
|
|
134
|
+
const at = `${path}.layers[${i}].reachable.from`;
|
|
135
|
+
if (!found)
|
|
136
|
+
tools.report(at, `no layer "${layer.reachable.from}" on this map`);
|
|
137
|
+
else if (!found.place || found.lines)
|
|
138
|
+
tools.report(at, `a reachable area is worked out from a layer of one place, or the reader's own; "${layer.reachable.from}" is not`);
|
|
139
|
+
});
|
|
140
|
+
node.fences?.forEach((fence, i) => {
|
|
141
|
+
const at = `${path}.fences[${i}]`;
|
|
142
|
+
const watched = node.layers.find((layer) => layer.id === fence.layer);
|
|
143
|
+
if (!watched)
|
|
144
|
+
tools.report(`${at}.layer`, `no layer "${fence.layer}" on this map`);
|
|
145
|
+
else if (!watched.live && !watched.myLocation)
|
|
146
|
+
tools.report(`${at}.layer`, `a fence watches a place that moves: a live layer, or the reader's own; "${fence.layer}" is not`);
|
|
147
|
+
if (fence.area !== undefined) {
|
|
148
|
+
const def = tools.need(fence.area, `${at}.area`);
|
|
149
|
+
if (def && def.type !== 'json')
|
|
150
|
+
tools.report(`${at}.area`, `"${fence.area}" is a ${def.type}; an area is kept in a json field`);
|
|
151
|
+
}
|
|
152
|
+
if (fence.within !== undefined && !node.layers.some((layer) => layer.id === fence.within && layer.reachable))
|
|
153
|
+
tools.report(`${at}.within`, `a fence is within a reachable area of this map; "${fence.within}" is not one`);
|
|
154
|
+
tools.checkSteps(fence.steps, `${at}.steps`);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
/** An address with suggestions: a char field, its place kept as a place field keeps one, its parts in a json field. */
|
|
158
|
+
function checkAddressSearch(node, def, path, tools) {
|
|
159
|
+
const options = node.options ?? {};
|
|
160
|
+
const kind = (key) => {
|
|
161
|
+
const name = options[key];
|
|
162
|
+
return typeof name === 'string' && has(tools.page.fields, name) ? tools.page.fields[name].type : undefined;
|
|
163
|
+
};
|
|
164
|
+
if (def && def.type !== 'char')
|
|
165
|
+
tools.report(`${path}.widget`, `address-search is for a char field; "${node.field}" is a ${def.type}`);
|
|
166
|
+
const place = kind('placeField');
|
|
167
|
+
if (place && place !== 'json' && place !== 'float')
|
|
168
|
+
tools.report(`${path}.options.placeField`, `"${options['placeField']}" is a ${place}; a place is kept in a json field, or in a float field (its latitude) with longitudeField`);
|
|
169
|
+
if (place === 'float' && options['longitudeField'] === undefined)
|
|
170
|
+
tools.report(`${path}.options.placeField`, `"${options['placeField']}" keeps a latitude: name the float field for its longitude in longitudeField`);
|
|
171
|
+
if (options['longitudeField'] !== undefined && place !== 'float')
|
|
172
|
+
tools.report(`${path}.options.longitudeField`, 'longitudeField goes with a placeField that is a float field, its latitude');
|
|
173
|
+
const longitude = kind('longitudeField');
|
|
174
|
+
if (longitude && longitude !== 'float')
|
|
175
|
+
tools.report(`${path}.options.longitudeField`, `"${options['longitudeField']}" is a ${longitude}; a longitude is kept in a float field`);
|
|
176
|
+
const parts = kind('partsField');
|
|
177
|
+
if (parts && parts !== 'json')
|
|
178
|
+
tools.report(`${path}.options.partsField`, `"${options['partsField']}" is a ${parts}; an address's parts are kept in a json field`);
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=map-checks.js.map
|