@fieldia/core 0.19.1 → 0.20.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.
Files changed (76) hide show
  1. package/package.json +1 -1
  2. package/schema/page.schema.json +777 -65
  3. package/src/index.d.mts +2 -1
  4. package/src/index.d.ts +2 -1
  5. package/src/index.js +5 -1
  6. package/src/index.js.map +1 -1
  7. package/src/index.mjs +2 -1
  8. package/src/index.mjs.map +1 -1
  9. package/src/lib/format/head-checks.d.mts +40 -0
  10. package/src/lib/format/head-checks.d.ts +40 -0
  11. package/src/lib/format/head-checks.js +172 -0
  12. package/src/lib/format/head-checks.js.map +1 -0
  13. package/src/lib/format/head-checks.mjs +167 -0
  14. package/src/lib/format/head-checks.mjs.map +1 -0
  15. package/src/lib/format/layout.d.mts +6485 -1447
  16. package/src/lib/format/layout.d.ts +6485 -1447
  17. package/src/lib/format/layout.js +106 -2
  18. package/src/lib/format/layout.js.map +1 -1
  19. package/src/lib/format/layout.mjs +105 -1
  20. package/src/lib/format/layout.mjs.map +1 -1
  21. package/src/lib/format/layout.types.d.mts +7 -1
  22. package/src/lib/format/layout.types.d.ts +7 -1
  23. package/src/lib/format/page.d.mts +1486 -164
  24. package/src/lib/format/page.d.ts +1486 -164
  25. package/src/lib/format/page.js +2 -0
  26. package/src/lib/format/page.js.map +1 -1
  27. package/src/lib/format/page.mjs +2 -0
  28. package/src/lib/format/page.mjs.map +1 -1
  29. package/src/lib/format/picker-options.d.mts +22 -0
  30. package/src/lib/format/picker-options.d.ts +22 -0
  31. package/src/lib/format/picker-options.js +50 -0
  32. package/src/lib/format/picker-options.js.map +1 -0
  33. package/src/lib/format/picker-options.mjs +46 -0
  34. package/src/lib/format/picker-options.mjs.map +1 -0
  35. package/src/lib/format/references.d.mts +9 -0
  36. package/src/lib/format/references.d.ts +9 -0
  37. package/src/lib/format/references.js +88 -1
  38. package/src/lib/format/references.js.map +1 -1
  39. package/src/lib/format/references.mjs +88 -1
  40. package/src/lib/format/references.mjs.map +1 -1
  41. package/src/lib/format/section-checks.d.mts +10 -0
  42. package/src/lib/format/section-checks.d.ts +10 -0
  43. package/src/lib/format/section-checks.js +35 -0
  44. package/src/lib/format/section-checks.js.map +1 -0
  45. package/src/lib/format/section-checks.mjs +31 -0
  46. package/src/lib/format/section-checks.mjs.map +1 -0
  47. package/src/lib/format/translate.js +11 -2
  48. package/src/lib/format/translate.js.map +1 -1
  49. package/src/lib/format/translate.mjs +11 -2
  50. package/src/lib/format/translate.mjs.map +1 -1
  51. package/src/lib/record/form.d.mts +12 -2
  52. package/src/lib/record/form.d.ts +12 -2
  53. package/src/lib/record/form.js +44 -6
  54. package/src/lib/record/form.js.map +1 -1
  55. package/src/lib/record/form.mjs +44 -6
  56. package/src/lib/record/form.mjs.map +1 -1
  57. package/src/lib/record/memory-data-source.d.mts +7 -0
  58. package/src/lib/record/memory-data-source.d.ts +7 -0
  59. package/src/lib/record/memory-data-source.js +19 -1
  60. package/src/lib/record/memory-data-source.js.map +1 -1
  61. package/src/lib/record/memory-data-source.mjs +19 -1
  62. package/src/lib/record/memory-data-source.mjs.map +1 -1
  63. package/src/lib/record/run.d.mts +7 -0
  64. package/src/lib/record/run.d.ts +7 -0
  65. package/src/lib/record/run.js +7 -0
  66. package/src/lib/record/run.js.map +1 -1
  67. package/src/lib/record/run.mjs +7 -0
  68. package/src/lib/record/run.mjs.map +1 -1
  69. package/src/lib/record/values.d.mts +4 -0
  70. package/src/lib/record/values.d.ts +4 -0
  71. package/src/lib/record/values.js.map +1 -1
  72. package/src/lib/record/values.mjs.map +1 -1
  73. package/src/runtime.d.mts +2 -1
  74. package/src/runtime.d.ts +2 -1
  75. package/src/runtime.js.map +1 -1
  76. package/src/runtime.mjs.map +1 -1
package/src/index.d.mts CHANGED
@@ -1,8 +1,9 @@
1
1
  export * from './runtime.mjs';
2
2
  export { FieldSchema, FieldsSchema, LineFieldSchema, LineKindsSchema, OptionSchema, PropertyDefinitionSchema, FilterConditionSchema, FilterItemSchema, MoneyLookSchema, PERIODS, } from './lib/format/field.mjs';
3
- export { ModifierSchema, RolesSchema, CellRulesSchema, ToneWhenSchema, LayoutNodeSchema, RootLayoutSchema, ListNodeSchema } from './lib/format/layout.mjs';
3
+ export { ModifierSchema, RolesSchema, CellRulesSchema, ToneWhenSchema, LayoutNodeSchema, RootLayoutSchema, ListNodeSchema, ListCellSchema } from './lib/format/layout.mjs';
4
4
  export { PageSchema } from './lib/format/page.mjs';
5
5
  export { ActionStepSchema, PageEventsSchema } from './lib/format/actions.mjs';
6
6
  export { validatePage } from './lib/format/validate.mjs';
7
7
  export { AddressSearchOptionsSchema } from './lib/format/address-search.mjs';
8
+ export { PathPickerOptionsSchema, StateDotOptionsSchema } from './lib/format/picker-options.mjs';
8
9
  export { pageJsonSchema } from './lib/format/json-schema.mjs';
package/src/index.d.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  export * from './runtime';
2
2
  export { FieldSchema, FieldsSchema, LineFieldSchema, LineKindsSchema, OptionSchema, PropertyDefinitionSchema, FilterConditionSchema, FilterItemSchema, MoneyLookSchema, PERIODS, } from './lib/format/field';
3
- export { ModifierSchema, RolesSchema, CellRulesSchema, ToneWhenSchema, LayoutNodeSchema, RootLayoutSchema, ListNodeSchema } from './lib/format/layout';
3
+ export { ModifierSchema, RolesSchema, CellRulesSchema, ToneWhenSchema, LayoutNodeSchema, RootLayoutSchema, ListNodeSchema, ListCellSchema } from './lib/format/layout';
4
4
  export { PageSchema } from './lib/format/page';
5
5
  export { ActionStepSchema, PageEventsSchema } from './lib/format/actions';
6
6
  export { validatePage } from './lib/format/validate';
7
7
  export { AddressSearchOptionsSchema } from './lib/format/address-search';
8
+ export { PathPickerOptionsSchema, StateDotOptionsSchema } from './lib/format/picker-options';
8
9
  export { pageJsonSchema } from './lib/format/json-schema';
package/src/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.pageJsonSchema = exports.AddressSearchOptionsSchema = exports.validatePage = exports.PageEventsSchema = exports.ActionStepSchema = exports.PageSchema = exports.ListNodeSchema = exports.RootLayoutSchema = exports.LayoutNodeSchema = exports.ToneWhenSchema = exports.CellRulesSchema = exports.RolesSchema = exports.ModifierSchema = exports.PERIODS = exports.MoneyLookSchema = exports.FilterItemSchema = exports.FilterConditionSchema = exports.PropertyDefinitionSchema = exports.OptionSchema = exports.LineKindsSchema = exports.LineFieldSchema = exports.FieldsSchema = exports.FieldSchema = void 0;
3
+ exports.pageJsonSchema = exports.StateDotOptionsSchema = exports.PathPickerOptionsSchema = exports.AddressSearchOptionsSchema = exports.validatePage = exports.PageEventsSchema = exports.ActionStepSchema = exports.PageSchema = exports.ListCellSchema = exports.ListNodeSchema = exports.RootLayoutSchema = exports.LayoutNodeSchema = exports.ToneWhenSchema = exports.CellRulesSchema = exports.RolesSchema = exports.ModifierSchema = exports.PERIODS = exports.MoneyLookSchema = exports.FilterItemSchema = exports.FilterConditionSchema = exports.PropertyDefinitionSchema = exports.OptionSchema = exports.LineKindsSchema = exports.LineFieldSchema = exports.FieldsSchema = exports.FieldSchema = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  tslib_1.__exportStar(require("./runtime"), exports);
6
6
  var field_1 = require("./lib/format/field");
@@ -22,6 +22,7 @@ Object.defineProperty(exports, "ToneWhenSchema", { enumerable: true, get: functi
22
22
  Object.defineProperty(exports, "LayoutNodeSchema", { enumerable: true, get: function () { return layout_1.LayoutNodeSchema; } });
23
23
  Object.defineProperty(exports, "RootLayoutSchema", { enumerable: true, get: function () { return layout_1.RootLayoutSchema; } });
24
24
  Object.defineProperty(exports, "ListNodeSchema", { enumerable: true, get: function () { return layout_1.ListNodeSchema; } });
25
+ Object.defineProperty(exports, "ListCellSchema", { enumerable: true, get: function () { return layout_1.ListCellSchema; } });
25
26
  var page_1 = require("./lib/format/page");
26
27
  Object.defineProperty(exports, "PageSchema", { enumerable: true, get: function () { return page_1.PageSchema; } });
27
28
  var actions_1 = require("./lib/format/actions");
@@ -31,6 +32,9 @@ var validate_1 = require("./lib/format/validate");
31
32
  Object.defineProperty(exports, "validatePage", { enumerable: true, get: function () { return validate_1.validatePage; } });
32
33
  var address_search_1 = require("./lib/format/address-search");
33
34
  Object.defineProperty(exports, "AddressSearchOptionsSchema", { enumerable: true, get: function () { return address_search_1.AddressSearchOptionsSchema; } });
35
+ var picker_options_1 = require("./lib/format/picker-options");
36
+ Object.defineProperty(exports, "PathPickerOptionsSchema", { enumerable: true, get: function () { return picker_options_1.PathPickerOptionsSchema; } });
37
+ Object.defineProperty(exports, "StateDotOptionsSchema", { enumerable: true, get: function () { return picker_options_1.StateDotOptionsSchema; } });
34
38
  var json_schema_1 = require("./lib/format/json-schema");
35
39
  Object.defineProperty(exports, "pageJsonSchema", { enumerable: true, get: function () { return json_schema_1.pageJsonSchema; } });
36
40
  //# sourceMappingURL=index.js.map
package/src/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/core/src/index.ts"],"names":[],"mappings":";;;;AAAA,oDAA0B;AAC1B,4CAW4B;AAV1B,oGAAA,WAAW,OAAA;AACX,qGAAA,YAAY,OAAA;AACZ,wGAAA,eAAe,OAAA;AACf,wGAAA,eAAe,OAAA;AACf,qGAAA,YAAY,OAAA;AACZ,iHAAA,wBAAwB,OAAA;AACxB,8GAAA,qBAAqB,OAAA;AACrB,yGAAA,gBAAgB,OAAA;AAChB,wGAAA,eAAe,OAAA;AACf,gGAAA,OAAO,OAAA;AAET,8CAAuJ;AAA9I,wGAAA,cAAc,OAAA;AAAE,qGAAA,WAAW,OAAA;AAAE,yGAAA,eAAe,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,0GAAA,gBAAgB,OAAA;AAAE,0GAAA,gBAAgB,OAAA;AAAE,wGAAA,cAAc,OAAA;AACzH,0CAA+C;AAAtC,kGAAA,UAAU,OAAA;AACnB,gDAA0E;AAAjE,2GAAA,gBAAgB,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AAC3C,kDAAqD;AAA5C,wGAAA,YAAY,OAAA;AACrB,8DAAyE;AAAhE,4HAAA,0BAA0B,OAAA;AACnC,wDAA0D;AAAjD,6GAAA,cAAc,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/core/src/index.ts"],"names":[],"mappings":";;;;AAAA,oDAA0B;AAC1B,4CAW4B;AAV1B,oGAAA,WAAW,OAAA;AACX,qGAAA,YAAY,OAAA;AACZ,wGAAA,eAAe,OAAA;AACf,wGAAA,eAAe,OAAA;AACf,qGAAA,YAAY,OAAA;AACZ,iHAAA,wBAAwB,OAAA;AACxB,8GAAA,qBAAqB,OAAA;AACrB,yGAAA,gBAAgB,OAAA;AAChB,wGAAA,eAAe,OAAA;AACf,gGAAA,OAAO,OAAA;AAET,8CAAuK;AAA9J,wGAAA,cAAc,OAAA;AAAE,qGAAA,WAAW,OAAA;AAAE,yGAAA,eAAe,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,0GAAA,gBAAgB,OAAA;AAAE,0GAAA,gBAAgB,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,wGAAA,cAAc,OAAA;AACzI,0CAA+C;AAAtC,kGAAA,UAAU,OAAA;AACnB,gDAA0E;AAAjE,2GAAA,gBAAgB,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AAC3C,kDAAqD;AAA5C,wGAAA,YAAY,OAAA;AACrB,8DAAyE;AAAhE,4HAAA,0BAA0B,OAAA;AACnC,8DAA6F;AAApF,yHAAA,uBAAuB,OAAA;AAAE,uHAAA,qBAAqB,OAAA;AACvD,wDAA0D;AAAjD,6GAAA,cAAc,OAAA"}
package/src/index.mjs CHANGED
@@ -1,9 +1,10 @@
1
1
  export * from './runtime.mjs';
2
2
  export { FieldSchema, FieldsSchema, LineFieldSchema, LineKindsSchema, OptionSchema, PropertyDefinitionSchema, FilterConditionSchema, FilterItemSchema, MoneyLookSchema, PERIODS, } from './lib/format/field.mjs';
3
- export { ModifierSchema, RolesSchema, CellRulesSchema, ToneWhenSchema, LayoutNodeSchema, RootLayoutSchema, ListNodeSchema } from './lib/format/layout.mjs';
3
+ export { ModifierSchema, RolesSchema, CellRulesSchema, ToneWhenSchema, LayoutNodeSchema, RootLayoutSchema, ListNodeSchema, ListCellSchema } from './lib/format/layout.mjs';
4
4
  export { PageSchema } from './lib/format/page.mjs';
5
5
  export { ActionStepSchema, PageEventsSchema } from './lib/format/actions.mjs';
6
6
  export { validatePage } from './lib/format/validate.mjs';
7
7
  export { AddressSearchOptionsSchema } from './lib/format/address-search.mjs';
8
+ export { PathPickerOptionsSchema, StateDotOptionsSchema } from './lib/format/picker-options.mjs';
8
9
  export { pageJsonSchema } from './lib/format/json-schema.mjs';
9
10
  //# sourceMappingURL=index.mjs.map
package/src/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../../libs/core/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,OAAO,EACL,WAAW,EACX,YAAY,EACZ,eAAe,EACf,eAAe,EACf,YAAY,EACZ,wBAAwB,EACxB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,OAAO,GACR,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACvJ,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../../../libs/core/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,OAAO,EACL,WAAW,EACX,YAAY,EACZ,eAAe,EACf,eAAe,EACf,YAAY,EACZ,wBAAwB,EACxB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,OAAO,GACR,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACvK,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAC7F,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { ActionStep } from './actions.mjs';
2
+ import type { Field, LineField } from './field.mjs';
3
+ import type { ButtonNode, LayoutNode, RootLayout, SheetNode, TabsNode } from './layout.mjs';
4
+ /**
5
+ * The checks of a record's head (`SheetHead`) and of the parts it brought to
6
+ * the format: the band's and the row's fields, its link and its buttons, a
7
+ * tab's count, the tabs placed in the head, and the access keys of fields.
8
+ * The reference check hands over its own tools, so what is said reads as the
9
+ * rest of its findings.
10
+ */
11
+ export interface HeadTools {
12
+ claim(id: string, path: string): void;
13
+ need(name: string, path: string): Field | LineField | undefined;
14
+ report(path: string, message: string): void;
15
+ /** A part as any in a group: its id, its conditions, its fields. */
16
+ walkNode(node: LayoutNode, path: string): void;
17
+ checkModifiers(owner: object, path: string, keys?: readonly string[]): void;
18
+ checkSteps(steps: ActionStep[], path: string): void;
19
+ /** A button's press: steps, an action, or a menu. */
20
+ checkPress(button: ButtonNode, path: string): void;
21
+ /** Whether an id is a part of this page, once the whole page has been walked. */
22
+ isPart(id: string): boolean;
23
+ /** Whether an id is a tab or a wizard step of this page. */
24
+ isPlace(id: string): boolean;
25
+ }
26
+ /**
27
+ * A button's own parts, wherever it stands: an icon to show alone, the
28
+ * condition that presses a toggle, and the items of its menu — each one
29
+ * doing something, and with words.
30
+ */
31
+ export declare function checkButtonParts(button: ButtonNode, path: string, tools: Pick<HeadTools, 'claim' | 'report' | 'checkModifiers' | 'checkSteps'>): void;
32
+ /**
33
+ * The record's head, once the whole page is walked: its kind, its row, its
34
+ * buttons, its band and "Updated by"; then, over the whole page, tabs placed
35
+ * in a head they are not directly under, a tab's icon and count, and the
36
+ * access keys of fields — one field each.
37
+ */
38
+ export declare function checkHead(root: RootLayout, path: string, tools: HeadTools): void;
39
+ /** The tabs a sheet places in its head, if it does. */
40
+ export declare function headTabs(sheet: SheetNode): TabsNode | undefined;
@@ -0,0 +1,40 @@
1
+ import type { ActionStep } from './actions';
2
+ import type { Field, LineField } from './field';
3
+ import type { ButtonNode, LayoutNode, RootLayout, SheetNode, TabsNode } from './layout';
4
+ /**
5
+ * The checks of a record's head (`SheetHead`) and of the parts it brought to
6
+ * the format: the band's and the row's fields, its link and its buttons, a
7
+ * tab's count, the tabs placed in the head, and the access keys of fields.
8
+ * The reference check hands over its own tools, so what is said reads as the
9
+ * rest of its findings.
10
+ */
11
+ export interface HeadTools {
12
+ claim(id: string, path: string): void;
13
+ need(name: string, path: string): Field | LineField | undefined;
14
+ report(path: string, message: string): void;
15
+ /** A part as any in a group: its id, its conditions, its fields. */
16
+ walkNode(node: LayoutNode, path: string): void;
17
+ checkModifiers(owner: object, path: string, keys?: readonly string[]): void;
18
+ checkSteps(steps: ActionStep[], path: string): void;
19
+ /** A button's press: steps, an action, or a menu. */
20
+ checkPress(button: ButtonNode, path: string): void;
21
+ /** Whether an id is a part of this page, once the whole page has been walked. */
22
+ isPart(id: string): boolean;
23
+ /** Whether an id is a tab or a wizard step of this page. */
24
+ isPlace(id: string): boolean;
25
+ }
26
+ /**
27
+ * A button's own parts, wherever it stands: an icon to show alone, the
28
+ * condition that presses a toggle, and the items of its menu — each one
29
+ * doing something, and with words.
30
+ */
31
+ export declare function checkButtonParts(button: ButtonNode, path: string, tools: Pick<HeadTools, 'claim' | 'report' | 'checkModifiers' | 'checkSteps'>): void;
32
+ /**
33
+ * The record's head, once the whole page is walked: its kind, its row, its
34
+ * buttons, its band and "Updated by"; then, over the whole page, tabs placed
35
+ * in a head they are not directly under, a tab's icon and count, and the
36
+ * access keys of fields — one field each.
37
+ */
38
+ export declare function checkHead(root: RootLayout, path: string, tools: HeadTools): void;
39
+ /** The tabs a sheet places in its head, if it does. */
40
+ export declare function headTabs(sheet: SheetNode): TabsNode | undefined;
@@ -0,0 +1,172 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkButtonParts = checkButtonParts;
4
+ exports.checkHead = checkHead;
5
+ exports.headTabs = headTabs;
6
+ const NUMBER = new Set(['integer', 'float', 'monetary']);
7
+ /** What a tab's count can count: a number, lines, links, files. */
8
+ const COUNTED = new Set(['integer', 'float', 'monetary', 'one2many', 'many2many', 'binary', 'image']);
9
+ /** What a record's number can be: a number, or words such as "BUG-12". */
10
+ const NUMBERED = new Set(['integer', 'float', 'char']);
11
+ const DATED = new Set(['date', 'datetime']);
12
+ /**
13
+ * A button's own parts, wherever it stands: an icon to show alone, the
14
+ * condition that presses a toggle, and the items of its menu — each one
15
+ * doing something, and with words.
16
+ */
17
+ function checkButtonParts(button, path, tools) {
18
+ if (button.iconOnly && !button.icon)
19
+ tools.report(`${path}.iconOnly`, 'a button shown by its icon alone needs an icon');
20
+ if (button.pressedLabel !== undefined && button.pressed === undefined)
21
+ tools.report(`${path}.pressedLabel`, 'words while pressed need the condition that presses it (pressed)');
22
+ if ((button.menuIcon !== undefined || button.menuLabel !== undefined) && !button.menu?.length)
23
+ tools.report(`${path}.menu`, 'a chevron of its own needs a menu to open');
24
+ tools.checkModifiers(button, path, ['pressed']);
25
+ button.menu?.forEach((item, i) => checkMenuItem(item, `${path}.menu[${i}]`, tools));
26
+ }
27
+ /** An item of a button's menu, as one of the record's gear menu: its id, its condition, and what it does. */
28
+ function checkMenuItem(item, path, tools) {
29
+ tools.claim(item.id, path);
30
+ tools.checkModifiers(item, path);
31
+ if (!item.steps && item.action === undefined && !item.builtin)
32
+ tools.report(path, 'a menu item needs steps, an action, or a built-in');
33
+ if (item.label === undefined && !item.builtin)
34
+ tools.report(`${path}.label`, 'a menu item needs words, unless it is a built-in');
35
+ if (item.steps)
36
+ tools.checkSteps(item.steps, `${path}.steps`);
37
+ }
38
+ /** Every part of a layout with where it stands, the head's and the title's fields included. */
39
+ function eachPart(root, path, visit) {
40
+ const walk = (nodes, at, parent) => nodes.forEach((node, i) => {
41
+ const here = `${at}[${i}]`;
42
+ visit(node, here, parent);
43
+ if (node.type === 'section')
44
+ walk(node.children, `${here}.children`, node);
45
+ if (node.type === 'tabs') {
46
+ node.children.forEach((tab, j) => {
47
+ visit(tab, `${here}.children[${j}]`, node);
48
+ walk(tab.children, `${here}.children[${j}].children`, tab);
49
+ });
50
+ }
51
+ if (node.type === 'field' && node.lineForm)
52
+ walk(node.lineForm.children, `${here}.lineForm.children`, node);
53
+ });
54
+ if (root.type === 'tabs') {
55
+ visit(root, path, root);
56
+ root.children.forEach((tab, j) => {
57
+ visit(tab, `${path}.children[${j}]`, root);
58
+ walk(tab.children, `${path}.children[${j}].children`, tab);
59
+ });
60
+ return;
61
+ }
62
+ if (root.type === 'list')
63
+ return;
64
+ if (root.type === 'wizard')
65
+ return root.children.forEach((step, i) => walk(step.children, `${path}.children[${i}].children`, root));
66
+ walk(root.children, `${path}.children`, root);
67
+ if (root.type !== 'sheet')
68
+ return;
69
+ for (const place of ['above', 'before', 'after', 'below'])
70
+ walk(root.title?.[place] ?? [], `${path}.title.${place}`, root);
71
+ walk((root.head?.meta ?? []).filter((part) => part.type === 'field'), `${path}.head.meta`, root);
72
+ walk(root.head?.band?.children ?? [], `${path}.head.band.children`, root);
73
+ }
74
+ /**
75
+ * The record's head, once the whole page is walked: its kind, its row, its
76
+ * buttons, its band and "Updated by"; then, over the whole page, tabs placed
77
+ * in a head they are not directly under, a tab's icon and count, and the
78
+ * access keys of fields — one field each.
79
+ */
80
+ function checkHead(root, path, tools) {
81
+ if (root.type === 'sheet' && root.head)
82
+ checkSheetHead(root, path, tools);
83
+ const keys = new Map();
84
+ let headTabs = 0;
85
+ eachPart(root, path, (node, at, parent) => {
86
+ if (node.type === 'tabs' && node.place === 'head') {
87
+ const placed = parent.type === 'sheet' && !!parent.head && parent.children.includes(node);
88
+ if (!placed)
89
+ tools.report(`${at}.place`, 'tabs go in the head only from directly in a sheet with a head');
90
+ else if (++headTabs > 1)
91
+ tools.report(`${at}.place`, 'a head holds one row of tabs');
92
+ }
93
+ if (node.type === 'tab')
94
+ checkTab(node, at, tools);
95
+ if (node.type === 'field' && node.hotkey !== undefined) {
96
+ const first = keys.get(node.hotkey);
97
+ if (first !== undefined)
98
+ tools.report(`${at}.hotkey`, `Alt+${node.hotkey.toUpperCase()} takes the focus to the field at ${first} already`);
99
+ else
100
+ keys.set(node.hotkey, at);
101
+ }
102
+ });
103
+ }
104
+ /** A tab's icon shown alone, and the field it counts. */
105
+ function checkTab(tab, path, tools) {
106
+ if (tab.iconOnly && !tab.icon)
107
+ tools.report(`${path}.iconOnly`, 'a tab shown by its icon alone needs an icon');
108
+ if (tab.count === undefined)
109
+ return;
110
+ const def = tools.need(tab.count, `${path}.count`);
111
+ if (def && !COUNTED.has(def.type))
112
+ tools.report(`${path}.count`, `"${tab.count}" is a ${def.type}; a tab counts a number, a table's lines, links or files`);
113
+ }
114
+ function checkSheetHead(sheet, path, tools) {
115
+ const head = sheet.head;
116
+ const at = `${path}.head`;
117
+ const kind = head.kind;
118
+ if (kind) {
119
+ const def = kind.field !== undefined ? tools.need(kind.field, `${at}.kind.field`) : undefined;
120
+ if (def && def.type !== 'selection' && def.type !== 'many2one')
121
+ tools.report(`${at}.kind.field`, `"${kind.field}" is a ${def.type}; a kind is a selection or a many2one`);
122
+ if (def?.type === 'selection') {
123
+ const values = new Set(def.options.map((option) => String(option.value)));
124
+ for (const value of Object.keys(kind.looks ?? {}))
125
+ if (!values.has(value))
126
+ tools.report(`${at}.kind.looks.${value}`, `"${value}" is not an option of "${kind.field}"`);
127
+ }
128
+ if (kind.looks && kind.field === undefined)
129
+ tools.report(`${at}.kind.looks`, 'a look for each kind needs the field that holds the kind');
130
+ if (kind.numberField !== undefined) {
131
+ const number = tools.need(kind.numberField, `${at}.kind.numberField`);
132
+ if (number && !NUMBERED.has(number.type))
133
+ tools.report(`${at}.kind.numberField`, `"${kind.numberField}" is a ${number.type}; a record's number is a number or words`);
134
+ }
135
+ }
136
+ head.meta?.forEach((part, i) => {
137
+ const here = `${at}.meta[${i}]`;
138
+ if (part.type === 'field')
139
+ return tools.walkNode(part, here);
140
+ tools.claim(part.id, here);
141
+ tools.checkModifiers(part, here);
142
+ const def = tools.need(part.field, `${here}.field`);
143
+ if (def && !NUMBER.has(def.type))
144
+ tools.report(`${here}.field`, `"${part.field}" is a ${def.type}; a link's words follow a number`);
145
+ if (part.target !== undefined && !tools.isPart(part.target))
146
+ tools.report(`${here}.target`, `no part "${part.target}" on this page`);
147
+ if (part.steps)
148
+ tools.checkSteps(part.steps, `${here}.steps`);
149
+ });
150
+ head.actions?.forEach((button, i) => {
151
+ const here = `${at}.actions[${i}]`;
152
+ tools.claim(button.id, here);
153
+ tools.checkModifiers(button, here);
154
+ tools.checkPress(button, here);
155
+ });
156
+ const band = head.band;
157
+ band?.children.forEach((child, i) => tools.walkNode(child, `${at}.band.children[${i}]`));
158
+ const updated = head.updated;
159
+ if (updated) {
160
+ tools.need(updated.byField, `${at}.updated.byField`);
161
+ const date = tools.need(updated.atField, `${at}.updated.atField`);
162
+ if (date && !DATED.has(date.type))
163
+ tools.report(`${at}.updated.atField`, `"${updated.atField}" is a ${date.type}; when it was updated is a date or a datetime`);
164
+ if (updated.opens !== undefined && !tools.isPlace(updated.opens))
165
+ tools.report(`${at}.updated.opens`, `no tab "${updated.opens}" on this page`);
166
+ }
167
+ }
168
+ /** The tabs a sheet places in its head, if it does. */
169
+ function headTabs(sheet) {
170
+ return sheet.head ? sheet.children.find((child) => child.type === 'tabs' && child.place === 'head') : undefined;
171
+ }
172
+ //# sourceMappingURL=head-checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"head-checks.js","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/format/head-checks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,167 @@
1
+ const NUMBER = new Set(['integer', 'float', 'monetary']);
2
+ /** What a tab's count can count: a number, lines, links, files. */
3
+ const COUNTED = new Set(['integer', 'float', 'monetary', 'one2many', 'many2many', 'binary', 'image']);
4
+ /** What a record's number can be: a number, or words such as "BUG-12". */
5
+ const NUMBERED = new Set(['integer', 'float', 'char']);
6
+ const DATED = new Set(['date', 'datetime']);
7
+ /**
8
+ * A button's own parts, wherever it stands: an icon to show alone, the
9
+ * condition that presses a toggle, and the items of its menu — each one
10
+ * doing something, and with words.
11
+ */
12
+ export function checkButtonParts(button, path, tools) {
13
+ if (button.iconOnly && !button.icon)
14
+ tools.report(`${path}.iconOnly`, 'a button shown by its icon alone needs an icon');
15
+ if (button.pressedLabel !== undefined && button.pressed === undefined)
16
+ tools.report(`${path}.pressedLabel`, 'words while pressed need the condition that presses it (pressed)');
17
+ if ((button.menuIcon !== undefined || button.menuLabel !== undefined) && !button.menu?.length)
18
+ tools.report(`${path}.menu`, 'a chevron of its own needs a menu to open');
19
+ tools.checkModifiers(button, path, ['pressed']);
20
+ button.menu?.forEach((item, i) => checkMenuItem(item, `${path}.menu[${i}]`, tools));
21
+ }
22
+ /** An item of a button's menu, as one of the record's gear menu: its id, its condition, and what it does. */
23
+ function checkMenuItem(item, path, tools) {
24
+ tools.claim(item.id, path);
25
+ tools.checkModifiers(item, path);
26
+ if (!item.steps && item.action === undefined && !item.builtin)
27
+ tools.report(path, 'a menu item needs steps, an action, or a built-in');
28
+ if (item.label === undefined && !item.builtin)
29
+ tools.report(`${path}.label`, 'a menu item needs words, unless it is a built-in');
30
+ if (item.steps)
31
+ tools.checkSteps(item.steps, `${path}.steps`);
32
+ }
33
+ /** Every part of a layout with where it stands, the head's and the title's fields included. */
34
+ function eachPart(root, path, visit) {
35
+ const walk = (nodes, at, parent) => nodes.forEach((node, i) => {
36
+ const here = `${at}[${i}]`;
37
+ visit(node, here, parent);
38
+ if (node.type === 'section')
39
+ walk(node.children, `${here}.children`, node);
40
+ if (node.type === 'tabs') {
41
+ node.children.forEach((tab, j) => {
42
+ visit(tab, `${here}.children[${j}]`, node);
43
+ walk(tab.children, `${here}.children[${j}].children`, tab);
44
+ });
45
+ }
46
+ if (node.type === 'field' && node.lineForm)
47
+ walk(node.lineForm.children, `${here}.lineForm.children`, node);
48
+ });
49
+ if (root.type === 'tabs') {
50
+ visit(root, path, root);
51
+ root.children.forEach((tab, j) => {
52
+ visit(tab, `${path}.children[${j}]`, root);
53
+ walk(tab.children, `${path}.children[${j}].children`, tab);
54
+ });
55
+ return;
56
+ }
57
+ if (root.type === 'list')
58
+ return;
59
+ if (root.type === 'wizard')
60
+ return root.children.forEach((step, i) => walk(step.children, `${path}.children[${i}].children`, root));
61
+ walk(root.children, `${path}.children`, root);
62
+ if (root.type !== 'sheet')
63
+ return;
64
+ for (const place of ['above', 'before', 'after', 'below'])
65
+ walk(root.title?.[place] ?? [], `${path}.title.${place}`, root);
66
+ walk((root.head?.meta ?? []).filter((part) => part.type === 'field'), `${path}.head.meta`, root);
67
+ walk(root.head?.band?.children ?? [], `${path}.head.band.children`, root);
68
+ }
69
+ /**
70
+ * The record's head, once the whole page is walked: its kind, its row, its
71
+ * buttons, its band and "Updated by"; then, over the whole page, tabs placed
72
+ * in a head they are not directly under, a tab's icon and count, and the
73
+ * access keys of fields — one field each.
74
+ */
75
+ export function checkHead(root, path, tools) {
76
+ if (root.type === 'sheet' && root.head)
77
+ checkSheetHead(root, path, tools);
78
+ const keys = new Map();
79
+ let headTabs = 0;
80
+ eachPart(root, path, (node, at, parent) => {
81
+ if (node.type === 'tabs' && node.place === 'head') {
82
+ const placed = parent.type === 'sheet' && !!parent.head && parent.children.includes(node);
83
+ if (!placed)
84
+ tools.report(`${at}.place`, 'tabs go in the head only from directly in a sheet with a head');
85
+ else if (++headTabs > 1)
86
+ tools.report(`${at}.place`, 'a head holds one row of tabs');
87
+ }
88
+ if (node.type === 'tab')
89
+ checkTab(node, at, tools);
90
+ if (node.type === 'field' && node.hotkey !== undefined) {
91
+ const first = keys.get(node.hotkey);
92
+ if (first !== undefined)
93
+ tools.report(`${at}.hotkey`, `Alt+${node.hotkey.toUpperCase()} takes the focus to the field at ${first} already`);
94
+ else
95
+ keys.set(node.hotkey, at);
96
+ }
97
+ });
98
+ }
99
+ /** A tab's icon shown alone, and the field it counts. */
100
+ function checkTab(tab, path, tools) {
101
+ if (tab.iconOnly && !tab.icon)
102
+ tools.report(`${path}.iconOnly`, 'a tab shown by its icon alone needs an icon');
103
+ if (tab.count === undefined)
104
+ return;
105
+ const def = tools.need(tab.count, `${path}.count`);
106
+ if (def && !COUNTED.has(def.type))
107
+ tools.report(`${path}.count`, `"${tab.count}" is a ${def.type}; a tab counts a number, a table's lines, links or files`);
108
+ }
109
+ function checkSheetHead(sheet, path, tools) {
110
+ const head = sheet.head;
111
+ const at = `${path}.head`;
112
+ const kind = head.kind;
113
+ if (kind) {
114
+ const def = kind.field !== undefined ? tools.need(kind.field, `${at}.kind.field`) : undefined;
115
+ if (def && def.type !== 'selection' && def.type !== 'many2one')
116
+ tools.report(`${at}.kind.field`, `"${kind.field}" is a ${def.type}; a kind is a selection or a many2one`);
117
+ if (def?.type === 'selection') {
118
+ const values = new Set(def.options.map((option) => String(option.value)));
119
+ for (const value of Object.keys(kind.looks ?? {}))
120
+ if (!values.has(value))
121
+ tools.report(`${at}.kind.looks.${value}`, `"${value}" is not an option of "${kind.field}"`);
122
+ }
123
+ if (kind.looks && kind.field === undefined)
124
+ tools.report(`${at}.kind.looks`, 'a look for each kind needs the field that holds the kind');
125
+ if (kind.numberField !== undefined) {
126
+ const number = tools.need(kind.numberField, `${at}.kind.numberField`);
127
+ if (number && !NUMBERED.has(number.type))
128
+ tools.report(`${at}.kind.numberField`, `"${kind.numberField}" is a ${number.type}; a record's number is a number or words`);
129
+ }
130
+ }
131
+ head.meta?.forEach((part, i) => {
132
+ const here = `${at}.meta[${i}]`;
133
+ if (part.type === 'field')
134
+ return tools.walkNode(part, here);
135
+ tools.claim(part.id, here);
136
+ tools.checkModifiers(part, here);
137
+ const def = tools.need(part.field, `${here}.field`);
138
+ if (def && !NUMBER.has(def.type))
139
+ tools.report(`${here}.field`, `"${part.field}" is a ${def.type}; a link's words follow a number`);
140
+ if (part.target !== undefined && !tools.isPart(part.target))
141
+ tools.report(`${here}.target`, `no part "${part.target}" on this page`);
142
+ if (part.steps)
143
+ tools.checkSteps(part.steps, `${here}.steps`);
144
+ });
145
+ head.actions?.forEach((button, i) => {
146
+ const here = `${at}.actions[${i}]`;
147
+ tools.claim(button.id, here);
148
+ tools.checkModifiers(button, here);
149
+ tools.checkPress(button, here);
150
+ });
151
+ const band = head.band;
152
+ band?.children.forEach((child, i) => tools.walkNode(child, `${at}.band.children[${i}]`));
153
+ const updated = head.updated;
154
+ if (updated) {
155
+ tools.need(updated.byField, `${at}.updated.byField`);
156
+ const date = tools.need(updated.atField, `${at}.updated.atField`);
157
+ if (date && !DATED.has(date.type))
158
+ tools.report(`${at}.updated.atField`, `"${updated.atField}" is a ${date.type}; when it was updated is a date or a datetime`);
159
+ if (updated.opens !== undefined && !tools.isPlace(updated.opens))
160
+ tools.report(`${at}.updated.opens`, `no tab "${updated.opens}" on this page`);
161
+ }
162
+ }
163
+ /** The tabs a sheet places in its head, if it does. */
164
+ export function headTabs(sheet) {
165
+ return sheet.head ? sheet.children.find((child) => child.type === 'tabs' && child.place === 'head') : undefined;
166
+ }
167
+ //# sourceMappingURL=head-checks.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"head-checks.mjs","sourceRoot":"","sources":["../../../../../../libs/core/src/lib/format/head-checks.ts"],"names":[],"mappings":"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"}