@cratis/scene.blueprint.default 4.32.0 → 4.33.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 (122) hide show
  1. package/ComponentName.ts +12 -0
  2. package/defaultBlueprintComponents.ts +5 -1
  3. package/dist/cjs/ComponentName.js +4 -0
  4. package/dist/cjs/ComponentName.js.map +1 -1
  5. package/dist/cjs/defaultBlueprint.js +1 -1
  6. package/dist/cjs/defaultBlueprintComponentMetadata.js +2 -2
  7. package/dist/cjs/defaultBlueprintComponents.js +10 -2
  8. package/dist/cjs/defaultBlueprintComponents.js.map +1 -1
  9. package/dist/cjs/foundation/ChartWrapper.js +520 -0
  10. package/dist/cjs/foundation/ChartWrapper.js.map +1 -0
  11. package/dist/cjs/foundation/ColumnChooser.js +156 -0
  12. package/dist/cjs/foundation/ColumnChooser.js.map +1 -0
  13. package/dist/cjs/foundation/FilterBuilder.js +307 -0
  14. package/dist/cjs/foundation/FilterBuilder.js.map +1 -0
  15. package/dist/cjs/foundation/SavedViewsMenu.js +199 -0
  16. package/dist/cjs/foundation/SavedViewsMenu.js.map +1 -0
  17. package/dist/cjs/foundation/chartGeometry.js +101 -0
  18. package/dist/cjs/foundation/chartGeometry.js.map +1 -0
  19. package/dist/cjs/foundation/columnModel.js +43 -0
  20. package/dist/cjs/foundation/columnModel.js.map +1 -0
  21. package/dist/cjs/foundation/filterModel.js +123 -0
  22. package/dist/cjs/foundation/filterModel.js.map +1 -0
  23. package/dist/cjs/foundation/foundationComponentMetadata.js +28 -0
  24. package/dist/cjs/foundation/foundationComponentMetadata.js.map +1 -1
  25. package/dist/cjs/foundation/foundationDescriptors.js +153 -0
  26. package/dist/cjs/foundation/foundationDescriptors.js.map +1 -1
  27. package/dist/cjs/foundation/foundationSamples.js +130 -0
  28. package/dist/cjs/foundation/foundationSamples.js.map +1 -1
  29. package/dist/cjs/foundation/foundationStrings.js +25 -0
  30. package/dist/cjs/foundation/foundationStrings.js.map +1 -1
  31. package/dist/cjs/foundation/useElementWidth.js +31 -0
  32. package/dist/cjs/foundation/useElementWidth.js.map +1 -0
  33. package/dist/cjs/foundation/viewModel.js +24 -0
  34. package/dist/cjs/foundation/viewModel.js.map +1 -0
  35. package/dist/cjs/index.js +38 -0
  36. package/dist/cjs/index.js.map +1 -1
  37. package/dist/esm/ComponentName.d.ts +5 -1
  38. package/dist/esm/ComponentName.d.ts.map +1 -1
  39. package/dist/esm/ComponentName.js +4 -0
  40. package/dist/esm/ComponentName.js.map +1 -1
  41. package/dist/esm/defaultBlueprint.js +1 -1
  42. package/dist/esm/defaultBlueprintComponentMetadata.js +2 -2
  43. package/dist/esm/defaultBlueprintComponents.d.ts.map +1 -1
  44. package/dist/esm/defaultBlueprintComponents.js +10 -2
  45. package/dist/esm/defaultBlueprintComponents.js.map +1 -1
  46. package/dist/esm/foundation/ChartWrapper.d.ts +5 -0
  47. package/dist/esm/foundation/ChartWrapper.d.ts.map +1 -0
  48. package/dist/esm/foundation/ChartWrapper.js +517 -0
  49. package/dist/esm/foundation/ChartWrapper.js.map +1 -0
  50. package/dist/esm/foundation/ColumnChooser.d.ts +3 -0
  51. package/dist/esm/foundation/ColumnChooser.d.ts.map +1 -0
  52. package/dist/esm/foundation/ColumnChooser.js +154 -0
  53. package/dist/esm/foundation/ColumnChooser.js.map +1 -0
  54. package/dist/esm/foundation/FilterBuilder.d.ts +3 -0
  55. package/dist/esm/foundation/FilterBuilder.d.ts.map +1 -0
  56. package/dist/esm/foundation/FilterBuilder.js +305 -0
  57. package/dist/esm/foundation/FilterBuilder.js.map +1 -0
  58. package/dist/esm/foundation/Foundation.stories.d.ts +16 -0
  59. package/dist/esm/foundation/Foundation.stories.d.ts.map +1 -1
  60. package/dist/esm/foundation/Foundation.stories.js +16 -0
  61. package/dist/esm/foundation/Foundation.stories.js.map +1 -1
  62. package/dist/esm/foundation/SavedViewsMenu.d.ts +4 -0
  63. package/dist/esm/foundation/SavedViewsMenu.d.ts.map +1 -0
  64. package/dist/esm/foundation/SavedViewsMenu.js +196 -0
  65. package/dist/esm/foundation/SavedViewsMenu.js.map +1 -0
  66. package/dist/esm/foundation/chartGeometry.d.ts +34 -0
  67. package/dist/esm/foundation/chartGeometry.d.ts.map +1 -0
  68. package/dist/esm/foundation/chartGeometry.js +93 -0
  69. package/dist/esm/foundation/chartGeometry.js.map +1 -0
  70. package/dist/esm/foundation/columnModel.d.ts +11 -0
  71. package/dist/esm/foundation/columnModel.d.ts.map +1 -0
  72. package/dist/esm/foundation/columnModel.js +38 -0
  73. package/dist/esm/foundation/columnModel.js.map +1 -0
  74. package/dist/esm/foundation/filterModel.d.ts +33 -0
  75. package/dist/esm/foundation/filterModel.d.ts.map +1 -0
  76. package/dist/esm/foundation/filterModel.js +112 -0
  77. package/dist/esm/foundation/filterModel.js.map +1 -0
  78. package/dist/esm/foundation/foundationComponentMetadata.d.ts.map +1 -1
  79. package/dist/esm/foundation/foundationComponentMetadata.js +28 -0
  80. package/dist/esm/foundation/foundationComponentMetadata.js.map +1 -1
  81. package/dist/esm/foundation/foundationDescriptors.d.ts.map +1 -1
  82. package/dist/esm/foundation/foundationDescriptors.js +154 -1
  83. package/dist/esm/foundation/foundationDescriptors.js.map +1 -1
  84. package/dist/esm/foundation/foundationSamples.d.ts.map +1 -1
  85. package/dist/esm/foundation/foundationSamples.js +130 -0
  86. package/dist/esm/foundation/foundationSamples.js.map +1 -1
  87. package/dist/esm/foundation/foundationStrings.d.ts +25 -0
  88. package/dist/esm/foundation/foundationStrings.d.ts.map +1 -1
  89. package/dist/esm/foundation/foundationStrings.js +25 -0
  90. package/dist/esm/foundation/foundationStrings.js.map +1 -1
  91. package/dist/esm/foundation/index.d.ts +9 -0
  92. package/dist/esm/foundation/index.d.ts.map +1 -1
  93. package/dist/esm/foundation/index.js +9 -0
  94. package/dist/esm/foundation/index.js.map +1 -1
  95. package/dist/esm/foundation/useElementWidth.d.ts +3 -0
  96. package/dist/esm/foundation/useElementWidth.d.ts.map +1 -0
  97. package/dist/esm/foundation/useElementWidth.js +29 -0
  98. package/dist/esm/foundation/useElementWidth.js.map +1 -0
  99. package/dist/esm/foundation/viewModel.d.ts +7 -0
  100. package/dist/esm/foundation/viewModel.d.ts.map +1 -0
  101. package/dist/esm/foundation/viewModel.js +22 -0
  102. package/dist/esm/foundation/viewModel.js.map +1 -0
  103. package/dist/esm/index.js +9 -0
  104. package/dist/esm/index.js.map +1 -1
  105. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  106. package/foundation/ChartWrapper.tsx +252 -0
  107. package/foundation/ColumnChooser.tsx +73 -0
  108. package/foundation/FilterBuilder.tsx +144 -0
  109. package/foundation/Foundation.stories.tsx +16 -0
  110. package/foundation/SavedViewsMenu.tsx +94 -0
  111. package/foundation/chartGeometry.ts +108 -0
  112. package/foundation/columnModel.ts +39 -0
  113. package/foundation/filterModel.ts +111 -0
  114. package/foundation/foundationComponentMetadata.ts +4 -0
  115. package/foundation/foundationDescriptors.ts +86 -1
  116. package/foundation/foundationSamples.ts +19 -0
  117. package/foundation/foundationStrings.ts +25 -0
  118. package/foundation/index.ts +9 -0
  119. package/foundation/useElementWidth.ts +31 -0
  120. package/foundation/viewModel.ts +21 -0
  121. package/package.json +8 -8
  122. package/shell/layout.css +285 -0
@@ -0,0 +1,156 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var react = require('react');
5
+ var scene_react = require('@cratis/scene.react');
6
+ var columnModel = require('./columnModel.js');
7
+ var ComponentState = require('./ComponentState.js');
8
+ var FoundationIcon = require('./FoundationIcon.js');
9
+ var foundationStrings = require('./foundationStrings.js');
10
+ var StateFrame = require('./StateFrame.js');
11
+
12
+ /**
13
+ * The `columnChooser` component: which columns a table shows, and in what order.
14
+ *
15
+ * `columns` lists what could be shown (id, label, whether it starts visible, and whether it is locked - the identifying column is). The
16
+ * chooser is a button that discloses a list of checkboxes; each row also has move up and move down buttons, so ordering needs no
17
+ * drag-and-drop. Its `value` output is the ordered list of visible ids, which the table binds its columns to. Escape closes the list and
18
+ * returns focus to the button.
19
+ */ function ColumnChooser({ element, interactions, bindingOutputs }) {
20
+ const supplied = react.useMemo(()=>columnModel.readColumns(element.properties.columns), [
21
+ element.properties.columns
22
+ ]);
23
+ const suppliedKey = JSON.stringify(supplied);
24
+ const [columns, setColumns] = react.useState(supplied);
25
+ const [open, setOpen] = react.useState(false);
26
+ const strings = foundationStrings.readFoundationStrings(element);
27
+ const state = ComponentState.readComponentState(element, supplied.length > 0);
28
+ const panelId = react.useId();
29
+ const button = react.useRef(null);
30
+ react.useEffect(()=>setColumns(supplied), [
31
+ suppliedKey
32
+ ]);
33
+ scene_react.useValueOutput(bindingOutputs, columnModel.visibleColumnIds(columns));
34
+ const apply = (next)=>{
35
+ setColumns(next);
36
+ interactions?.onChange?.();
37
+ };
38
+ const close = (event)=>{
39
+ if (event.key !== 'Escape' || !open) return;
40
+ setOpen(false);
41
+ button.current?.focus();
42
+ };
43
+ return /*#__PURE__*/ jsxRuntime.jsx(StateFrame.FoundationFrame, {
44
+ element: element,
45
+ interactions: interactions,
46
+ name: "column-chooser",
47
+ state: state,
48
+ skeleton: [
49
+ 50
50
+ ],
51
+ children: state !== ComponentState.ComponentState.Loading && /*#__PURE__*/ jsxRuntime.jsxs("div", {
52
+ className: "foundation-popover-host",
53
+ onKeyDown: close,
54
+ children: [
55
+ /*#__PURE__*/ jsxRuntime.jsxs("button", {
56
+ ref: button,
57
+ type: "button",
58
+ className: "foundation-button",
59
+ "data-emphasis": "secondary",
60
+ "aria-expanded": open,
61
+ "aria-controls": panelId,
62
+ onClick: ()=>setOpen(!open),
63
+ children: [
64
+ /*#__PURE__*/ jsxRuntime.jsx(FoundationIcon.FoundationIcon, {
65
+ name: "columns"
66
+ }),
67
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
68
+ children: strings.columnsChoose
69
+ }),
70
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
71
+ className: "foundation-count",
72
+ children: foundationStrings.formatText(strings.columnsShown, {
73
+ shown: columnModel.visibleColumnIds(columns).length,
74
+ total: columns.length
75
+ })
76
+ })
77
+ ]
78
+ }),
79
+ /*#__PURE__*/ jsxRuntime.jsxs("div", {
80
+ id: panelId,
81
+ className: "foundation-popover",
82
+ hidden: !open,
83
+ children: [
84
+ /*#__PURE__*/ jsxRuntime.jsx("ul", {
85
+ className: "foundation-list",
86
+ "aria-label": strings.columnsChoose,
87
+ children: columns.map((column, index)=>/*#__PURE__*/ jsxRuntime.jsxs("li", {
88
+ className: "foundation-list-row",
89
+ children: [
90
+ /*#__PURE__*/ jsxRuntime.jsxs("label", {
91
+ className: "foundation-check",
92
+ children: [
93
+ /*#__PURE__*/ jsxRuntime.jsx("input", {
94
+ type: "checkbox",
95
+ checked: column.visible,
96
+ disabled: column.locked,
97
+ onChange: ()=>apply(columnModel.toggleColumn(columns, index))
98
+ }),
99
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
100
+ children: column.label
101
+ }),
102
+ column.locked && /*#__PURE__*/ jsxRuntime.jsxs("span", {
103
+ className: "foundation-count",
104
+ children: [
105
+ "(",
106
+ strings.columnsLocked,
107
+ ")"
108
+ ]
109
+ })
110
+ ]
111
+ }),
112
+ /*#__PURE__*/ jsxRuntime.jsx("button", {
113
+ type: "button",
114
+ className: "foundation-icon-button",
115
+ disabled: index === 0,
116
+ "aria-label": foundationStrings.formatText(strings.columnsMoveUp, {
117
+ name: column.label
118
+ }),
119
+ onClick: ()=>apply(columnModel.moveColumn(columns, index, -1)),
120
+ children: /*#__PURE__*/ jsxRuntime.jsx(FoundationIcon.FoundationIcon, {
121
+ name: "arrow-up"
122
+ })
123
+ }),
124
+ /*#__PURE__*/ jsxRuntime.jsx("button", {
125
+ type: "button",
126
+ className: "foundation-icon-button",
127
+ disabled: index === columns.length - 1,
128
+ "aria-label": foundationStrings.formatText(strings.columnsMoveDown, {
129
+ name: column.label
130
+ }),
131
+ onClick: ()=>apply(columnModel.moveColumn(columns, index, 1)),
132
+ children: /*#__PURE__*/ jsxRuntime.jsx(FoundationIcon.FoundationIcon, {
133
+ name: "arrow-down"
134
+ })
135
+ })
136
+ ]
137
+ }, column.id))
138
+ }),
139
+ /*#__PURE__*/ jsxRuntime.jsx("button", {
140
+ type: "button",
141
+ className: "foundation-link",
142
+ onClick: ()=>apply(columns.map((column)=>({
143
+ ...column,
144
+ visible: true
145
+ }))),
146
+ children: strings.columnsReset
147
+ })
148
+ ]
149
+ })
150
+ ]
151
+ })
152
+ });
153
+ }
154
+
155
+ exports.ColumnChooser = ColumnChooser;
156
+ //# sourceMappingURL=ColumnChooser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColumnChooser.js","sources":["../../../foundation/ColumnChooser.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { KeyboardEvent, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { RegisteredComponentProps, useValueOutput } from '@cratis/scene.react';\nimport { ChooserColumn, moveColumn, readColumns, toggleColumn, visibleColumnIds } from './columnModel';\nimport { ComponentState, readComponentState } from './ComponentState';\nimport { FoundationIcon } from './FoundationIcon';\nimport { formatText, readFoundationStrings } from './foundationStrings';\nimport { FoundationFrame } from './StateFrame';\n\n/**\n * The `columnChooser` component: which columns a table shows, and in what order.\n *\n * `columns` lists what could be shown (id, label, whether it starts visible, and whether it is locked - the identifying column is). The\n * chooser is a button that discloses a list of checkboxes; each row also has move up and move down buttons, so ordering needs no\n * drag-and-drop. Its `value` output is the ordered list of visible ids, which the table binds its columns to. Escape closes the list and\n * returns focus to the button.\n */\nexport function ColumnChooser({ element, interactions, bindingOutputs }: RegisteredComponentProps) {\n const supplied = useMemo(() => readColumns(element.properties.columns), [element.properties.columns]);\n const suppliedKey = JSON.stringify(supplied);\n const [columns, setColumns] = useState<ChooserColumn[]>(supplied);\n const [open, setOpen] = useState(false);\n const strings = readFoundationStrings(element);\n const state = readComponentState(element, supplied.length > 0);\n const panelId = useId();\n const button = useRef<HTMLButtonElement>(null);\n\n useEffect(() => setColumns(supplied), [suppliedKey]);\n useValueOutput(bindingOutputs, visibleColumnIds(columns));\n\n const apply = (next: ChooserColumn[]) => { setColumns(next); interactions?.onChange?.(); };\n const close = (event: KeyboardEvent) => {\n if (event.key !== 'Escape' || !open) return;\n setOpen(false);\n button.current?.focus();\n };\n\n return (\n <FoundationFrame element={element} interactions={interactions} name='column-chooser' state={state} skeleton={[50]}>\n {state !== ComponentState.Loading && (\n <div className='foundation-popover-host' onKeyDown={close}>\n <button ref={button} type='button' className='foundation-button' data-emphasis='secondary' aria-expanded={open} aria-controls={panelId} onClick={() => setOpen(!open)}>\n <FoundationIcon name='columns' />\n <span>{strings.columnsChoose}</span>\n <span className='foundation-count'>{formatText(strings.columnsShown, { shown: visibleColumnIds(columns).length, total: columns.length })}</span>\n </button>\n <div id={panelId} className='foundation-popover' hidden={!open}>\n <ul className='foundation-list' aria-label={strings.columnsChoose}>\n {columns.map((column, index) => (\n <li key={column.id} className='foundation-list-row'>\n <label className='foundation-check'>\n <input type='checkbox' checked={column.visible} disabled={column.locked} onChange={() => apply(toggleColumn(columns, index))} />\n <span>{column.label}</span>\n {column.locked && <span className='foundation-count'>({strings.columnsLocked})</span>}\n </label>\n <button type='button' className='foundation-icon-button' disabled={index === 0} aria-label={formatText(strings.columnsMoveUp, { name: column.label })} onClick={() => apply(moveColumn(columns, index, -1))}>\n <FoundationIcon name='arrow-up' />\n </button>\n <button type='button' className='foundation-icon-button' disabled={index === columns.length - 1} aria-label={formatText(strings.columnsMoveDown, { name: column.label })} onClick={() => apply(moveColumn(columns, index, 1))}>\n <FoundationIcon name='arrow-down' />\n </button>\n </li>\n ))}\n </ul>\n <button type='button' className='foundation-link' onClick={() => apply(columns.map(column => ({ ...column, visible: true })))}>{strings.columnsReset}</button>\n </div>\n </div>\n )}\n </FoundationFrame>\n );\n}\n"],"names":["ColumnChooser","element","interactions","bindingOutputs","supplied","useMemo","readColumns","properties","columns","suppliedKey","JSON","stringify","setColumns","useState","open","setOpen","strings","readFoundationStrings","state","readComponentState","length","panelId","useId","button","useRef","useEffect","useValueOutput","visibleColumnIds","apply","next","onChange","close","event","key","current","focus","_jsx","FoundationFrame","name","skeleton","ComponentState","Loading","_jsxs","div","className","onKeyDown","ref","type","data-emphasis","aria-expanded","aria-controls","onClick","FoundationIcon","span","columnsChoose","formatText","columnsShown","shown","total","id","hidden","ul","aria-label","map","column","index","li","label","input","checked","visible","disabled","locked","toggleColumn","columnsLocked","columnsMoveUp","moveColumn","columnsMoveDown","columnsReset"],"mappings":"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"}
@@ -0,0 +1,307 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var react = require('react');
5
+ var scene_react = require('@cratis/scene.react');
6
+ var ComponentState = require('./ComponentState.js');
7
+ var ActionButton = require('./ActionButton.js');
8
+ var filterModel = require('./filterModel.js');
9
+ var foundationStrings = require('./foundationStrings.js');
10
+ var StateFrame = require('./StateFrame.js');
11
+ var PermissionRule = require('./PermissionRule.js');
12
+
13
+ const operatorText = (strings, operator)=>{
14
+ const names = {
15
+ contains: strings.opContains,
16
+ equals: strings.opEquals,
17
+ notEquals: strings.opNotEquals,
18
+ startsWith: strings.opStartsWith,
19
+ isEmpty: strings.opIsEmpty,
20
+ greater: strings.opGreater,
21
+ greaterOrEqual: strings.opGreaterOrEqual,
22
+ less: strings.opLess,
23
+ lessOrEqual: strings.opLessOrEqual,
24
+ before: strings.opBefore,
25
+ after: strings.opAfter,
26
+ on: strings.opOn,
27
+ is: strings.opIs,
28
+ isNot: strings.opIsNot,
29
+ true: strings.opTrue,
30
+ false: strings.opFalse
31
+ };
32
+ return names[operator] ?? operator;
33
+ };
34
+ function ValueInput({ field, condition, strings, label, disabled, onChange }) {
35
+ if (filterModel.valuelessOperators.includes(condition.operator)) return undefined;
36
+ if (field?.type === filterModel.FilterFieldType.Select) {
37
+ return /*#__PURE__*/ jsxRuntime.jsxs("select", {
38
+ "aria-label": `${strings.filterValue}, ${label}`,
39
+ value: condition.value,
40
+ disabled: disabled,
41
+ onChange: (event)=>onChange(event.target.value),
42
+ children: [
43
+ /*#__PURE__*/ jsxRuntime.jsx("option", {
44
+ value: "",
45
+ children: "—"
46
+ }),
47
+ field.options.map((option)=>/*#__PURE__*/ jsxRuntime.jsx("option", {
48
+ value: option,
49
+ children: option
50
+ }, option))
51
+ ]
52
+ });
53
+ }
54
+ return /*#__PURE__*/ jsxRuntime.jsx("input", {
55
+ "aria-label": `${strings.filterValue}, ${label}`,
56
+ type: field?.type === filterModel.FilterFieldType.Number ? 'number' : field?.type === filterModel.FilterFieldType.Date ? 'date' : 'text',
57
+ value: condition.value,
58
+ disabled: disabled,
59
+ onChange: (event)=>onChange(event.target.value)
60
+ });
61
+ }
62
+ function GroupEditor({ group, path, fields, strings, locked, change }) {
63
+ const label = path.length === 0 ? strings.filterMatchAll.replace(/ \(.*\)$/, '') : foundationStrings.formatText(strings.filterGroup, {
64
+ n: path.join('.')
65
+ });
66
+ const depth = path.length + 1;
67
+ return /*#__PURE__*/ jsxRuntime.jsxs("div", {
68
+ className: "foundation-filter-group",
69
+ role: "group",
70
+ "aria-label": path.length === 0 ? foundationStrings.formatText(filterModel.countActiveConditions(group) === 1 ? strings.filterSummaryOne : strings.filterSummary, {
71
+ count: filterModel.countActiveConditions(group)
72
+ }) : label,
73
+ "data-depth": depth,
74
+ children: [
75
+ /*#__PURE__*/ jsxRuntime.jsxs("div", {
76
+ className: "foundation-filter-match",
77
+ children: [
78
+ /*#__PURE__*/ jsxRuntime.jsxs("select", {
79
+ "aria-label": strings.filterMatchAll,
80
+ value: group.operator,
81
+ disabled: locked,
82
+ onChange: (event)=>change(path, (current)=>({
83
+ ...current,
84
+ operator: event.target.value === 'or' ? 'or' : 'and'
85
+ })),
86
+ children: [
87
+ /*#__PURE__*/ jsxRuntime.jsx("option", {
88
+ value: "and",
89
+ children: strings.filterMatchAll
90
+ }),
91
+ /*#__PURE__*/ jsxRuntime.jsx("option", {
92
+ value: "or",
93
+ children: strings.filterMatchAny
94
+ })
95
+ ]
96
+ }),
97
+ path.length > 0 && !locked && /*#__PURE__*/ jsxRuntime.jsx("button", {
98
+ type: "button",
99
+ className: "foundation-link",
100
+ onClick: ()=>change(path.slice(0, -1), (parent)=>({
101
+ ...parent,
102
+ groups: parent.groups.filter((_, index)=>index !== path[path.length - 1])
103
+ })),
104
+ children: strings.filterRemoveGroup
105
+ })
106
+ ]
107
+ }),
108
+ group.conditions.map((condition, index)=>{
109
+ const field = fields.find((candidate)=>candidate.name === condition.field);
110
+ const conditionLabel = foundationStrings.formatText(strings.filterCondition, {
111
+ n: index + 1
112
+ });
113
+ return /*#__PURE__*/ jsxRuntime.jsxs("div", {
114
+ className: "foundation-filter-row",
115
+ role: "group",
116
+ "aria-label": conditionLabel,
117
+ children: [
118
+ /*#__PURE__*/ jsxRuntime.jsx("select", {
119
+ "aria-label": `${strings.filterField}, ${conditionLabel}`,
120
+ value: condition.field,
121
+ disabled: locked,
122
+ onChange: (event)=>{
123
+ const next = fields.find((candidate)=>candidate.name === event.target.value);
124
+ change(path, (current)=>({
125
+ ...current,
126
+ conditions: current.conditions.map((existing, position)=>position === index ? {
127
+ field: event.target.value,
128
+ operator: next ? filterModel.filterOperators[next.type][0] : existing.operator,
129
+ value: ''
130
+ } : existing)
131
+ }));
132
+ },
133
+ children: fields.map((candidate)=>/*#__PURE__*/ jsxRuntime.jsx("option", {
134
+ value: candidate.name,
135
+ children: candidate.label
136
+ }, candidate.name))
137
+ }),
138
+ /*#__PURE__*/ jsxRuntime.jsx("select", {
139
+ "aria-label": `${strings.filterOperator}, ${conditionLabel}`,
140
+ value: condition.operator,
141
+ disabled: locked,
142
+ onChange: (event)=>change(path, (current)=>({
143
+ ...current,
144
+ conditions: current.conditions.map((existing, position)=>position === index ? {
145
+ ...existing,
146
+ operator: event.target.value
147
+ } : existing)
148
+ })),
149
+ children: filterModel.filterOperators[field?.type ?? filterModel.FilterFieldType.Text].map((operator)=>/*#__PURE__*/ jsxRuntime.jsx("option", {
150
+ value: operator,
151
+ children: operatorText(strings, operator)
152
+ }, operator))
153
+ }),
154
+ /*#__PURE__*/ jsxRuntime.jsx(ValueInput, {
155
+ field: field,
156
+ condition: condition,
157
+ strings: strings,
158
+ label: conditionLabel,
159
+ disabled: locked,
160
+ onChange: (value)=>change(path, (current)=>({
161
+ ...current,
162
+ conditions: current.conditions.map((existing, position)=>position === index ? {
163
+ ...existing,
164
+ value
165
+ } : existing)
166
+ }))
167
+ }),
168
+ !locked && /*#__PURE__*/ jsxRuntime.jsx("button", {
169
+ type: "button",
170
+ className: "foundation-icon-button",
171
+ "aria-label": `${strings.filterRemove}, ${conditionLabel}`,
172
+ onClick: ()=>change(path, (current)=>({
173
+ ...current,
174
+ conditions: current.conditions.filter((_, position)=>position !== index)
175
+ })),
176
+ children: "×"
177
+ })
178
+ ]
179
+ }, index);
180
+ }),
181
+ group.groups.map((nested, index)=>/*#__PURE__*/ jsxRuntime.jsx(GroupEditor, {
182
+ group: nested,
183
+ path: [
184
+ ...path,
185
+ index
186
+ ],
187
+ fields: fields,
188
+ strings: strings,
189
+ locked: locked,
190
+ change: change
191
+ }, index)),
192
+ !locked && /*#__PURE__*/ jsxRuntime.jsxs("div", {
193
+ className: "foundation-filter-actions",
194
+ children: [
195
+ /*#__PURE__*/ jsxRuntime.jsx("button", {
196
+ type: "button",
197
+ className: "foundation-link",
198
+ onClick: ()=>change(path, (current)=>({
199
+ ...current,
200
+ conditions: [
201
+ ...current.conditions,
202
+ filterModel.newCondition(fields)
203
+ ]
204
+ })),
205
+ children: strings.filterAdd
206
+ }),
207
+ depth < filterModel.maximumFilterDepth && /*#__PURE__*/ jsxRuntime.jsx("button", {
208
+ type: "button",
209
+ className: "foundation-link",
210
+ onClick: ()=>change(path, (current)=>({
211
+ ...current,
212
+ groups: [
213
+ ...current.groups,
214
+ {
215
+ operator: 'and',
216
+ conditions: [
217
+ filterModel.newCondition(fields)
218
+ ],
219
+ groups: []
220
+ }
221
+ ]
222
+ })),
223
+ children: strings.filterAddGroup
224
+ })
225
+ ]
226
+ })
227
+ ]
228
+ });
229
+ }
230
+ /**
231
+ * The `filterBuilder` component: field, operator and value conditions joined by AND or OR, in groups that nest up to three deep.
232
+ *
233
+ * The filter is the component's `value` output - `{ operator, conditions, groups }` - which a list screen binds its query to; the
234
+ * component itself filters nothing. `fields` describe what can be filtered (name, label, type, and options for a select), and
235
+ * the operators on offer follow each field's type. A filter bound in through `value` is read back as the user left it: conditions on
236
+ * fields that no longer exist are dropped rather than shown broken. The component is the filter panel of a list on a desktop and
237
+ * the body of the filter dialog on a phone.
238
+ */ function FilterBuilder({ element, interactions, bindingOutputs }) {
239
+ const fields = react.useMemo(()=>filterModel.readFilterFields(element.properties.fields), [
240
+ element.properties.fields
241
+ ]);
242
+ const supplied = react.useMemo(()=>filterModel.normalizeFilter(element.properties.filter, fields), [
243
+ element.properties.filter,
244
+ fields
245
+ ]);
246
+ const [filter, setFilter] = react.useState(supplied);
247
+ const strings = foundationStrings.readFoundationStrings(element);
248
+ const suppliedKey = JSON.stringify(supplied);
249
+ const state = ComponentState.readComponentState(element, fields.length > 0);
250
+ const locked = PermissionRule.readPermissionRule(element, 'editPermission') !== 'enabled';
251
+ react.useEffect(()=>setFilter(supplied), [
252
+ suppliedKey
253
+ ]);
254
+ scene_react.useValueOutput(bindingOutputs, filter);
255
+ const change = (path, apply)=>{
256
+ const next = filterModel.updateGroupAt(filter, path, apply);
257
+ setFilter(next);
258
+ interactions?.onChange?.();
259
+ };
260
+ const active = filterModel.countActiveConditions(filter);
261
+ return /*#__PURE__*/ jsxRuntime.jsx(StateFrame.FoundationFrame, {
262
+ element: element,
263
+ interactions: interactions,
264
+ name: "filter-builder",
265
+ state: state,
266
+ skeleton: [
267
+ 100,
268
+ 100
269
+ ],
270
+ children: state !== ComponentState.ComponentState.Loading && /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
271
+ children: [
272
+ /*#__PURE__*/ jsxRuntime.jsx(GroupEditor, {
273
+ group: filter,
274
+ path: [],
275
+ fields: fields,
276
+ strings: strings,
277
+ locked: locked,
278
+ change: change
279
+ }),
280
+ /*#__PURE__*/ jsxRuntime.jsxs("div", {
281
+ className: "foundation-filter-footer",
282
+ children: [
283
+ /*#__PURE__*/ jsxRuntime.jsx("span", {
284
+ className: "foundation-filter-summary",
285
+ "aria-live": "polite",
286
+ children: active === 1 ? strings.filterSummaryOne : foundationStrings.formatText(strings.filterSummary, {
287
+ count: active
288
+ })
289
+ }),
290
+ active > 0 && !locked && /*#__PURE__*/ jsxRuntime.jsx(ActionButton.ActionButton, {
291
+ emphasis: "quiet",
292
+ disabledReason: strings.disabledNoPermission,
293
+ onClick: ()=>{
294
+ setFilter(filterModel.emptyFilter());
295
+ interactions?.onChange?.();
296
+ },
297
+ children: strings.filterClear
298
+ })
299
+ ]
300
+ })
301
+ ]
302
+ })
303
+ });
304
+ }
305
+
306
+ exports.FilterBuilder = FilterBuilder;
307
+ //# sourceMappingURL=FilterBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterBuilder.js","sources":["../../../foundation/FilterBuilder.tsx"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { useEffect, useMemo, useState } from 'react';\nimport { RegisteredComponentProps, useValueOutput } from '@cratis/scene.react';\nimport { ComponentState, readComponentState } from './ComponentState';\nimport { ActionButton } from './ActionButton';\nimport {\n FilterCondition, FilterField, emptyFilter, FilterFieldType, FilterGroup, countActiveConditions, filterOperators, maximumFilterDepth, newCondition,\n normalizeFilter, readFilterFields, updateGroupAt, valuelessOperators,\n} from './filterModel';\nimport { FoundationStrings, formatText, readFoundationStrings } from './foundationStrings';\nimport { FoundationFrame } from './StateFrame';\nimport { readPermissionRule } from './PermissionRule';\n\nconst operatorText = (strings: FoundationStrings, operator: string): string => {\n const names: Record<string, string> = {\n contains: strings.opContains, equals: strings.opEquals, notEquals: strings.opNotEquals, startsWith: strings.opStartsWith, isEmpty: strings.opIsEmpty,\n greater: strings.opGreater, greaterOrEqual: strings.opGreaterOrEqual, less: strings.opLess, lessOrEqual: strings.opLessOrEqual,\n before: strings.opBefore, after: strings.opAfter, on: strings.opOn, is: strings.opIs, isNot: strings.opIsNot, true: strings.opTrue, false: strings.opFalse,\n };\n return names[operator] ?? operator;\n};\n\ninterface GroupEditorProps {\n group: FilterGroup;\n path: number[];\n fields: FilterField[];\n strings: FoundationStrings;\n locked: boolean;\n change(path: number[], change: (group: FilterGroup) => FilterGroup): void;\n}\n\nfunction ValueInput({ field, condition, strings, label, disabled, onChange }: { field: FilterField | undefined; condition: FilterCondition; strings: FoundationStrings; label: string; disabled: boolean; onChange(value: string): void }) {\n if (valuelessOperators.includes(condition.operator)) return undefined;\n\n if (field?.type === FilterFieldType.Select) {\n return (\n <select aria-label={`${strings.filterValue}, ${label}`} value={condition.value} disabled={disabled} onChange={event => onChange(event.target.value)}>\n <option value=''>—</option>\n {field.options.map(option => <option key={option} value={option}>{option}</option>)}\n </select>\n );\n }\n\n return <input aria-label={`${strings.filterValue}, ${label}`} type={field?.type === FilterFieldType.Number ? 'number' : field?.type === FilterFieldType.Date ? 'date' : 'text'} value={condition.value} disabled={disabled} onChange={event => onChange(event.target.value)} />;\n}\n\nfunction GroupEditor({ group, path, fields, strings, locked, change }: GroupEditorProps) {\n const label = path.length === 0 ? strings.filterMatchAll.replace(/ \\(.*\\)$/, '') : formatText(strings.filterGroup, { n: path.join('.') });\n const depth = path.length + 1;\n\n return (\n <div className='foundation-filter-group' role='group' aria-label={path.length === 0 ? formatText(countActiveConditions(group) === 1 ? strings.filterSummaryOne : strings.filterSummary, { count: countActiveConditions(group) }) : label} data-depth={depth}>\n <div className='foundation-filter-match'>\n <select aria-label={strings.filterMatchAll} value={group.operator} disabled={locked} onChange={event => change(path, current => ({ ...current, operator: event.target.value === 'or' ? 'or' : 'and' }))}>\n <option value='and'>{strings.filterMatchAll}</option>\n <option value='or'>{strings.filterMatchAny}</option>\n </select>\n {path.length > 0 && !locked && (\n <button type='button' className='foundation-link' onClick={() => change(path.slice(0, -1), parent => ({ ...parent, groups: parent.groups.filter((_, index) => index !== path[path.length - 1]) }))}>{strings.filterRemoveGroup}</button>\n )}\n </div>\n {group.conditions.map((condition, index) => {\n const field = fields.find(candidate => candidate.name === condition.field);\n const conditionLabel = formatText(strings.filterCondition, { n: index + 1 });\n return (\n <div className='foundation-filter-row' role='group' aria-label={conditionLabel} key={index}>\n <select aria-label={`${strings.filterField}, ${conditionLabel}`} value={condition.field} disabled={locked}\n onChange={event => {\n const next = fields.find(candidate => candidate.name === event.target.value);\n change(path, current => ({ ...current, conditions: current.conditions.map((existing, position) => (position === index\n ? { field: event.target.value, operator: next ? filterOperators[next.type][0] : existing.operator, value: '' } : existing)) }));\n }}>\n {fields.map(candidate => <option key={candidate.name} value={candidate.name}>{candidate.label}</option>)}\n </select>\n <select aria-label={`${strings.filterOperator}, ${conditionLabel}`} value={condition.operator} disabled={locked}\n onChange={event => change(path, current => ({ ...current, conditions: current.conditions.map((existing, position) => (position === index ? { ...existing, operator: event.target.value } : existing)) }))}>\n {filterOperators[field?.type ?? FilterFieldType.Text].map(operator => <option key={operator} value={operator}>{operatorText(strings, operator)}</option>)}\n </select>\n <ValueInput field={field} condition={condition} strings={strings} label={conditionLabel} disabled={locked}\n onChange={value => change(path, current => ({ ...current, conditions: current.conditions.map((existing, position) => (position === index ? { ...existing, value } : existing)) }))} />\n {!locked && (\n <button type='button' className='foundation-icon-button' aria-label={`${strings.filterRemove}, ${conditionLabel}`}\n onClick={() => change(path, current => ({ ...current, conditions: current.conditions.filter((_, position) => position !== index) }))}>×</button>\n )}\n </div>\n );\n })}\n {group.groups.map((nested, index) => <GroupEditor key={index} group={nested} path={[...path, index]} fields={fields} strings={strings} locked={locked} change={change} />)}\n {!locked && (\n <div className='foundation-filter-actions'>\n <button type='button' className='foundation-link' onClick={() => change(path, current => ({ ...current, conditions: [...current.conditions, newCondition(fields)] }))}>{strings.filterAdd}</button>\n {depth < maximumFilterDepth && (\n <button type='button' className='foundation-link' onClick={() => change(path, current => ({ ...current, groups: [...current.groups, { operator: 'and', conditions: [newCondition(fields)], groups: [] }] }))}>{strings.filterAddGroup}</button>\n )}\n </div>\n )}\n </div>\n );\n}\n\n/**\n * The `filterBuilder` component: field, operator and value conditions joined by AND or OR, in groups that nest up to three deep.\n *\n * The filter is the component's `value` output - `{ operator, conditions, groups }` - which a list screen binds its query to; the\n * component itself filters nothing. `fields` describe what can be filtered (name, label, type, and options for a select), and\n * the operators on offer follow each field's type. A filter bound in through `value` is read back as the user left it: conditions on\n * fields that no longer exist are dropped rather than shown broken. The component is the filter panel of a list on a desktop and\n * the body of the filter dialog on a phone.\n */\nexport function FilterBuilder({ element, interactions, bindingOutputs }: RegisteredComponentProps) {\n const fields = useMemo(() => readFilterFields(element.properties.fields), [element.properties.fields]);\n const supplied = useMemo(() => normalizeFilter(element.properties.filter, fields), [element.properties.filter, fields]);\n const [filter, setFilter] = useState<FilterGroup>(supplied);\n const strings = readFoundationStrings(element);\n const suppliedKey = JSON.stringify(supplied);\n const state = readComponentState(element, fields.length > 0);\n const locked = readPermissionRule(element, 'editPermission') !== 'enabled';\n\n useEffect(() => setFilter(supplied), [suppliedKey]);\n useValueOutput(bindingOutputs, filter);\n\n const change = (path: number[], apply: (group: FilterGroup) => FilterGroup) => {\n const next = updateGroupAt(filter, path, apply);\n setFilter(next);\n interactions?.onChange?.();\n };\n const active = countActiveConditions(filter);\n\n return (\n <FoundationFrame element={element} interactions={interactions} name='filter-builder' state={state} skeleton={[100, 100]}>\n {state !== ComponentState.Loading && (\n <>\n <GroupEditor group={filter} path={[]} fields={fields} strings={strings} locked={locked} change={change} />\n <div className='foundation-filter-footer'>\n <span className='foundation-filter-summary' aria-live='polite'>{active === 1 ? strings.filterSummaryOne : formatText(strings.filterSummary, { count: active })}</span>\n {active > 0 && !locked && <ActionButton emphasis='quiet' disabledReason={strings.disabledNoPermission} onClick={() => { setFilter(emptyFilter()); interactions?.onChange?.(); }}>{strings.filterClear}</ActionButton>}\n </div>\n </>\n )}\n </FoundationFrame>\n );\n}\n"],"names":["operatorText","strings","operator","names","contains","opContains","equals","opEquals","notEquals","opNotEquals","startsWith","opStartsWith","isEmpty","opIsEmpty","greater","opGreater","greaterOrEqual","opGreaterOrEqual","less","opLess","lessOrEqual","opLessOrEqual","before","opBefore","after","opAfter","on","opOn","is","opIs","isNot","opIsNot","true","opTrue","false","opFalse","ValueInput","field","condition","label","disabled","onChange","valuelessOperators","includes","undefined","type","FilterFieldType","Select","_jsxs","select","aria-label","filterValue","value","event","target","_jsx","option","options","map","input","Number","Date","GroupEditor","group","path","fields","locked","change","length","filterMatchAll","replace","formatText","filterGroup","n","join","depth","div","className","role","countActiveConditions","filterSummaryOne","filterSummary","count","data-depth","current","filterMatchAny","button","onClick","slice","parent","groups","filter","_","index","filterRemoveGroup","conditions","find","candidate","name","conditionLabel","filterCondition","filterField","next","existing","position","filterOperators","filterOperator","Text","filterRemove","nested","newCondition","filterAdd","maximumFilterDepth","filterAddGroup","FilterBuilder","element","interactions","bindingOutputs","useMemo","readFilterFields","properties","supplied","normalizeFilter","setFilter","useState","readFoundationStrings","suppliedKey","JSON","stringify","state","readComponentState","readPermissionRule","useEffect","useValueOutput","apply","updateGroupAt","active","FoundationFrame","skeleton","ComponentState","Loading","_Fragment","span","aria-live","ActionButton","emphasis","disabledReason","disabledNoPermission","emptyFilter","filterClear"],"mappings":"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"}