@servicetitan/dte-unlayer 0.158.0 → 0.160.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 (158) hide show
  1. package/dist/api-core.js +22 -29
  2. package/dist/api-core.js.map +1 -1
  3. package/dist/api-custom-tools.js +23 -29
  4. package/dist/api-custom-tools.js.map +1 -1
  5. package/dist/business-calendar/BusinessCalendarDrawer.d.ts +19 -0
  6. package/dist/business-calendar/BusinessCalendarDrawer.d.ts.map +1 -0
  7. package/dist/business-calendar/BusinessCalendarDrawer.js +41 -0
  8. package/dist/business-calendar/BusinessCalendarDrawer.js.map +1 -0
  9. package/dist/business-calendar/business-calendar-requests.d.ts +25 -0
  10. package/dist/business-calendar/business-calendar-requests.d.ts.map +1 -0
  11. package/dist/business-calendar/business-calendar-requests.js +46 -0
  12. package/dist/business-calendar/business-calendar-requests.js.map +1 -0
  13. package/dist/business-calendar/business-calendar-state.d.ts +22 -0
  14. package/dist/business-calendar/business-calendar-state.d.ts.map +1 -0
  15. package/dist/business-calendar/business-calendar-state.js +74 -0
  16. package/dist/business-calendar/business-calendar-state.js.map +1 -0
  17. package/dist/business-calendar/useBusinessCalendarRequests.d.ts +15 -0
  18. package/dist/business-calendar/useBusinessCalendarRequests.d.ts.map +1 -0
  19. package/dist/business-calendar/useBusinessCalendarRequests.js +30 -0
  20. package/dist/business-calendar/useBusinessCalendarRequests.js.map +1 -0
  21. package/dist/display-conditions/ConditionGroup.d.ts.map +1 -1
  22. package/dist/display-conditions/ConditionGroup.js +20 -89
  23. package/dist/display-conditions/ConditionGroup.js.map +1 -1
  24. package/dist/display-conditions/ConditionGroupsSection.d.ts.map +1 -1
  25. package/dist/display-conditions/ConditionGroupsSection.js +2 -70
  26. package/dist/display-conditions/ConditionGroupsSection.js.map +1 -1
  27. package/dist/display-conditions/ConditionRow.d.ts.map +1 -1
  28. package/dist/display-conditions/ConditionRow.js +88 -212
  29. package/dist/display-conditions/ConditionRow.js.map +1 -1
  30. package/dist/display-conditions/DisplayConditionModal.d.ts.map +1 -1
  31. package/dist/display-conditions/DisplayConditionModal.js +39 -194
  32. package/dist/display-conditions/DisplayConditionModal.js.map +1 -1
  33. package/dist/display-conditions/LookupValueControl.js +42 -105
  34. package/dist/display-conditions/LookupValueControl.js.map +1 -1
  35. package/dist/display-conditions/SeparatorWithChip.js +1 -10
  36. package/dist/display-conditions/SeparatorWithChip.js.map +1 -1
  37. package/dist/display-conditions/constants.js +15 -20
  38. package/dist/display-conditions/constants.js.map +1 -1
  39. package/dist/display-conditions/displayConditionController.js +5 -8
  40. package/dist/display-conditions/displayConditionController.js.map +1 -1
  41. package/dist/display-conditions/lookupOptionsController.js +16 -16
  42. package/dist/display-conditions/lookupOptionsController.js.map +1 -1
  43. package/dist/display-conditions/nunjucks.js +98 -116
  44. package/dist/display-conditions/nunjucks.js.map +1 -1
  45. package/dist/display-conditions/schemaDataPoints.js +13 -11
  46. package/dist/display-conditions/schemaDataPoints.js.map +1 -1
  47. package/dist/display-conditions/types.js +23 -67
  48. package/dist/display-conditions/types.js.map +1 -1
  49. package/dist/display-conditions/useConditionForms.js +38 -56
  50. package/dist/display-conditions/useConditionForms.js.map +1 -1
  51. package/dist/display-conditions/useLookupOptions.js +24 -44
  52. package/dist/display-conditions/useLookupOptions.js.map +1 -1
  53. package/dist/e-sign-offset/ESignDateSignedOffsetModal.js +42 -155
  54. package/dist/e-sign-offset/ESignDateSignedOffsetModal.js.map +1 -1
  55. package/dist/e-sign-offset/ESignOffsetRuleRow.js +12 -73
  56. package/dist/e-sign-offset/ESignOffsetRuleRow.js.map +1 -1
  57. package/dist/e-sign-offset/eSignOffsetController.js +5 -8
  58. package/dist/e-sign-offset/eSignOffsetController.js.map +1 -1
  59. package/dist/editor-core-source.d.ts +2 -2
  60. package/dist/editor-core-source.d.ts.map +1 -1
  61. package/dist/editor-core-source.js +3 -3
  62. package/dist/editor-core-source.js.map +1 -1
  63. package/dist/editor-core.js +2 -2
  64. package/dist/editor-core.js.map +1 -1
  65. package/dist/editor.d.ts.map +1 -1
  66. package/dist/editor.js +56 -118
  67. package/dist/editor.js.map +1 -1
  68. package/dist/image-upload-error.js +3 -3
  69. package/dist/image-upload-error.js.map +1 -1
  70. package/dist/index.d.ts +1 -0
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +0 -1
  73. package/dist/index.js.map +1 -1
  74. package/dist/loadScript.js +7 -8
  75. package/dist/loadScript.js.map +1 -1
  76. package/dist/log.js +2 -3
  77. package/dist/log.js.map +1 -1
  78. package/dist/merge-tags.js +18 -17
  79. package/dist/merge-tags.js.map +1 -1
  80. package/dist/shared/configs.js +1 -2
  81. package/dist/shared/configs.js.map +1 -1
  82. package/dist/shared/const.d.ts +70 -0
  83. package/dist/shared/const.d.ts.map +1 -1
  84. package/dist/shared/const.js +13 -4
  85. package/dist/shared/const.js.map +1 -1
  86. package/dist/shared/date-calc.js +47 -38
  87. package/dist/shared/date-calc.js.map +1 -1
  88. package/dist/shared/e-sign-offset.js +46 -63
  89. package/dist/shared/e-sign-offset.js.map +1 -1
  90. package/dist/shared/edit-icon.js +0 -1
  91. package/dist/shared/edit-icon.js.map +1 -1
  92. package/dist/shared/fonts.js +16 -17
  93. package/dist/shared/fonts.js.map +1 -1
  94. package/dist/shared/forms.js +16 -38
  95. package/dist/shared/forms.js.map +1 -1
  96. package/dist/shared/instance-id.js +6 -9
  97. package/dist/shared/instance-id.js.map +1 -1
  98. package/dist/shared/nunjucks-helpers.js +2 -5
  99. package/dist/shared/nunjucks-helpers.js.map +1 -1
  100. package/dist/shared/schema.js +52 -96
  101. package/dist/shared/schema.js.map +1 -1
  102. package/dist/shared/tools.js +6 -13
  103. package/dist/shared/tools.js.map +1 -1
  104. package/dist/store.d.ts +15 -1
  105. package/dist/store.d.ts.map +1 -1
  106. package/dist/store.js +851 -548
  107. package/dist/store.js.map +1 -1
  108. package/dist/tools.js +133 -143
  109. package/dist/tools.js.map +1 -1
  110. package/dist/unlayer-interface.d.ts +15 -4
  111. package/dist/unlayer-interface.d.ts.map +1 -1
  112. package/dist/unlayer-interface.js +1 -2
  113. package/dist/unlayer-interface.js.map +1 -1
  114. package/dist/unlayer.js +86 -113
  115. package/dist/unlayer.js.map +1 -1
  116. package/dist/vendor/dte-shared/business-calendar-validation.utils.d.ts +25 -0
  117. package/dist/vendor/dte-shared/business-calendar-validation.utils.js +80 -0
  118. package/dist/vendor/dte-shared/components/business-calendar-section.d.ts +15 -0
  119. package/dist/vendor/dte-shared/components/business-calendar-section.js +14 -0
  120. package/dist/vendor/dte-shared/components/schedule-drawer.d.ts +18 -0
  121. package/dist/vendor/dte-shared/components/schedule-drawer.js +119 -0
  122. package/dist/vendor/dte-shared/components/schedule-picker.d.ts +8 -0
  123. package/dist/vendor/dte-shared/components/schedule-picker.js +88 -0
  124. package/dist/vendor/dte-shared/constants.d.ts +31 -0
  125. package/dist/vendor/dte-shared/constants.js +34 -0
  126. package/dist/vendor/dte-shared/field-schedule-editor-context.d.ts +31 -0
  127. package/dist/vendor/dte-shared/field-schedule-editor-context.js +110 -0
  128. package/dist/vendor/dte-shared/index.d.ts +8 -0
  129. package/dist/vendor/dte-shared/index.js +7 -0
  130. package/dist/vendor/dte-shared/schedule-bindings.utils.d.ts +22 -0
  131. package/dist/vendor/dte-shared/schedule-bindings.utils.js +31 -0
  132. package/dist/vendor/dte-shared/styles/schedule.css +19 -0
  133. package/dist/vendor/dte-shared/types.d.ts +129 -0
  134. package/dist/vendor/dte-shared/types.js +1 -0
  135. package/package.json +7 -1
  136. package/src/__tests__/business-calendar-drawer.test.tsx +183 -0
  137. package/src/__tests__/business-calendar-requests.test.ts +166 -0
  138. package/src/__tests__/business-calendar-state.test.tsx +142 -0
  139. package/src/__tests__/condition-row.test.tsx +51 -8
  140. package/src/__tests__/e-sign-offset-modal.test.tsx +13 -2
  141. package/src/__tests__/store.business-calendar.test.ts +185 -0
  142. package/src/__tests__/unlayer.e-sign-types.test.ts +30 -0
  143. package/src/business-calendar/BusinessCalendarDrawer.tsx +76 -0
  144. package/src/business-calendar/business-calendar-requests.ts +80 -0
  145. package/src/business-calendar/business-calendar-state.ts +113 -0
  146. package/src/business-calendar/useBusinessCalendarRequests.ts +49 -0
  147. package/src/display-conditions/ConditionGroup.tsx +13 -3
  148. package/src/display-conditions/ConditionGroupsSection.tsx +24 -21
  149. package/src/display-conditions/ConditionRow.tsx +75 -32
  150. package/src/display-conditions/DisplayConditionModal.tsx +18 -59
  151. package/src/e-sign-offset/ESignDateSignedOffsetModal.tsx +6 -6
  152. package/src/editor-core-source.ts +2 -2
  153. package/src/editor.tsx +15 -0
  154. package/src/index.ts +10 -0
  155. package/src/shared/const.ts +59 -0
  156. package/src/store.ts +67 -5
  157. package/src/unlayer-interface.tsx +15 -4
  158. package/src/unlayer.tsx +5 -5
@@ -3,21 +3,22 @@ import { TextField } from '@servicetitan/anvil2';
3
3
  import { SelectField, SelectFieldSync } from '@servicetitan/anvil2/beta';
4
4
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
5
5
  import { useLookupOptions } from './useLookupOptions';
6
- const toOption = (option)=>({
7
- id: option.key,
8
- label: option.label
9
- });
6
+ const toOption = (option) => ({
7
+ id: option.key,
8
+ label: option.label,
9
+ });
10
10
  /*
11
11
  * Searchable sources return nothing until the user types, which would make the
12
12
  * dropdown show its built-in "No match found" empty state on open — confusing
13
13
  * before any search has happened. Render a disabled hint instead so the list is
14
14
  * never mistaken for "no results".
15
- */ const SEARCH_HINT_OPTION = {
15
+ */
16
+ const SEARCH_HINT_OPTION = {
16
17
  id: '__lookup_search_hint__',
17
18
  label: 'Start typing to search…',
18
- disabled: true
19
+ disabled: true,
19
20
  };
20
- const sanitizeNumericInput = (raw)=>{
21
+ const sanitizeNumericInput = (raw) => {
21
22
  let value = raw.replaceAll(/[^0-9.-]/g, '');
22
23
  const isNegative = value.startsWith('-');
23
24
  value = value.replaceAll('-', '');
@@ -39,66 +40,48 @@ const sanitizeNumericInput = (raw)=>{
39
40
  * Unlayer persists conditions as a Nunjucks string, so a saved searchable value
40
41
  * has no stored label — we display the saved key as the label until the user
41
42
  * re-searches and re-selects.
42
- */ export function LookupValueControl({ fieldType, lookupSource, onChange, value }) {
43
+ */
44
+ export function LookupValueControl({ fieldType, lookupSource, onChange, value, }) {
43
45
  const { loadOptions, options, resolveOptions, status } = useLookupOptions(lookupSource);
44
- const staticOptions = useMemo(()=>options.map(toOption), [
45
- options
46
- ]);
46
+ const staticOptions = useMemo(() => options.map(toOption), [options]);
47
47
  /*
48
48
  * Fall back to the raw value so a saved key that the host omits from its list
49
49
  * (e.g. an inactive/renamed option) still shows on edit instead of vanishing.
50
- */ const staticSelected = useMemo(()=>{
51
- var _staticOptions_find;
50
+ */
51
+ const staticSelected = useMemo(() => {
52
+ var _a;
52
53
  if (!value) {
53
54
  return null;
54
55
  }
55
- return (_staticOptions_find = staticOptions.find((option)=>String(option.id) === value)) !== null && _staticOptions_find !== void 0 ? _staticOptions_find : {
56
- id: value,
57
- label: value
58
- };
59
- }, [
60
- staticOptions,
61
- value
62
- ]);
56
+ return ((_a = staticOptions.find(option => String(option.id) === value)) !== null && _a !== void 0 ? _a : { id: value, label: value });
57
+ }, [staticOptions, value]);
63
58
  /*
64
59
  * Ensure the saved value is present in the list so it is visible/selectable
65
60
  * even when the host did not return it.
66
- */ const staticOptionsWithSelected = useMemo(()=>{
67
- if (staticSelected && !staticOptions.some((option)=>String(option.id) === String(staticSelected.id))) {
68
- return [
69
- staticSelected,
70
- ...staticOptions
71
- ];
61
+ */
62
+ const staticOptionsWithSelected = useMemo(() => {
63
+ if (staticSelected &&
64
+ !staticOptions.some(option => String(option.id) === String(staticSelected.id))) {
65
+ return [staticSelected, ...staticOptions];
72
66
  }
73
67
  return staticOptions;
74
- }, [
75
- staticOptions,
76
- staticSelected
77
- ]);
78
- const [searchableSelected, setSearchableSelected] = useState(value ? {
79
- id: value,
80
- label: value
81
- } : null);
68
+ }, [staticOptions, staticSelected]);
69
+ const [searchableSelected, setSearchableSelected] = useState(value ? { id: value, label: value } : null);
82
70
  // Tracks the key we've already turned into a human-readable label so we don't re-resolve it.
83
71
  const resolvedKeyRef = useRef(null);
84
- useEffect(()=>{
85
- setSearchableSelected((prev)=>{
72
+ useEffect(() => {
73
+ setSearchableSelected(prev => {
86
74
  if (!value) {
87
75
  return null;
88
76
  }
89
77
  if ((prev === null || prev === void 0 ? void 0 : prev.id) === value) {
90
78
  return prev;
91
79
  }
92
- return {
93
- id: value,
94
- label: value
95
- };
80
+ return { id: value, label: value };
96
81
  });
97
- }, [
98
- value
99
- ]);
82
+ }, [value]);
100
83
  // On open (or when a saved searchable value appears), ask the host to resolve key -> label.
101
- useEffect(()=>{
84
+ useEffect(() => {
102
85
  if (status !== 'searchable' || !value) {
103
86
  resolvedKeyRef.current = null;
104
87
  return;
@@ -107,90 +90,44 @@ const sanitizeNumericInput = (raw)=>{
107
90
  return;
108
91
  }
109
92
  let cancelled = false;
110
- resolveOptions([
111
- value
112
- ]).then((result)=>{
93
+ resolveOptions([value]).then(result => {
113
94
  if (cancelled) {
114
95
  return;
115
96
  }
116
- const match = result.find((option)=>option.key === value);
97
+ const match = result.find(option => option.key === value);
117
98
  if (match) {
118
99
  resolvedKeyRef.current = value;
119
- setSearchableSelected({
120
- id: match.key,
121
- label: match.label
122
- });
100
+ setSearchableSelected({ id: match.key, label: match.label });
123
101
  }
124
102
  });
125
- return ()=>{
103
+ return () => {
126
104
  cancelled = true;
127
105
  };
128
- }, [
129
- status,
130
- value,
131
- resolveOptions
132
- ]);
133
- const handleLoadOptions = useCallback(async (query)=>{
106
+ }, [status, value, resolveOptions]);
107
+ const handleLoadOptions = useCallback(async (query) => {
134
108
  if (!query.trim()) {
135
- return [
136
- SEARCH_HINT_OPTION
137
- ];
109
+ return [SEARCH_HINT_OPTION];
138
110
  }
139
111
  const result = await loadOptions(query);
140
112
  return result.map(toOption);
141
- }, [
142
- loadOptions
143
- ]);
113
+ }, [loadOptions]);
144
114
  if (status === 'loading') {
145
- return /*#__PURE__*/ _jsx(TextField, {
146
- label: "Value",
147
- flex: 1,
148
- disabled: true,
149
- value: "",
150
- placeholder: "",
151
- "aria-label": "Value"
152
- });
115
+ return (_jsx(TextField, { label: "Value", flex: 1, disabled: true, value: "", placeholder: "", "aria-label": "Value" }));
153
116
  }
154
117
  if (status === 'static') {
155
- return /*#__PURE__*/ _jsx(SelectFieldSync, {
156
- flex: 1,
157
- label: "Value",
158
- placeholder: "Search value...",
159
- options: staticOptionsWithSelected,
160
- value: staticSelected,
161
- onSelectedOptionChange: (option)=>onChange(option ? String(option.id) : '')
162
- });
118
+ return (_jsx(SelectFieldSync, { flex: 1, label: "Value", placeholder: "Search value...", options: staticOptionsWithSelected, value: staticSelected, onSelectedOptionChange: option => onChange(option ? String(option.id) : '') }));
163
119
  }
164
120
  if (status === 'searchable') {
165
- return /*#__PURE__*/ _jsx(SelectField, {
166
- flex: 1,
167
- label: "Value",
168
- placeholder: "Type to search...",
169
- initialLoad: "open",
170
- loadOptions: handleLoadOptions,
171
- value: searchableSelected,
172
- onSelectedOptionChange: (option)=>{
121
+ return (_jsx(SelectField, { flex: 1, label: "Value", placeholder: "Type to search...", initialLoad: "open", loadOptions: handleLoadOptions, value: searchableSelected, onSelectedOptionChange: option => {
173
122
  resolvedKeyRef.current = option ? String(option.id) : null;
174
123
  setSearchableSelected(option);
175
124
  onChange(option ? String(option.id) : '');
176
- }
177
- });
125
+ } }));
178
126
  }
179
127
  // idle / fallback (no source, empty, error, or timeout) -> free text.
180
- const handleTextChange = (raw)=>{
128
+ const handleTextChange = (raw) => {
181
129
  onChange(fieldType === 'number' ? sanitizeNumericInput(raw) : raw);
182
130
  };
183
- return /*#__PURE__*/ _jsx(TextField, {
184
- label: "Value",
185
- flex: 1,
186
- value: value,
187
- onChange: (e)=>handleTextChange(e.target.value),
188
- placeholder: fieldType === 'number' ? 'e.g. 1.5' : 'Enter value...',
189
- "aria-label": "Value",
190
- ...fieldType === 'number' && {
191
- inputMode: 'decimal'
192
- }
193
- });
131
+ return (_jsx(TextField, { label: "Value", flex: 1, value: value, onChange: e => handleTextChange(e.target.value), placeholder: fieldType === 'number' ? 'e.g. 1.5' : 'Enter value...', "aria-label": "Value", ...(fieldType === 'number' && { inputMode: 'decimal' }) }));
194
132
  }
195
-
196
133
  //# sourceMappingURL=LookupValueControl.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/display-conditions/LookupValueControl.tsx"],"sourcesContent":["import { TextField } from '@servicetitan/anvil2';\nimport { SelectField, SelectFieldOption, SelectFieldSync } from '@servicetitan/anvil2/beta';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { LookupOption } from './lookupOptionsController';\nimport { useLookupOptions } from './useLookupOptions';\n\nexport interface LookupValueControlProps {\n value: string;\n fieldType: 'number' | 'string';\n /** The selected data point's `options.fieldLookupSource`; empty -> free-text input. */\n lookupSource?: string;\n onChange: (value: string) => void;\n}\n\nconst toOption = (option: LookupOption): SelectFieldOption => ({\n id: option.key,\n label: option.label,\n});\n\n/*\n * Searchable sources return nothing until the user types, which would make the\n * dropdown show its built-in \"No match found\" empty state on open — confusing\n * before any search has happened. Render a disabled hint instead so the list is\n * never mistaken for \"no results\".\n */\nconst SEARCH_HINT_OPTION: SelectFieldOption = {\n id: '__lookup_search_hint__',\n label: 'Start typing to search…',\n disabled: true,\n};\n\nconst sanitizeNumericInput = (raw: string): string => {\n let value = raw.replaceAll(/[^0-9.-]/g, '');\n const isNegative = value.startsWith('-');\n value = value.replaceAll('-', '');\n if (isNegative) {\n value = `-${value}`;\n }\n const firstDot = value.indexOf('.');\n if (firstDot >= 0) {\n value = `${value.slice(0, firstDot + 1)}${value.slice(firstDot + 1).replaceAll('.', '')}`;\n }\n return value;\n};\n\n/**\n * Renders the value control for a single condition based on the field's lookup source:\n * - `static` -> full list returned by the host, filtered locally (`SelectFieldSync`).\n * - `searchable` -> host searches per typed query (`SelectField` + `loadOptions`).\n * - `idle`/`fallback`/`loading` -> free-text input (never block the user).\n *\n * Unlayer persists conditions as a Nunjucks string, so a saved searchable value\n * has no stored label — we display the saved key as the label until the user\n * re-searches and re-selects.\n */\nexport function LookupValueControl({\n fieldType,\n lookupSource,\n onChange,\n value,\n}: Readonly<LookupValueControlProps>) {\n const { loadOptions, options, resolveOptions, status } = useLookupOptions(lookupSource);\n\n const staticOptions = useMemo<SelectFieldOption[]>(() => options.map(toOption), [options]);\n\n /*\n * Fall back to the raw value so a saved key that the host omits from its list\n * (e.g. an inactive/renamed option) still shows on edit instead of vanishing.\n */\n const staticSelected = useMemo<SelectFieldOption | null>(() => {\n if (!value) {\n return null;\n }\n return (\n staticOptions.find(option => String(option.id) === value) ?? { id: value, label: value }\n );\n }, [staticOptions, value]);\n\n /*\n * Ensure the saved value is present in the list so it is visible/selectable\n * even when the host did not return it.\n */\n const staticOptionsWithSelected = useMemo<SelectFieldOption[]>(() => {\n if (\n staticSelected &&\n !staticOptions.some(option => String(option.id) === String(staticSelected.id))\n ) {\n return [staticSelected, ...staticOptions];\n }\n return staticOptions;\n }, [staticOptions, staticSelected]);\n\n const [searchableSelected, setSearchableSelected] = useState<SelectFieldOption | null>(\n value ? { id: value, label: value } : null,\n );\n\n // Tracks the key we've already turned into a human-readable label so we don't re-resolve it.\n const resolvedKeyRef = useRef<string | null>(null);\n\n useEffect(() => {\n setSearchableSelected(prev => {\n if (!value) {\n return null;\n }\n if (prev?.id === value) {\n return prev;\n }\n return { id: value, label: value };\n });\n }, [value]);\n\n // On open (or when a saved searchable value appears), ask the host to resolve key -> label.\n useEffect(() => {\n if (status !== 'searchable' || !value) {\n resolvedKeyRef.current = null;\n return;\n }\n if (resolvedKeyRef.current === value) {\n return;\n }\n\n let cancelled = false;\n resolveOptions([value]).then(result => {\n if (cancelled) {\n return;\n }\n const match = result.find(option => option.key === value);\n if (match) {\n resolvedKeyRef.current = value;\n setSearchableSelected({ id: match.key, label: match.label });\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [status, value, resolveOptions]);\n\n const handleLoadOptions = useCallback(\n async (query: string) => {\n if (!query.trim()) {\n return [SEARCH_HINT_OPTION];\n }\n const result = await loadOptions(query);\n return result.map(toOption);\n },\n [loadOptions],\n );\n\n if (status === 'loading') {\n return (\n <TextField label=\"Value\" flex={1} disabled value=\"\" placeholder=\"\" aria-label=\"Value\" />\n );\n }\n\n if (status === 'static') {\n return (\n <SelectFieldSync\n flex={1}\n label=\"Value\"\n placeholder=\"Search value...\"\n options={staticOptionsWithSelected}\n value={staticSelected}\n onSelectedOptionChange={option => onChange(option ? String(option.id) : '')}\n />\n );\n }\n\n if (status === 'searchable') {\n return (\n <SelectField\n flex={1}\n label=\"Value\"\n placeholder=\"Type to search...\"\n initialLoad=\"open\"\n loadOptions={handleLoadOptions}\n value={searchableSelected}\n onSelectedOptionChange={option => {\n resolvedKeyRef.current = option ? String(option.id) : null;\n setSearchableSelected(option);\n onChange(option ? String(option.id) : '');\n }}\n />\n );\n }\n\n // idle / fallback (no source, empty, error, or timeout) -> free text.\n const handleTextChange = (raw: string) => {\n onChange(fieldType === 'number' ? sanitizeNumericInput(raw) : raw);\n };\n\n return (\n <TextField\n label=\"Value\"\n flex={1}\n value={value}\n onChange={e => handleTextChange(e.target.value)}\n placeholder={fieldType === 'number' ? 'e.g. 1.5' : 'Enter value...'}\n aria-label=\"Value\"\n {...(fieldType === 'number' && { inputMode: 'decimal' })}\n />\n );\n}\n"],"names":["TextField","SelectField","SelectFieldSync","useCallback","useEffect","useMemo","useRef","useState","useLookupOptions","toOption","option","id","key","label","SEARCH_HINT_OPTION","disabled","sanitizeNumericInput","raw","value","replaceAll","isNegative","startsWith","firstDot","indexOf","slice","LookupValueControl","fieldType","lookupSource","onChange","loadOptions","options","resolveOptions","status","staticOptions","map","staticSelected","find","String","staticOptionsWithSelected","some","searchableSelected","setSearchableSelected","resolvedKeyRef","prev","current","cancelled","then","result","match","handleLoadOptions","query","trim","flex","placeholder","aria-label","onSelectedOptionChange","initialLoad","handleTextChange","e","target","inputMode"],"mappings":"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"}
1
+ {"version":3,"file":"LookupValueControl.js","sourceRoot":"","sources":["../../src/display-conditions/LookupValueControl.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAqB,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAUtD,MAAM,QAAQ,GAAG,CAAC,MAAoB,EAAqB,EAAE,CAAC,CAAC;IAC3D,EAAE,EAAE,MAAM,CAAC,GAAG;IACd,KAAK,EAAE,MAAM,CAAC,KAAK;CACtB,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,kBAAkB,GAAsB;IAC1C,EAAE,EAAE,wBAAwB;IAC5B,KAAK,EAAE,yBAAyB;IAChC,QAAQ,EAAE,IAAI;CACjB,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,GAAW,EAAU,EAAE;IACjD,IAAI,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACzC,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAClC,IAAI,UAAU,EAAE,CAAC;QACb,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;IACxB,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QAChB,KAAK,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC;IAC9F,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAC/B,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,KAAK,GAC2B;IAChC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAExF,MAAM,aAAa,GAAG,OAAO,CAAsB,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAE3F;;;OAGG;IACH,MAAM,cAAc,GAAG,OAAO,CAA2B,GAAG,EAAE;;QAC1D,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QAChB,CAAC;QACD,OAAO,CACH,MAAA,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,mCAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAC3F,CAAC;IACN,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC;IAE3B;;;OAGG;IACH,MAAM,yBAAyB,GAAG,OAAO,CAAsB,GAAG,EAAE;QAChE,IACI,cAAc;YACd,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,EAChF,CAAC;YACC,OAAO,CAAC,cAAc,EAAE,GAAG,aAAa,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,aAAa,CAAC;IACzB,CAAC,EAAE,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,CAAC;IAEpC,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CACxD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAC7C,CAAC;IAEF,6FAA6F;IAC7F,MAAM,cAAc,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAEnD,SAAS,CAAC,GAAG,EAAE;QACX,qBAAqB,CAAC,IAAI,CAAC,EAAE;YACzB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,OAAO,IAAI,CAAC;YAChB,CAAC;YACD,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,EAAE,MAAK,KAAK,EAAE,CAAC;gBACrB,OAAO,IAAI,CAAC;YAChB,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACvC,CAAC,CAAC,CAAC;IACP,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,4FAA4F;IAC5F,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,MAAM,KAAK,YAAY,IAAI,CAAC,KAAK,EAAE,CAAC;YACpC,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;YAC9B,OAAO;QACX,CAAC;QACD,IAAI,cAAc,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YACnC,OAAO;QACX,CAAC;QAED,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,cAAc,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;YAClC,IAAI,SAAS,EAAE,CAAC;gBACZ,OAAO;YACX,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC;YAC1D,IAAI,KAAK,EAAE,CAAC;gBACR,cAAc,CAAC,OAAO,GAAG,KAAK,CAAC;gBAC/B,qBAAqB,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YACjE,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACR,SAAS,GAAG,IAAI,CAAC;QACrB,CAAC,CAAC;IACN,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;IAEpC,MAAM,iBAAiB,GAAG,WAAW,CACjC,KAAK,EAAE,KAAa,EAAE,EAAE;QACpB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAChB,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAChC,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,CAAC;QACxC,OAAO,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC,EACD,CAAC,WAAW,CAAC,CAChB,CAAC;IAEF,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,CACH,KAAC,SAAS,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,QAAC,KAAK,EAAC,EAAE,EAAC,WAAW,EAAC,EAAE,gBAAY,OAAO,GAAG,CAC3F,CAAC;IACN,CAAC;IAED,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACtB,OAAO,CACH,KAAC,eAAe,IACZ,IAAI,EAAE,CAAC,EACP,KAAK,EAAC,OAAO,EACb,WAAW,EAAC,iBAAiB,EAC7B,OAAO,EAAE,yBAAyB,EAClC,KAAK,EAAE,cAAc,EACrB,sBAAsB,EAAE,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAC7E,CACL,CAAC;IACN,CAAC;IAED,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAC1B,OAAO,CACH,KAAC,WAAW,IACR,IAAI,EAAE,CAAC,EACP,KAAK,EAAC,OAAO,EACb,WAAW,EAAC,mBAAmB,EAC/B,WAAW,EAAC,MAAM,EAClB,WAAW,EAAE,iBAAiB,EAC9B,KAAK,EAAE,kBAAkB,EACzB,sBAAsB,EAAE,MAAM,CAAC,EAAE;gBAC7B,cAAc,CAAC,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC3D,qBAAqB,CAAC,MAAM,CAAC,CAAC;gBAC9B,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9C,CAAC,GACH,CACL,CAAC;IACN,CAAC;IAED,sEAAsE;IACtE,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAAE,EAAE;QACrC,QAAQ,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACvE,CAAC,CAAC;IAEF,OAAO,CACH,KAAC,SAAS,IACN,KAAK,EAAC,OAAO,EACb,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC/C,WAAW,EAAE,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,gBAAgB,gBACxD,OAAO,KACd,CAAC,SAAS,KAAK,QAAQ,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,GAC1D,CACL,CAAC;AACN,CAAC"}
@@ -1,15 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { Chip, Divider } from '@servicetitan/anvil2';
3
3
  export function SeparatorWithChip({ color = '#94a3b8', label }) {
4
- return /*#__PURE__*/ _jsx(Divider, {
5
- alignContent: "center",
6
- spacing: "2",
7
- children: /*#__PURE__*/ _jsx(Chip, {
8
- label: label,
9
- size: "small",
10
- color: color
11
- })
12
- });
4
+ return (_jsx(Divider, { alignContent: "center", spacing: "2", children: _jsx(Chip, { label: label, size: "small", color: color }) }));
13
5
  }
14
-
15
6
  //# sourceMappingURL=SeparatorWithChip.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/display-conditions/SeparatorWithChip.tsx"],"sourcesContent":["import { Chip, Divider } from '@servicetitan/anvil2';\n\nexport interface SeparatorWithChipProps {\n label: string;\n color?: string;\n}\n\nexport function SeparatorWithChip({ color = '#94a3b8', label }: Readonly<SeparatorWithChipProps>) {\n return (\n <Divider alignContent=\"center\" spacing=\"2\">\n <Chip label={label} size=\"small\" color={color} />\n </Divider>\n );\n}\n"],"names":["Chip","Divider","SeparatorWithChip","color","label","alignContent","spacing","size"],"mappings":";AAAA,SAASA,IAAI,EAAEC,OAAO,QAAQ,uBAAuB;AAOrD,OAAO,SAASC,kBAAkB,EAAEC,QAAQ,SAAS,EAAEC,KAAK,EAAoC;IAC5F,qBACI,KAACH;QAAQI,cAAa;QAASC,SAAQ;kBACnC,cAAA,KAACN;YAAKI,OAAOA;YAAOG,MAAK;YAAQJ,OAAOA;;;AAGpD"}
1
+ {"version":3,"file":"SeparatorWithChip.js","sourceRoot":"","sources":["../../src/display-conditions/SeparatorWithChip.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAOrD,MAAM,UAAU,iBAAiB,CAAC,EAAE,KAAK,GAAG,SAAS,EAAE,KAAK,EAAoC;IAC5F,OAAO,CACH,KAAC,OAAO,IAAC,YAAY,EAAC,QAAQ,EAAC,OAAO,EAAC,GAAG,YACtC,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAC,OAAO,EAAC,KAAK,EAAE,KAAK,GAAI,GAC3C,CACb,CAAC;AACN,CAAC"}
@@ -1,22 +1,17 @@
1
- export const generateId = ()=>Math.random().toString(36).slice(2, 11);
2
- export const defaultCondition = ()=>({
3
- dataPointKey: '',
4
- id: generateId(),
5
- operator: 'is_equal_to',
6
- value: ''
7
- });
8
- export const defaultGroup = ()=>({
9
- conditions: [
10
- defaultCondition()
11
- ],
12
- id: generateId()
13
- });
14
- export const defaultState = ()=>({
15
- behavior: 'show',
16
- groups: [
17
- defaultGroup()
18
- ]
19
- });
1
+ export const generateId = () => Math.random().toString(36).slice(2, 11);
2
+ export const defaultCondition = () => ({
3
+ dataPointKey: '',
4
+ id: generateId(),
5
+ operator: 'is_equal_to',
6
+ value: '',
7
+ });
8
+ export const defaultGroup = () => ({
9
+ conditions: [defaultCondition()],
10
+ id: generateId(),
11
+ });
12
+ export const defaultState = () => ({
13
+ behavior: 'show',
14
+ groups: [defaultGroup()],
15
+ });
20
16
  export const MODAL_CONTENT_MAX_HEIGHT = '70vh';
21
-
22
17
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/display-conditions/constants.ts"],"sourcesContent":["import { ConditionGroup, DisplayConditionState, SingleCondition } from './types';\n\nexport const generateId = () => Math.random().toString(36).slice(2, 11);\n\nexport const defaultCondition = (): SingleCondition => ({\n dataPointKey: '',\n id: generateId(),\n operator: 'is_equal_to',\n value: '',\n});\n\nexport const defaultGroup = (): ConditionGroup => ({\n conditions: [defaultCondition()],\n id: generateId(),\n});\n\nexport const defaultState = (): DisplayConditionState => ({\n behavior: 'show',\n groups: [defaultGroup()],\n});\n\nexport const MODAL_CONTENT_MAX_HEIGHT = '70vh';\n"],"names":["generateId","Math","random","toString","slice","defaultCondition","dataPointKey","id","operator","value","defaultGroup","conditions","defaultState","behavior","groups","MODAL_CONTENT_MAX_HEIGHT"],"mappings":"AAEA,OAAO,MAAMA,aAAa,IAAMC,KAAKC,MAAM,GAAGC,QAAQ,CAAC,IAAIC,KAAK,CAAC,GAAG,IAAI;AAExE,OAAO,MAAMC,mBAAmB,IAAwB,CAAA;QACpDC,cAAc;QACdC,IAAIP;QACJQ,UAAU;QACVC,OAAO;IACX,CAAA,EAAG;AAEH,OAAO,MAAMC,eAAe,IAAuB,CAAA;QAC/CC,YAAY;YAACN;SAAmB;QAChCE,IAAIP;IACR,CAAA,EAAG;AAEH,OAAO,MAAMY,eAAe,IAA8B,CAAA;QACtDC,UAAU;QACVC,QAAQ;YAACJ;SAAe;IAC5B,CAAA,EAAG;AAEH,OAAO,MAAMK,2BAA2B,OAAO"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/display-conditions/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAExE,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAoB,EAAE,CAAC,CAAC;IACpD,YAAY,EAAE,EAAE;IAChB,EAAE,EAAE,UAAU,EAAE;IAChB,QAAQ,EAAE,aAAa;IACvB,KAAK,EAAE,EAAE;CACZ,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,GAAmB,EAAE,CAAC,CAAC;IAC/C,UAAU,EAAE,CAAC,gBAAgB,EAAE,CAAC;IAChC,EAAE,EAAE,UAAU,EAAE;CACnB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,GAA0B,EAAE,CAAC,CAAC;IACtD,QAAQ,EAAE,MAAM;IAChB,MAAM,EAAE,CAAC,YAAY,EAAE,CAAC;CAC3B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC"}
@@ -1,8 +1,8 @@
1
1
  const DISPLAY_CONDITION_EVENT = 'dte:display-condition';
2
2
  const displayConditionEvents = new EventTarget();
3
3
  let activeListeners = 0;
4
- export const onDisplayCondition = (listener)=>{
5
- const handler = (event)=>{
4
+ export const onDisplayCondition = (listener) => {
5
+ const handler = (event) => {
6
6
  const detail = event.detail;
7
7
  if (!detail) {
8
8
  return;
@@ -11,19 +11,16 @@ export const onDisplayCondition = (listener)=>{
11
11
  };
12
12
  activeListeners += 1;
13
13
  displayConditionEvents.addEventListener(DISPLAY_CONDITION_EVENT, handler);
14
- return ()=>{
14
+ return () => {
15
15
  activeListeners = Math.max(0, activeListeners - 1);
16
16
  displayConditionEvents.removeEventListener(DISPLAY_CONDITION_EVENT, handler);
17
17
  };
18
18
  };
19
- export const emitDisplayCondition = (request)=>{
19
+ export const emitDisplayCondition = (request) => {
20
20
  if (activeListeners === 0) {
21
21
  request.done(request.data);
22
22
  return;
23
23
  }
24
- displayConditionEvents.dispatchEvent(new CustomEvent(DISPLAY_CONDITION_EVENT, {
25
- detail: request
26
- }));
24
+ displayConditionEvents.dispatchEvent(new CustomEvent(DISPLAY_CONDITION_EVENT, { detail: request }));
27
25
  };
28
-
29
26
  //# sourceMappingURL=displayConditionController.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/display-conditions/displayConditionController.ts"],"sourcesContent":["export interface DisplayConditionRequest {\n data: any;\n done: (condition: any) => void;\n}\n\ntype Listener = (request: DisplayConditionRequest) => void;\n\nconst DISPLAY_CONDITION_EVENT = 'dte:display-condition';\nconst displayConditionEvents = new EventTarget();\nlet activeListeners = 0;\n\nexport const onDisplayCondition = (listener: Listener) => {\n const handler = (event: Event) => {\n const detail = (event as CustomEvent<DisplayConditionRequest>).detail;\n if (!detail) {\n return;\n }\n listener(detail);\n };\n\n activeListeners += 1;\n displayConditionEvents.addEventListener(DISPLAY_CONDITION_EVENT, handler as EventListener);\n\n return () => {\n activeListeners = Math.max(0, activeListeners - 1);\n displayConditionEvents.removeEventListener(\n DISPLAY_CONDITION_EVENT,\n handler as EventListener,\n );\n };\n};\n\nexport const emitDisplayCondition = (request: DisplayConditionRequest) => {\n if (activeListeners === 0) {\n request.done(request.data);\n return;\n }\n\n displayConditionEvents.dispatchEvent(\n new CustomEvent<DisplayConditionRequest>(DISPLAY_CONDITION_EVENT, { detail: request }),\n );\n};\n"],"names":["DISPLAY_CONDITION_EVENT","displayConditionEvents","EventTarget","activeListeners","onDisplayCondition","listener","handler","event","detail","addEventListener","Math","max","removeEventListener","emitDisplayCondition","request","done","data","dispatchEvent","CustomEvent"],"mappings":"AAOA,MAAMA,0BAA0B;AAChC,MAAMC,yBAAyB,IAAIC;AACnC,IAAIC,kBAAkB;AAEtB,OAAO,MAAMC,qBAAqB,CAACC;IAC/B,MAAMC,UAAU,CAACC;QACb,MAAMC,SAAS,AAACD,MAA+CC,MAAM;QACrE,IAAI,CAACA,QAAQ;YACT;QACJ;QACAH,SAASG;IACb;IAEAL,mBAAmB;IACnBF,uBAAuBQ,gBAAgB,CAACT,yBAAyBM;IAEjE,OAAO;QACHH,kBAAkBO,KAAKC,GAAG,CAAC,GAAGR,kBAAkB;QAChDF,uBAAuBW,mBAAmB,CACtCZ,yBACAM;IAER;AACJ,EAAE;AAEF,OAAO,MAAMO,uBAAuB,CAACC;IACjC,IAAIX,oBAAoB,GAAG;QACvBW,QAAQC,IAAI,CAACD,QAAQE,IAAI;QACzB;IACJ;IAEAf,uBAAuBgB,aAAa,CAChC,IAAIC,YAAqClB,yBAAyB;QAAEQ,QAAQM;IAAQ;AAE5F,EAAE"}
1
+ {"version":3,"file":"displayConditionController.js","sourceRoot":"","sources":["../../src/display-conditions/displayConditionController.ts"],"names":[],"mappings":"AAOA,MAAM,uBAAuB,GAAG,uBAAuB,CAAC;AACxD,MAAM,sBAAsB,GAAG,IAAI,WAAW,EAAE,CAAC;AACjD,IAAI,eAAe,GAAG,CAAC,CAAC;AAExB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAkB,EAAE,EAAE;IACrD,MAAM,OAAO,GAAG,CAAC,KAAY,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAI,KAA8C,CAAC,MAAM,CAAC;QACtE,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO;QACX,CAAC;QACD,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,eAAe,IAAI,CAAC,CAAC;IACrB,sBAAsB,CAAC,gBAAgB,CAAC,uBAAuB,EAAE,OAAwB,CAAC,CAAC;IAE3F,OAAO,GAAG,EAAE;QACR,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,GAAG,CAAC,CAAC,CAAC;QACnD,sBAAsB,CAAC,mBAAmB,CACtC,uBAAuB,EACvB,OAAwB,CAC3B,CAAC;IACN,CAAC,CAAC;AACN,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAgC,EAAE,EAAE;IACrE,IAAI,eAAe,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO;IACX,CAAC;IAED,sBAAsB,CAAC,aAAa,CAChC,IAAI,WAAW,CAA0B,uBAAuB,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CACzF,CAAC;AACN,CAAC,CAAC"}
@@ -25,16 +25,17 @@
25
25
  * The host-side resolver is intentionally NOT implemented in this package. The
26
26
  * host listens via `onLookupOptionsRequest` and replies via
27
27
  * `emitLookupOptionsResponse`.
28
- */ /** The single dropdown option shape used end-to-end. */ export const LOOKUP_OPTIONS_REQUEST_EVENT = 'dte-unlayer:lookup-options-request';
28
+ */
29
+ export const LOOKUP_OPTIONS_REQUEST_EVENT = 'dte-unlayer:lookup-options-request';
29
30
  export const LOOKUP_OPTIONS_RESPONSE_EVENT = 'dte-unlayer:lookup-options-response';
30
31
  const lookupOptionsEvents = new EventTarget();
31
- /** editor -> host: ask the host to resolve options for a lookup source. */ export const emitLookupOptionsRequest = (request)=>{
32
- lookupOptionsEvents.dispatchEvent(new CustomEvent(LOOKUP_OPTIONS_REQUEST_EVENT, {
33
- detail: request
34
- }));
32
+ /** editor -> host: ask the host to resolve options for a lookup source. */
33
+ export const emitLookupOptionsRequest = (request) => {
34
+ lookupOptionsEvents.dispatchEvent(new CustomEvent(LOOKUP_OPTIONS_REQUEST_EVENT, { detail: request }));
35
35
  };
36
- /** host side: listen for editor requests. Returns an unsubscribe function. */ export const onLookupOptionsRequest = (listener)=>{
37
- const handler = (event)=>{
36
+ /** host side: listen for editor requests. Returns an unsubscribe function. */
37
+ export const onLookupOptionsRequest = (listener) => {
38
+ const handler = (event) => {
38
39
  const detail = event.detail;
39
40
  if (!detail) {
40
41
  return;
@@ -42,17 +43,17 @@ const lookupOptionsEvents = new EventTarget();
42
43
  listener(detail);
43
44
  };
44
45
  lookupOptionsEvents.addEventListener(LOOKUP_OPTIONS_REQUEST_EVENT, handler);
45
- return ()=>{
46
+ return () => {
46
47
  lookupOptionsEvents.removeEventListener(LOOKUP_OPTIONS_REQUEST_EVENT, handler);
47
48
  };
48
49
  };
49
- /** host -> editor: deliver resolved options back to the editor. */ export const emitLookupOptionsResponse = (response)=>{
50
- lookupOptionsEvents.dispatchEvent(new CustomEvent(LOOKUP_OPTIONS_RESPONSE_EVENT, {
51
- detail: response
52
- }));
50
+ /** host -> editor: deliver resolved options back to the editor. */
51
+ export const emitLookupOptionsResponse = (response) => {
52
+ lookupOptionsEvents.dispatchEvent(new CustomEvent(LOOKUP_OPTIONS_RESPONSE_EVENT, { detail: response }));
53
53
  };
54
- /** editor side: listen for host responses. Returns an unsubscribe function. */ export const onLookupOptionsResponse = (listener)=>{
55
- const handler = (event)=>{
54
+ /** editor side: listen for host responses. Returns an unsubscribe function. */
55
+ export const onLookupOptionsResponse = (listener) => {
56
+ const handler = (event) => {
56
57
  const detail = event.detail;
57
58
  if (!detail) {
58
59
  return;
@@ -60,9 +61,8 @@ const lookupOptionsEvents = new EventTarget();
60
61
  listener(detail);
61
62
  };
62
63
  lookupOptionsEvents.addEventListener(LOOKUP_OPTIONS_RESPONSE_EVENT, handler);
63
- return ()=>{
64
+ return () => {
64
65
  lookupOptionsEvents.removeEventListener(LOOKUP_OPTIONS_RESPONSE_EVENT, handler);
65
66
  };
66
67
  };
67
-
68
68
  //# sourceMappingURL=lookupOptionsController.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/display-conditions/lookupOptionsController.ts"],"sourcesContent":["/**\n * Host <-> editor contract for \"data-model lookup source\" dropdown options.\n *\n * A schema field can be tagged (in the template-type editor) with\n * `options.fieldLookupSource`. When such a field is selected in the conditional\n * UI, the editor does NOT own the option data — it asks the HOST for it over the\n * EventTarget bus below and renders whatever the host returns.\n *\n * Two host-driven modes are supported (the host decides, the editor adapts):\n * 1. Full-list source (e.g. \"state\", \"jobType\"): the host returns every option\n * on the first request and omits `searchable`. The editor caches that list\n * and filters it LOCALLY as the user types — no further requests are sent.\n * 2. Searchable source (e.g. \"city\"): the list is too large to send at once.\n * The host returns `searchable: true` (typically with an empty list on the\n * first, query-less request). The editor then re-requests with the typed\n * `query` on each keystroke and the host returns a fresh, server-filtered\n * list per query.\n *\n * Transport mirrors the existing `displayConditionController` EventBus pattern.\n *\n * Event names (host <-> editor):\n * - \"dte-unlayer:lookup-options-request\" (editor -> host)\n * - \"dte-unlayer:lookup-options-response\" (host -> editor)\n *\n * The host-side resolver is intentionally NOT implemented in this package. The\n * host listens via `onLookupOptionsRequest` and replies via\n * `emitLookupOptionsResponse`.\n */\n\n/** The single dropdown option shape used end-to-end. */\nexport interface LookupOption {\n /** Human-readable label shown in the dropdown. */\n label: string;\n /** Stable value baked into the stored condition. */\n key: string;\n}\n\n/** editor -> host */\nexport interface LookupOptionsRequest {\n /** Correlates a response to its originating request. */\n requestId: string;\n /** The selected field's `options.fieldLookupSource`. */\n sourceKey: string;\n /**\n * The text the user has typed. Sent on each (debounced) keystroke once the\n * host has declared the source `searchable`. Empty/omitted on the first\n * request, where the host decides whether the source is searchable.\n */\n query?: string;\n /**\n * Resolve mode: the editor is asking the host to return the option(s) for\n * these EXACT stored keys (not a text search). Used on open to turn a saved\n * searchable value (a bare key) back into a human-readable label. When\n * present the host should match by key and ignore `query`.\n */\n keys?: string[];\n}\n\n/** host -> editor */\nexport interface LookupOptionsResponse {\n requestId: string;\n options: LookupOption[];\n /**\n * Set to `true` by the host when the source must be searched per query\n * (server-side). When omitted/false the editor treats `options` as the\n * complete list and switches to local filtering. Only read from the first\n * (query-less) response for a given source.\n */\n searchable?: boolean;\n}\n\nexport const LOOKUP_OPTIONS_REQUEST_EVENT = 'dte-unlayer:lookup-options-request';\nexport const LOOKUP_OPTIONS_RESPONSE_EVENT = 'dte-unlayer:lookup-options-response';\n\nconst lookupOptionsEvents = new EventTarget();\n\n/** editor -> host: ask the host to resolve options for a lookup source. */\nexport const emitLookupOptionsRequest = (request: LookupOptionsRequest) => {\n lookupOptionsEvents.dispatchEvent(\n new CustomEvent<LookupOptionsRequest>(LOOKUP_OPTIONS_REQUEST_EVENT, { detail: request }),\n );\n};\n\n/** host side: listen for editor requests. Returns an unsubscribe function. */\nexport const onLookupOptionsRequest = (listener: (request: LookupOptionsRequest) => void) => {\n const handler = (event: Event) => {\n const detail = (event as CustomEvent<LookupOptionsRequest>).detail;\n if (!detail) {\n return;\n }\n listener(detail);\n };\n\n lookupOptionsEvents.addEventListener(LOOKUP_OPTIONS_REQUEST_EVENT, handler);\n\n return () => {\n lookupOptionsEvents.removeEventListener(LOOKUP_OPTIONS_REQUEST_EVENT, handler);\n };\n};\n\n/** host -> editor: deliver resolved options back to the editor. */\nexport const emitLookupOptionsResponse = (response: LookupOptionsResponse) => {\n lookupOptionsEvents.dispatchEvent(\n new CustomEvent<LookupOptionsResponse>(LOOKUP_OPTIONS_RESPONSE_EVENT, { detail: response }),\n );\n};\n\n/** editor side: listen for host responses. Returns an unsubscribe function. */\nexport const onLookupOptionsResponse = (listener: (response: LookupOptionsResponse) => void) => {\n const handler = (event: Event) => {\n const detail = (event as CustomEvent<LookupOptionsResponse>).detail;\n if (!detail) {\n return;\n }\n listener(detail);\n };\n\n lookupOptionsEvents.addEventListener(LOOKUP_OPTIONS_RESPONSE_EVENT, handler);\n\n return () => {\n lookupOptionsEvents.removeEventListener(LOOKUP_OPTIONS_RESPONSE_EVENT, handler);\n };\n};\n"],"names":["LOOKUP_OPTIONS_REQUEST_EVENT","LOOKUP_OPTIONS_RESPONSE_EVENT","lookupOptionsEvents","EventTarget","emitLookupOptionsRequest","request","dispatchEvent","CustomEvent","detail","onLookupOptionsRequest","listener","handler","event","addEventListener","removeEventListener","emitLookupOptionsResponse","response","onLookupOptionsResponse"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BC,GAED,sDAAsD,GA0CtD,OAAO,MAAMA,+BAA+B,qCAAqC;AACjF,OAAO,MAAMC,gCAAgC,sCAAsC;AAEnF,MAAMC,sBAAsB,IAAIC;AAEhC,yEAAyE,GACzE,OAAO,MAAMC,2BAA2B,CAACC;IACrCH,oBAAoBI,aAAa,CAC7B,IAAIC,YAAkCP,8BAA8B;QAAEQ,QAAQH;IAAQ;AAE9F,EAAE;AAEF,4EAA4E,GAC5E,OAAO,MAAMI,yBAAyB,CAACC;IACnC,MAAMC,UAAU,CAACC;QACb,MAAMJ,SAAS,AAACI,MAA4CJ,MAAM;QAClE,IAAI,CAACA,QAAQ;YACT;QACJ;QACAE,SAASF;IACb;IAEAN,oBAAoBW,gBAAgB,CAACb,8BAA8BW;IAEnE,OAAO;QACHT,oBAAoBY,mBAAmB,CAACd,8BAA8BW;IAC1E;AACJ,EAAE;AAEF,iEAAiE,GACjE,OAAO,MAAMI,4BAA4B,CAACC;IACtCd,oBAAoBI,aAAa,CAC7B,IAAIC,YAAmCN,+BAA+B;QAAEO,QAAQQ;IAAS;AAEjG,EAAE;AAEF,6EAA6E,GAC7E,OAAO,MAAMC,0BAA0B,CAACP;IACpC,MAAMC,UAAU,CAACC;QACb,MAAMJ,SAAS,AAACI,MAA6CJ,MAAM;QACnE,IAAI,CAACA,QAAQ;YACT;QACJ;QACAE,SAASF;IACb;IAEAN,oBAAoBW,gBAAgB,CAACZ,+BAA+BU;IAEpE,OAAO;QACHT,oBAAoBY,mBAAmB,CAACb,+BAA+BU;IAC3E;AACJ,EAAE"}
1
+ {"version":3,"file":"lookupOptionsController.js","sourceRoot":"","sources":["../../src/display-conditions/lookupOptionsController.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AA4CH,MAAM,CAAC,MAAM,4BAA4B,GAAG,oCAAoC,CAAC;AACjF,MAAM,CAAC,MAAM,6BAA6B,GAAG,qCAAqC,CAAC;AAEnF,MAAM,mBAAmB,GAAG,IAAI,WAAW,EAAE,CAAC;AAE9C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,OAA6B,EAAE,EAAE;IACtE,mBAAmB,CAAC,aAAa,CAC7B,IAAI,WAAW,CAAuB,4BAA4B,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAC3F,CAAC;AACN,CAAC,CAAC;AAEF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,QAAiD,EAAE,EAAE;IACxF,MAAM,OAAO,GAAG,CAAC,KAAY,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAI,KAA2C,CAAC,MAAM,CAAC;QACnE,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO;QACX,CAAC;QACD,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,mBAAmB,CAAC,gBAAgB,CAAC,4BAA4B,EAAE,OAAO,CAAC,CAAC;IAE5E,OAAO,GAAG,EAAE;QACR,mBAAmB,CAAC,mBAAmB,CAAC,4BAA4B,EAAE,OAAO,CAAC,CAAC;IACnF,CAAC,CAAC;AACN,CAAC,CAAC;AAEF,mEAAmE;AACnE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,QAA+B,EAAE,EAAE;IACzE,mBAAmB,CAAC,aAAa,CAC7B,IAAI,WAAW,CAAwB,6BAA6B,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAC9F,CAAC;AACN,CAAC,CAAC;AAEF,+EAA+E;AAC/E,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,QAAmD,EAAE,EAAE;IAC3F,MAAM,OAAO,GAAG,CAAC,KAAY,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAI,KAA4C,CAAC,MAAM,CAAC;QACpE,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO;QACX,CAAC;QACD,QAAQ,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,mBAAmB,CAAC,gBAAgB,CAAC,6BAA6B,EAAE,OAAO,CAAC,CAAC;IAE7E,OAAO,GAAG,EAAE;QACR,mBAAmB,CAAC,mBAAmB,CAAC,6BAA6B,EAAE,OAAO,CAAC,CAAC;IACpF,CAAC,CAAC;AACN,CAAC,CAAC"}