@openg2p/registry-widgets 1.1.9-dev.2 → 1.1.9-dev.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/PanelRenderer.d.ts.map +1 -1
- package/dist/components/SectionBuilder/schemas.d.ts +4 -4
- package/dist/components/SectionRenderer/SectionRenderer.d.ts.map +1 -1
- package/dist/components/SectionRenderer/components/IntakeFormLayout.d.ts.map +1 -1
- package/dist/components/SectionRenderer/components/RegistryViewLayout.d.ts.map +1 -1
- package/dist/components/SectionRenderer/components/SectionStyles.d.ts.map +1 -1
- package/dist/components/SectionRenderer/types/sectionChanges.d.ts +11 -2
- package/dist/components/SectionRenderer/types/sectionChanges.d.ts.map +1 -1
- package/dist/components/SectionRenderer/utils/diffSectionChangeRecords.d.ts +2 -1
- package/dist/components/SectionRenderer/utils/diffSectionChangeRecords.d.ts.map +1 -1
- package/dist/components/SectionRenderer/utils/documentWidgetConfig.d.ts +0 -1
- package/dist/components/SectionRenderer/utils/documentWidgetConfig.d.ts.map +1 -1
- package/dist/components/SectionRenderer/utils/executeSectionSave.d.ts.map +1 -1
- package/dist/components/SectionRenderer/utils/index.d.ts +2 -0
- package/dist/components/SectionRenderer/utils/index.d.ts.map +1 -1
- package/dist/components/SectionRenderer/utils/sectionFiles.d.ts +52 -0
- package/dist/components/SectionRenderer/utils/sectionFiles.d.ts.map +1 -0
- package/dist/components/SectionRenderer/utils/sectionSnapshot.d.ts +3 -2
- package/dist/components/SectionRenderer/utils/sectionSnapshot.d.ts.map +1 -1
- package/dist/components/SectionsContainer.d.ts.map +1 -1
- package/dist/hooks/useBaseWidget.d.ts.map +1 -1
- package/dist/index.d.ts +53 -21
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.js +638 -744
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +640 -745
- package/dist/index.js.map +1 -1
- package/dist/registry/defaultWidgets.d.ts.map +1 -1
- package/dist/registry/widgetTypes.d.ts +1 -1
- package/dist/registry/widgetTypes.d.ts.map +1 -1
- package/dist/theme/index.d.ts +1 -1
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/types/index.d.ts +0 -10
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/pathUtils.d.ts.map +1 -1
- package/dist/utils/sectionValidate.d.ts +2 -1
- package/dist/utils/sectionValidate.d.ts.map +1 -1
- package/dist/utils/storedDocument.d.ts +9 -0
- package/dist/utils/storedDocument.d.ts.map +1 -0
- package/dist/utils/validation.d.ts +1 -2
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/widgets/DialogTableWidget.d.ts.map +1 -1
- package/dist/widgets/FileInputWidget.d.ts.map +1 -1
- package/dist/widgets/HeaderSectionWidget.d.ts.map +1 -1
- package/dist/widgets/IdAuthenticationWidget.d.ts.map +1 -1
- package/dist/widgets/ProfileWidget.d.ts.map +1 -1
- package/dist/widgets/RegisterLookupWidget.d.ts.map +1 -1
- package/dist/widgets/TableWidget.d.ts.map +1 -1
- package/dist/widgets/index.d.ts +0 -1
- package/dist/widgets/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/widgets/DocsWidget.d.ts +0 -16
- package/dist/widgets/DocsWidget.d.ts.map +0 -1
package/dist/index.js
CHANGED
|
@@ -213,10 +213,16 @@ const getWidgetValue = (values, dataPath, widgetId) => {
|
|
|
213
213
|
return getValueByPath(values, dataPath);
|
|
214
214
|
}
|
|
215
215
|
const result = {};
|
|
216
|
+
let hasDefined = false;
|
|
216
217
|
for (const [key, path] of Object.entries(dataPath)) {
|
|
217
|
-
|
|
218
|
+
const pathValue = getValueByPath(values, path);
|
|
219
|
+
result[key] = pathValue;
|
|
220
|
+
if (pathValue !== undefined) {
|
|
221
|
+
hasDefined = true;
|
|
222
|
+
}
|
|
218
223
|
}
|
|
219
|
-
|
|
224
|
+
// Avoid returning `{ label: undefined, ... }` which looks like an empty select option.
|
|
225
|
+
return hasDefined ? result : undefined;
|
|
220
226
|
};
|
|
221
227
|
/**
|
|
222
228
|
* Set value in widget state using data path.
|
|
@@ -276,79 +282,6 @@ const setWidgetValue = (currentValues, dataPath, widgetId, value) => {
|
|
|
276
282
|
return widgetId ? { ...newValues, [widgetId]: value } : newValues;
|
|
277
283
|
};
|
|
278
284
|
|
|
279
|
-
const isFile = (value) => {
|
|
280
|
-
return value instanceof File;
|
|
281
|
-
};
|
|
282
|
-
const isSerializedFile = (value) => {
|
|
283
|
-
return value && typeof value === 'object' && value.__type === 'File';
|
|
284
|
-
};
|
|
285
|
-
const serializeFile = async (file) => {
|
|
286
|
-
return new Promise((resolve, reject) => {
|
|
287
|
-
const reader = new FileReader();
|
|
288
|
-
reader.onload = () => {
|
|
289
|
-
const base64 = reader.result.split(',')[1];
|
|
290
|
-
resolve({
|
|
291
|
-
__type: 'File',
|
|
292
|
-
name: file.name,
|
|
293
|
-
type: file.type,
|
|
294
|
-
size: file.size,
|
|
295
|
-
lastModified: file.lastModified,
|
|
296
|
-
data: base64,
|
|
297
|
-
});
|
|
298
|
-
};
|
|
299
|
-
reader.onerror = reject;
|
|
300
|
-
reader.readAsDataURL(file);
|
|
301
|
-
});
|
|
302
|
-
};
|
|
303
|
-
const deserializeFile = (serialized) => {
|
|
304
|
-
const byteCharacters = atob(serialized.data);
|
|
305
|
-
const byteNumbers = new Array(byteCharacters.length);
|
|
306
|
-
for (let i = 0; i < byteCharacters.length; i++) {
|
|
307
|
-
byteNumbers[i] = byteCharacters.charCodeAt(i);
|
|
308
|
-
}
|
|
309
|
-
const byteArray = new Uint8Array(byteNumbers);
|
|
310
|
-
const blob = new Blob([byteArray], { type: serialized.type });
|
|
311
|
-
return new File([blob], serialized.name, {
|
|
312
|
-
type: serialized.type,
|
|
313
|
-
lastModified: serialized.lastModified,
|
|
314
|
-
});
|
|
315
|
-
};
|
|
316
|
-
const serializeValue = async (value) => {
|
|
317
|
-
if (value === null || value === undefined) {
|
|
318
|
-
return value;
|
|
319
|
-
}
|
|
320
|
-
if (isFile(value)) {
|
|
321
|
-
return await serializeFile(value);
|
|
322
|
-
}
|
|
323
|
-
if (Array.isArray(value)) {
|
|
324
|
-
return Promise.all(value.map(item => serializeValue(item)));
|
|
325
|
-
}
|
|
326
|
-
if (value && typeof value === 'object' && !(value instanceof Date) && !(value instanceof RegExp)) {
|
|
327
|
-
const result = {};
|
|
328
|
-
for (const [key, val] of Object.entries(value)) {
|
|
329
|
-
result[key] = await serializeValue(val);
|
|
330
|
-
}
|
|
331
|
-
return result;
|
|
332
|
-
}
|
|
333
|
-
return value;
|
|
334
|
-
};
|
|
335
|
-
const deserializeValue = (value) => {
|
|
336
|
-
if (isSerializedFile(value)) {
|
|
337
|
-
return deserializeFile(value);
|
|
338
|
-
}
|
|
339
|
-
if (Array.isArray(value)) {
|
|
340
|
-
return value.map(item => deserializeValue(item));
|
|
341
|
-
}
|
|
342
|
-
if (value && typeof value === 'object') {
|
|
343
|
-
const result = {};
|
|
344
|
-
for (const [key, val] of Object.entries(value)) {
|
|
345
|
-
result[key] = deserializeValue(val);
|
|
346
|
-
}
|
|
347
|
-
return result;
|
|
348
|
-
}
|
|
349
|
-
return value;
|
|
350
|
-
};
|
|
351
|
-
|
|
352
285
|
const VALIDATION_PATTERNS = {
|
|
353
286
|
email: {
|
|
354
287
|
pattern: /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,
|
|
@@ -447,35 +380,6 @@ const validateWidget = (value, validation, required = false, skipRequired = fals
|
|
|
447
380
|
}
|
|
448
381
|
return errors;
|
|
449
382
|
};
|
|
450
|
-
const isDocsSlotFilled = (stored) => {
|
|
451
|
-
if (stored == null || stored === '') {
|
|
452
|
-
return false;
|
|
453
|
-
}
|
|
454
|
-
if (typeof stored === 'string') {
|
|
455
|
-
return stored.trim().length > 0;
|
|
456
|
-
}
|
|
457
|
-
if (typeof File !== 'undefined' && stored instanceof File) {
|
|
458
|
-
return true;
|
|
459
|
-
}
|
|
460
|
-
return isSerializedFile(stored);
|
|
461
|
-
};
|
|
462
|
-
const validateDocsWidget = (value, documents, skipRequired = false) => {
|
|
463
|
-
if (skipRequired || !documents?.length) {
|
|
464
|
-
return [];
|
|
465
|
-
}
|
|
466
|
-
const docsValue = value && typeof value === 'object' && !Array.isArray(value)
|
|
467
|
-
? value
|
|
468
|
-
: {};
|
|
469
|
-
const errors = [];
|
|
470
|
-
for (const doc of documents) {
|
|
471
|
-
if (!doc['document-required'])
|
|
472
|
-
continue;
|
|
473
|
-
if (!isDocsSlotFilled(docsValue[doc['document-key']])) {
|
|
474
|
-
errors.push('This document is required');
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
return errors;
|
|
478
|
-
};
|
|
479
383
|
const createZodSchema = (validation, required = false) => {
|
|
480
384
|
if (!validation && !required) {
|
|
481
385
|
return null;
|
|
@@ -1810,6 +1714,9 @@ const OWT_FIELD_STYLES = `
|
|
|
1810
1714
|
.owt-text-muted {
|
|
1811
1715
|
color: var(--owt-color-text-muted);
|
|
1812
1716
|
}
|
|
1717
|
+
.owt-field-label {
|
|
1718
|
+
color: var(--owt-color-text-muted);
|
|
1719
|
+
}
|
|
1813
1720
|
.owt-bg {
|
|
1814
1721
|
background-color: var(--owt-color-bg);
|
|
1815
1722
|
}
|
|
@@ -1954,6 +1861,93 @@ const WidgetProvider = ({ store, dataSourceRequestHandler, schemaData, hostConte
|
|
|
1954
1861
|
}, children: [jsxRuntimeExports.jsx("style", { className: "owt-field-styles", children: OWT_FIELD_STYLES }), children] }) }) }) }) }));
|
|
1955
1862
|
};
|
|
1956
1863
|
|
|
1864
|
+
const isFile = (value) => {
|
|
1865
|
+
return value instanceof File;
|
|
1866
|
+
};
|
|
1867
|
+
const isSerializedFile = (value) => {
|
|
1868
|
+
return value && typeof value === 'object' && value.__type === 'File';
|
|
1869
|
+
};
|
|
1870
|
+
const serializeFile = async (file) => {
|
|
1871
|
+
return new Promise((resolve, reject) => {
|
|
1872
|
+
const reader = new FileReader();
|
|
1873
|
+
reader.onload = () => {
|
|
1874
|
+
const base64 = reader.result.split(',')[1];
|
|
1875
|
+
resolve({
|
|
1876
|
+
__type: 'File',
|
|
1877
|
+
name: file.name,
|
|
1878
|
+
type: file.type,
|
|
1879
|
+
size: file.size,
|
|
1880
|
+
lastModified: file.lastModified,
|
|
1881
|
+
data: base64,
|
|
1882
|
+
});
|
|
1883
|
+
};
|
|
1884
|
+
reader.onerror = reject;
|
|
1885
|
+
reader.readAsDataURL(file);
|
|
1886
|
+
});
|
|
1887
|
+
};
|
|
1888
|
+
const deserializeFile = (serialized) => {
|
|
1889
|
+
const byteCharacters = atob(serialized.data);
|
|
1890
|
+
const byteNumbers = new Array(byteCharacters.length);
|
|
1891
|
+
for (let i = 0; i < byteCharacters.length; i++) {
|
|
1892
|
+
byteNumbers[i] = byteCharacters.charCodeAt(i);
|
|
1893
|
+
}
|
|
1894
|
+
const byteArray = new Uint8Array(byteNumbers);
|
|
1895
|
+
const blob = new Blob([byteArray], { type: serialized.type });
|
|
1896
|
+
return new File([blob], serialized.name, {
|
|
1897
|
+
type: serialized.type,
|
|
1898
|
+
lastModified: serialized.lastModified,
|
|
1899
|
+
});
|
|
1900
|
+
};
|
|
1901
|
+
const serializeValue = async (value) => {
|
|
1902
|
+
if (value === null || value === undefined) {
|
|
1903
|
+
return value;
|
|
1904
|
+
}
|
|
1905
|
+
if (isFile(value)) {
|
|
1906
|
+
return await serializeFile(value);
|
|
1907
|
+
}
|
|
1908
|
+
if (Array.isArray(value)) {
|
|
1909
|
+
return Promise.all(value.map(item => serializeValue(item)));
|
|
1910
|
+
}
|
|
1911
|
+
if (value && typeof value === 'object' && !(value instanceof Date) && !(value instanceof RegExp)) {
|
|
1912
|
+
const result = {};
|
|
1913
|
+
for (const [key, val] of Object.entries(value)) {
|
|
1914
|
+
result[key] = await serializeValue(val);
|
|
1915
|
+
}
|
|
1916
|
+
return result;
|
|
1917
|
+
}
|
|
1918
|
+
return value;
|
|
1919
|
+
};
|
|
1920
|
+
const deserializeValue = (value) => {
|
|
1921
|
+
if (isSerializedFile(value)) {
|
|
1922
|
+
return deserializeFile(value);
|
|
1923
|
+
}
|
|
1924
|
+
if (Array.isArray(value)) {
|
|
1925
|
+
return value.map(item => deserializeValue(item));
|
|
1926
|
+
}
|
|
1927
|
+
if (value && typeof value === 'object') {
|
|
1928
|
+
const result = {};
|
|
1929
|
+
for (const [key, val] of Object.entries(value)) {
|
|
1930
|
+
result[key] = deserializeValue(val);
|
|
1931
|
+
}
|
|
1932
|
+
return result;
|
|
1933
|
+
}
|
|
1934
|
+
return value;
|
|
1935
|
+
};
|
|
1936
|
+
|
|
1937
|
+
const isStoredDocumentRef = (value) => {
|
|
1938
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
1939
|
+
return false;
|
|
1940
|
+
if (isSerializedFile(value))
|
|
1941
|
+
return false;
|
|
1942
|
+
const doc = value;
|
|
1943
|
+
return (typeof doc.label === 'string' &&
|
|
1944
|
+
doc.label.length > 0 &&
|
|
1945
|
+
typeof doc.document_id === 'string' &&
|
|
1946
|
+
doc.document_id.length > 0 &&
|
|
1947
|
+
typeof doc.presigned_url === 'string' &&
|
|
1948
|
+
doc.presigned_url.length > 0);
|
|
1949
|
+
};
|
|
1950
|
+
|
|
1957
1951
|
const EMPTY_ERRORS = [];
|
|
1958
1952
|
const EMPTY_DATA_SOURCE = [];
|
|
1959
1953
|
const useBaseWidget = (options) => {
|
|
@@ -1969,7 +1963,6 @@ const useBaseWidget = (options) => {
|
|
|
1969
1963
|
const loading = reactRedux.useSelector((state) => state.widget.loading[widgetId] || false);
|
|
1970
1964
|
const dataSourceOptions = reactRedux.useSelector((state) => state.widget.dataSources[widgetId] ?? EMPTY_DATA_SOURCE);
|
|
1971
1965
|
const isLayoutWidget = config['widget-type'] === 'layout';
|
|
1972
|
-
const isDocsWidget = config.widget === 'docs';
|
|
1973
1966
|
const userHasSetValueRef = React.useRef(false);
|
|
1974
1967
|
const valuesRef = React.useRef(values);
|
|
1975
1968
|
const loadingRef = React.useRef(loading);
|
|
@@ -1984,6 +1977,15 @@ const useBaseWidget = (options) => {
|
|
|
1984
1977
|
if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {
|
|
1985
1978
|
return obj;
|
|
1986
1979
|
}
|
|
1980
|
+
if (typeof File !== 'undefined' && obj instanceof File) {
|
|
1981
|
+
return obj;
|
|
1982
|
+
}
|
|
1983
|
+
if (isSerializedFile(obj) || isStoredDocumentRef(obj)) {
|
|
1984
|
+
return obj;
|
|
1985
|
+
}
|
|
1986
|
+
if ('document_id' in obj && ('presigned_url' in obj || 'source_filename' in obj || 'label' in obj)) {
|
|
1987
|
+
return obj;
|
|
1988
|
+
}
|
|
1987
1989
|
if ('value' in obj) {
|
|
1988
1990
|
return obj.value;
|
|
1989
1991
|
}
|
|
@@ -2002,19 +2004,6 @@ const useBaseWidget = (options) => {
|
|
|
2002
2004
|
if (isLayoutWidget) {
|
|
2003
2005
|
return undefined; // Layout widgets don't have values
|
|
2004
2006
|
}
|
|
2005
|
-
if (isDocsWidget) {
|
|
2006
|
-
let docsValue = values[widgetId];
|
|
2007
|
-
if (docsValue === undefined && config['widget-data-path']) {
|
|
2008
|
-
docsValue = getWidgetValue(values, config['widget-data-path'], widgetId);
|
|
2009
|
-
}
|
|
2010
|
-
if (userHasSetValueRef.current) {
|
|
2011
|
-
return docsValue;
|
|
2012
|
-
}
|
|
2013
|
-
if (docsValue === null) {
|
|
2014
|
-
return null;
|
|
2015
|
-
}
|
|
2016
|
-
return docsValue !== undefined ? docsValue : config['widget-data-default'];
|
|
2017
|
-
}
|
|
2018
2007
|
let value = config['widget-data-path']
|
|
2019
2008
|
? getWidgetValue(values, config['widget-data-path'], widgetId)
|
|
2020
2009
|
: values[widgetId];
|
|
@@ -2037,13 +2026,13 @@ const useBaseWidget = (options) => {
|
|
|
2037
2026
|
return null; // User explicitly cleared it, don't use default
|
|
2038
2027
|
}
|
|
2039
2028
|
return value !== undefined ? value : config['widget-data-default'];
|
|
2040
|
-
}, [values, config, widgetId, isLayoutWidget,
|
|
2029
|
+
}, [values, config, widgetId, isLayoutWidget, extractValueFromObject]);
|
|
2041
2030
|
const lastMirroredValueRef = React.useRef(null);
|
|
2042
2031
|
// Mirror value from dataPath to widgetId in Redux state if it's not already there.
|
|
2043
2032
|
// This is essential for widgets that depend on this widget via 'dependsOn' using its widgetId,
|
|
2044
2033
|
// CRITICAL: This ensures that dependencies are resolved correctly when entering Edit mode.
|
|
2045
2034
|
React.useEffect(() => {
|
|
2046
|
-
if (isLayoutWidget ||
|
|
2035
|
+
if (isLayoutWidget || !config['widget-data-path']) {
|
|
2047
2036
|
return;
|
|
2048
2037
|
}
|
|
2049
2038
|
const rawValue = getWidgetValue(values, config['widget-data-path'], widgetId);
|
|
@@ -2123,9 +2112,7 @@ const useBaseWidget = (options) => {
|
|
|
2123
2112
|
dispatch(setValues(updatedValues));
|
|
2124
2113
|
}
|
|
2125
2114
|
if (validate) {
|
|
2126
|
-
const validationErrors =
|
|
2127
|
-
? validateDocsWidget(newValue, config['documents'])
|
|
2128
|
-
: validateWidget(newValue, config['widget-data-validation'], resolveIsRequired(currentValues));
|
|
2115
|
+
const validationErrors = validateWidget(newValue, config['widget-data-validation'], resolveIsRequired(currentValues));
|
|
2129
2116
|
dispatch(setError({ widgetId, errors: validationErrors }));
|
|
2130
2117
|
}
|
|
2131
2118
|
if (onValueChange) {
|
|
@@ -2139,16 +2126,11 @@ const useBaseWidget = (options) => {
|
|
|
2139
2126
|
timestamp: Date.now(),
|
|
2140
2127
|
});
|
|
2141
2128
|
}
|
|
2142
|
-
}, [config, widgetId, dispatch, onValueChange, eventBus, resolveIsRequired
|
|
2129
|
+
}, [config, widgetId, dispatch, onValueChange, eventBus, resolveIsRequired]);
|
|
2143
2130
|
const handleBlur = React.useCallback(() => {
|
|
2144
2131
|
dispatch(setTouched({ widgetId, touched: true }));
|
|
2145
2132
|
const latestValues = valuesRef.current;
|
|
2146
|
-
const
|
|
2147
|
-
? latestValues[widgetId] ?? getWidgetValue(latestValues, config['widget-data-path'], widgetId)
|
|
2148
|
-
: currentValue;
|
|
2149
|
-
const validationErrors = isDocsWidget
|
|
2150
|
-
? validateDocsWidget(valueToValidate, config['documents'])
|
|
2151
|
-
: validateWidget(valueToValidate, config['widget-data-validation'], resolveIsRequired(latestValues));
|
|
2133
|
+
const validationErrors = validateWidget(currentValue, config['widget-data-validation'], resolveIsRequired(latestValues));
|
|
2152
2134
|
dispatch(setError({ widgetId, errors: validationErrors }));
|
|
2153
2135
|
if (eventBus) {
|
|
2154
2136
|
eventBus.publish({
|
|
@@ -2158,7 +2140,7 @@ const useBaseWidget = (options) => {
|
|
|
2158
2140
|
timestamp: Date.now(),
|
|
2159
2141
|
});
|
|
2160
2142
|
}
|
|
2161
|
-
}, [currentValue, config, widgetId, dispatch, eventBus, resolveIsRequired
|
|
2143
|
+
}, [currentValue, config, widgetId, dispatch, eventBus, resolveIsRequired]);
|
|
2162
2144
|
const getFieldValue = React.useCallback((path) => {
|
|
2163
2145
|
return getWidgetValue(values, path, '');
|
|
2164
2146
|
}, [values]);
|
|
@@ -2519,7 +2501,9 @@ const PanelRenderer = ({ panel, dataSourceRequestHandler, schemaData, onValueCha
|
|
|
2519
2501
|
top: 0,
|
|
2520
2502
|
bottom: '5px',
|
|
2521
2503
|
width: '1px',
|
|
2522
|
-
backgroundColor: isEditMode
|
|
2504
|
+
backgroundColor: isEditMode
|
|
2505
|
+
? 'var(--owt-color-primary-dark)'
|
|
2506
|
+
: 'var(--owt-panel-divider-color)',
|
|
2523
2507
|
} }))] }) }, nestedPanel['panel-id'] || `panel-${index}`));
|
|
2524
2508
|
}), widgets.map((widgetConfig, index) => (jsxRuntimeExports.jsx(WidgetRenderer, { config: widgetConfig, dataSourceRequestHandler: dataSourceRequestHandler, schemaData: schemaData, onValueChange: onValueChange }, widgetConfig['widget-id'] || `widget-${index}`)))] }));
|
|
2525
2509
|
return (jsxRuntimeExports.jsx("div", { className: `panel panel-${orientation}`, "data-panel-id": panel['panel-id'], style: orientation === 'horizontal' ? { width: '100%' } : {}, children: content }));
|
|
@@ -2647,8 +2631,9 @@ const collectWidgets = (panels) => {
|
|
|
2647
2631
|
/**
|
|
2648
2632
|
* @param skipRequired - Skip required checks for per-section Save/Next navigation;
|
|
2649
2633
|
* format and range validation still run.
|
|
2634
|
+
* @param includeSupportingDocuments - When false (e.g. IntakeForm), skip supporting-doc checks.
|
|
2650
2635
|
*/
|
|
2651
|
-
const sectionValidate = (section, currentSchemaData, dispatch, skipRequired = false) => {
|
|
2636
|
+
const sectionValidate = (section, currentSchemaData, dispatch, skipRequired = false, includeSupportingDocuments = true) => {
|
|
2652
2637
|
const allWidgets = collectWidgets(section.panels);
|
|
2653
2638
|
let isValid = true;
|
|
2654
2639
|
for (const widget of allWidgets) {
|
|
@@ -2668,9 +2653,7 @@ const sectionValidate = (section, currentSchemaData, dispatch, skipRequired = fa
|
|
|
2668
2653
|
}
|
|
2669
2654
|
const value = getWidgetValue(currentSchemaData, widget['widget-data-path'], widgetId);
|
|
2670
2655
|
const isRequired = shouldRequireWidget(widget['widget-data-options'], currentSchemaData, widget['widget-required'] ?? false);
|
|
2671
|
-
const errors = widget
|
|
2672
|
-
? validateDocsWidget(value, widget['documents'], skipRequired)
|
|
2673
|
-
: validateWidget(value, widget['widget-data-validation'], isRequired, skipRequired);
|
|
2656
|
+
const errors = validateWidget(value, widget['widget-data-validation'], isRequired, skipRequired);
|
|
2674
2657
|
if (errors.length > 0) {
|
|
2675
2658
|
isValid = false;
|
|
2676
2659
|
dispatch(setTouched({ widgetId, touched: true }));
|
|
@@ -2681,24 +2664,26 @@ const sectionValidate = (section, currentSchemaData, dispatch, skipRequired = fa
|
|
|
2681
2664
|
dispatch(setError({ widgetId, errors: [] }));
|
|
2682
2665
|
}
|
|
2683
2666
|
}
|
|
2684
|
-
|
|
2685
|
-
|
|
2686
|
-
|
|
2687
|
-
|
|
2688
|
-
|
|
2689
|
-
|
|
2690
|
-
|
|
2691
|
-
|
|
2692
|
-
|
|
2693
|
-
|
|
2694
|
-
|
|
2695
|
-
|
|
2696
|
-
|
|
2697
|
-
|
|
2698
|
-
|
|
2667
|
+
if (includeSupportingDocuments) {
|
|
2668
|
+
section['section-supporting-documents']?.forEach((doc, index) => {
|
|
2669
|
+
const widgetId = `supporting-doc-${section['section-id']}-${index}`;
|
|
2670
|
+
if (!skipRequired && doc['document-required']) {
|
|
2671
|
+
const file = getValueByPath(currentSchemaData, doc['document-data-path']);
|
|
2672
|
+
if (!file) {
|
|
2673
|
+
isValid = false;
|
|
2674
|
+
dispatch(setTouched({ widgetId, touched: true }));
|
|
2675
|
+
dispatch(setError({
|
|
2676
|
+
widgetId,
|
|
2677
|
+
errors: ['This document is required'],
|
|
2678
|
+
}));
|
|
2679
|
+
}
|
|
2680
|
+
else {
|
|
2681
|
+
dispatch(setTouched({ widgetId, touched: false }));
|
|
2682
|
+
dispatch(setError({ widgetId, errors: [] }));
|
|
2683
|
+
}
|
|
2699
2684
|
}
|
|
2700
|
-
}
|
|
2701
|
-
}
|
|
2685
|
+
});
|
|
2686
|
+
}
|
|
2702
2687
|
return isValid;
|
|
2703
2688
|
};
|
|
2704
2689
|
|
|
@@ -2844,12 +2829,225 @@ const createDocumentWidgetConfig = (doc, sectionId, index, mode, isDraft) => {
|
|
|
2844
2829
|
'widget-readonly': mode === 'IntakeForm' && isDraft === false,
|
|
2845
2830
|
'widget-data-options': {
|
|
2846
2831
|
accept,
|
|
2847
|
-
multiple: false,
|
|
2848
2832
|
maxSize: doc['document-max-size'],
|
|
2849
2833
|
},
|
|
2850
2834
|
};
|
|
2851
2835
|
};
|
|
2852
2836
|
|
|
2837
|
+
/** Origin tags attached to entries in `SectionChanges.section_files`. */
|
|
2838
|
+
const SECTION_FILE_TAG = {
|
|
2839
|
+
PROFILE: '_profile',
|
|
2840
|
+
SUPPORTING_DOCS: '_supporting_docs',
|
|
2841
|
+
DIRECT_FILE: '_direct_file',
|
|
2842
|
+
};
|
|
2843
|
+
const fieldFromPath = (path) => path.includes('.') ? path.split('.').slice(1).join('.') : path;
|
|
2844
|
+
const isFreshUpload = (value) => (typeof File !== 'undefined' && value instanceof File) || isSerializedFile(value);
|
|
2845
|
+
const isCollectableFileValue = (value) => isFreshUpload(value) || isStoredDocumentRef(value);
|
|
2846
|
+
const isFreshSectionFileEntry = (entry) => isSerializedFile(entry);
|
|
2847
|
+
const getProfileImageUrlPaths = (panels) => {
|
|
2848
|
+
const paths = [];
|
|
2849
|
+
collectWidgets(panels)
|
|
2850
|
+
.filter((widget) => widget.widget === 'header-section')
|
|
2851
|
+
.forEach((widget) => {
|
|
2852
|
+
const widgetPath = widget['widget-data-path'];
|
|
2853
|
+
if (!widgetPath || typeof widgetPath !== 'object' || Array.isArray(widgetPath))
|
|
2854
|
+
return;
|
|
2855
|
+
const imageUrlPath = widgetPath.imageUrl;
|
|
2856
|
+
if (imageUrlPath)
|
|
2857
|
+
paths.push(imageUrlPath);
|
|
2858
|
+
});
|
|
2859
|
+
return paths;
|
|
2860
|
+
};
|
|
2861
|
+
const collectProfileFiles = (widgets, sourceData) => {
|
|
2862
|
+
const files = [];
|
|
2863
|
+
for (const widget of widgets) {
|
|
2864
|
+
if (widget.widget !== 'header-section')
|
|
2865
|
+
continue;
|
|
2866
|
+
const widgetPath = widget['widget-data-path'];
|
|
2867
|
+
if (!widgetPath || typeof widgetPath !== 'object' || Array.isArray(widgetPath))
|
|
2868
|
+
continue;
|
|
2869
|
+
const paths = widgetPath;
|
|
2870
|
+
if (!paths.imageUrl)
|
|
2871
|
+
continue;
|
|
2872
|
+
const value = getValueByPath(sourceData, paths.imageUrl);
|
|
2873
|
+
if (!isCollectableFileValue(value))
|
|
2874
|
+
continue;
|
|
2875
|
+
const field = paths.image ? fieldFromPath(paths.image) : 'record_image_document_id';
|
|
2876
|
+
files.push({
|
|
2877
|
+
value,
|
|
2878
|
+
tag: SECTION_FILE_TAG.PROFILE,
|
|
2879
|
+
field,
|
|
2880
|
+
label: isStoredDocumentRef(value) ? value.label : 'profile image',
|
|
2881
|
+
});
|
|
2882
|
+
}
|
|
2883
|
+
return files;
|
|
2884
|
+
};
|
|
2885
|
+
const collectSupportingDocFiles = (section, sourceData, skipPaths) => {
|
|
2886
|
+
const files = [];
|
|
2887
|
+
const supportingDocuments = section['section-supporting-documents'] || [];
|
|
2888
|
+
for (const doc of supportingDocuments) {
|
|
2889
|
+
const path = doc['document-data-path'];
|
|
2890
|
+
if (!path || skipPaths.has(path))
|
|
2891
|
+
continue;
|
|
2892
|
+
const value = getValueByPath(sourceData, path);
|
|
2893
|
+
if (!isCollectableFileValue(value))
|
|
2894
|
+
continue;
|
|
2895
|
+
files.push({
|
|
2896
|
+
value,
|
|
2897
|
+
tag: SECTION_FILE_TAG.SUPPORTING_DOCS,
|
|
2898
|
+
field: fieldFromPath(path),
|
|
2899
|
+
label: (isStoredDocumentRef(value) ? value.label : undefined) ||
|
|
2900
|
+
doc['document-label'] ||
|
|
2901
|
+
fieldFromPath(path),
|
|
2902
|
+
});
|
|
2903
|
+
}
|
|
2904
|
+
return files;
|
|
2905
|
+
};
|
|
2906
|
+
const collectDirectFileWidgetFiles = (widgets, sourceData, skipPaths) => {
|
|
2907
|
+
const files = [];
|
|
2908
|
+
for (const widget of widgets) {
|
|
2909
|
+
if (widget.widget !== 'file')
|
|
2910
|
+
continue;
|
|
2911
|
+
const widgetId = widget['widget-id'] || '';
|
|
2912
|
+
// Supporting-doc slots are collected via section-supporting-documents.
|
|
2913
|
+
if (widgetId.startsWith('supporting-doc-'))
|
|
2914
|
+
continue;
|
|
2915
|
+
const widgetPath = widget['widget-data-path'];
|
|
2916
|
+
if (!widgetPath || typeof widgetPath !== 'string' || skipPaths.has(widgetPath))
|
|
2917
|
+
continue;
|
|
2918
|
+
const value = getValueByPath(sourceData, widgetPath);
|
|
2919
|
+
if (!isCollectableFileValue(value))
|
|
2920
|
+
continue;
|
|
2921
|
+
const field = fieldFromPath(widgetPath);
|
|
2922
|
+
files.push({
|
|
2923
|
+
value,
|
|
2924
|
+
tag: SECTION_FILE_TAG.DIRECT_FILE,
|
|
2925
|
+
field,
|
|
2926
|
+
label: (isStoredDocumentRef(value) ? value.label : undefined) ||
|
|
2927
|
+
widget['widget-label'] ||
|
|
2928
|
+
field,
|
|
2929
|
+
});
|
|
2930
|
+
}
|
|
2931
|
+
return files;
|
|
2932
|
+
};
|
|
2933
|
+
/**
|
|
2934
|
+
* Sync collection for dirty checks / snapshots.
|
|
2935
|
+
* Fresh uploads and existing stored document refs are returned with origin tags.
|
|
2936
|
+
*/
|
|
2937
|
+
const collectAllSectionFilesSync = (section, sourceData, options) => {
|
|
2938
|
+
const widgets = collectWidgets(section.panels);
|
|
2939
|
+
const profilePaths = getProfileImageUrlPaths(section.panels);
|
|
2940
|
+
const skipPaths = new Set(profilePaths);
|
|
2941
|
+
const includeSupportingDocuments = options?.includeSupportingDocuments !== false;
|
|
2942
|
+
return [
|
|
2943
|
+
...collectProfileFiles(widgets, sourceData),
|
|
2944
|
+
...(includeSupportingDocuments
|
|
2945
|
+
? collectSupportingDocFiles(section, sourceData, skipPaths)
|
|
2946
|
+
: []),
|
|
2947
|
+
...collectDirectFileWidgetFiles(widgets, sourceData, skipPaths),
|
|
2948
|
+
];
|
|
2949
|
+
};
|
|
2950
|
+
/** Fingerprint for dirty comparison (avoids File / base64 noise). */
|
|
2951
|
+
const fingerprintSectionFiles = (files) => files.map(({ value, tag, field, label }) => {
|
|
2952
|
+
if (isStoredDocumentRef(value)) {
|
|
2953
|
+
return {
|
|
2954
|
+
tag,
|
|
2955
|
+
field,
|
|
2956
|
+
label,
|
|
2957
|
+
document_id: value.document_id,
|
|
2958
|
+
source_filename: value.source_filename,
|
|
2959
|
+
presigned_url: value.presigned_url,
|
|
2960
|
+
};
|
|
2961
|
+
}
|
|
2962
|
+
return {
|
|
2963
|
+
tag,
|
|
2964
|
+
field,
|
|
2965
|
+
label,
|
|
2966
|
+
name: value.name,
|
|
2967
|
+
size: value.size,
|
|
2968
|
+
type: value.type,
|
|
2969
|
+
lastModified: value.lastModified,
|
|
2970
|
+
};
|
|
2971
|
+
});
|
|
2972
|
+
/**
|
|
2973
|
+
* Collect every section file into `section_files`:
|
|
2974
|
+
* - fresh uploads as serialized File blobs (`__type: "File"`)
|
|
2975
|
+
* - unchanged existing docs as `{ label, document_id, presigned_url, source_filename }`
|
|
2976
|
+
*/
|
|
2977
|
+
const collectAllSectionFiles = async (section, sourceData, options) => {
|
|
2978
|
+
const rawFiles = collectAllSectionFilesSync(section, sourceData, options);
|
|
2979
|
+
const result = [];
|
|
2980
|
+
for (const raw of rawFiles) {
|
|
2981
|
+
if (isStoredDocumentRef(raw.value)) {
|
|
2982
|
+
result.push({
|
|
2983
|
+
label: raw.value.label,
|
|
2984
|
+
document_id: raw.value.document_id,
|
|
2985
|
+
presigned_url: raw.value.presigned_url,
|
|
2986
|
+
...(raw.value.source_filename
|
|
2987
|
+
? { source_filename: raw.value.source_filename }
|
|
2988
|
+
: {}),
|
|
2989
|
+
tag: raw.tag,
|
|
2990
|
+
...(raw.field ? { field: raw.field } : {}),
|
|
2991
|
+
...(raw.document_key ? { document_key: raw.document_key } : {}),
|
|
2992
|
+
});
|
|
2993
|
+
continue;
|
|
2994
|
+
}
|
|
2995
|
+
const serialized = raw.value instanceof File ? await serializeFile(raw.value) : raw.value;
|
|
2996
|
+
result.push({
|
|
2997
|
+
...serialized,
|
|
2998
|
+
tag: raw.tag,
|
|
2999
|
+
...(raw.label ? { label: raw.label } : {}),
|
|
3000
|
+
...(raw.field ? { field: raw.field } : {}),
|
|
3001
|
+
...(raw.document_key ? { document_key: raw.document_key } : {}),
|
|
3002
|
+
});
|
|
3003
|
+
}
|
|
3004
|
+
return result;
|
|
3005
|
+
};
|
|
3006
|
+
/** Paths for file widgets / supporting docs — values travel in `section_files`, not `records`. */
|
|
3007
|
+
const getSectionFileBlobPaths = (section, options) => {
|
|
3008
|
+
const paths = [...getProfileImageUrlPaths(section.panels)];
|
|
3009
|
+
const includeSupportingDocuments = options?.includeSupportingDocuments !== false;
|
|
3010
|
+
collectWidgets(section.panels).forEach((widget) => {
|
|
3011
|
+
if (widget.widget !== 'file')
|
|
3012
|
+
return;
|
|
3013
|
+
const widgetId = widget['widget-id'] || '';
|
|
3014
|
+
if (widgetId.startsWith('supporting-doc-'))
|
|
3015
|
+
return;
|
|
3016
|
+
const widgetPath = widget['widget-data-path'];
|
|
3017
|
+
if (typeof widgetPath === 'string' && widgetPath.length > 0) {
|
|
3018
|
+
paths.push(widgetPath);
|
|
3019
|
+
}
|
|
3020
|
+
});
|
|
3021
|
+
if (includeSupportingDocuments) {
|
|
3022
|
+
(section['section-supporting-documents'] || []).forEach((doc) => {
|
|
3023
|
+
const path = doc['document-data-path'];
|
|
3024
|
+
if (path)
|
|
3025
|
+
paths.push(path);
|
|
3026
|
+
});
|
|
3027
|
+
}
|
|
3028
|
+
return paths;
|
|
3029
|
+
};
|
|
3030
|
+
/**
|
|
3031
|
+
* Remove file-widget fields from records (fresh uploads, stored docs, empty placeholders).
|
|
3032
|
+
* Those values are carried only in `section_files`.
|
|
3033
|
+
*/
|
|
3034
|
+
const stripSectionFileBlobs = (records, blobPaths) => {
|
|
3035
|
+
if (blobPaths.length === 0)
|
|
3036
|
+
return records;
|
|
3037
|
+
const fieldKeys = blobPaths.map(fieldFromPath);
|
|
3038
|
+
return records.map((record) => {
|
|
3039
|
+
if (typeof record !== 'object' || record === null)
|
|
3040
|
+
return record;
|
|
3041
|
+
const copy = { ...record };
|
|
3042
|
+
for (const key of fieldKeys) {
|
|
3043
|
+
if (!Object.prototype.hasOwnProperty.call(copy, key))
|
|
3044
|
+
continue;
|
|
3045
|
+
delete copy[key];
|
|
3046
|
+
}
|
|
3047
|
+
return copy;
|
|
3048
|
+
});
|
|
3049
|
+
};
|
|
3050
|
+
|
|
2853
3051
|
const collectWidgetPathSnapshot = (widgets, sourceData) => {
|
|
2854
3052
|
const snapshot = {};
|
|
2855
3053
|
let hasTable = false;
|
|
@@ -2913,24 +3111,13 @@ const buildSectionRecords = (widgets, sourceData, { sectionRegisterId, editActio
|
|
|
2913
3111
|
}
|
|
2914
3112
|
return extractTableRecordsFromSnapshot(snapshot, widgets);
|
|
2915
3113
|
};
|
|
2916
|
-
const collectSectionSupportingFiles = (section, sourceData) => {
|
|
2917
|
-
const files = [];
|
|
2918
|
-
const supportingDocuments = section['section-supporting-documents'] || [];
|
|
2919
|
-
supportingDocuments.forEach((doc) => {
|
|
2920
|
-
const path = doc['document-data-path'];
|
|
2921
|
-
if (path) {
|
|
2922
|
-
files.push(getValueByPath(sourceData, path));
|
|
2923
|
-
}
|
|
2924
|
-
});
|
|
2925
|
-
return files;
|
|
2926
|
-
};
|
|
2927
3114
|
/** Save flow: records for change detection and onSectionSave payloads. */
|
|
2928
3115
|
const trackSectionChanges = (widgets, sourceData, sectionRegisterId) => buildSectionRecords(widgets, sourceData, {
|
|
2929
3116
|
sectionRegisterId,
|
|
2930
3117
|
editAction: 'always',
|
|
2931
3118
|
whenEmpty: 'empty-array',
|
|
2932
3119
|
});
|
|
2933
|
-
/** Dirty-state baseline: records +
|
|
3120
|
+
/** Dirty-state baseline: records + all section files. */
|
|
2934
3121
|
const buildSectionSnapshot = (section, sourceData, hasSupportingDocuments, sectionRegisterId) => {
|
|
2935
3122
|
const sectionWidgets = collectWidgets(section.panels);
|
|
2936
3123
|
const records = sectionWidgets.length > 0
|
|
@@ -2942,26 +3129,51 @@ const buildSectionSnapshot = (section, sourceData, hasSupportingDocuments, secti
|
|
|
2942
3129
|
: buildSectionRecords(sectionWidgets, sourceData, {
|
|
2943
3130
|
whenEmpty: 'raw-snapshot',
|
|
2944
3131
|
});
|
|
2945
|
-
const files =
|
|
2946
|
-
|
|
2947
|
-
|
|
3132
|
+
const files = fingerprintSectionFiles(collectAllSectionFilesSync(section, sourceData, {
|
|
3133
|
+
includeSupportingDocuments: hasSupportingDocuments,
|
|
3134
|
+
}));
|
|
2948
3135
|
return { records, files };
|
|
2949
3136
|
};
|
|
2950
3137
|
/** Form submit / draft: full SectionChanges payload for one section. */
|
|
2951
3138
|
function buildSectionChanges(section, storeValues, options) {
|
|
2952
3139
|
const sectionWidgets = collectWidgets(section.panels);
|
|
2953
|
-
const { sectionRegisterId } = options || {};
|
|
2954
|
-
const
|
|
3140
|
+
const { sectionRegisterId, includeSupportingDocuments = true } = options || {};
|
|
3141
|
+
const fileOptions = { includeSupportingDocuments };
|
|
3142
|
+
const records = stripSectionFileBlobs(buildSectionRecords(sectionWidgets, storeValues, {
|
|
2955
3143
|
sectionRegisterId,
|
|
2956
3144
|
editAction: 'when-register-id',
|
|
2957
3145
|
whenEmpty: 'single-record',
|
|
3146
|
+
}), getSectionFileBlobPaths(section, fileOptions));
|
|
3147
|
+
// Fresh uploads (serialized) + unchanged stored document refs.
|
|
3148
|
+
const sectionFiles = collectAllSectionFilesSync(section, storeValues, fileOptions)
|
|
3149
|
+
.filter((raw) => isSerializedFile(raw.value) || isStoredDocumentRef(raw.value))
|
|
3150
|
+
.map(({ value, tag, label, field, document_key }) => {
|
|
3151
|
+
if (isStoredDocumentRef(value)) {
|
|
3152
|
+
return {
|
|
3153
|
+
label: value.label,
|
|
3154
|
+
document_id: value.document_id,
|
|
3155
|
+
presigned_url: value.presigned_url,
|
|
3156
|
+
...(value.source_filename
|
|
3157
|
+
? { source_filename: value.source_filename }
|
|
3158
|
+
: {}),
|
|
3159
|
+
tag,
|
|
3160
|
+
...(field ? { field } : {}),
|
|
3161
|
+
...(document_key ? { document_key } : {}),
|
|
3162
|
+
};
|
|
3163
|
+
}
|
|
3164
|
+
return {
|
|
3165
|
+
...value,
|
|
3166
|
+
tag,
|
|
3167
|
+
...(label ? { label } : {}),
|
|
3168
|
+
...(field ? { field } : {}),
|
|
3169
|
+
...(document_key ? { document_key } : {}),
|
|
3170
|
+
};
|
|
2958
3171
|
});
|
|
2959
|
-
const files = collectSectionSupportingFiles(section, storeValues);
|
|
2960
3172
|
return {
|
|
2961
3173
|
section_id: options?.dbSectionId ?? section['section-id'],
|
|
2962
3174
|
section_register_id: sectionRegisterId,
|
|
2963
3175
|
records,
|
|
2964
|
-
|
|
3176
|
+
...(sectionFiles.length > 0 ? { section_files: sectionFiles } : {}),
|
|
2965
3177
|
};
|
|
2966
3178
|
}
|
|
2967
3179
|
|
|
@@ -3007,11 +3219,11 @@ const pickAllSectionFields = (baseline, current) => {
|
|
|
3007
3219
|
return fields;
|
|
3008
3220
|
};
|
|
3009
3221
|
const toRowList = (records) => records.filter(isPlainRecord);
|
|
3010
|
-
const diffFormRecord = (baselineRecords, currentRecords, internalRecordId) => {
|
|
3222
|
+
const diffFormRecord = (baselineRecords, currentRecords, internalRecordId, hasFileChanges = false) => {
|
|
3011
3223
|
const baseline = toRowList(baselineRecords)[0] ?? {};
|
|
3012
3224
|
const current = toRowList(currentRecords)[0] ?? {};
|
|
3013
3225
|
const changedFields = pickChangedFields(baseline, current);
|
|
3014
|
-
if (Object.keys(changedFields).length === 0)
|
|
3226
|
+
if (Object.keys(changedFields).length === 0 && !hasFileChanges)
|
|
3015
3227
|
return [];
|
|
3016
3228
|
const payload = {
|
|
3017
3229
|
...pickAllSectionFields(baseline, current),
|
|
@@ -3089,10 +3301,10 @@ const diffTableRows = (baselineRecords, currentRecords, tableColumnKeys) => {
|
|
|
3089
3301
|
});
|
|
3090
3302
|
return result;
|
|
3091
3303
|
};
|
|
3092
|
-
function diffSectionChangeRecords(baselineRecords, currentRecords, { isTable, internalRecordId, tableColumnKeys }) {
|
|
3304
|
+
function diffSectionChangeRecords(baselineRecords, currentRecords, { isTable, internalRecordId, tableColumnKeys, hasFileChanges, }) {
|
|
3093
3305
|
return isTable
|
|
3094
3306
|
? diffTableRows(baselineRecords, currentRecords, tableColumnKeys)
|
|
3095
|
-
: diffFormRecord(baselineRecords, currentRecords, internalRecordId);
|
|
3307
|
+
: diffFormRecord(baselineRecords, currentRecords, internalRecordId, hasFileChanges);
|
|
3096
3308
|
}
|
|
3097
3309
|
|
|
3098
3310
|
const cloneValue = (value) => {
|
|
@@ -3243,73 +3455,6 @@ const revertSectionValues = ({ section, store, dispatch, schemaData, contextSche
|
|
|
3243
3455
|
dispatch(replaceValues(newStoreValues));
|
|
3244
3456
|
};
|
|
3245
3457
|
|
|
3246
|
-
const collectDocsWidgetFiles = (panels, sourceData) => {
|
|
3247
|
-
const files = [];
|
|
3248
|
-
const docsWidgets = collectWidgets(panels).filter((w) => w.widget === 'docs');
|
|
3249
|
-
docsWidgets.forEach((widget) => {
|
|
3250
|
-
const widgetPath = widget['widget-data-path'];
|
|
3251
|
-
if (!widgetPath || typeof widgetPath !== 'string')
|
|
3252
|
-
return;
|
|
3253
|
-
const docsValue = getValueByPath(sourceData, widgetPath);
|
|
3254
|
-
if (!docsValue || typeof docsValue !== 'object' || Array.isArray(docsValue))
|
|
3255
|
-
return;
|
|
3256
|
-
const documents = widget['documents'] || [];
|
|
3257
|
-
documents.forEach((doc) => {
|
|
3258
|
-
const key = doc['document-key'];
|
|
3259
|
-
const file = docsValue[key];
|
|
3260
|
-
if (file && isSerializedFile(file)) {
|
|
3261
|
-
files.push({ ...file, label: doc['document-label'] ?? key });
|
|
3262
|
-
}
|
|
3263
|
-
});
|
|
3264
|
-
});
|
|
3265
|
-
return files;
|
|
3266
|
-
};
|
|
3267
|
-
/**
|
|
3268
|
-
* Strip the base-64 blobs of freshly-uploaded `docs` files from the save
|
|
3269
|
-
* records (they travel in `SectionChanges.files` instead) while preserving
|
|
3270
|
-
* already-uploaded documents that are stored as view-URL strings.
|
|
3271
|
-
*/
|
|
3272
|
-
const stripDocsWidgetFields = (records, panels) => {
|
|
3273
|
-
const docsWidgets = collectWidgets(panels).filter((w) => w.widget === 'docs');
|
|
3274
|
-
if (docsWidgets.length === 0)
|
|
3275
|
-
return records;
|
|
3276
|
-
const fieldKeys = docsWidgets
|
|
3277
|
-
.map((w) => {
|
|
3278
|
-
const path = w['widget-data-path'];
|
|
3279
|
-
if (!path || typeof path !== 'string')
|
|
3280
|
-
return null;
|
|
3281
|
-
return path.includes('.') ? path.split('.').slice(1).join('.') : path;
|
|
3282
|
-
})
|
|
3283
|
-
.filter((k) => k !== null);
|
|
3284
|
-
if (fieldKeys.length === 0)
|
|
3285
|
-
return records;
|
|
3286
|
-
return records.map((record) => {
|
|
3287
|
-
if (typeof record !== 'object' || record === null)
|
|
3288
|
-
return record;
|
|
3289
|
-
const copy = { ...record };
|
|
3290
|
-
for (const key of fieldKeys) {
|
|
3291
|
-
const docsObject = copy[key];
|
|
3292
|
-
if (!docsObject || typeof docsObject !== 'object' || Array.isArray(docsObject)) {
|
|
3293
|
-
delete copy[key];
|
|
3294
|
-
continue;
|
|
3295
|
-
}
|
|
3296
|
-
// Keep only the string URLs of already-uploaded docs; drop base-64 blobs.
|
|
3297
|
-
const preserved = {};
|
|
3298
|
-
for (const [docKey, docValue] of Object.entries(docsObject)) {
|
|
3299
|
-
if (typeof docValue === 'string' && docValue.length > 0) {
|
|
3300
|
-
preserved[docKey] = docValue;
|
|
3301
|
-
}
|
|
3302
|
-
}
|
|
3303
|
-
if (Object.keys(preserved).length > 0) {
|
|
3304
|
-
copy[key] = preserved;
|
|
3305
|
-
}
|
|
3306
|
-
else {
|
|
3307
|
-
delete copy[key];
|
|
3308
|
-
}
|
|
3309
|
-
}
|
|
3310
|
-
return copy;
|
|
3311
|
-
});
|
|
3312
|
-
};
|
|
3313
3458
|
const readSectionInternalRecordId = (source, sectionRegisterId) => {
|
|
3314
3459
|
if (!sectionRegisterId)
|
|
3315
3460
|
return undefined;
|
|
@@ -3320,60 +3465,32 @@ const readSectionInternalRecordId = (source, sectionRegisterId) => {
|
|
|
3320
3465
|
const id = sectionData.internal_record_id;
|
|
3321
3466
|
return typeof id === 'string' && id.length > 0 ? id : undefined;
|
|
3322
3467
|
};
|
|
3323
|
-
const extractProfileImage = (records) => {
|
|
3324
|
-
let profileImage = null;
|
|
3325
|
-
const clonedRecords = records.map((record) => {
|
|
3326
|
-
if (typeof record !== 'object' || record === null)
|
|
3327
|
-
return record;
|
|
3328
|
-
const copy = { ...record };
|
|
3329
|
-
for (const [key, value] of Object.entries(copy)) {
|
|
3330
|
-
if (value instanceof File) {
|
|
3331
|
-
profileImage = value;
|
|
3332
|
-
copy[key] = '';
|
|
3333
|
-
}
|
|
3334
|
-
else if (isSerializedFile(value)) {
|
|
3335
|
-
try {
|
|
3336
|
-
profileImage = deserializeFile(value);
|
|
3337
|
-
copy[key] = '';
|
|
3338
|
-
}
|
|
3339
|
-
catch (err) {
|
|
3340
|
-
console.error('Failed to deserialize profile image:', err);
|
|
3341
|
-
}
|
|
3342
|
-
}
|
|
3343
|
-
}
|
|
3344
|
-
return copy;
|
|
3345
|
-
});
|
|
3346
|
-
return { records: clonedRecords, profileImage };
|
|
3347
|
-
};
|
|
3348
3468
|
const executeSectionSave = async ({ store, dispatch, section, schemaData, contextSchemaData, hasSupportingDocuments, dbSectionId, sectionRegisterId, sectionFieldsOnly = false, skipRequired = false, onSectionSave, }) => {
|
|
3349
3469
|
const sectionWidgets = collectWidgets(section.panels);
|
|
3350
3470
|
const currentState = store.getState().widget;
|
|
3351
3471
|
let currentSchemaData = currentState.values || {};
|
|
3352
|
-
const
|
|
3472
|
+
const fileOptions = { includeSupportingDocuments: hasSupportingDocuments };
|
|
3473
|
+
const isSectionValid = sectionValidate(section, currentSchemaData, dispatch, skipRequired, hasSupportingDocuments);
|
|
3353
3474
|
if (!isSectionValid) {
|
|
3354
3475
|
return { validated: false, saved: false, currentSchemaData };
|
|
3355
3476
|
}
|
|
3356
3477
|
const baselineSource = (schemaData || contextSchemaData || {});
|
|
3357
3478
|
const baselineRecords = trackSectionChanges(sectionWidgets, baselineSource, sectionRegisterId);
|
|
3358
3479
|
const newSchemaData = trackSectionChanges(sectionWidgets, currentSchemaData, sectionRegisterId);
|
|
3359
|
-
const sectionFiles =
|
|
3360
|
-
|
|
3361
|
-
|
|
3362
|
-
|
|
3363
|
-
|
|
3364
|
-
|
|
3365
|
-
|
|
3366
|
-
// Collect files from any docs widgets and add them to the save payload.
|
|
3367
|
-
const docsFiles = collectDocsWidgetFiles(section.panels, currentSchemaData);
|
|
3368
|
-
sectionFiles.push(...docsFiles);
|
|
3369
|
-
if (JSON.stringify(baselineRecords) === JSON.stringify(newSchemaData) && docsFiles.length === 0) {
|
|
3480
|
+
const sectionFiles = await collectAllSectionFiles(section, currentSchemaData, fileOptions);
|
|
3481
|
+
// Existing stored docs are included for payload continuity; only fresh uploads
|
|
3482
|
+
// should drive "file changed" / no-op detection.
|
|
3483
|
+
const freshSectionFiles = sectionFiles.filter(isFreshSectionFileEntry);
|
|
3484
|
+
const blobPaths = getSectionFileBlobPaths(section, fileOptions);
|
|
3485
|
+
if (JSON.stringify(baselineRecords) === JSON.stringify(newSchemaData) &&
|
|
3486
|
+
freshSectionFiles.length === 0) {
|
|
3370
3487
|
return { validated: true, saved: false, currentSchemaData };
|
|
3371
3488
|
}
|
|
3372
|
-
|
|
3373
|
-
|
|
3374
|
-
|
|
3489
|
+
// Strip file fields from records — they travel only in `section_files`.
|
|
3490
|
+
let records = stripSectionFileBlobs([...newSchemaData], blobPaths);
|
|
3491
|
+
const fullCurrentRecords = records;
|
|
3375
3492
|
if (sectionFieldsOnly) {
|
|
3376
|
-
const baselineStripped =
|
|
3493
|
+
const baselineStripped = stripSectionFileBlobs([...baselineRecords], blobPaths);
|
|
3377
3494
|
const isTable = sectionWidgets.some((widget) => isTableLikeWidget(widget));
|
|
3378
3495
|
const internalRecordId = readSectionInternalRecordId(baselineSource, sectionRegisterId) ??
|
|
3379
3496
|
readSectionInternalRecordId(currentSchemaData, sectionRegisterId);
|
|
@@ -3391,18 +3508,28 @@ const executeSectionSave = async ({ store, dispatch, section, schemaData, contex
|
|
|
3391
3508
|
isTable,
|
|
3392
3509
|
internalRecordId,
|
|
3393
3510
|
tableColumnKeys,
|
|
3511
|
+
hasFileChanges: freshSectionFiles.length > 0,
|
|
3394
3512
|
});
|
|
3395
|
-
if (records.length === 0 &&
|
|
3513
|
+
if (records.length === 0 && freshSectionFiles.length === 0) {
|
|
3396
3514
|
return { validated: true, saved: false, currentSchemaData };
|
|
3397
3515
|
}
|
|
3516
|
+
if (records.length === 0 && freshSectionFiles.length > 0) {
|
|
3517
|
+
const currentRecord = fullCurrentRecords.find((record) => typeof record === 'object' && record !== null);
|
|
3518
|
+
records = [
|
|
3519
|
+
{
|
|
3520
|
+
...(currentRecord ?? {}),
|
|
3521
|
+
edit_action: 'UPDATE',
|
|
3522
|
+
...(internalRecordId ? { internal_record_id: internalRecordId } : {}),
|
|
3523
|
+
},
|
|
3524
|
+
];
|
|
3525
|
+
}
|
|
3398
3526
|
}
|
|
3399
3527
|
try {
|
|
3400
3528
|
await onSectionSave?.({
|
|
3401
3529
|
section_id: dbSectionId ?? section['section-id'],
|
|
3402
3530
|
section_register_id: sectionRegisterId,
|
|
3403
3531
|
records,
|
|
3404
|
-
|
|
3405
|
-
...(profileImage ? { image: profileImage } : {}),
|
|
3532
|
+
...(sectionFiles.length > 0 ? { section_files: sectionFiles } : {}),
|
|
3406
3533
|
});
|
|
3407
3534
|
}
|
|
3408
3535
|
catch (error) {
|
|
@@ -3716,45 +3843,9 @@ const WidgetFieldLabel = ({ label, required = false, className = '', title, }) =
|
|
|
3716
3843
|
const { t } = useWidgetContext();
|
|
3717
3844
|
const translatedLabel = tSchema(t, label);
|
|
3718
3845
|
const tooltip = title !== undefined ? tSchema(t, title) : translatedLabel;
|
|
3719
|
-
return (jsxRuntimeExports.jsxs("label", { className: `flex items-baseline min-w-0 max-w-full ${className}`, style: { fontFamily: 'Roboto, sans-serif' }, title: tooltip, children: [jsxRuntimeExports.jsx("span", { className: "min-w-0 truncate", children: translatedLabel }), required && jsxRuntimeExports.jsx("span", { className: "ml-1 shrink-0 owt-field-required", children: "*" })] }));
|
|
3846
|
+
return (jsxRuntimeExports.jsxs("label", { className: `flex items-baseline min-w-0 max-w-full owt-field-label ${className}`, style: { fontFamily: 'Roboto, sans-serif' }, title: tooltip, children: [jsxRuntimeExports.jsx("span", { className: "min-w-0 truncate", children: translatedLabel }), required && jsxRuntimeExports.jsx("span", { className: "ml-1 shrink-0 owt-field-required", children: "*" })] }));
|
|
3720
3847
|
};
|
|
3721
3848
|
|
|
3722
|
-
const canPreviewInWeb = (file) => {
|
|
3723
|
-
let mimeType;
|
|
3724
|
-
let fileName;
|
|
3725
|
-
if (file instanceof File) {
|
|
3726
|
-
mimeType = file.type;
|
|
3727
|
-
fileName = file.name.toLowerCase();
|
|
3728
|
-
}
|
|
3729
|
-
else {
|
|
3730
|
-
try {
|
|
3731
|
-
const parsed = new URL(file);
|
|
3732
|
-
fileName = parsed.pathname.toLowerCase();
|
|
3733
|
-
}
|
|
3734
|
-
catch {
|
|
3735
|
-
fileName = file.split('?')[0].split('#')[0].toLowerCase();
|
|
3736
|
-
}
|
|
3737
|
-
mimeType = '';
|
|
3738
|
-
}
|
|
3739
|
-
if (mimeType) {
|
|
3740
|
-
if (mimeType.startsWith('image/'))
|
|
3741
|
-
return true;
|
|
3742
|
-
if (mimeType === 'application/pdf')
|
|
3743
|
-
return true;
|
|
3744
|
-
if (mimeType.startsWith('text/'))
|
|
3745
|
-
return true;
|
|
3746
|
-
if (mimeType === 'application/json')
|
|
3747
|
-
return true;
|
|
3748
|
-
}
|
|
3749
|
-
const extension = fileName.split('.').pop() || '';
|
|
3750
|
-
const previewableExtensions = [
|
|
3751
|
-
'jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'bmp', 'ico',
|
|
3752
|
-
'pdf',
|
|
3753
|
-
'txt', 'csv', 'json', 'xml', 'html', 'css', 'js', 'ts', 'tsx', 'jsx',
|
|
3754
|
-
'md', 'markdown', 'yaml', 'yml',
|
|
3755
|
-
];
|
|
3756
|
-
return previewableExtensions.includes(extension.toLowerCase());
|
|
3757
|
-
};
|
|
3758
3849
|
const openFileInNewTab = (file) => {
|
|
3759
3850
|
if (typeof file === 'string') {
|
|
3760
3851
|
window.open(file, '_blank', 'noopener,noreferrer');
|
|
@@ -3766,13 +3857,11 @@ const openFileInNewTab = (file) => {
|
|
|
3766
3857
|
window.setTimeout(() => URL.revokeObjectURL(url), 60000);
|
|
3767
3858
|
};
|
|
3768
3859
|
|
|
3769
|
-
var img$d = "data:image/png;base64,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";
|
|
3770
|
-
|
|
3771
|
-
var img$c = "data:image/png;base64,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";
|
|
3860
|
+
var img$c = "data:image/png;base64,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";
|
|
3772
3861
|
|
|
3773
|
-
var img$b = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAACAKADAAQAAAABAAACAAAAAAAL+LWFAAAkvUlEQVR4Ae3d344sVb0H8I1GuMFofAD5p95443ucGwHJifgg8g7wDpoYJecCvOGEIHAFr2ACMeobqES4OCGBsxZ7L2emd/f8urtqVa0/n04qvWemu2rVp35rfX/Tu2fmwQM3AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA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AfCGPyVNIBYYqQnIa5cbAQILBF5Kz+29AfCd/4IC8NTpBEZpAl6c7so5YQIrC+T3aXyStl6bAN/5r1wQdjeFQO9NQF6zvMdsilJ1krUFcifdYwPgO//alWH/Iwv03AT8fOQL49wIbC3wbjpgT02A8N+6QhxvRIEem4D3R7wQzonAngLPp4Pnvw/QQxPgZf89K8WxRxPoqQnIa1Req9wIEFhZ4JW0v9YbAN/5r3zR7Y5AEuilCXjV1SJAoJ7A62nXrTYBvvOvd93tmUDrTUBem9wIEKgo8ETa92/S1loT4Dv/ihfdrgk8Emi1Cfh9Gp93/StTAhsI5EXgd2lrpQnIY8ljciNAoL6A+V/f2BEINC2QXwl4I217NwH5Zb88FjcCBLYTMP+3s3YkAs0K5N8U+I+0bd0IfJaO+ctmVQyMwBwC5v8c19lZEjgp8EL6Sv7Z262agPxXCv2oz8nL4QsENhUw/zfldjACbQrk7wY+TVutRiD/ek+/37vNa29UBMx/NUBgcoH8TtyX0/Zx2tb4U8J5Hx+lLS8u3uWbENwINCxg/jd8cQyNwJYCz6aDvZa2D9P2RdrOfWUgP/aDtP06bc+kzY0Agf4Enk1DNv/7u26bjdi7tzej3v1AT6YR/DRtP0rbc2n7QdqeTlu+fZ62/EbCv6ftL2n7c9q+TJsbAQJjCJj/Y1xHZ0GAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgssD/A1hw9f23AMmGAAAAAElFTkSuQmCC";
|
|
3862
|
+
var img$b = "data:image/png;base64,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";
|
|
3774
3863
|
|
|
3775
|
-
var img$a = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAkCAYAAACe0YppAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAHqADAAQAAAABAAAAJAAAAAAh0JciAAACrUlEQVRYCcWXPW8TQRCG31kbpNBChGiiRJQ0tFDggPgBtKGhJgEJUGxDFCmJUBKwDUoV2jRxS2NEhZCgAPELKBAhIPFRpKIwUXIe3vFHFJzbs2zWupHWu7e7M8/OenbuVkDReUzoLjbZvGDP/ysiWJQSlpLsiN7HOBp4rco6oBC+Svicz2QWERYULSjh605Q3dvHnk/B138sg1EV1DrjtPVAC9j1eS6NPD5x8lko3rgKch3FfmvbOY2w1a3n89xxlWdsMuvP3UqDPhO2xPLF9NueL3Tbct0dIZ4jJdTh8iH4Irf9H/hQwLZ4edSCs7ltz/Tc4CvWNhka2IwbXDKYZLMDt4Brep61CUFE8Jt26iwj9KbcKGDW7GrDfnGi+csf8zwqoh7MY1nFjhLYBpziKTl3UIDRDthqp5gJ5zENZsrMCXlscQE3DoMO2sJ8wURFr08GBRtAythgZeWIRAVsSDtZBdvqI5QeHamBE7c6yqPKJND/G0sZvIqXmQpmfI57wVrEGI/CFINhIOGCp3lml/mS+B5nwAuWx/iqs5hnDr8ap9ijT7noF+5JPNR0vWAblAqWWVkJLqkFV2rgxK1mVG8ySC4Oss/NqC5j2qfrBdf5RSERrg8c1cBNvYOHsoYfcXAveISvNHpcZIrLxSkm9rXO8SvngZquF2yDTPolVlaCS2rBlRo4cav56fscgvNJ+8wYqDEt3k6aEzfmBVtU82P/Wq+oZiq/pfdQkqf4Fgfw9XnBFtXM1XeZq73nmGPK68871yfUFuMF2yBz9RorK8ElteDiHY2blYI4/ks7xuUCxofNJ2OizfiZZVTW2GGfKJNMkc9cFlUu5k/QRQiOYx9TfHFcMrtkvhWdw2l2fmDnWFCY39i2XWucrOAXb1A5ruKjf26wkfeEXrE71V+iV9IhdJQEvwAAAABJRU5ErkJggg==";
|
|
3864
|
+
var img$a = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAACAKADAAQAAAABAAACAAAAAAAL+LWFAAAkvUlEQVR4Ae3d344sVb0H8I1GuMFofAD5p95443ucGwHJifgg8g7wDpoYJecCvOGEIHAFr2ACMeobqES4OCGBsxZ7L2emd/f8urtqVa0/n04qvWemu2rVp35rfX/Tu2fmwQM3AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBA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AfCGPyVNIBYYqQnIa5cbAQILBF5Kz+29AfCd/4IC8NTpBEZpAl6c7so5YQIrC+T3aXyStl6bAN/5r1wQdjeFQO9NQF6zvMdsilJ1krUFcifdYwPgO//alWH/Iwv03AT8fOQL49wIbC3wbjpgT02A8N+6QhxvRIEem4D3R7wQzonAngLPp4Pnvw/QQxPgZf89K8WxRxPoqQnIa1Req9wIEFhZ4JW0v9YbAN/5r3zR7Y5AEuilCXjV1SJAoJ7A62nXrTYBvvOvd93tmUDrTUBem9wIEKgo8ETa92/S1loT4Dv/ihfdrgk8Emi1Cfh9Gp93/StTAhsI5EXgd2lrpQnIY8ljciNAoL6A+V/f2BEINC2QXwl4I217NwH5Zb88FjcCBLYTMP+3s3YkAs0K5N8U+I+0bd0IfJaO+ctmVQyMwBwC5v8c19lZEjgp8EL6Sv7Z262agPxXCv2oz8nL4QsENhUw/zfldjACbQrk7wY+TVutRiD/ek+/37vNa29UBMx/NUBgcoH8TtyX0/Zx2tb4U8J5Hx+lLS8u3uWbENwINCxg/jd8cQyNwJYCz6aDvZa2D9P2RdrOfWUgP/aDtP06bc+kzY0Agf4Enk1DNv/7u26bjdi7tzej3v1AT6YR/DRtP0rbc2n7QdqeTlu+fZ62/EbCv6ftL2n7c9q+TJsbAQJjCJj/Y1xHZ0GAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgssD/A1hw9f23AMmGAAAAAElFTkSuQmCC";
|
|
3776
3865
|
|
|
3777
3866
|
var img$9 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGxmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDIgNzkuMTY0NDYwLCAyMDIwLzA1LzEyLTE2OjA0OjE3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMiAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjUtMDktMjRUMTI6Mjc6NDArMDU6MzAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjYtMDEtMDJUMTY6NTA6MDQrMDU6MzAiIHhtcDpNb2RpZnlEYXRlPSIyMDI2LTAxLTAyVDE2OjUwOjA0KzA1OjMwIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjljMDI0ZTVhLWJiMWItNDBiMi05NThmLTg5YjExMTE5NGI4MSIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjMzZDZiMTBiLTQzNjYtYTc0Ny1iOTZlLWI4ZTBhZjQxMTkzOCIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjI1M2M1ZmRhLTlkYzctNGQ0MC04Y2E3LThmMTQ2MmU4OWMxNSIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MjUzYzVmZGEtOWRjNy00ZDQwLThjYTctOGYxNDYyZTg5YzE1IiBzdEV2dDp3aGVuPSIyMDI1LTA5LTI0VDEyOjI3OjQwKzA1OjMwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjEuMiAoTWFjaW50b3NoKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MDQ5N2Y5YmYtMWZiMi00MWJlLTg5ZGItZGFiMDZmMjEwODE4IiBzdEV2dDp3aGVuPSIyMDI1LTA5LTI0VDEyOjI3OjQwKzA1OjMwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjEuMiAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OWMwMjRlNWEtYmIxYi00MGIyLTk1OGYtODliMTExMTk0YjgxIiBzdEV2dDp3aGVuPSIyMDI2LTAxLTAyVDE2OjUwOjA0KzA1OjMwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjEuMiAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7pSLHQ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";
|
|
3778
3867
|
|
|
@@ -3794,202 +3883,125 @@ var img$1 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAasAAAGmCAYAAADCj6uzA
|
|
|
3794
3883
|
|
|
3795
3884
|
var img = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAACAKADAAQAAAABAAACAAAAAAAL+LWFAAAoQklEQVR4Ae3dy49tWV0H8MubEI3GGBFwojwbGmjppsH3pQEnDIz6BzAz4T9QiVPxFZ0ZJ2LigBEDE00g0SADNb7CI4EQE41goBua7r7dPBQEvP52uvftuvU4tc/Ze+21fmt9TrJy6lbts/dan9+q8/3VqbpVN264ESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMAOAi+Ka7xwh+sUu8Rzip15nxNPBfjhGP8d49Y+l3QVAgQIEBhM4KWx3l+OcTPGfTF+IsYLYky3b8f49xifjPGxGH8RQx4Fwta3V8cJfz3Gx2N8Mcb/xbh9Zkzv+1CM98V4WQw3AgQIECBwqsAD8cAPx/hOjLNZc+jtb8Wxfx7jnhhuGwi8M87xjzEOoZ//2FSED8a4N4YbAQIECBBYKvCDceCUH+e/yDyfM4f+PTUNfxTjJTHcThB4VTzmIzEOIV/3se/F438nRurv1cT83QgQIECgvMBb4hL/GeO6bFn68c/EuV5Tftp9XeGXYjlPxViKfN1xn4hzTd9CcCNAgAABApcJ3Ix3bpk7cy49GuedGgu3BQLvjWO+G2PG2+r+kTjn6xZc3yEECBAgMJbAQ7Hcb8bYKm/On+crce7pVW23AwLTV/4lwn8uhibgAL4PESBAYECB0uE/58+nw/bFA/ouWvLUHZV4+WXGn+81AYvK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cqPi0586sS/E2LoJ+Eqc8/7is3cBAgQIEMgqMP1gYKn8eUtWlL3n/Yq44D/E2KoJ+GSc65V7L8L1CBAgQCCdwNb586kQkD9HboPpZwLeH+ObMU5tBKb/a/nbMV4cw40AAQIECCwReEEc9Fsx1ubPB+Ic8meJ+BXHTN3Y9FOTT8RY2gh8LY794xg/HsONAAECBAicIvBj8aApf6afH1uaP1+PY1Pkz3NiolluL4qJvuuZcV/cTy+pfH+M6TcJTuD/EePTMf42xkdj/E8MNwIECBAgsFZgyp93x3hnjOl3B0w/sP7SGFP+TD9f9kiMz8X4eIyPxJA/geBGgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAn0I/D/rORE18R9ldgAAAABJRU5ErkJggg==";
|
|
3796
3885
|
|
|
3886
|
+
const getFileName = (file) => file instanceof File ? file.name : file.split('/').pop() || file;
|
|
3887
|
+
const iconButtonClass = 'inline-flex items-center justify-center shrink-0 p-0 border-0 bg-transparent focus:outline-none';
|
|
3888
|
+
const docControlClass = 'w-full h-9 min-w-0 flex items-center rounded-lg px-2.5 box-border';
|
|
3797
3889
|
const FileInputWidget = ({ config }) => {
|
|
3798
3890
|
const { value, error, touched, isEnabled, isRequired, onChange, onBlur, config: widgetConfig, } = useBaseWidget({ config });
|
|
3799
3891
|
const { t } = useWidgetContext();
|
|
3800
3892
|
const accept = widgetConfig['widget-data-options']?.accept;
|
|
3801
|
-
const multiple = widgetConfig['widget-data-options']?.multiple || false;
|
|
3802
3893
|
const maxSize = widgetConfig['widget-data-options']?.maxSize;
|
|
3803
|
-
const
|
|
3804
|
-
const [
|
|
3894
|
+
const isReadonly = Boolean(widgetConfig['widget-readonly']);
|
|
3895
|
+
const [localFile, setLocalFile] = React.useState(null);
|
|
3896
|
+
const fileInputRef = React.useRef(null);
|
|
3805
3897
|
const deserializedValue = React.useMemo(() => {
|
|
3806
3898
|
if (!value)
|
|
3807
3899
|
return null;
|
|
3808
3900
|
return deserializeValue(value);
|
|
3809
3901
|
}, [value]);
|
|
3902
|
+
const storedDocument = React.useMemo(() => {
|
|
3903
|
+
if (isStoredDocumentRef(deserializedValue))
|
|
3904
|
+
return deserializedValue;
|
|
3905
|
+
if (isStoredDocumentRef(value))
|
|
3906
|
+
return value;
|
|
3907
|
+
return null;
|
|
3908
|
+
}, [deserializedValue, value]);
|
|
3810
3909
|
React.useEffect(() => {
|
|
3811
|
-
if (deserializedValue) {
|
|
3812
|
-
|
|
3813
|
-
if (Array.isArray(deserializedValue)) {
|
|
3814
|
-
const files = deserializedValue.filter((v) => v instanceof File);
|
|
3815
|
-
setLocalFiles(files.length > 0 ? files : null);
|
|
3816
|
-
}
|
|
3817
|
-
else {
|
|
3818
|
-
setLocalFiles(null);
|
|
3819
|
-
}
|
|
3820
|
-
}
|
|
3821
|
-
else {
|
|
3822
|
-
if (deserializedValue instanceof File) {
|
|
3823
|
-
setLocalFiles(deserializedValue);
|
|
3824
|
-
}
|
|
3825
|
-
else {
|
|
3826
|
-
setLocalFiles(null);
|
|
3827
|
-
}
|
|
3828
|
-
}
|
|
3910
|
+
if (deserializedValue instanceof File) {
|
|
3911
|
+
setLocalFile(deserializedValue);
|
|
3829
3912
|
}
|
|
3830
3913
|
else {
|
|
3831
|
-
|
|
3914
|
+
setLocalFile(null);
|
|
3832
3915
|
}
|
|
3833
|
-
}, [deserializedValue
|
|
3916
|
+
}, [deserializedValue]);
|
|
3834
3917
|
const handleFileChange = async (e) => {
|
|
3835
3918
|
const files = e.target.files;
|
|
3836
3919
|
if (!files || files.length === 0) {
|
|
3837
3920
|
onChange(null);
|
|
3838
|
-
|
|
3921
|
+
setLocalFile(null);
|
|
3839
3922
|
return;
|
|
3840
3923
|
}
|
|
3841
|
-
|
|
3842
|
-
|
|
3843
|
-
|
|
3844
|
-
|
|
3845
|
-
return;
|
|
3846
|
-
}
|
|
3847
|
-
}
|
|
3848
|
-
}
|
|
3849
|
-
const fileArray = Array.from(files);
|
|
3850
|
-
if (multiple) {
|
|
3851
|
-
setLocalFiles(fileArray);
|
|
3852
|
-
}
|
|
3853
|
-
else {
|
|
3854
|
-
setLocalFiles(fileArray[0]);
|
|
3924
|
+
const file = files[0];
|
|
3925
|
+
if (maxSize && file.size > maxSize) {
|
|
3926
|
+
console.error(`File ${file.name} exceeds maximum size of ${maxSize} bytes`);
|
|
3927
|
+
return;
|
|
3855
3928
|
}
|
|
3929
|
+
setLocalFile(file);
|
|
3856
3930
|
try {
|
|
3857
|
-
const serialized = await serializeValue(
|
|
3931
|
+
const serialized = await serializeValue(file);
|
|
3858
3932
|
onChange(serialized);
|
|
3859
3933
|
}
|
|
3860
3934
|
catch (error) {
|
|
3861
3935
|
console.error('Error serializing file:', error);
|
|
3862
|
-
|
|
3863
|
-
|
|
3864
|
-
|
|
3865
|
-
|
|
3866
|
-
onChange({ name: fileArray[0].name, size: fileArray[0].size, type: fileArray[0].type });
|
|
3867
|
-
}
|
|
3936
|
+
onChange({ name: file.name, size: file.size, type: file.type });
|
|
3937
|
+
}
|
|
3938
|
+
if (fileInputRef.current) {
|
|
3939
|
+
fileInputRef.current.value = '';
|
|
3868
3940
|
}
|
|
3869
3941
|
};
|
|
3870
|
-
const
|
|
3871
|
-
|
|
3872
|
-
|
|
3873
|
-
|
|
3874
|
-
|
|
3875
|
-
if (!multiple && localFiles instanceof File) {
|
|
3876
|
-
return [localFiles];
|
|
3877
|
-
}
|
|
3942
|
+
const handleRemove = () => {
|
|
3943
|
+
onChange(null);
|
|
3944
|
+
setLocalFile(null);
|
|
3945
|
+
if (fileInputRef.current) {
|
|
3946
|
+
fileInputRef.current.value = '';
|
|
3878
3947
|
}
|
|
3879
|
-
|
|
3880
|
-
|
|
3881
|
-
|
|
3882
|
-
|
|
3883
|
-
|
|
3884
|
-
|
|
3885
|
-
|
|
3886
|
-
|
|
3887
|
-
|
|
3888
|
-
|
|
3889
|
-
|
|
3890
|
-
|
|
3948
|
+
};
|
|
3949
|
+
const getFile = () => {
|
|
3950
|
+
if (localFile instanceof File) {
|
|
3951
|
+
return localFile;
|
|
3952
|
+
}
|
|
3953
|
+
if (deserializedValue instanceof File) {
|
|
3954
|
+
return deserializedValue;
|
|
3955
|
+
}
|
|
3956
|
+
if (typeof deserializedValue === 'string') {
|
|
3957
|
+
return deserializedValue;
|
|
3958
|
+
}
|
|
3959
|
+
if (storedDocument) {
|
|
3960
|
+
return storedDocument.presigned_url;
|
|
3961
|
+
}
|
|
3962
|
+
if (deserializedValue && typeof deserializedValue === 'object' && isSerializedFile(deserializedValue)) {
|
|
3963
|
+
try {
|
|
3964
|
+
return deserializeFile(deserializedValue);
|
|
3891
3965
|
}
|
|
3892
|
-
|
|
3893
|
-
|
|
3894
|
-
return [deserializeFile(deserializedValue)];
|
|
3895
|
-
}
|
|
3896
|
-
catch (e) {
|
|
3897
|
-
console.error('Error deserializing file:', e);
|
|
3898
|
-
}
|
|
3966
|
+
catch (e) {
|
|
3967
|
+
console.error('Error deserializing file:', e);
|
|
3899
3968
|
}
|
|
3900
3969
|
}
|
|
3901
|
-
return
|
|
3970
|
+
return null;
|
|
3902
3971
|
};
|
|
3903
|
-
const
|
|
3904
|
-
const
|
|
3905
|
-
|
|
3906
|
-
|
|
3907
|
-
|
|
3972
|
+
const file = getFile();
|
|
3973
|
+
const hasFile = !!file || !!storedDocument;
|
|
3974
|
+
const displayFileName = storedDocument
|
|
3975
|
+
? storedDocument.source_filename || storedDocument.label
|
|
3976
|
+
: file
|
|
3977
|
+
? getFileName(file)
|
|
3978
|
+
: '';
|
|
3979
|
+
const isEmptyRequired = isRequired && !hasFile;
|
|
3980
|
+
const showValidationError = touched && error.length > 0 && isEmptyRequired;
|
|
3981
|
+
const label = tSchema(t, widgetConfig['widget-label']);
|
|
3982
|
+
const handlePreview = (previewFile, e) => {
|
|
3908
3983
|
if (e) {
|
|
3909
3984
|
e.preventDefault();
|
|
3910
3985
|
e.stopPropagation();
|
|
3911
3986
|
}
|
|
3912
|
-
if (!
|
|
3987
|
+
if (!previewFile)
|
|
3913
3988
|
return;
|
|
3914
|
-
|
|
3915
|
-
if (canPreviewInWeb(file)) {
|
|
3916
|
-
openFileInNewTab(file);
|
|
3917
|
-
}
|
|
3918
|
-
};
|
|
3919
|
-
const renderFileDisplay = () => {
|
|
3920
|
-
if (files.length === 0) {
|
|
3921
|
-
return null;
|
|
3922
|
-
}
|
|
3923
|
-
if (files.length === 1) {
|
|
3924
|
-
const file = files[0];
|
|
3925
|
-
const fileName = file instanceof File ? file.name : file.split('/').pop() || file;
|
|
3926
|
-
const canPreview = canPreviewInWeb(file);
|
|
3927
|
-
const fileIconElement = (jsxRuntimeExports.jsx("img", { src: img$a, alt: "File icon", style: {
|
|
3928
|
-
width: '15px',
|
|
3929
|
-
height: '18px',
|
|
3930
|
-
aspectRatio: '5/6',
|
|
3931
|
-
marginRight: '8px',
|
|
3932
|
-
flexShrink: 0
|
|
3933
|
-
} }));
|
|
3934
|
-
if (canPreview) {
|
|
3935
|
-
return (jsxRuntimeExports.jsxs("div", { style: { display: 'flex', alignItems: 'center' }, children: [fileIconElement, jsxRuntimeExports.jsx("button", { type: "button", onClick: (e) => handleFileClick(file, e), className: "text-sm hover:underline focus:outline-none rounded cursor-pointer owt-link", style: { color: isSupportingDocument ? 'var(--owt-color-text)' : 'var(--owt-color-info)' }, title: "Click to preview", children: fileName })] }));
|
|
3936
|
-
}
|
|
3937
|
-
else {
|
|
3938
|
-
return (jsxRuntimeExports.jsxs("div", { style: { display: 'flex', alignItems: 'center' }, children: [fileIconElement, jsxRuntimeExports.jsx("span", { className: "text-sm", style: { color: isSupportingDocument ? 'var(--owt-color-text)' : 'var(--owt-color-text-muted)' }, children: fileName })] }));
|
|
3939
|
-
}
|
|
3940
|
-
}
|
|
3941
|
-
return (jsxRuntimeExports.jsx("div", { className: "flex flex-wrap gap-2", children: files.map((file, index) => {
|
|
3942
|
-
const fileName = file instanceof File ? file.name : file.split('/').pop() || file;
|
|
3943
|
-
const canPreview = canPreviewInWeb(file);
|
|
3944
|
-
const fileIconElement = (jsxRuntimeExports.jsx("img", { src: img$a, alt: "File icon", style: {
|
|
3945
|
-
width: '15px',
|
|
3946
|
-
height: '18px',
|
|
3947
|
-
aspectRatio: '5/6',
|
|
3948
|
-
marginRight: '8px',
|
|
3949
|
-
flexShrink: 0
|
|
3950
|
-
} }));
|
|
3951
|
-
if (canPreview) {
|
|
3952
|
-
return (jsxRuntimeExports.jsxs("div", { style: { display: 'flex', alignItems: 'center' }, children: [fileIconElement, jsxRuntimeExports.jsx("button", { type: "button", onClick: (e) => handleFileClick(file, e), className: "text-sm hover:underline focus:outline-none rounded cursor-pointer owt-link", style: { color: isSupportingDocument ? 'var(--owt-color-text)' : 'var(--owt-color-info)' }, title: "Click to preview", children: fileName })] }, index));
|
|
3953
|
-
}
|
|
3954
|
-
else {
|
|
3955
|
-
return (jsxRuntimeExports.jsxs("div", { style: { display: 'flex', alignItems: 'center' }, children: [fileIconElement, jsxRuntimeExports.jsx("span", { className: "text-sm", style: { color: isSupportingDocument ? 'var(--owt-color-text)' : 'var(--owt-color-text-muted)' }, children: fileName })] }, index));
|
|
3956
|
-
}
|
|
3957
|
-
}) }));
|
|
3989
|
+
openFileInNewTab(previewFile);
|
|
3958
3990
|
};
|
|
3959
|
-
if (
|
|
3960
|
-
|
|
3961
|
-
|
|
3962
|
-
}
|
|
3963
|
-
|
|
3964
|
-
|
|
3965
|
-
|
|
3966
|
-
|
|
3967
|
-
|
|
3968
|
-
maxWidth: '180px',
|
|
3969
|
-
height: '30px',
|
|
3970
|
-
paddingLeft: '12px',
|
|
3971
|
-
paddingRight: '12px',
|
|
3972
|
-
borderRadius: '10px'
|
|
3973
|
-
}, children: [jsxRuntimeExports.jsx("span", { style: {
|
|
3974
|
-
color: isSupportingDocument ? 'var(--owt-color-text-muted)' : 'var(--owt-color-text-muted)',
|
|
3975
|
-
fontFamily: 'Roboto',
|
|
3976
|
-
fontSize: '16px',
|
|
3977
|
-
fontStyle: 'normal',
|
|
3978
|
-
fontWeight: 400,
|
|
3979
|
-
lineHeight: '24px',
|
|
3980
|
-
textAlign: 'left'
|
|
3981
|
-
}, children: t?.('common.uploadFile') || 'Upload File' }), jsxRuntimeExports.jsx("img", { src: img$9, alt: "Upload", style: {
|
|
3982
|
-
width: '18px',
|
|
3983
|
-
height: '18px',
|
|
3984
|
-
aspectRatio: '1/1',
|
|
3985
|
-
display: 'block',
|
|
3986
|
-
flexShrink: 0
|
|
3987
|
-
} }), jsxRuntimeExports.jsx("input", { type: "file", accept: accept, multiple: multiple, onChange: handleFileChange, onBlur: onBlur, disabled: !isEnabled, className: "hidden" })] }), displayValue && (jsxRuntimeExports.jsx("div", { className: "flex-1 min-w-0", children: renderFileDisplay() }))] }), touched && error.length > 0 && (jsxRuntimeExports.jsx("p", { className: "owt-field-error text-sm mt-1", children: error[0] })), maxSize && (jsxRuntimeExports.jsx("p", { className: "hidden sm:block owt-text-muted text-xs mt-1", children: t?.('common.maxFileSize', { size: (maxSize / 1024 / 1024).toFixed(2) }) }))] })] }) }));
|
|
3991
|
+
if (isReadonly) {
|
|
3992
|
+
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] FileDisplayWidget flex flex-row items-start w-full", children: [label && (jsxRuntimeExports.jsxs("div", { className: "w-1/2 min-w-0 pr-2 text-base owt-field-label font-medium truncate", style: { fontFamily: 'Roboto, sans-serif' }, title: label, children: [label, ":"] })), jsxRuntimeExports.jsx("div", { className: "w-1/2 min-w-0 flex items-center min-h-[1.5rem]", children: hasFile && file ? (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx("span", { className: "w-10/12 min-w-0 truncate text-base owt-text font-medium", title: displayFileName, children: displayFileName }), jsxRuntimeExports.jsx("button", { type: "button", onClick: (e) => handlePreview(file, e), className: `w-2/12 ${iconButtonClass}`, title: displayFileName, children: jsxRuntimeExports.jsx("img", { src: img$1, alt: t?.('common.view') ?? 'View', className: "h-4 w-4" }) })] })) : (jsxRuntimeExports.jsx("span", { className: "text-base owt-text font-medium", children: "-" })) })] }));
|
|
3993
|
+
}
|
|
3994
|
+
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-row items-start w-full", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "w-1/2 min-w-0 pr-2 text-base font-medium owt-field-label", label: label, required: isRequired }), jsxRuntimeExports.jsxs("div", { className: "w-1/2 min-w-0 flex flex-col justify-center min-h-[1.5rem]", children: [!hasFile && (jsxRuntimeExports.jsxs("label", { className: `${docControlClass} cursor-pointer justify-center gap-2 border border-dashed ${!isEnabled ? 'opacity-50 cursor-not-allowed' : ''}`, style: {
|
|
3995
|
+
borderColor: isEmptyRequired
|
|
3996
|
+
? 'var(--owt-widget-error-color)'
|
|
3997
|
+
: 'var(--owt-color-primary-dark)',
|
|
3998
|
+
backgroundColor: 'var(--owt-color-bg)',
|
|
3999
|
+
}, children: [jsxRuntimeExports.jsx("img", { src: img$9, alt: "", className: "h-4 w-4 shrink-0" }), jsxRuntimeExports.jsx("span", { className: "text-sm font-medium owt-text", children: t?.('common.upload') ?? 'Upload' }), jsxRuntimeExports.jsx("input", { ref: fileInputRef, type: "file", accept: accept, onChange: (e) => void handleFileChange(e), onBlur: onBlur, disabled: !isEnabled, className: "hidden" })] })), hasFile && file && (jsxRuntimeExports.jsxs("div", { className: `${docControlClass} gap-2 border owt-border owt-bg`, title: displayFileName, children: [jsxRuntimeExports.jsxs("button", { type: "button", onClick: (e) => handlePreview(file, e), className: `${iconButtonClass} min-w-0 flex-1 gap-2 justify-start`, title: displayFileName, children: [jsxRuntimeExports.jsx("img", { src: img$1, alt: "", className: "h-4 w-4 shrink-0" }), jsxRuntimeExports.jsx("span", { className: "min-w-0 truncate text-sm font-medium owt-text", children: displayFileName })] }), jsxRuntimeExports.jsx("button", { type: "button", onClick: handleRemove, disabled: !isEnabled, className: `inline-flex items-center justify-center shrink-0 h-5 w-5 p-0 border-0 rounded-full owt-bg-alt focus:outline-none ${!isEnabled ? 'opacity-50 cursor-not-allowed' : ''}`, title: t?.('common.remove') ?? 'Remove', children: jsxRuntimeExports.jsx("img", { src: img, alt: t?.('common.remove') ?? 'Remove', className: "h-2.5 w-2.5" }) })] })), showValidationError && (jsxRuntimeExports.jsx("p", { className: "owt-field-error text-sm mt-1", children: error[0] })), touched && error.length > 0 && !isEmptyRequired && (jsxRuntimeExports.jsx("p", { className: "owt-field-error text-sm mt-1", children: error[0] }))] })] }) }));
|
|
3988
4000
|
};
|
|
3989
4001
|
|
|
3990
4002
|
const SupportingDocuments = ({ sectionId, documents, mode, isDraft, expanded = true, onToggleExpanded, collapsible = false, }) => {
|
|
3991
4003
|
const { t } = useWidgetContext();
|
|
3992
|
-
if (documents.length === 0)
|
|
4004
|
+
if (mode === 'IntakeForm' || documents.length === 0)
|
|
3993
4005
|
return null;
|
|
3994
4006
|
const title = t?.('common.supportedDocuments') || 'Supported Documents';
|
|
3995
4007
|
return (jsxRuntimeExports.jsxs("div", { className: "supporting-documents-container", children: [collapsible ? (jsxRuntimeExports.jsxs("button", { type: "button", onClick: onToggleExpanded, className: "supporting-documents-title-button w-full flex items-center text-left", children: [jsxRuntimeExports.jsx("span", { className: "font-semibold", style: { fontFamily: 'Roboto, sans-serif', fontSize: '16px' }, children: title }), jsxRuntimeExports.jsx("img", { src: expanded ? img$7 : img$6, alt: "Toggle Documents", className: "w-4 h-2.25 transition-transform ml-2" })] })) : (jsxRuntimeExports.jsx("span", { className: "font-semibold", style: { fontFamily: 'Roboto, sans-serif', fontSize: '16px' }, children: title })), expanded && (jsxRuntimeExports.jsx("div", { className: "supporting-documents-grid mt-4", children: documents.map((doc, index) => {
|
|
@@ -4024,6 +4036,8 @@ const SectionStyles = ({ sectionClassId, gridId, columnSpan, hasTableWidget, rea
|
|
|
4024
4036
|
height: auto !important;
|
|
4025
4037
|
}
|
|
4026
4038
|
.${sectionClassId} label.owt-text,
|
|
4039
|
+
.${sectionClassId} label.owt-field-label,
|
|
4040
|
+
.${sectionClassId} .owt-field-label,
|
|
4027
4041
|
.${sectionClassId} .text-base.owt-text-muted {
|
|
4028
4042
|
font-weight: 400 !important;
|
|
4029
4043
|
color: var(--owt-color-text-muted) !important;
|
|
@@ -4249,7 +4263,7 @@ const EditSectionPortal = ({ mode, isEditMode, editSectionPosition, sectionClass
|
|
|
4249
4263
|
top: 0;
|
|
4250
4264
|
bottom: 5px;
|
|
4251
4265
|
width: 1px;
|
|
4252
|
-
background-color: var(--owt-color-primary);
|
|
4266
|
+
background-color: var(--owt-color-primary-dark);
|
|
4253
4267
|
}
|
|
4254
4268
|
#${editGridId} > .section-divider {
|
|
4255
4269
|
flex: 0 0 100%;
|
|
@@ -4269,14 +4283,14 @@ const EditSectionPortal = ({ mode, isEditMode, editSectionPosition, sectionClass
|
|
|
4269
4283
|
width: '100%',
|
|
4270
4284
|
maxWidth: '100%',
|
|
4271
4285
|
height: '1px',
|
|
4272
|
-
backgroundColor: 'var(--owt-color-primary)',
|
|
4286
|
+
backgroundColor: 'var(--owt-color-primary-dark)',
|
|
4273
4287
|
margin: '25px 0 0 0',
|
|
4274
4288
|
} }), jsxRuntimeExports.jsx(SupportingDocuments, { sectionId: sectionId, documents: supportingDocuments, mode: mode, expanded: isDocumentsExpanded, onToggleExpanded: () => setIsDocumentsExpanded(!isDocumentsExpanded), collapsible: true })] })), jsxRuntimeExports.jsx("div", { className: "section-divider", role: "separator", style: {
|
|
4275
4289
|
flex: '0 0 100%',
|
|
4276
4290
|
width: '100%',
|
|
4277
4291
|
maxWidth: '100%',
|
|
4278
4292
|
height: '1px',
|
|
4279
|
-
backgroundColor: 'var(--owt-color-primary)',
|
|
4293
|
+
backgroundColor: 'var(--owt-color-primary-dark)',
|
|
4280
4294
|
marginTop: hasSupportingDocuments ? '20px' : '25px',
|
|
4281
4295
|
marginBottom: '20px',
|
|
4282
4296
|
} }), jsxRuntimeExports.jsx(SectionEditControls, { onCancel: onCancel, onSave: onSave, isDirty: isDirty })] })] })] }), document.body);
|
|
@@ -4321,7 +4335,9 @@ const IntakeFormLayout = ({ section, sectionId, gridId, sectionIndex, isExpanded
|
|
|
4321
4335
|
width: '100%',
|
|
4322
4336
|
maxWidth: '100%',
|
|
4323
4337
|
height: '1px',
|
|
4324
|
-
backgroundColor:
|
|
4338
|
+
backgroundColor: isDraft !== false
|
|
4339
|
+
? 'var(--owt-color-primary-dark)'
|
|
4340
|
+
: 'var(--owt-panel-divider-color)',
|
|
4325
4341
|
margin: '15px 0 0 0',
|
|
4326
4342
|
} }), hasSupportingDocuments && (jsxRuntimeExports.jsx(SupportingDocuments, { sectionId: sectionId, documents: supportingDocuments, mode: "IntakeForm", isDraft: isDraft })), jsxRuntimeExports.jsxs("div", { className: "intake-form-edit-controls", style: {
|
|
4327
4343
|
display: 'flex',
|
|
@@ -4377,7 +4393,6 @@ const RegistryViewLayout = ({ mode, section, gridId, editableSection, dataSource
|
|
|
4377
4393
|
borderRadius: '4px',
|
|
4378
4394
|
fontSize: '12px',
|
|
4379
4395
|
fontWeight: 600,
|
|
4380
|
-
textTransform: 'uppercase',
|
|
4381
4396
|
letterSpacing: '0.5px',
|
|
4382
4397
|
backgroundColor: changeRequestType === 'new'
|
|
4383
4398
|
? 'var(--owt-color-success)'
|
|
@@ -4387,21 +4402,21 @@ const RegistryViewLayout = ({ mode, section, gridId, editableSection, dataSource
|
|
|
4387
4402
|
: 'var(--owt-color-error)',
|
|
4388
4403
|
whiteSpace: 'nowrap',
|
|
4389
4404
|
boxShadow: changeRequestType === 'new' ? '0 2px 4px color-mix(in srgb, var(--owt-color-success) 30%, transparent)' : 'none',
|
|
4390
|
-
}, children: changeRequestType === 'new' ? '
|
|
4391
|
-
? { paddingBottom: '30px' }
|
|
4392
|
-
: {}, children: [jsxRuntimeExports.jsx(PanelGrid, { panels: editableSection.panels, dataSourceRequestHandler: dataSourceRequestHandler, schemaData: schemaData, onValueChange: onValueChange, wrapInContainer: false }), mode === 'RegistryView' && !effectiveHideEditButton && (jsxRuntimeExports.jsx("div", { className: "section-divider", role: "separator", style: {
|
|
4405
|
+
}, children: changeRequestType === 'new' ? 'NEW' : 'OLD' }))] })), jsxRuntimeExports.jsxs("div", { id: gridId, className: "section-panels", children: [jsxRuntimeExports.jsx(PanelGrid, { panels: editableSection.panels, dataSourceRequestHandler: dataSourceRequestHandler, schemaData: schemaData, onValueChange: onValueChange, wrapInContainer: false }), jsxRuntimeExports.jsx("div", { className: "section-divider", role: "separator", style: {
|
|
4393
4406
|
flex: '0 0 100%',
|
|
4394
4407
|
width: '100%',
|
|
4395
4408
|
maxWidth: '100%',
|
|
4396
4409
|
height: '1px',
|
|
4397
4410
|
marginTop: !isEditMode ? '10px' : 0,
|
|
4398
|
-
marginBottom: '14px',
|
|
4399
|
-
backgroundColor:
|
|
4400
|
-
|
|
4411
|
+
marginBottom: mode === 'CRView' ? '28px' : '14px',
|
|
4412
|
+
backgroundColor: isEditMode
|
|
4413
|
+
? 'var(--owt-color-primary-dark)'
|
|
4414
|
+
: 'var(--owt-panel-divider-color)',
|
|
4415
|
+
} }), mode !== 'CRView' && !isEditMode && !effectiveHideEditButton && (jsxRuntimeExports.jsx("div", { className: "registry-edit-details flex justify-start items-center", style: { marginBottom: '20px' }, children: jsxRuntimeExports.jsxs("button", { onClick: onEdit, className: "font-normal inline-flex items-center gap-2 bg-transparent border-0 p-0 cursor-pointer hover:opacity-80", style: {
|
|
4401
4416
|
fontFamily: 'Roboto, sans-serif',
|
|
4402
4417
|
fontSize: '16px',
|
|
4403
4418
|
color: 'var(--owt-color-text-muted)',
|
|
4404
|
-
}, children: [t
|
|
4419
|
+
}, children: [tSchema(t, 'common.editDetails'), jsxRuntimeExports.jsx("img", { src: img$8, alt: "right-arrow", className: "w-3.5 h-3.5 brightness-0 opacity-50" })] }) }))] })] }));
|
|
4405
4420
|
};
|
|
4406
4421
|
|
|
4407
4422
|
const SectionRenderer = ({ section, dataSourceRequestHandler: propDataSourceRequestHandler, schemaData, onValueChange, gridColumnSpan, onSectionSave, hideEditButton = false, mode = 'RegistryView', changeRequestType, showChangeRequestLabel = true, dbSectionId, sectionRegisterId, onSectionDirtyChange, sectionIndex, expandedSectionIndex, onExpandSection, onSectionSaveSuccess, onPreviousSection, isDraft, isAccessible = false, onEditModeChange, forceExitEdit, }) => {
|
|
@@ -4417,7 +4432,7 @@ const SectionRenderer = ({ section, dataSourceRequestHandler: propDataSourceRequ
|
|
|
4417
4432
|
const { columnSpan, hasTable: hasTableWidget, hasExplicitTableSpan } = React.useMemo(() => resolveSectionColumnSpan(section.panels, gridColumnSpan), [section.panels, gridColumnSpan]);
|
|
4418
4433
|
const readonlyStyles = React.useMemo(() => buildReadonlyStyleSelectors(sectionClassId), [sectionClassId]);
|
|
4419
4434
|
const supportingDocuments = section['section-supporting-documents'] || [];
|
|
4420
|
-
const hasSupportingDocuments = supportingDocuments.length > 0;
|
|
4435
|
+
const hasSupportingDocuments = mode !== 'IntakeForm' && supportingDocuments.length > 0;
|
|
4421
4436
|
const { isExpanded, handleAccordionToggle } = useIntakeFormAccordion(mode, sectionIndex, expandedSectionIndex, isAccessible, onExpandSection);
|
|
4422
4437
|
const { isEditMode, sectionRef, sectionHeight, editSectionPosition, enterEditMode, exitEditMode, } = useSectionEditPortal(forceExitEdit);
|
|
4423
4438
|
const widgetsEditable = mode === 'IntakeForm' ? isDraft !== false : isEditMode;
|
|
@@ -4544,12 +4559,13 @@ const SectionsContainer = ({ sections, dataSourceRequestHandler: propDataSourceR
|
|
|
4544
4559
|
validate: async () => {
|
|
4545
4560
|
if (modeRef.current !== 'IntakeForm')
|
|
4546
4561
|
checkNoUnsavedChanges();
|
|
4562
|
+
const includeSupportingDocuments = modeRef.current !== 'IntakeForm';
|
|
4547
4563
|
const values = getValues();
|
|
4548
4564
|
let allValid = true;
|
|
4549
4565
|
let firstInvalidIndex = null;
|
|
4550
4566
|
for (let i = 0; i < safeSections.length; i++) {
|
|
4551
4567
|
const section = safeSections[i];
|
|
4552
|
-
const valid = sectionValidate(section, values, dispatch);
|
|
4568
|
+
const valid = sectionValidate(section, values, dispatch, false, includeSupportingDocuments);
|
|
4553
4569
|
if (!valid) {
|
|
4554
4570
|
if (firstInvalidIndex === null)
|
|
4555
4571
|
firstInvalidIndex = i;
|
|
@@ -4565,18 +4581,19 @@ const SectionsContainer = ({ sections, dataSourceRequestHandler: propDataSourceR
|
|
|
4565
4581
|
validateAndGetData: async () => {
|
|
4566
4582
|
if (modeRef.current !== 'IntakeForm')
|
|
4567
4583
|
checkNoUnsavedChanges();
|
|
4584
|
+
const includeSupportingDocuments = modeRef.current !== 'IntakeForm';
|
|
4568
4585
|
const values = getValues();
|
|
4569
4586
|
const results = [];
|
|
4570
4587
|
let firstInvalidIndex = null;
|
|
4571
4588
|
for (let i = 0; i < safeSections.length; i++) {
|
|
4572
4589
|
const section = safeSections[i];
|
|
4573
|
-
const valid = sectionValidate(section, values, dispatch);
|
|
4590
|
+
const valid = sectionValidate(section, values, dispatch, false, includeSupportingDocuments);
|
|
4574
4591
|
if (!valid) {
|
|
4575
4592
|
if (firstInvalidIndex === null)
|
|
4576
4593
|
firstInvalidIndex = i;
|
|
4577
4594
|
}
|
|
4578
4595
|
else {
|
|
4579
|
-
results.push(buildSectionChanges(section, values));
|
|
4596
|
+
results.push(buildSectionChanges(section, values, { includeSupportingDocuments }));
|
|
4580
4597
|
}
|
|
4581
4598
|
}
|
|
4582
4599
|
if (firstInvalidIndex !== null) {
|
|
@@ -4588,11 +4605,12 @@ const SectionsContainer = ({ sections, dataSourceRequestHandler: propDataSourceR
|
|
|
4588
4605
|
return results;
|
|
4589
4606
|
},
|
|
4590
4607
|
getStructuredData: () => {
|
|
4608
|
+
const includeSupportingDocuments = modeRef.current !== 'IntakeForm';
|
|
4591
4609
|
const values = getValues();
|
|
4592
4610
|
const results = [];
|
|
4593
4611
|
for (let i = 0; i < safeSections.length; i++) {
|
|
4594
4612
|
const section = safeSections[i];
|
|
4595
|
-
results.push(buildSectionChanges(section, values));
|
|
4613
|
+
results.push(buildSectionChanges(section, values, { includeSupportingDocuments }));
|
|
4596
4614
|
}
|
|
4597
4615
|
return results;
|
|
4598
4616
|
},
|
|
@@ -4711,7 +4729,6 @@ const WIDGET_TYPES = [
|
|
|
4711
4729
|
'parent-lookup',
|
|
4712
4730
|
'multi-select',
|
|
4713
4731
|
'geo-hierarchy',
|
|
4714
|
-
'docs',
|
|
4715
4732
|
];
|
|
4716
4733
|
function getWidgetCategory(widget) {
|
|
4717
4734
|
switch (widget) {
|
|
@@ -4721,7 +4738,6 @@ function getWidgetCategory(widget) {
|
|
|
4721
4738
|
case 'profile':
|
|
4722
4739
|
case 'header-section':
|
|
4723
4740
|
case 'scores-display':
|
|
4724
|
-
case 'docs':
|
|
4725
4741
|
return 'layout';
|
|
4726
4742
|
default:
|
|
4727
4743
|
return 'input';
|
|
@@ -6271,7 +6287,7 @@ const JSONEditorPanel = ({ initialText, onChange, onRawDraftChange, onRawValidat
|
|
|
6271
6287
|
border: 'none',
|
|
6272
6288
|
borderRadius: '4px',
|
|
6273
6289
|
background: 'transparent',
|
|
6274
|
-
color: 'var(--owt-color-text-muted
|
|
6290
|
+
color: 'var(--owt-color-text-muted)',
|
|
6275
6291
|
cursor: 'pointer',
|
|
6276
6292
|
display: 'flex',
|
|
6277
6293
|
alignItems: 'center',
|
|
@@ -6282,7 +6298,7 @@ const JSONEditorPanel = ({ initialText, onChange, onRawDraftChange, onRawValidat
|
|
|
6282
6298
|
marginBottom: '8px',
|
|
6283
6299
|
padding: '10px 12px',
|
|
6284
6300
|
borderRadius: '8px',
|
|
6285
|
-
background: 'var(--owt-color-error-light
|
|
6301
|
+
background: 'var(--owt-color-error-light)',
|
|
6286
6302
|
border: '1px solid var(--owt-color-error)',
|
|
6287
6303
|
color: 'var(--owt-color-error)',
|
|
6288
6304
|
fontSize: '12px',
|
|
@@ -6292,7 +6308,7 @@ const JSONEditorPanel = ({ initialText, onChange, onRawDraftChange, onRawValidat
|
|
|
6292
6308
|
padding: '4px 10px',
|
|
6293
6309
|
borderRadius: '8px',
|
|
6294
6310
|
border: '1px solid var(--owt-color-error)',
|
|
6295
|
-
background: 'var(--owt-color-bg
|
|
6311
|
+
background: 'var(--owt-color-bg)',
|
|
6296
6312
|
color: 'var(--owt-color-error)',
|
|
6297
6313
|
cursor: 'pointer',
|
|
6298
6314
|
fontSize: '12px',
|
|
@@ -6311,7 +6327,7 @@ const JSONEditorPanel = ({ initialText, onChange, onRawDraftChange, onRawValidat
|
|
|
6311
6327
|
width: '52px',
|
|
6312
6328
|
overflow: 'hidden',
|
|
6313
6329
|
borderRight: '1px solid var(--owt-color-border-light)',
|
|
6314
|
-
background: 'var(--owt-color-bg-alt
|
|
6330
|
+
background: 'var(--owt-color-bg-alt)',
|
|
6315
6331
|
padding: '20px 8px 20px 12px',
|
|
6316
6332
|
boxSizing: 'border-box',
|
|
6317
6333
|
userSelect: 'none',
|
|
@@ -6324,9 +6340,9 @@ const JSONEditorPanel = ({ initialText, onChange, onRawDraftChange, onRawValidat
|
|
|
6324
6340
|
fontFamily: 'Monaco, Menlo, "Ubuntu Mono", Consolas, "source-code-pro", monospace',
|
|
6325
6341
|
fontSize: `${EDITOR_FONT_SIZE}px`,
|
|
6326
6342
|
textAlign: 'right',
|
|
6327
|
-
color: isHighlighted ? 'var(--owt-color-error)' : 'var(--owt-color-text-muted
|
|
6343
|
+
color: isHighlighted ? 'var(--owt-color-error)' : 'var(--owt-color-text-muted)',
|
|
6328
6344
|
fontWeight: isHighlighted ? 700 : 400,
|
|
6329
|
-
background: isHighlighted ? 'var(--owt-color-error-light
|
|
6345
|
+
background: isHighlighted ? 'var(--owt-color-error-light)' : 'transparent',
|
|
6330
6346
|
borderRadius: '4px',
|
|
6331
6347
|
}, children: lineNumber }, lineNumber));
|
|
6332
6348
|
}) }), jsxRuntimeExports.jsxs("div", { style: {
|
|
@@ -6355,7 +6371,7 @@ const JSONEditorPanel = ({ initialText, onChange, onRawDraftChange, onRawValidat
|
|
|
6355
6371
|
whiteSpace: 'pre-wrap',
|
|
6356
6372
|
wordBreak: 'break-word',
|
|
6357
6373
|
color: 'transparent',
|
|
6358
|
-
background: isHighlighted ? 'var(--owt-color-error-light
|
|
6374
|
+
background: isHighlighted ? 'var(--owt-color-error-light)' : 'transparent',
|
|
6359
6375
|
boxShadow: isHighlighted ? 'inset 3px 0 0 var(--owt-color-error)' : 'none',
|
|
6360
6376
|
}, children: line.length > 0 ? line : ' ' }, `highlight-${lineNumber}`));
|
|
6361
6377
|
}) }), jsxRuntimeExports.jsx("textarea", { ref: textareaRef, value: rawJsonText, onChange: (e) => handleRawJsonChange(e.target.value), onScroll: handleTextareaScroll, style: {
|
|
@@ -11253,27 +11269,27 @@ const VisualBuilderPanel = ({ section, selectedNode, onSelectNode, onSectionChan
|
|
|
11253
11269
|
minHeight: 0,
|
|
11254
11270
|
}, children: [jsxRuntimeExports.jsxs("div", { style: {
|
|
11255
11271
|
padding: '20px',
|
|
11256
|
-
background: 'var(--owt-color-bg
|
|
11272
|
+
background: 'var(--owt-color-bg)',
|
|
11257
11273
|
display: 'flex',
|
|
11258
11274
|
justifyContent: 'space-between',
|
|
11259
11275
|
alignItems: 'center',
|
|
11260
11276
|
flexShrink: 0,
|
|
11261
|
-
}, children: [jsxRuntimeExports.jsx("div", { style: { fontWeight: 600, fontSize: '16px', color: 'var(--owt-color-text
|
|
11277
|
+
}, children: [jsxRuntimeExports.jsx("div", { style: { fontWeight: 600, fontSize: '16px', color: 'var(--owt-color-text)', paddingTop: '5px' }, children: t?.('sectionBuilder.visualBuilder') || 'Visual Builder' }), jsxRuntimeExports.jsxs("div", { style: { display: 'flex', gap: '10px' }, children: [jsxRuntimeExports.jsx("button", { onClick: handleAddPanel, style: {
|
|
11262
11278
|
padding: '8px 16px',
|
|
11263
|
-
border: '1px solid var(--owt-color-border
|
|
11279
|
+
border: '1px solid var(--owt-color-border)',
|
|
11264
11280
|
borderRadius: '10px',
|
|
11265
|
-
background: 'var(--owt-btn-primary-bg
|
|
11266
|
-
color: 'var(--owt-btn-primary-color
|
|
11281
|
+
background: 'var(--owt-btn-primary-bg)',
|
|
11282
|
+
color: 'var(--owt-btn-primary-color)',
|
|
11267
11283
|
fontWeight: 600,
|
|
11268
11284
|
cursor: 'pointer',
|
|
11269
11285
|
fontSize: '12px',
|
|
11270
11286
|
whiteSpace: 'nowrap',
|
|
11271
11287
|
}, children: t?.('sectionBuilder.addPanel') || '+ Add Panel' }), jsxRuntimeExports.jsx("button", { onClick: () => handleAddWidget(), style: {
|
|
11272
11288
|
padding: '8px 16px',
|
|
11273
|
-
border: '1px solid var(--owt-color-border
|
|
11289
|
+
border: '1px solid var(--owt-color-border)',
|
|
11274
11290
|
borderRadius: '10px',
|
|
11275
|
-
background: 'var(--owt-btn-primary-bg
|
|
11276
|
-
color: 'var(--owt-btn-primary-color
|
|
11291
|
+
background: 'var(--owt-btn-primary-bg)',
|
|
11292
|
+
color: 'var(--owt-btn-primary-color)',
|
|
11277
11293
|
fontWeight: 600,
|
|
11278
11294
|
cursor: 'pointer',
|
|
11279
11295
|
fontSize: '12px',
|
|
@@ -11283,7 +11299,7 @@ const VisualBuilderPanel = ({ section, selectedNode, onSelectNode, onSectionChan
|
|
|
11283
11299
|
border: 'none',
|
|
11284
11300
|
borderRadius: '4px',
|
|
11285
11301
|
background: 'transparent',
|
|
11286
|
-
color: 'var(--owt-color-text-muted
|
|
11302
|
+
color: 'var(--owt-color-text-muted)',
|
|
11287
11303
|
cursor: 'pointer',
|
|
11288
11304
|
display: 'flex',
|
|
11289
11305
|
alignItems: 'center',
|
|
@@ -11294,23 +11310,23 @@ const VisualBuilderPanel = ({ section, selectedNode, onSelectNode, onSectionChan
|
|
|
11294
11310
|
flex: '1 1 0%',
|
|
11295
11311
|
display: 'flex',
|
|
11296
11312
|
overflow: 'hidden',
|
|
11297
|
-
border: '1px solid var(--owt-color-border
|
|
11313
|
+
border: '1px solid var(--owt-color-border)',
|
|
11298
11314
|
borderRadius: '10px',
|
|
11299
11315
|
minHeight: 0,
|
|
11300
11316
|
}, children: [jsxRuntimeExports.jsxs("div", { style: {
|
|
11301
11317
|
flex: '1 1 0%',
|
|
11302
11318
|
width: '45%',
|
|
11303
|
-
borderRight: '1px solid var(--owt-color-border
|
|
11319
|
+
borderRight: '1px solid var(--owt-color-border)',
|
|
11304
11320
|
display: 'flex',
|
|
11305
11321
|
flexDirection: 'column',
|
|
11306
11322
|
minHeight: 0,
|
|
11307
11323
|
overflow: 'hidden',
|
|
11308
11324
|
}, children: [jsxRuntimeExports.jsxs("div", { style: {
|
|
11309
11325
|
padding: '12px 15px',
|
|
11310
|
-
borderBottom: '1px solid var(--owt-color-border-light
|
|
11311
|
-
background: 'var(--owt-color-bg
|
|
11326
|
+
borderBottom: '1px solid var(--owt-color-border-light)',
|
|
11327
|
+
background: 'var(--owt-color-bg)',
|
|
11312
11328
|
flexShrink: 0,
|
|
11313
|
-
}, children: [jsxRuntimeExports.jsx("div", { style: { fontSize: '12px', fontWeight: 700, color: 'var(--owt-color-text
|
|
11329
|
+
}, children: [jsxRuntimeExports.jsx("div", { style: { fontSize: '12px', fontWeight: 700, color: 'var(--owt-color-text)', marginBottom: '8px' }, children: t?.('sectionBuilder.widgetPalette') || 'Widget Palette' }), jsxRuntimeExports.jsxs("div", { style: { display: 'flex', gap: '8px', alignItems: 'stretch' }, children: [jsxRuntimeExports.jsx("div", { style: { flex: 1, minWidth: 0 }, children: jsxRuntimeExports.jsx(SearchableSelect, { options: WIDGET_TYPES, value: paletteWidgetType, onChange: setPaletteWidgetType, placeholder: t?.('sectionBuilder.searchWidgetType') || 'Search widget type...' }) }), jsxRuntimeExports.jsx("button", { type: "button", onClick: () => {
|
|
11314
11330
|
if (selectedNode?.type === 'panel') {
|
|
11315
11331
|
onAddWidget(selectedNode.id, paletteWidgetType);
|
|
11316
11332
|
}
|
|
@@ -11321,13 +11337,13 @@ const VisualBuilderPanel = ({ section, selectedNode, onSelectNode, onSectionChan
|
|
|
11321
11337
|
padding: '8px 12px',
|
|
11322
11338
|
border: 'none',
|
|
11323
11339
|
borderRadius: '6px',
|
|
11324
|
-
background: 'var(--owt-color-text
|
|
11325
|
-
color: 'var(--owt-color-bg
|
|
11340
|
+
background: 'var(--owt-color-text)',
|
|
11341
|
+
color: 'var(--owt-color-bg)',
|
|
11326
11342
|
cursor: 'pointer',
|
|
11327
11343
|
fontSize: '12px',
|
|
11328
11344
|
fontWeight: 700,
|
|
11329
11345
|
whiteSpace: 'nowrap',
|
|
11330
|
-
}, children: t?.('sectionBuilder.add') || 'Add' })] }), jsxRuntimeExports.jsx("div", { style: { marginTop: '8px', fontSize: '11px', color: 'var(--owt-color-text-muted
|
|
11346
|
+
}, children: t?.('sectionBuilder.add') || 'Add' })] }), jsxRuntimeExports.jsx("div", { style: { marginTop: '8px', fontSize: '11px', color: 'var(--owt-color-text-muted)' }, children: t?.('sectionBuilder.paletteTip') ||
|
|
11331
11347
|
'Tip: select a panel first to control where widgets land.' })] }), jsxRuntimeExports.jsx("div", { style: { flex: '1 1 0%', minHeight: 0, display: 'flex', flexDirection: 'column', overflow: 'hidden' }, children: jsxRuntimeExports.jsx(SectionTree, { section: section, selectedNode: selectedNode, onSelectNode: onSelectNode, onAddPanel: onAddPanel, onAddWidget: onAddWidget, onDeleteNode: onDeleteNode, onDuplicateNode: onDuplicateNode, onMoveNode: onMoveNode }) })] }), jsxRuntimeExports.jsx("div", { style: {
|
|
11332
11348
|
flex: '1 1 0%',
|
|
11333
11349
|
width: '55%',
|
|
@@ -11676,7 +11692,7 @@ const SectionBuilder = ({ initialSection, onChange, onSave, onNotify, }) => {
|
|
|
11676
11692
|
left: 0,
|
|
11677
11693
|
right: 0,
|
|
11678
11694
|
bottom: 0,
|
|
11679
|
-
background: '
|
|
11695
|
+
background: 'var(--owt-color-overlay)',
|
|
11680
11696
|
zIndex: 9998,
|
|
11681
11697
|
}, onClick: toggleMaximize })), jsxRuntimeExports.jsxs("div", { style: {
|
|
11682
11698
|
display: 'flex',
|
|
@@ -11685,7 +11701,7 @@ const SectionBuilder = ({ initialSection, onChange, onSave, onNotify, }) => {
|
|
|
11685
11701
|
height: isMaximized ? '100vh' : undefined,
|
|
11686
11702
|
width: isMaximized ? '100vw' : '100%',
|
|
11687
11703
|
minHeight: 0,
|
|
11688
|
-
background: 'var(--owt-color-bg
|
|
11704
|
+
background: 'var(--owt-color-bg)',
|
|
11689
11705
|
fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
|
|
11690
11706
|
overflow: 'hidden',
|
|
11691
11707
|
border: 'none',
|
|
@@ -11695,19 +11711,19 @@ const SectionBuilder = ({ initialSection, onChange, onSave, onNotify, }) => {
|
|
|
11695
11711
|
zIndex: isMaximized ? 9999 : 'auto',
|
|
11696
11712
|
}, children: [jsxRuntimeExports.jsxs("div", { style: {
|
|
11697
11713
|
padding: '12px 16px',
|
|
11698
|
-
borderBottom: '1px solid var(--owt-color-border-light
|
|
11714
|
+
borderBottom: '1px solid var(--owt-color-border-light)',
|
|
11699
11715
|
display: 'flex',
|
|
11700
11716
|
alignItems: 'center',
|
|
11701
11717
|
justifyContent: 'space-between',
|
|
11702
|
-
background: 'var(--owt-color-bg
|
|
11718
|
+
background: 'var(--owt-color-bg)',
|
|
11703
11719
|
flexShrink: 0,
|
|
11704
|
-
}, children: [jsxRuntimeExports.jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '10px' }, children: [jsxRuntimeExports.jsx("div", { style: { fontWeight: 700, fontSize: '14px', color: 'var(--owt-color-text
|
|
11720
|
+
}, children: [jsxRuntimeExports.jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '10px' }, children: [jsxRuntimeExports.jsx("div", { style: { fontWeight: 700, fontSize: '14px', color: 'var(--owt-color-text)' }, children: t?.('sectionBuilder.title') || 'Section Builder' }), jsxRuntimeExports.jsxs("div", { style: { display: 'flex', gap: '6px', background: 'var(--owt-color-bg-alt)', padding: '4px', borderRadius: '9999px' }, children: [jsxRuntimeExports.jsx("button", { type: "button", onClick: switchToGraphical, style: {
|
|
11705
11721
|
padding: '6px 10px',
|
|
11706
11722
|
borderRadius: '9999px',
|
|
11707
11723
|
border: 'none',
|
|
11708
11724
|
cursor: 'pointer',
|
|
11709
|
-
background: mode === 'graphical' ? 'var(--owt-color-text
|
|
11710
|
-
color: mode === 'graphical' ? 'var(--owt-color-bg
|
|
11725
|
+
background: mode === 'graphical' ? 'var(--owt-color-text)' : 'transparent',
|
|
11726
|
+
color: mode === 'graphical' ? 'var(--owt-color-bg)' : 'var(--owt-color-text)',
|
|
11711
11727
|
fontSize: '12px',
|
|
11712
11728
|
fontWeight: 700,
|
|
11713
11729
|
}, children: t?.('sectionBuilder.graphical') || 'Graphical' }), jsxRuntimeExports.jsx("button", { type: "button", onClick: switchToRaw, style: {
|
|
@@ -11715,28 +11731,28 @@ const SectionBuilder = ({ initialSection, onChange, onSave, onNotify, }) => {
|
|
|
11715
11731
|
borderRadius: '9999px',
|
|
11716
11732
|
border: 'none',
|
|
11717
11733
|
cursor: 'pointer',
|
|
11718
|
-
background: mode === 'raw' ? 'var(--owt-color-text
|
|
11719
|
-
color: mode === 'raw' ? 'var(--owt-color-bg
|
|
11734
|
+
background: mode === 'raw' ? 'var(--owt-color-text)' : 'transparent',
|
|
11735
|
+
color: mode === 'raw' ? 'var(--owt-color-bg)' : 'var(--owt-color-text)',
|
|
11720
11736
|
fontSize: '12px',
|
|
11721
11737
|
fontWeight: 700,
|
|
11722
11738
|
}, children: t?.('sectionBuilder.rawJson') || 'Raw JSON' })] })] }), jsxRuntimeExports.jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '10px' }, children: [jsxRuntimeExports.jsx("button", { type: "button", onClick: () => setShowPreview(true), style: {
|
|
11723
11739
|
padding: '8px 12px',
|
|
11724
11740
|
borderRadius: '10px',
|
|
11725
11741
|
border: 'none',
|
|
11726
|
-
background: 'var(--owt-color-primary-accent
|
|
11727
|
-
color: 'var(--owt-color-bg
|
|
11742
|
+
background: 'var(--owt-color-primary-accent)',
|
|
11743
|
+
color: 'var(--owt-color-bg)',
|
|
11728
11744
|
cursor: 'pointer',
|
|
11729
11745
|
fontSize: '12px',
|
|
11730
11746
|
fontWeight: 700,
|
|
11731
11747
|
}, title: t?.('sectionBuilder.previewSection') || 'Preview Section', children: t?.('sectionBuilder.preview') || 'Preview' }), jsxRuntimeExports.jsx("button", { type: "button", onClick: handleReset, style: {
|
|
11732
11748
|
padding: '8px 12px',
|
|
11733
11749
|
borderRadius: '10px',
|
|
11734
|
-
border: '1px solid var(--owt-color-border
|
|
11735
|
-
background: 'var(--owt-color-bg
|
|
11750
|
+
border: '1px solid var(--owt-color-border)',
|
|
11751
|
+
background: 'var(--owt-color-bg)',
|
|
11736
11752
|
cursor: 'pointer',
|
|
11737
11753
|
fontSize: '12px',
|
|
11738
11754
|
fontWeight: 700,
|
|
11739
|
-
color: 'var(--owt-color-text
|
|
11755
|
+
color: 'var(--owt-color-text)',
|
|
11740
11756
|
}, children: t?.('sectionBuilder.reset') || 'Reset' }), onSave && (jsxRuntimeExports.jsx("button", { type: "button", onClick: () => {
|
|
11741
11757
|
if (mode === 'raw') {
|
|
11742
11758
|
const validation = parseSectionJson(rawDraft);
|
|
@@ -11754,8 +11770,8 @@ const SectionBuilder = ({ initialSection, onChange, onSave, onNotify, }) => {
|
|
|
11754
11770
|
padding: '8px 12px',
|
|
11755
11771
|
borderRadius: '10px',
|
|
11756
11772
|
border: 'none',
|
|
11757
|
-
background: 'var(--owt-color-text
|
|
11758
|
-
color: 'var(--owt-color-bg
|
|
11773
|
+
background: 'var(--owt-color-text)',
|
|
11774
|
+
color: 'var(--owt-color-bg)',
|
|
11759
11775
|
cursor: 'pointer',
|
|
11760
11776
|
fontSize: '12px',
|
|
11761
11777
|
fontWeight: 700,
|
|
@@ -11768,14 +11784,14 @@ const SectionBuilder = ({ initialSection, onChange, onSave, onNotify, }) => {
|
|
|
11768
11784
|
left: 0,
|
|
11769
11785
|
right: 0,
|
|
11770
11786
|
bottom: 0,
|
|
11771
|
-
background: '
|
|
11787
|
+
background: 'var(--owt-color-overlay)',
|
|
11772
11788
|
zIndex: 10000,
|
|
11773
11789
|
display: 'flex',
|
|
11774
11790
|
alignItems: 'center',
|
|
11775
11791
|
justifyContent: 'center',
|
|
11776
11792
|
padding: '20px',
|
|
11777
11793
|
}, onClick: () => setShowPreview(false), children: jsxRuntimeExports.jsxs("div", { style: {
|
|
11778
|
-
background: 'var(--owt-color-bg
|
|
11794
|
+
background: 'var(--owt-color-bg)',
|
|
11779
11795
|
borderRadius: '8px',
|
|
11780
11796
|
width: '100%',
|
|
11781
11797
|
minWidth: '700px',
|
|
@@ -11784,21 +11800,21 @@ const SectionBuilder = ({ initialSection, onChange, onSave, onNotify, }) => {
|
|
|
11784
11800
|
maxHeight: '90vh',
|
|
11785
11801
|
display: 'flex',
|
|
11786
11802
|
flexDirection: 'column',
|
|
11787
|
-
boxShadow: '0 4px 20px
|
|
11803
|
+
boxShadow: '0 4px 20px var(--owt-color-shadow)',
|
|
11788
11804
|
}, onClick: (e) => e.stopPropagation(), children: [jsxRuntimeExports.jsxs("div", { style: {
|
|
11789
11805
|
padding: '15px 20px',
|
|
11790
|
-
borderBottom: '1px solid var(--owt-color-border-light
|
|
11806
|
+
borderBottom: '1px solid var(--owt-color-border-light)',
|
|
11791
11807
|
display: 'flex',
|
|
11792
11808
|
justifyContent: 'space-between',
|
|
11793
11809
|
alignItems: 'center',
|
|
11794
|
-
background: 'var(--owt-color-bg-alt
|
|
11795
|
-
}, children: [jsxRuntimeExports.jsx("h2", { style: { margin: 0, fontSize: '18px', fontWeight: 600, color: 'var(--owt-color-text
|
|
11810
|
+
background: 'var(--owt-color-bg-alt)',
|
|
11811
|
+
}, children: [jsxRuntimeExports.jsx("h2", { style: { margin: 0, fontSize: '18px', fontWeight: 600, color: 'var(--owt-color-text)' }, children: t?.('sectionBuilder.previewTitle') || 'Preview' }), jsxRuntimeExports.jsx("button", { type: "button", onClick: () => setShowPreview(false), style: {
|
|
11796
11812
|
background: 'transparent',
|
|
11797
11813
|
border: 'none',
|
|
11798
11814
|
cursor: 'pointer',
|
|
11799
11815
|
fontSize: '18px',
|
|
11800
11816
|
padding: '5px 10px',
|
|
11801
|
-
color: 'var(--owt-color-text-muted
|
|
11817
|
+
color: 'var(--owt-color-text-muted)',
|
|
11802
11818
|
}, "aria-label": t?.('sectionBuilder.closePreview') || 'Close preview', children: "\u00D7" })] }), jsxRuntimeExports.jsx("div", { style: { flex: 1, overflow: 'auto', padding: '20px' }, children: jsxRuntimeExports.jsx(reactRedux.Provider, { store: previewStore, children: jsxRuntimeExports.jsx(WidgetProvider, { store: previewStore, dataSourceRequestHandler: widgetContext.dataSourceRequestHandler, schemaData: widgetContext.schemaData, t: widgetContext.t, children: jsxRuntimeExports.jsx("div", { style: { position: 'relative', width: '100%', height: '100%' }, children: jsxRuntimeExports.jsx(SectionRenderer, { section: makeSectionEditable(section), hideEditButton: true }) }) }) }) })] }) }), document.body)] }));
|
|
11803
11819
|
};
|
|
11804
11820
|
|
|
@@ -12099,9 +12115,9 @@ const TextInputWidget = ({ config }) => {
|
|
|
12099
12115
|
}, [displayValue, widgetConfig, t]);
|
|
12100
12116
|
if (widgetConfig['widget-readonly']) {
|
|
12101
12117
|
const label = tSchema(t, widgetConfig['widget-label']);
|
|
12102
|
-
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] TextDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [label && (jsxRuntimeExports.jsxs("div", { className: "text-base owt-
|
|
12118
|
+
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] TextDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [label && (jsxRuntimeExports.jsxs("div", { className: "text-base owt-field-label font-medium md:min-w-[120px] sm:pr-4 mb-1 sm:mb-0", style: { fontFamily: 'Roboto, sans-serif' }, title: label, children: [label, ":"] })), jsxRuntimeExports.jsx("div", { className: "flex-1", children: jsxRuntimeExports.jsx("div", { className: "text-base owt-text font-medium", title: String(displayValue ?? ''), children: displayValue }) })] }));
|
|
12103
12119
|
}
|
|
12104
|
-
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium owt-
|
|
12120
|
+
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium owt-field-label md:min-w-[120px] sm:pr-4 sm:pt-1 mb-1 sm:mb-0", label: tSchema(t, widgetConfig['widget-label']), required: isRequired }), jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 mb-1", children: [jsxRuntimeExports.jsx("input", { type: getInputType(), value: displayValue, onChange: handleChange, onBlur: onBlur, disabled: !isEnabled || widgetConfig['widget-readonly'], placeholder: placeholder, maxLength: formatConfig?.mask ? undefined : maxLength, inputMode: formatConfig?.currency
|
|
12105
12121
|
? 'decimal'
|
|
12106
12122
|
: formatConfig?.characterType === 'numeric' || formatConfig?.characterType === 'numeric-decimal'
|
|
12107
12123
|
? 'numeric'
|
|
@@ -12229,9 +12245,9 @@ const NumberInputWidget = ({ config }) => {
|
|
|
12229
12245
|
const label = tSchema(t, widgetConfig['widget-label']);
|
|
12230
12246
|
const numValue = getNumericValue();
|
|
12231
12247
|
const display = numValue !== null ? formatNumber(numValue, formatConfig) : '';
|
|
12232
|
-
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] NumberDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [label && (jsxRuntimeExports.jsxs("div", { className: "text-base owt-
|
|
12248
|
+
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] NumberDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [label && (jsxRuntimeExports.jsxs("div", { className: "text-base owt-field-label font-medium md:min-w-[120px] sm:pr-4 mb-1 sm:mb-0", style: { fontFamily: 'Roboto, sans-serif' }, title: label, children: [label, ":"] })), jsxRuntimeExports.jsx("div", { className: "flex-1", children: jsxRuntimeExports.jsx("div", { className: `text-base owt-text font-medium ${textAlignClass}`, title: String(display ?? ''), children: display }) })] }));
|
|
12233
12249
|
}
|
|
12234
|
-
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium owt-
|
|
12250
|
+
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium owt-field-label md:min-w-[120px] sm:pr-4 sm:pt-1 mb-1 sm:mb-0", label: tSchema(t, widgetConfig['widget-label']), required: isRequired }), jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [jsxRuntimeExports.jsxs("div", { className: "flex items-center justify-between mb-1", children: [jsxRuntimeExports.jsx("input", { type: "text", inputMode: "decimal", value: displayValue, onChange: handleChange, onBlur: handleBlur, onFocus: handleFocus, onKeyDown: handleKeyDown, disabled: !isEnabled || widgetConfig['widget-readonly'], placeholder: placeholder, maxLength: maxLength, className: owtFieldInputClass({
|
|
12235
12251
|
error: (touched && error.length > 0) || (widgetConfig['widget-required'] && (value === null || value === undefined || value === '')),
|
|
12236
12252
|
disabled: !isEnabled || widgetConfig['widget-readonly'],
|
|
12237
12253
|
className: `w-full sm:w-[180px] max-w-full h-[30px] px-3 owt-shadow-sm ${textAlignClass}`,
|
|
@@ -12304,10 +12320,10 @@ const BooleanWidget = ({ config }) => {
|
|
|
12304
12320
|
else {
|
|
12305
12321
|
displayValue = falseLabel;
|
|
12306
12322
|
}
|
|
12307
|
-
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] BooleanDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [label && (jsxRuntimeExports.jsxs("div", { className: "text-base owt-
|
|
12323
|
+
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] BooleanDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [label && (jsxRuntimeExports.jsxs("div", { className: "text-base owt-field-label font-medium md:min-w-[120px] sm:pr-4 mb-1 sm:mb-0", style: { fontFamily: 'Roboto, sans-serif' }, title: label, children: [label, ":"] })), jsxRuntimeExports.jsx("div", { className: "flex-1", children: jsxRuntimeExports.jsx("div", { className: "text-base owt-text font-medium", title: String(displayValue ?? ''), children: displayValue }) })] }));
|
|
12308
12324
|
}
|
|
12309
12325
|
if (controlType === 'checkbox') {
|
|
12310
|
-
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-baseline", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium leading-normal owt-
|
|
12326
|
+
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-baseline", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium leading-normal owt-field-label md:min-w-[120px] sm:pr-4 mb-1 sm:mb-0 sm:pt-0.5", label: tSchema(t, widgetConfig['widget-label']), required: isRequired }), jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [jsxRuntimeExports.jsxs("label", { className: "inline-flex items-baseline cursor-pointer gap-2", children: [jsxRuntimeExports.jsx("input", { type: "checkbox", checked: currentValue === true, onChange: handleCheckboxChange, onBlur: onBlur, disabled: !isEnabled || widgetConfig['widget-readonly'], className: "relative top-[0.2em] h-4 w-4 shrink-0 owt-field-check rounded" }), (currentValue === true || currentValue === false) && (jsxRuntimeExports.jsx("span", { className: "text-base owt-text leading-normal", children: currentValue === true ? trueLabel : falseLabel }))] }), touched && error.length > 0 && (jsxRuntimeExports.jsx("p", { className: "owt-field-error text-sm mt-1", children: error[0] }))] })] }) }));
|
|
12311
12327
|
}
|
|
12312
12328
|
if (controlType === 'radio') {
|
|
12313
12329
|
const containerClass = orientation === 'horizontal'
|
|
@@ -12315,9 +12331,9 @@ const BooleanWidget = ({ config }) => {
|
|
|
12315
12331
|
: 'flex flex-col items-start gap-2';
|
|
12316
12332
|
const radioDisabled = !isEnabled || widgetConfig['widget-readonly'];
|
|
12317
12333
|
const optionDisabledClass = radioDisabled ? 'opacity-50 cursor-not-allowed' : '';
|
|
12318
|
-
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-baseline", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium leading-normal owt-
|
|
12334
|
+
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-baseline", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium leading-normal owt-field-label md:min-w-[120px] sm:pr-4 mb-1 sm:mb-0 sm:pt-0.5", label: tSchema(t, widgetConfig['widget-label']), required: isRequired }), jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [jsxRuntimeExports.jsxs("div", { className: containerClass, onBlur: onBlur, children: [allowUnset && (jsxRuntimeExports.jsxs("label", { className: `inline-flex items-baseline gap-2 cursor-pointer ${optionDisabledClass}`, children: [jsxRuntimeExports.jsx("input", { type: "radio", name: radioGroupName, checked: currentValue === null, onChange: () => handleRadioChange(null), disabled: radioDisabled, className: "relative top-[0.2em] h-4 w-4 shrink-0 owt-field-check" }), jsxRuntimeExports.jsx("span", { className: "text-base owt-text leading-normal", children: unsetLabel })] })), jsxRuntimeExports.jsxs("label", { className: `inline-flex items-baseline gap-2 cursor-pointer ${optionDisabledClass}`, children: [jsxRuntimeExports.jsx("input", { type: "radio", name: radioGroupName, checked: currentValue === true, onChange: () => handleRadioChange(true), disabled: radioDisabled, className: "relative top-[0.2em] h-4 w-4 shrink-0 owt-field-check" }), jsxRuntimeExports.jsx("span", { className: "text-base owt-text leading-normal", children: trueLabel })] }), jsxRuntimeExports.jsxs("label", { className: `inline-flex items-baseline gap-2 cursor-pointer ${optionDisabledClass}`, children: [jsxRuntimeExports.jsx("input", { type: "radio", name: radioGroupName, checked: currentValue === false, onChange: () => handleRadioChange(false), disabled: radioDisabled, className: "relative top-[0.2em] h-4 w-4 shrink-0 owt-field-check" }), jsxRuntimeExports.jsx("span", { className: "text-base owt-text leading-normal", children: falseLabel })] })] }), touched && error.length > 0 && (jsxRuntimeExports.jsx("p", { className: "owt-field-error text-sm mt-1", children: error[0] }))] })] }) }));
|
|
12319
12335
|
}
|
|
12320
|
-
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-baseline", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium leading-normal owt-
|
|
12336
|
+
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-baseline", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium leading-normal owt-field-label sm:min-w-[150px] sm:pr-4 mb-1 sm:mb-0 sm:pt-0.5", label: tSchema(t, widgetConfig['widget-label']), required: isRequired }), jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [jsxRuntimeExports.jsxs("div", { className: "flex flex-wrap items-center gap-3", onBlur: onBlur, children: [allowUnset && (jsxRuntimeExports.jsx("button", { type: "button", onClick: () => handleChange(null), disabled: !isEnabled || widgetConfig['widget-readonly'], className: `px-3 py-1 text-sm ${currentValue === null
|
|
12321
12337
|
? 'owt-boolean-chip owt-boolean-chip-selected'
|
|
12322
12338
|
: 'owt-boolean-chip'} ${!isEnabled || widgetConfig['widget-readonly'] ? 'opacity-50 cursor-not-allowed' : ''}`, style: { borderRadius: '15px' }, children: unsetLabel })), jsxRuntimeExports.jsx("button", { type: "button", onClick: () => handleChange(true), disabled: !isEnabled || widgetConfig['widget-readonly'], className: `px-3 py-1 text-sm ${currentValue === true
|
|
12323
12339
|
? 'owt-boolean-chip owt-boolean-chip-selected'
|
|
@@ -12526,9 +12542,9 @@ const DateInputWidget = ({ config }) => {
|
|
|
12526
12542
|
else {
|
|
12527
12543
|
displayValue = '-';
|
|
12528
12544
|
}
|
|
12529
|
-
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] DateDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [label && (jsxRuntimeExports.jsxs("div", { className: "text-base owt-
|
|
12545
|
+
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] DateDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [label && (jsxRuntimeExports.jsxs("div", { className: "text-base owt-field-label font-medium md:min-w-[120px] sm:pr-4 mb-1 sm:mb-0", style: { fontFamily: 'Roboto, sans-serif' }, title: label, children: [label, ":"] })), jsxRuntimeExports.jsx("div", { className: "flex-1", children: jsxRuntimeExports.jsx("div", { className: "text-base owt-text font-medium", title: String(displayValue ?? ''), children: displayValue }) })] }));
|
|
12530
12546
|
}
|
|
12531
|
-
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium owt-
|
|
12547
|
+
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium owt-field-label md:min-w-[120px] sm:pr-4 sm:pt-1 mb-1 sm:mb-0", label: tSchema(t, widgetConfig['widget-label']), required: isRequired }), jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [jsxRuntimeExports.jsx("input", { type: inputType, value: getDisplayValue(), onChange: handleChange, onBlur: handleBlur, onFocus: handleFocus, disabled: !isEnabled || widgetConfig['widget-readonly'], placeholder: placeholder, min: inputMethod === 'picker' ? effectiveMinDate : undefined, max: inputMethod === 'picker' ? effectiveMaxDate : undefined, className: owtFieldInputClass({
|
|
12532
12548
|
error: showValidationError || showRequiredError,
|
|
12533
12549
|
disabled: !isEnabled || widgetConfig['widget-readonly'],
|
|
12534
12550
|
className: 'w-full sm:w-[180px] max-w-full h-[30px] px-3 owt-shadow-sm',
|
|
@@ -12907,9 +12923,9 @@ const DateTimeInputWidget = ({ config }) => {
|
|
|
12907
12923
|
else {
|
|
12908
12924
|
displayValue = '-';
|
|
12909
12925
|
}
|
|
12910
|
-
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] DateTimeDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [label && (jsxRuntimeExports.jsxs("div", { className: "text-base owt-
|
|
12926
|
+
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] DateTimeDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [label && (jsxRuntimeExports.jsxs("div", { className: "text-base owt-field-label font-medium md:min-w-[120px] sm:pr-4 mb-1 sm:mb-0", style: { fontFamily: 'Roboto, sans-serif' }, title: label, children: [label, ":"] })), jsxRuntimeExports.jsx("div", { className: "flex-1", children: jsxRuntimeExports.jsx("div", { className: "text-base owt-text font-medium", title: String(displayValue ?? ''), children: displayValue }) })] }));
|
|
12911
12927
|
}
|
|
12912
|
-
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium owt-
|
|
12928
|
+
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium owt-field-label md:min-w-[120px] sm:pr-4 sm:pt-1 mb-1 sm:mb-0", label: tSchema(t, widgetConfig['widget-label']), required: isRequired }), jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [jsxRuntimeExports.jsx("input", { type: inputType, value: getDisplayValue(), onChange: handleChange, onBlur: handleBlur, onFocus: handleFocus, disabled: !isEnabled || widgetConfig['widget-readonly'], placeholder: placeholder, min: inputMethod === 'picker' ? effectiveMinDateTime : undefined, max: inputMethod === 'picker' ? effectiveMaxDateTime : undefined, className: owtFieldInputClass({
|
|
12913
12929
|
error: (touched && error.length > 0) || (widgetConfig['widget-required'] && (!value || value === '')),
|
|
12914
12930
|
disabled: !isEnabled || widgetConfig['widget-readonly'],
|
|
12915
12931
|
className: 'w-full sm:w-[180px] max-w-full h-[30px] px-3 owt-shadow-sm',
|
|
@@ -12927,9 +12943,9 @@ const SelectWidget = ({ config }) => {
|
|
|
12927
12943
|
: loading
|
|
12928
12944
|
? '-'
|
|
12929
12945
|
: (value != null && value !== '' ? tSchema(t, String(value)) : '-');
|
|
12930
|
-
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] SelectDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [label && (jsxRuntimeExports.jsxs("div", { className: "text-base owt-
|
|
12946
|
+
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] SelectDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [label && (jsxRuntimeExports.jsxs("div", { className: "text-base owt-field-label font-medium md:min-w-[120px] sm:pr-4 mb-1 sm:mb-0", style: { fontFamily: 'Roboto, sans-serif' }, title: label, children: [label, ":"] })), jsxRuntimeExports.jsx("div", { className: "flex-1", children: jsxRuntimeExports.jsx("div", { className: "text-base owt-text font-medium", title: String(displayValue ?? ''), children: displayValue }) })] }));
|
|
12931
12947
|
}
|
|
12932
|
-
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium owt-
|
|
12948
|
+
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium owt-field-label md:min-w-[120px] sm:pr-4 sm:pt-1 mb-1 sm:mb-0", label: tSchema(t, widgetConfig['widget-label']), required: isRequired }), jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [jsxRuntimeExports.jsxs("select", {
|
|
12933
12949
|
// value={value || ''}
|
|
12934
12950
|
// onChange={(e) => onChange(e.target.value === '' ? undefined : e.target.value)}
|
|
12935
12951
|
value: value === undefined || value === null ? '' : String(value), onChange: (e) => {
|
|
@@ -13006,9 +13022,9 @@ const RadioWidget = ({ config }) => {
|
|
|
13006
13022
|
const displayValue = selectedOption
|
|
13007
13023
|
? tSchema(t, selectedOption.label)
|
|
13008
13024
|
: (allowUnset && currentValue === null ? '-' : '');
|
|
13009
|
-
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] RadioDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [label && (jsxRuntimeExports.jsxs("div", { className: "text-base owt-
|
|
13025
|
+
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] RadioDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [label && (jsxRuntimeExports.jsxs("div", { className: "text-base owt-field-label font-medium md:min-w-[120px] sm:pr-4 mb-1 sm:mb-0", style: { fontFamily: 'Roboto, sans-serif' }, title: label, children: [label, ":"] })), jsxRuntimeExports.jsx("div", { className: "flex-1", children: jsxRuntimeExports.jsx("div", { className: "text-base owt-text font-medium", title: String(displayValue ?? ''), children: displayValue }) })] }));
|
|
13010
13026
|
}
|
|
13011
|
-
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium owt-
|
|
13027
|
+
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium owt-field-label md:min-w-[120px] sm:pr-4 sm:pt-1 mb-1 sm:mb-0", label: tSchema(t, widgetConfig['widget-label']), required: isRequired }), jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [jsxRuntimeExports.jsx("div", { className: layoutConfig.className, style: layoutConfig.style, onBlur: onBlur, children: loading ? (jsxRuntimeExports.jsx("p", { className: "text-sm owt-text-muted", children: t?.('common.loading') })) : (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [allowUnset && (jsxRuntimeExports.jsxs("label", { className: `flex items-center cursor-pointer ${!isEnabled || widgetConfig['widget-readonly'] ? 'opacity-50 cursor-not-allowed' : ''}`, children: [jsxRuntimeExports.jsx("input", { type: "radio", name: widgetConfig['widget-id'], checked: currentValue === null, onChange: handleUnset, disabled: !isEnabled || widgetConfig['widget-readonly'], className: "mr-2 h-4 w-4 owt-field-check" }), jsxRuntimeExports.jsx("span", { className: "text-sm owt-text", children: "-" })] })), processedOptions.map((option) => (jsxRuntimeExports.jsxs("label", { className: `flex items-center cursor-pointer ${!isEnabled || widgetConfig['widget-readonly'] ? 'opacity-50 cursor-not-allowed' : ''}`, children: [jsxRuntimeExports.jsx("input", { type: "radio", name: widgetConfig['widget-id'], value: option.value, checked: currentValue === option.value, onChange: () => handleChange(option.value), disabled: !isEnabled || widgetConfig['widget-readonly'], className: "mr-2 h-4 w-4 owt-field-check" }), jsxRuntimeExports.jsx("span", { className: "text-sm owt-text", children: tSchema(t, option.label) })] }, option.value)))] })) }), touched && error.length > 0 && (jsxRuntimeExports.jsx("p", { className: "owt-field-error text-sm mt-1", children: error[0] }))] })] }) }));
|
|
13012
13028
|
};
|
|
13013
13029
|
|
|
13014
13030
|
const CheckboxWidget = ({ config }) => {
|
|
@@ -13023,9 +13039,9 @@ const CheckboxWidget = ({ config }) => {
|
|
|
13023
13039
|
if (widgetConfig['widget-readonly']) {
|
|
13024
13040
|
const label = tSchema(t, widgetConfig['widget-label']);
|
|
13025
13041
|
const displayValue = isChecked ? 'Yes' : 'No';
|
|
13026
|
-
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] CheckboxDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [label && (jsxRuntimeExports.jsxs("div", { className: "text-base owt-
|
|
13042
|
+
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] CheckboxDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [label && (jsxRuntimeExports.jsxs("div", { className: "text-base owt-field-label font-medium md:min-w-[120px] sm:pr-4 mb-1 sm:mb-0", style: { fontFamily: 'Roboto, sans-serif' }, title: label, children: [label, ":"] })), jsxRuntimeExports.jsx("div", { className: "flex-1", children: jsxRuntimeExports.jsx("div", { className: "text-base owt-text font-medium", title: String(displayValue ?? ''), children: displayValue }) })] }));
|
|
13027
13043
|
}
|
|
13028
|
-
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-baseline", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium leading-normal owt-
|
|
13044
|
+
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-baseline", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium leading-normal owt-field-label md:min-w-[120px] sm:pr-4 mb-1 sm:mb-0 sm:pt-0.5", label: tSchema(t, widgetConfig['widget-label']), required: isRequired }), jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [jsxRuntimeExports.jsxs("label", { className: "inline-flex cursor-pointer items-baseline gap-2", children: [jsxRuntimeExports.jsx("input", { type: "checkbox", checked: isChecked, onChange: (e) => onChange(e.target.checked), onBlur: onBlur, disabled: !isEnabled || widgetConfig['widget-readonly'], className: "relative top-[0.2em] h-4 w-4 shrink-0 owt-field-check rounded" }), jsxRuntimeExports.jsx("span", { className: "text-base leading-normal owt-text", children: isChecked ? 'Yes' : 'No' })] }), touched && error.length > 0 && (jsxRuntimeExports.jsx("p", { className: "owt-field-error text-sm mt-1", children: error[0] }))] })] }) }));
|
|
13029
13045
|
}
|
|
13030
13046
|
const processedOptions = React.useMemo(() => {
|
|
13031
13047
|
let options = [...dataSourceOptions];
|
|
@@ -13082,9 +13098,9 @@ const CheckboxWidget = ({ config }) => {
|
|
|
13082
13098
|
const displayValue = selectedOptions.length > 0
|
|
13083
13099
|
? selectedOptions.map(opt => tSchema(t, opt.label)).join(', ')
|
|
13084
13100
|
: '-';
|
|
13085
|
-
return (jsxRuntimeExports.jsxs("div", { className: "mb-3 CheckboxDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [label && (jsxRuntimeExports.jsxs("div", { className: "text-sm owt-
|
|
13101
|
+
return (jsxRuntimeExports.jsxs("div", { className: "mb-3 CheckboxDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [label && (jsxRuntimeExports.jsxs("div", { className: "text-sm owt-field-label font-medium md:min-w-[120px] sm:pr-4 mb-1 sm:mb-0", title: label, children: [label, ":"] })), jsxRuntimeExports.jsx("div", { className: "flex-1", children: jsxRuntimeExports.jsx("div", { className: "text-base owt-text font-medium", title: String(displayValue ?? ''), children: displayValue }) })] }));
|
|
13086
13102
|
}
|
|
13087
|
-
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-baseline", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium leading-normal owt-
|
|
13103
|
+
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-baseline", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium leading-normal owt-field-label md:min-w-[120px] sm:pr-4 mb-1 sm:mb-0 sm:pt-0.5", label: tSchema(t, widgetConfig['widget-label']), required: isRequired }), jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [jsxRuntimeExports.jsx("div", { className: layoutConfig.className, style: layoutConfig.style, onBlur: onBlur, children: loading ? (jsxRuntimeExports.jsx("p", { className: "text-sm owt-text-muted", children: t?.('common.loading') })) : (processedOptions.map((option) => (jsxRuntimeExports.jsxs("label", { className: `inline-flex cursor-pointer items-baseline gap-2 ${!isEnabled || widgetConfig['widget-readonly'] ? 'opacity-50 cursor-not-allowed' : ''}`, children: [jsxRuntimeExports.jsx("input", { type: "checkbox", value: option.value, checked: selectedValues.includes(option.value), onChange: (e) => handleCheckboxChange(option.value, e.target.checked), disabled: !isEnabled || widgetConfig['widget-readonly'], className: "relative top-[0.2em] h-4 w-4 shrink-0 owt-field-check rounded" }), jsxRuntimeExports.jsx("span", { className: "text-base leading-normal owt-text", children: tSchema(t, option.label) })] }, option.value)))) }), touched && error.length > 0 && (jsxRuntimeExports.jsx("p", { className: "owt-field-error text-sm mt-1", children: error[0] }))] })] }) }));
|
|
13088
13104
|
};
|
|
13089
13105
|
|
|
13090
13106
|
const PhoneInputWidget = ({ config }) => {
|
|
@@ -13095,9 +13111,9 @@ const PhoneInputWidget = ({ config }) => {
|
|
|
13095
13111
|
: (value || '');
|
|
13096
13112
|
if (widgetConfig['widget-readonly']) {
|
|
13097
13113
|
const label = tSchema(t, widgetConfig['widget-label']);
|
|
13098
|
-
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] PhoneDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [label && (jsxRuntimeExports.jsxs("div", { className: "text-base owt-
|
|
13114
|
+
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] PhoneDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [label && (jsxRuntimeExports.jsxs("div", { className: "text-base owt-field-label font-medium md:min-w-[120px] sm:pr-4 mb-1 sm:mb-0", style: { fontFamily: 'Roboto, sans-serif' }, title: label, children: [label, ":"] })), jsxRuntimeExports.jsx("div", { className: "flex-1", children: jsxRuntimeExports.jsx("div", { className: "text-base owt-text font-medium", title: String(displayValue || ''), children: displayValue || '-' }) })] }));
|
|
13099
13115
|
}
|
|
13100
|
-
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium owt-
|
|
13116
|
+
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium owt-field-label md:min-w-[120px] sm:pr-4 sm:pt-1 mb-1 sm:mb-0", label: tSchema(t, widgetConfig['widget-label']), required: isRequired }), jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [jsxRuntimeExports.jsx("input", { type: "tel", value: displayValue, onChange: (e) => onChange(e.target.value), onBlur: onBlur, disabled: !isEnabled || widgetConfig['widget-readonly'], placeholder: tSchema(t, widgetConfig['widget-data-placeholder']), className: owtFieldInputClass({
|
|
13101
13117
|
error: (touched && error.length > 0) || (widgetConfig['widget-required'] && (!value || value === '')),
|
|
13102
13118
|
disabled: !isEnabled || widgetConfig['widget-readonly'],
|
|
13103
13119
|
className: 'w-full sm:w-[180px] max-w-full h-[30px] px-3 owt-shadow-sm',
|
|
@@ -13135,7 +13151,7 @@ const DisplayWidget = ({ config }) => {
|
|
|
13135
13151
|
if (!label || label.trim() === '') {
|
|
13136
13152
|
return (jsxRuntimeExports.jsx("div", { className: "DisplayFieldWidget mb-3 min-w-0 w-full overflow-hidden text-ellipsis whitespace-nowrap text-base owt-text", title: String(displayValue ?? ''), children: displayValue }));
|
|
13137
13153
|
}
|
|
13138
|
-
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] DisplayFieldWidget flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsxs("div", { className: "text-base owt-
|
|
13154
|
+
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] DisplayFieldWidget flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsxs("div", { className: "text-base owt-field-label font-medium md:min-w-[120px] sm:pr-4 mb-1 sm:mb-0", style: { fontFamily: 'Roboto, sans-serif' }, title: label, children: [label, ":"] }), jsxRuntimeExports.jsx("div", { className: "flex-1 min-w-0", children: jsxRuntimeExports.jsx("div", { className: "text-base owt-text font-medium", title: String(displayValue ?? ''), children: displayValue }) })] }));
|
|
13139
13155
|
};
|
|
13140
13156
|
|
|
13141
13157
|
const getDateColumnConstraintError = (column, cellValue, rowValues, resolveSchemaLabel) => {
|
|
@@ -13421,6 +13437,13 @@ const TableWidget = ({ config }) => {
|
|
|
13421
13437
|
if (!rowData) {
|
|
13422
13438
|
return false;
|
|
13423
13439
|
}
|
|
13440
|
+
const hasValue = columns.some((col) => {
|
|
13441
|
+
const value = rowData[col['column-key']];
|
|
13442
|
+
return value !== null && value !== undefined && value !== '';
|
|
13443
|
+
});
|
|
13444
|
+
if (!hasValue) {
|
|
13445
|
+
return false;
|
|
13446
|
+
}
|
|
13424
13447
|
return isTableRowDataValid(rowData, columns, isReadonly, resolveSchemaLabel);
|
|
13425
13448
|
}, [resolveNewRowData, columns, isReadonly, resolveSchemaLabel]);
|
|
13426
13449
|
const showConfirmation = React.useCallback((message, onConfirm, onCancel) => {
|
|
@@ -14245,6 +14268,8 @@ const DialogTableWidget = ({ config }) => {
|
|
|
14245
14268
|
}
|
|
14246
14269
|
const cleaned = finalizeDialogRowPayload(payload);
|
|
14247
14270
|
if (dialogMode === 'add') {
|
|
14271
|
+
if (Object.keys(cleaned).length === 0)
|
|
14272
|
+
return;
|
|
14248
14273
|
const savedRow = { ...cleaned, edit_action: 'ADD' };
|
|
14249
14274
|
onChange([...rows, savedRow]);
|
|
14250
14275
|
closeDialog();
|
|
@@ -14499,7 +14524,6 @@ const ProfileWidget = ({ config }) => {
|
|
|
14499
14524
|
}
|
|
14500
14525
|
const format = widgetConfig['widget-data-format'] || {};
|
|
14501
14526
|
const imageSize = format.imageSize || 80;
|
|
14502
|
-
const nameColor = format.nameColor || 'var(--owt-color-primary-dark)';
|
|
14503
14527
|
const showIdLabel = format.showIdLabel !== false;
|
|
14504
14528
|
const widgetClassId = `profile-widget-${config['widget-id']}`;
|
|
14505
14529
|
return (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx("style", { children: `
|
|
@@ -14557,7 +14581,7 @@ const ProfileWidget = ({ config }) => {
|
|
|
14557
14581
|
.${widgetClassId} .profile-name {
|
|
14558
14582
|
font-size: 1.25rem;
|
|
14559
14583
|
font-weight: 600;
|
|
14560
|
-
color:
|
|
14584
|
+
color: var(--owt-color-primary-dark);
|
|
14561
14585
|
line-height: 1.4;
|
|
14562
14586
|
word-wrap: break-word;
|
|
14563
14587
|
max-width: 100%;
|
|
@@ -14587,7 +14611,7 @@ const ProfileWidget = ({ config }) => {
|
|
|
14587
14611
|
if (placeholder) {
|
|
14588
14612
|
placeholder.style.display = 'flex';
|
|
14589
14613
|
}
|
|
14590
|
-
} })) : null, jsxRuntimeExports.jsx("div", { className: "profile-avatar-placeholder", style: { display: imageUrl ? 'none' : 'flex' }, children: jsxRuntimeExports.jsx("img", { src: img$
|
|
14614
|
+
} })) : null, jsxRuntimeExports.jsx("div", { className: "profile-avatar-placeholder", style: { display: imageUrl ? 'none' : 'flex' }, children: jsxRuntimeExports.jsx("img", { src: img$c, alt: t?.('profile.profilePlaceholderAlt') ?? 'Profile Placeholder' }) })] }), jsxRuntimeExports.jsxs("div", { className: "profile-info", children: [displayName && (jsxRuntimeExports.jsx("div", { className: "profile-name", children: displayName })), idValue && (jsxRuntimeExports.jsxs("div", { className: "profile-id", children: [showIdLabel && (jsxRuntimeExports.jsx("span", { className: "profile-id-label", children: t?.('profile.idLabel') ?? 'ID :' })), jsxRuntimeExports.jsx("span", { className: "profile-id-value", children: idValue })] }))] })] })] }));
|
|
14591
14615
|
};
|
|
14592
14616
|
|
|
14593
14617
|
const TextAreaWidget = ({ config }) => {
|
|
@@ -14634,7 +14658,7 @@ const TextAreaWidget = ({ config }) => {
|
|
|
14634
14658
|
const errorMessage = hasError ? error[0] : '';
|
|
14635
14659
|
if (isReadonly) {
|
|
14636
14660
|
const displayValue = getStringValue() || '-';
|
|
14637
|
-
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] TextAreaDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [label && (jsxRuntimeExports.jsxs("div", { className: "text-base owt-
|
|
14661
|
+
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] TextAreaDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [label && (jsxRuntimeExports.jsxs("div", { className: "text-base owt-field-label font-medium md:min-w-[120px] sm:pr-4 mb-1 sm:mb-0", style: { fontFamily: 'Roboto, sans-serif' }, title: label, children: [label, ":"] })), jsxRuntimeExports.jsx("div", { className: "flex-1", children: jsxRuntimeExports.jsx("div", { title: String(displayValue), className: "text-base owt-text font-medium overflow-y-auto whitespace-pre-wrap break-words", style: {
|
|
14638
14662
|
fontFamily: 'Roboto, sans-serif',
|
|
14639
14663
|
height: '56px',
|
|
14640
14664
|
minHeight: '56px',
|
|
@@ -14645,7 +14669,7 @@ const TextAreaWidget = ({ config }) => {
|
|
|
14645
14669
|
border: 'none',
|
|
14646
14670
|
}, children: displayValue }) })] }));
|
|
14647
14671
|
}
|
|
14648
|
-
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium owt-
|
|
14672
|
+
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium owt-field-label md:min-w-[120px] sm:pr-4 sm:pt-1 mb-1 sm:mb-0", label: label, required: isRequired }), jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [jsxRuntimeExports.jsxs("div", { style: { position: 'relative' }, children: [jsxRuntimeExports.jsx("textarea", { id: widgetConfig['widget-id'], rows: rows, value: getStringValue(), onChange: handleChange, onBlur: onBlur, disabled: !isEnabled, placeholder: placeholder, className: owtFieldInputClass({
|
|
14649
14673
|
error: hasError,
|
|
14650
14674
|
disabled: !isEnabled,
|
|
14651
14675
|
className: 'w-full px-3 py-2 owt-shadow-sm',
|
|
@@ -14663,11 +14687,6 @@ const TextAreaWidget = ({ config }) => {
|
|
|
14663
14687
|
}, children: charCounterText }))] }), hasError && (jsxRuntimeExports.jsx("p", { className: "owt-field-error text-sm mt-1", children: errorMessage }))] })] }) }));
|
|
14664
14688
|
};
|
|
14665
14689
|
|
|
14666
|
-
const DEFAULT_STATUS_COLORS = {
|
|
14667
|
-
active: 'var(--owt-color-success)',
|
|
14668
|
-
inactive: 'var(--owt-color-warning)',
|
|
14669
|
-
archived: 'var(--owt-color-text-muted)',
|
|
14670
|
-
};
|
|
14671
14690
|
const DEFAULT_LABELS = {
|
|
14672
14691
|
functionalId: 'Functional Record ID',
|
|
14673
14692
|
status: 'Record Status',
|
|
@@ -14874,11 +14893,6 @@ const HeaderSectionWidget = ({ config }) => {
|
|
|
14874
14893
|
}, [completionScoreRaw, idealScoreRaw]);
|
|
14875
14894
|
const format = (widgetConfig['widget-data-format'] || {});
|
|
14876
14895
|
const imageSize = format.imageSize || 120;
|
|
14877
|
-
const nameColor = format.nameColor || 'var(--owt-color-primary-dark)';
|
|
14878
|
-
const statusColors = {
|
|
14879
|
-
...DEFAULT_STATUS_COLORS,
|
|
14880
|
-
...(format.statusColors || {}),
|
|
14881
|
-
};
|
|
14882
14896
|
const updateFieldValue = React.useCallback((fieldKey, newValue) => {
|
|
14883
14897
|
const path = paths[fieldKey];
|
|
14884
14898
|
if (!path)
|
|
@@ -14892,7 +14906,6 @@ const HeaderSectionWidget = ({ config }) => {
|
|
|
14892
14906
|
const opt = statusOptions.find((o) => String(o.value).toLowerCase() === String(statusValue).toLowerCase());
|
|
14893
14907
|
return opt ? opt.label : String(statusValue);
|
|
14894
14908
|
}, [statusValue, statusOptions]);
|
|
14895
|
-
const statusColor = statusColors[String(statusValue).toLowerCase()] || 'var(--owt-color-text-muted)';
|
|
14896
14909
|
const fileInputRef = React.useRef(null);
|
|
14897
14910
|
const handleImageUpload = React.useCallback(async (e) => {
|
|
14898
14911
|
const file = e.target.files?.[0];
|
|
@@ -15086,7 +15099,7 @@ const HeaderSectionWidget = ({ config }) => {
|
|
|
15086
15099
|
.${cls} .hdr-name {
|
|
15087
15100
|
font-size: 1.25rem;
|
|
15088
15101
|
font-weight: 600;
|
|
15089
|
-
color:
|
|
15102
|
+
color: var(--owt-color-primary-dark);
|
|
15090
15103
|
line-height: 1.4;
|
|
15091
15104
|
word-wrap: break-word;
|
|
15092
15105
|
}
|
|
@@ -15126,12 +15139,25 @@ const HeaderSectionWidget = ({ config }) => {
|
|
|
15126
15139
|
font-size: 0.75rem;
|
|
15127
15140
|
font-weight: 600;
|
|
15128
15141
|
color: var(--owt-color-bg);
|
|
15142
|
+
background-color: var(--owt-color-text-muted);
|
|
15129
15143
|
max-width: 100%;
|
|
15130
15144
|
overflow: hidden;
|
|
15131
15145
|
text-overflow: ellipsis;
|
|
15132
15146
|
white-space: nowrap;
|
|
15133
15147
|
}
|
|
15134
15148
|
|
|
15149
|
+
.${cls} .hdr-status-badge[data-status="active"] {
|
|
15150
|
+
background-color: var(--owt-color-success);
|
|
15151
|
+
}
|
|
15152
|
+
|
|
15153
|
+
.${cls} .hdr-status-badge[data-status="inactive"] {
|
|
15154
|
+
background-color: var(--owt-color-warning);
|
|
15155
|
+
}
|
|
15156
|
+
|
|
15157
|
+
.${cls} .hdr-status-badge[data-status="archived"] {
|
|
15158
|
+
background-color: var(--owt-color-text-muted);
|
|
15159
|
+
}
|
|
15160
|
+
|
|
15135
15161
|
.${cls} .hdr-meta-row {
|
|
15136
15162
|
display: flex;
|
|
15137
15163
|
align-items: baseline;
|
|
@@ -15221,7 +15247,7 @@ const HeaderSectionWidget = ({ config }) => {
|
|
|
15221
15247
|
.parentElement?.querySelector('.hdr-avatar-placeholder');
|
|
15222
15248
|
if (placeholder)
|
|
15223
15249
|
placeholder.style.display = 'flex';
|
|
15224
|
-
} })) : null, jsxRuntimeExports.jsx("div", { className: "hdr-avatar-placeholder", style: { display: displayImageUrl ? 'none' : 'flex' }, children: jsxRuntimeExports.jsx("img", { src: img$
|
|
15250
|
+
} })) : null, jsxRuntimeExports.jsx("div", { className: "hdr-avatar-placeholder", style: { display: displayImageUrl ? 'none' : 'flex' }, children: jsxRuntimeExports.jsx("img", { src: img$c, alt: "Profile Placeholder" }) }), !isReadonly && (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsxs("div", { className: "hdr-avatar-overlay", children: [jsxRuntimeExports.jsxs("button", { type: "button", className: "hdr-avatar-action", onClick: () => fileInputRef.current?.click(), children: [jsxRuntimeExports.jsxs("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [jsxRuntimeExports.jsx("path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" }), jsxRuntimeExports.jsx("polyline", { points: "17 8 12 3 7 8" }), jsxRuntimeExports.jsx("line", { x1: "12", y1: "3", x2: "12", y2: "15" })] }), "Upload"] }), jsxRuntimeExports.jsxs("button", { type: "button", className: "hdr-avatar-action hdr-avatar-action--delete", onClick: handleImageDelete, children: [jsxRuntimeExports.jsxs("svg", { width: "13", height: "13", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [jsxRuntimeExports.jsx("polyline", { points: "3 6 5 6 21 6" }), jsxRuntimeExports.jsx("path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" })] }), "Delete"] })] }), jsxRuntimeExports.jsx("input", { ref: fileInputRef, type: "file", accept: "image/*", style: { display: 'none' }, onChange: handleImageUpload })] }))] }), jsxRuntimeExports.jsxs("div", { className: "hdr-info", children: [displayName && jsxRuntimeExports.jsx("div", { className: "hdr-name", children: displayName }), jsxRuntimeExports.jsxs("div", { className: "hdr-field-row", children: [jsxRuntimeExports.jsxs("span", { className: "hdr-field-label", title: `${getLabel('functionalId')} :`, children: [getLabel('functionalId'), " :"] }), jsxRuntimeExports.jsx("span", { className: "hdr-field-value", title: functionalId || '-', children: functionalId || '-' })] }), jsxRuntimeExports.jsxs("div", { className: "hdr-field-row", children: [jsxRuntimeExports.jsx("span", { className: "hdr-field-label", title: getLabel('status'), children: getLabel('status') }), isReadonly ? (statusLabel ? (jsxRuntimeExports.jsx("span", { className: "hdr-status-badge", "data-status": String(statusValue).toLowerCase(), title: statusLabel, children: statusLabel })) : (jsxRuntimeExports.jsx("span", { className: "hdr-field-value", title: "-", children: "-" }))) : (jsxRuntimeExports.jsxs("select", { className: "hdr-select", value: statusValue, onChange: (e) => updateFieldValue('status', e.target.value), children: [jsxRuntimeExports.jsx("option", { value: "", children: getLabel('select') }), statusOptions.map((opt) => (jsxRuntimeExports.jsx("option", { value: opt.value, children: opt.label }, opt.value)))] }))] }), jsxRuntimeExports.jsxs("div", { className: "hdr-field-row", children: [jsxRuntimeExports.jsxs("span", { className: "hdr-field-label", title: `${getLabel('statusReason')} :`, children: [getLabel('statusReason'), " :"] }), isReadonly ? (jsxRuntimeExports.jsx("span", { className: "hdr-field-value", title: statusReason || '-', children: statusReason || '-' })) : (jsxRuntimeExports.jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: 4 }, children: [jsxRuntimeExports.jsx("input", { type: "text", className: `hdr-input ${(!isReadonly && (showReasonRequired || isReasonMissing) && isReasonMissing) ? 'hdr-input--error' : ''}`, value: statusReason, placeholder: getLabel('enterReason'), required: isStatusChanged, "aria-required": isStatusChanged, "aria-invalid": !isReadonly && (showReasonRequired || isReasonMissing) && isReasonMissing, onBlur: () => {
|
|
15225
15251
|
if (isReasonMissing)
|
|
15226
15252
|
setShowReasonRequired(true);
|
|
15227
15253
|
}, onChange: (e) => {
|
|
@@ -15536,6 +15562,7 @@ function unwrapPayload(response) {
|
|
|
15536
15562
|
}
|
|
15537
15563
|
const IdAuthenticationWidget = ({ config, schemaData: propSchemaData }) => {
|
|
15538
15564
|
const { dataSourceRequestHandler, schemaData: ctxSchemaData, t } = useWidgetContext();
|
|
15565
|
+
const themeRoot = useOwtThemeRootProps();
|
|
15539
15566
|
const values = reactRedux.useSelector((state) => state.widget.values);
|
|
15540
15567
|
const schemaData = (propSchemaData || ctxSchemaData || {});
|
|
15541
15568
|
const widgetId = config['widget-id'];
|
|
@@ -15829,7 +15856,7 @@ const IdAuthenticationWidget = ({ config, schemaData: propSchemaData }) => {
|
|
|
15829
15856
|
font-size: 14px;
|
|
15830
15857
|
font-weight: 500;
|
|
15831
15858
|
color: var(--owt-color-text);
|
|
15832
|
-
background:
|
|
15859
|
+
background: var(--owt-color-bg);
|
|
15833
15860
|
border: none;
|
|
15834
15861
|
border-radius: 0;
|
|
15835
15862
|
padding: 0;
|
|
@@ -15843,8 +15870,8 @@ const IdAuthenticationWidget = ({ config, schemaData: propSchemaData }) => {
|
|
|
15843
15870
|
padding: 8px 24px;
|
|
15844
15871
|
line-height: 1.5;
|
|
15845
15872
|
border-radius: var(--owt-btn-border-radius);
|
|
15846
|
-
border: 1px solid var(--owt-
|
|
15847
|
-
background-color: var(--owt-color-primary
|
|
15873
|
+
border: 1px solid var(--owt-btn-primary-border);
|
|
15874
|
+
background-color: var(--owt-color-primary);
|
|
15848
15875
|
color: var(--owt-color-bg);
|
|
15849
15876
|
font-family: Roboto, sans-serif;
|
|
15850
15877
|
cursor: pointer;
|
|
@@ -15858,7 +15885,7 @@ const IdAuthenticationWidget = ({ config, schemaData: propSchemaData }) => {
|
|
|
15858
15885
|
|
|
15859
15886
|
.${cls} .auth-error {
|
|
15860
15887
|
font-size: 12px;
|
|
15861
|
-
color: var(--owt-color
|
|
15888
|
+
color: var(--owt-widget-error-color);
|
|
15862
15889
|
font-weight: 700;
|
|
15863
15890
|
line-height: 1.3;
|
|
15864
15891
|
text-align: left;
|
|
@@ -15936,7 +15963,7 @@ const IdAuthenticationWidget = ({ config, schemaData: propSchemaData }) => {
|
|
|
15936
15963
|
max-width: none;
|
|
15937
15964
|
}
|
|
15938
15965
|
}
|
|
15939
|
-
` }), jsxRuntimeExports.jsxs("div", { className: cls, children: [overlayUrl ? (jsxRuntimeExports.jsx("div", { className: "overlay-backdrop", role: "dialog", "aria-modal": "true", "aria-label": t?.('idAuth.overlayAria') ?? 'Authentication', onClick: (e) => {
|
|
15966
|
+
` }), jsxRuntimeExports.jsxs("div", { className: `${cls} ${themeRoot.className}`, style: themeRoot.style, children: [overlayUrl ? (jsxRuntimeExports.jsx("div", { className: "overlay-backdrop", role: "dialog", "aria-modal": "true", "aria-label": t?.('idAuth.overlayAria') ?? 'Authentication', onClick: (e) => {
|
|
15940
15967
|
if (e.target === e.currentTarget) {
|
|
15941
15968
|
setOverlayUrl(null);
|
|
15942
15969
|
emitHostEvent({ type: 'overlay_closed' });
|
|
@@ -16005,6 +16032,7 @@ const RecordDisplayPanel = ({ row, widgetIdPrefix, className = '', isEditMode =
|
|
|
16005
16032
|
min-width: 0 !important;
|
|
16006
16033
|
overflow: hidden !important;
|
|
16007
16034
|
}
|
|
16035
|
+
.register-lookup-record-panel .DisplayFieldWidget > .text-base.owt-field-label,
|
|
16008
16036
|
.register-lookup-record-panel .DisplayFieldWidget > .text-base.owt-text-muted {
|
|
16009
16037
|
width: 50% !important;
|
|
16010
16038
|
min-width: 50% !important;
|
|
@@ -16246,7 +16274,7 @@ const RegisterLookupWidget = ({ config }) => {
|
|
|
16246
16274
|
error: hasError,
|
|
16247
16275
|
disabled: !isEnabled,
|
|
16248
16276
|
className: 'flex items-center gap-2 w-full sm:w-[180px] max-w-full px-3 h-[30px] text-sm cursor-pointer',
|
|
16249
|
-
}), children: [jsxRuntimeExports.jsx("img", { src: img$
|
|
16277
|
+
}), children: [jsxRuntimeExports.jsx("img", { src: img$b, alt: "", className: "w-4 h-4 opacity-50 flex-shrink-0" }), jsxRuntimeExports.jsx("span", { className: "min-w-0 truncate", children: actionLabel }), isRequired && jsxRuntimeExports.jsx("span", { className: "shrink-0 owt-field-required", children: "*" })] }), touched && error.length > 0 && jsxRuntimeExports.jsx("p", { className: "owt-field-error text-sm mt-1", children: error[0] })] })) : null, !isReadonly && isOpen && (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx("div", { className: "fixed inset-0 z-50", style: { backgroundColor: 'var(--owt-color-overlay)' }, onClick: () => { setIsOpen(false); onBlur(); } }), jsxRuntimeExports.jsxs("div", { className: `${themeRoot.className} flex flex-col overflow-hidden`, style: {
|
|
16250
16278
|
...themeRoot.style,
|
|
16251
16279
|
position: 'fixed',
|
|
16252
16280
|
top: modalPos.y,
|
|
@@ -16266,14 +16294,14 @@ const RegisterLookupWidget = ({ config }) => {
|
|
|
16266
16294
|
e.preventDefault();
|
|
16267
16295
|
isDragging.current = true;
|
|
16268
16296
|
dragOrigin.current = { mouseX: e.clientX, mouseY: e.clientY, posX: modalPos.x, posY: modalPos.y };
|
|
16269
|
-
}, className: "flex items-center justify-between px-5 py-4 flex-shrink-0 select-none border-b owt-border cursor-grab", children: [jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold owt-text", children: t?.('common.selectTitle', { label, defaultValue: `Select ${label}` }) }), jsxRuntimeExports.jsx("button", { type: "button", onClick: () => { setIsOpen(false); onBlur(); }, onMouseDown: (e) => e.stopPropagation(), className: "p-0 border-0 bg-transparent cursor-pointer", "aria-label": t?.('common.close', { defaultValue: 'Close' }), children: jsxRuntimeExports.jsx("img", { src: img$
|
|
16297
|
+
}, className: "flex items-center justify-between px-5 py-4 flex-shrink-0 select-none border-b owt-border cursor-grab", children: [jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold owt-text", children: t?.('common.selectTitle', { label, defaultValue: `Select ${label}` }) }), jsxRuntimeExports.jsx("button", { type: "button", onClick: () => { setIsOpen(false); onBlur(); }, onMouseDown: (e) => e.stopPropagation(), className: "p-0 border-0 bg-transparent cursor-pointer", "aria-label": t?.('common.close', { defaultValue: 'Close' }), children: jsxRuntimeExports.jsx("img", { src: img$a, alt: "", className: "w-5 h-5 opacity-60" }) })] }), jsxRuntimeExports.jsx("div", { className: "px-5 py-3 flex-shrink-0 border-b owt-border", children: jsxRuntimeExports.jsxs("div", { className: owtFieldInputClass({ className: 'flex items-center gap-2 px-3 h-[30px] rounded-[10px]' }), children: [jsxRuntimeExports.jsx("input", { ref: searchInputRef, type: "text", value: searchText, onChange: (e) => setSearchText(e.target.value), onKeyDown: (e) => {
|
|
16270
16298
|
if (e.key === 'Enter') {
|
|
16271
16299
|
e.preventDefault();
|
|
16272
16300
|
runSearch(searchText, 1);
|
|
16273
16301
|
}
|
|
16274
|
-
}, placeholder: searchPlaceholder, className: "flex-1 outline-none text-sm owt-text bg-transparent" }), jsxRuntimeExports.jsx("button", { type: "button", onClick: () => runSearch(searchText, 1), "aria-label": t?.('common.search', { defaultValue: 'Search' }), className: "flex-shrink-0 p-0 border-0 bg-transparent cursor-pointer", children: jsxRuntimeExports.jsx("img", { src: img$
|
|
16302
|
+
}, placeholder: searchPlaceholder, className: "flex-1 outline-none text-sm owt-text bg-transparent" }), jsxRuntimeExports.jsx("button", { type: "button", onClick: () => runSearch(searchText, 1), "aria-label": t?.('common.search', { defaultValue: 'Search' }), className: "flex-shrink-0 p-0 border-0 bg-transparent cursor-pointer", children: jsxRuntimeExports.jsx("img", { src: img$b, alt: "", className: "w-4 h-4 opacity-40" }) })] }) }), jsxRuntimeExports.jsx("div", { className: "overflow-auto flex-1", children: searchResults.length === 0 ? (jsxRuntimeExports.jsx("p", { className: "text-center text-sm owt-text-muted py-10", children: searchText
|
|
16275
16303
|
? t?.('common.noResults', { defaultValue: 'No results found' })
|
|
16276
|
-
: t?.('common.searchHint', { defaultValue: 'Type and press Enter or click search' }) })) : (jsxRuntimeExports.jsx(ResultsTable, { rows: searchResults, selectedRowKey: pendingRow?.internal_record_id ?? null, onRowClick: setPendingRow, onRowDoubleClick: applySelection })) }), jsxRuntimeExports.jsxs("div", { className: `flex-shrink-0 flex flex-wrap items-center gap-3 px-5 py-3 border-t owt-border ${totalCount !== null ? 'justify-between' : 'justify-end'}`, children: [totalCount !== null && (jsxRuntimeExports.jsx(PaginationFooter, { embedded: true, currentPage: currentPage, totalPages: totalPages, totalCount: totalCount, pageSize: pageSize, onPageChange: (page) => runSearch(searchText, page), onPrev: () => currentPage > 1 && runSearch(searchText, currentPage - 1), onNext: () => currentPage < totalPages && runSearch(searchText, currentPage + 1) })), jsxRuntimeExports.jsx("button", { type: "button", onClick: () => pendingRow && applySelection(pendingRow), disabled: !pendingRow, className: "px-4 h-9 text-sm font-medium rounded-[10px]
|
|
16304
|
+
: t?.('common.searchHint', { defaultValue: 'Type and press Enter or click search' }) })) : (jsxRuntimeExports.jsx(ResultsTable, { rows: searchResults, selectedRowKey: pendingRow?.internal_record_id ?? null, onRowClick: setPendingRow, onRowDoubleClick: applySelection })) }), jsxRuntimeExports.jsxs("div", { className: `flex-shrink-0 flex flex-wrap items-center gap-3 px-5 py-3 border-t owt-border ${totalCount !== null ? 'justify-between' : 'justify-end'}`, children: [totalCount !== null && (jsxRuntimeExports.jsx(PaginationFooter, { embedded: true, currentPage: currentPage, totalPages: totalPages, totalCount: totalCount, pageSize: pageSize, onPageChange: (page) => runSearch(searchText, page), onPrev: () => currentPage > 1 && runSearch(searchText, currentPage - 1), onNext: () => currentPage < totalPages && runSearch(searchText, currentPage + 1) })), jsxRuntimeExports.jsx("button", { type: "button", onClick: () => pendingRow && applySelection(pendingRow), disabled: !pendingRow, className: "px-4 h-9 text-sm font-medium rounded-[10px] disabled:opacity-40 disabled:cursor-not-allowed flex-shrink-0", style: { backgroundColor: 'var(--owt-color-info)', color: 'var(--owt-color-bg)' }, children: selectRecordLabel })] })] })] }))] }));
|
|
16277
16305
|
};
|
|
16278
16306
|
|
|
16279
16307
|
const parentLookupRecordCache = new Map();
|
|
@@ -16555,12 +16583,12 @@ const ParentLookupWidget = ({ config, value: valueProp, error: errorProp, touche
|
|
|
16555
16583
|
className: `w-full sm:w-[180px] max-w-full h-[30px] px-3 owt-shadow-sm ${!isEnabled || isReadonly ? '' : 'cursor-pointer'}`,
|
|
16556
16584
|
}), style: { borderRadius: '10px' }, title: hasValue ? displayName : placeholder, children: [jsxRuntimeExports.jsx("option", { value: "", children: placeholder }), hasValue && jsxRuntimeExports.jsx("option", { value: "__selected__", children: displayName })] }));
|
|
16557
16585
|
if (isReadonly && !isCompact) {
|
|
16558
|
-
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] flex flex-col sm:flex-row sm:items-start", children: [rawLabel && (jsxRuntimeExports.jsxs("div", { className: "text-base owt-
|
|
16586
|
+
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] flex flex-col sm:flex-row sm:items-start", children: [rawLabel && (jsxRuntimeExports.jsxs("div", { className: "text-base owt-field-label font-medium md:min-w-[120px] sm:pr-4 mb-1 sm:mb-0", style: { fontFamily: 'Roboto, sans-serif' }, title: label, children: [label, ":"] })), jsxRuntimeExports.jsx("div", { className: "flex-1 text-base owt-text font-medium", children: hasValue ? displayName : '-' })] }));
|
|
16559
16587
|
}
|
|
16560
16588
|
if (isReadonly && isCompact) {
|
|
16561
16589
|
return (jsxRuntimeExports.jsx("span", { className: "text-sm truncate block", style: { color: 'inherit' }, children: hasValue ? displayName : '-' }));
|
|
16562
16590
|
}
|
|
16563
|
-
return (jsxRuntimeExports.jsxs("div", { className: isCompact ? 'table-cell-field w-full' : 'mb-[10px]', children: [isCompact ? (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [selectTrigger, jsxRuntimeExports.jsx("p", { className: "table-cell-field-error", "aria-hidden": "true", children: '\u00a0' })] })) : (jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-start", children: [rawLabel && (jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium owt-
|
|
16591
|
+
return (jsxRuntimeExports.jsxs("div", { className: isCompact ? 'table-cell-field w-full' : 'mb-[10px]', children: [isCompact ? (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [selectTrigger, jsxRuntimeExports.jsx("p", { className: "table-cell-field-error", "aria-hidden": "true", children: '\u00a0' })] })) : (jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-start", children: [rawLabel && (jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium owt-field-label md:min-w-[120px] sm:pr-4 sm:pt-1 mb-1 sm:mb-0", label: rawLabel, required: isRequired })), jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [selectTrigger, touched && error.length > 0 && (jsxRuntimeExports.jsx("p", { className: "owt-field-error text-sm mt-1", children: error[0] }))] })] })), isOpen && (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx("div", { className: "fixed inset-0 z-[100]", style: { backgroundColor: 'var(--owt-color-overlay)' }, onClick: () => {
|
|
16564
16592
|
setIsOpen(false);
|
|
16565
16593
|
onBlur();
|
|
16566
16594
|
} }), jsxRuntimeExports.jsxs("div", { className: `${themeRoot.className} flex flex-col overflow-hidden`, style: {
|
|
@@ -16591,12 +16619,12 @@ const ParentLookupWidget = ({ config, value: valueProp, error: errorProp, touche
|
|
|
16591
16619
|
}, className: "flex items-center justify-between px-5 py-4 flex-shrink-0 select-none border-b owt-border cursor-grab", children: [jsxRuntimeExports.jsx("h3", { className: "text-lg font-semibold owt-text", children: t?.('common.selectTitle', { label, defaultValue: `Select ${label}` }) }), jsxRuntimeExports.jsx("button", { type: "button", onClick: () => {
|
|
16592
16620
|
setIsOpen(false);
|
|
16593
16621
|
onBlur();
|
|
16594
|
-
}, onMouseDown: (e) => e.stopPropagation(), className: "p-0 border-0 bg-transparent cursor-pointer", "aria-label": t?.('common.close', { defaultValue: 'Close' }), children: jsxRuntimeExports.jsx("img", { src: img$
|
|
16622
|
+
}, onMouseDown: (e) => e.stopPropagation(), className: "p-0 border-0 bg-transparent cursor-pointer", "aria-label": t?.('common.close', { defaultValue: 'Close' }), children: jsxRuntimeExports.jsx("img", { src: img$a, alt: "", className: "w-5 h-5 opacity-60" }) })] }), jsxRuntimeExports.jsx("div", { className: "px-5 py-3 flex-shrink-0 border-b owt-border", children: jsxRuntimeExports.jsxs("div", { className: owtFieldInputClass({ className: 'flex items-center gap-2 px-3 h-[30px] rounded-[10px]' }), children: [jsxRuntimeExports.jsx("input", { ref: searchInputRef, type: "text", value: searchText, onChange: (e) => setSearchText(e.target.value), onKeyDown: (e) => {
|
|
16595
16623
|
if (e.key === 'Enter') {
|
|
16596
16624
|
e.preventDefault();
|
|
16597
16625
|
runSearch(searchText, 1);
|
|
16598
16626
|
}
|
|
16599
|
-
}, placeholder: searchPlaceholder, className: "flex-1 outline-none text-sm owt-text bg-transparent" }), jsxRuntimeExports.jsx("button", { type: "button", onClick: () => runSearch(searchText, 1), "aria-label": t?.('common.search', { defaultValue: 'Search' }), className: "flex-shrink-0 p-0 border-0 bg-transparent cursor-pointer", children: jsxRuntimeExports.jsx("img", { src: img$
|
|
16627
|
+
}, placeholder: searchPlaceholder, className: "flex-1 outline-none text-sm owt-text bg-transparent" }), jsxRuntimeExports.jsx("button", { type: "button", onClick: () => runSearch(searchText, 1), "aria-label": t?.('common.search', { defaultValue: 'Search' }), className: "flex-shrink-0 p-0 border-0 bg-transparent cursor-pointer", children: jsxRuntimeExports.jsx("img", { src: img$b, alt: "", className: "w-4 h-4 opacity-40" }) })] }) }), jsxRuntimeExports.jsx("div", { className: "overflow-auto flex-1", children: searchResults.length === 0 ? (jsxRuntimeExports.jsx("p", { className: "text-center text-sm owt-text-muted py-10", children: searchText
|
|
16600
16628
|
? t?.('common.noResults', { defaultValue: 'No results found' })
|
|
16601
16629
|
: t?.('common.searchHint', {
|
|
16602
16630
|
defaultValue: 'Type and press Enter or click search',
|
|
@@ -16620,7 +16648,7 @@ const ParentLookupWidget = ({ config, value: valueProp, error: errorProp, touche
|
|
|
16620
16648
|
clearSelection();
|
|
16621
16649
|
setIsOpen(false);
|
|
16622
16650
|
onBlur();
|
|
16623
|
-
}, className: "px-4 h-9 text-sm font-medium rounded-[10px] owt-bg-alt owt-text flex-shrink-0", children: t?.('common.remove', { defaultValue: 'Clear' }) })), jsxRuntimeExports.jsx("button", { type: "button", onClick: () => pendingRow && applySelection(pendingRow), disabled: !pendingRow, className: "px-4 h-9 text-sm font-medium rounded-[10px]
|
|
16651
|
+
}, className: "px-4 h-9 text-sm font-medium rounded-[10px] owt-bg-alt owt-text flex-shrink-0", children: t?.('common.remove', { defaultValue: 'Clear' }) })), jsxRuntimeExports.jsx("button", { type: "button", onClick: () => pendingRow && applySelection(pendingRow), disabled: !pendingRow, className: "px-4 h-9 text-sm font-medium rounded-[10px] disabled:opacity-40 disabled:cursor-not-allowed flex-shrink-0", style: { backgroundColor: 'var(--owt-color-info)', color: 'var(--owt-color-bg)' }, children: selectRecordLabel })] })] })] })] }))] }));
|
|
16624
16652
|
};
|
|
16625
16653
|
|
|
16626
16654
|
const MultiSelectWidget = ({ config }) => {
|
|
@@ -16859,7 +16887,7 @@ const MultiSelectWidget = ({ config }) => {
|
|
|
16859
16887
|
}) }), jsxRuntimeExports.jsx("div", { className: "overflow-y-auto flex-1 min-h-0 py-1 overscroll-contain", children: selectedLabels.map((label, index) => (jsxRuntimeExports.jsx("div", { className: "px-3 py-1.5 text-sm owt-text", title: label, children: label }, `${selectedValues[index]}-${label}`))) })] })) : null;
|
|
16860
16888
|
if (widgetConfig['widget-readonly']) {
|
|
16861
16889
|
const fieldLabel = widgetConfig['widget-label'];
|
|
16862
|
-
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] MultiSelectDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [fieldLabel && (jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base owt-
|
|
16890
|
+
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] MultiSelectDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [fieldLabel && (jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base owt-field-label font-medium md:min-w-[120px] sm:pr-4 mb-1 sm:mb-0", label: fieldLabel })), jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", children: [selectedLabels.length === 0 ? (jsxRuntimeExports.jsx("div", { className: "text-base owt-text font-medium", children: "-" })) : (renderSelectedLabels({ readonly: true })), mounted && listPopupPanel && typeof document !== 'undefined'
|
|
16863
16891
|
? reactDom.createPortal(listPopupPanel, document.body)
|
|
16864
16892
|
: null] })] }));
|
|
16865
16893
|
}
|
|
@@ -16891,7 +16919,7 @@ const MultiSelectWidget = ({ config }) => {
|
|
|
16891
16919
|
const isChecked = selectedValues.includes(option.value);
|
|
16892
16920
|
return (jsxRuntimeExports.jsxs("label", { className: `flex items-center gap-2 px-3 py-1 cursor-pointer owt-highlight-hover ${isChecked ? 'owt-highlight' : ''}`, children: [jsxRuntimeExports.jsx("input", { type: "checkbox", checked: isChecked, onChange: (e) => handleToggle(option.value, e.target.checked), className: "h-4 w-4 shrink-0 owt-field-check rounded" }), jsxRuntimeExports.jsx("span", { className: "text-sm owt-text leading-normal select-none", children: option.label })] }, option.value));
|
|
16893
16921
|
})) })] })) : null;
|
|
16894
|
-
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium owt-
|
|
16922
|
+
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium owt-field-label md:min-w-[120px] sm:pr-4 sm:pt-1 mb-1 sm:mb-0", label: widgetConfig['widget-label'] ?? '', required: isRequired }), jsxRuntimeExports.jsxs("div", { className: "flex-1 min-w-0", ref: containerRef, children: [jsxRuntimeExports.jsxs("button", { ref: triggerRef, type: "button", onClick: () => {
|
|
16895
16923
|
if (!disabled)
|
|
16896
16924
|
setIsOpen((prev) => !prev);
|
|
16897
16925
|
}, onBlur: () => {
|
|
@@ -17840,7 +17868,7 @@ function resolveDisplayValue(levelId, selectedValues, options, resolvedLabels, l
|
|
|
17840
17868
|
return loading ? '-' : selected;
|
|
17841
17869
|
}
|
|
17842
17870
|
function ReadonlyLevelRow({ level, displayValue, }) {
|
|
17843
|
-
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] SelectDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsxs("div", { className: "text-base owt-
|
|
17871
|
+
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] SelectDisplayWidget flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsxs("div", { className: "text-base owt-field-label font-medium md:min-w-[120px] sm:pr-4 mb-1 sm:mb-0", style: { fontFamily: 'Roboto, sans-serif' }, title: level.level_mnemonic, children: [level.level_mnemonic, ":"] }), jsxRuntimeExports.jsx("div", { className: "flex-1", children: jsxRuntimeExports.jsx("div", { className: "text-base owt-text font-medium", style: { fontFamily: 'Roboto, sans-serif' }, title: displayValue, children: displayValue }) })] }));
|
|
17844
17872
|
}
|
|
17845
17873
|
function renderFormSteps({ columnSteps, selectedValues, options, loadingLevels, loadingLevelId, isEnabled, isRequired, isComplete, touched, hasError, t, onBlur, handleValueChange, formatLevelLabel, }) {
|
|
17846
17874
|
return columnSteps.map((step) => {
|
|
@@ -17856,7 +17884,7 @@ function renderFormSteps({ columnSteps, selectedValues, options, loadingLevels,
|
|
|
17856
17884
|
((isRequired && !isComplete && !levelHasValue) ||
|
|
17857
17885
|
(touched && hasError && !levelHasValue));
|
|
17858
17886
|
const label = formatLevelLabel(level.level_mnemonic);
|
|
17859
|
-
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium owt-
|
|
17887
|
+
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium owt-field-label md:min-w-[120px] sm:pr-4 sm:pt-1 mb-1 sm:mb-0", label: label, required: isRequired }), jsxRuntimeExports.jsx("div", { className: "flex-1 min-w-0", children: jsxRuntimeExports.jsxs("select", { value: selectedValues[level.level_id] || '', onChange: (event) => {
|
|
17860
17888
|
const nextValue = event.target.value;
|
|
17861
17889
|
void handleValueChange(level.level_id, nextValue === '' ? undefined : nextValue);
|
|
17862
17890
|
}, onBlur: onBlur, disabled: disabled, className: selectClassName(showLevelError, disabled), style: { borderRadius: '10px' }, children: [jsxRuntimeExports.jsx("option", { value: "", children: t?.('common.select') }), levelOptions.map((option) => (jsxRuntimeExports.jsx("option", { value: option.value, children: tSchema(t, option.label) }, option.value)))] }) })] }) }, step.key));
|
|
@@ -17872,7 +17900,7 @@ function renderFormSteps({ columnSteps, selectedValues, options, loadingLevels,
|
|
|
17872
17900
|
const showLevelError = !parentUnselected &&
|
|
17873
17901
|
((isRequired && !isComplete && !encodedValue) ||
|
|
17874
17902
|
(touched && hasError && !encodedValue));
|
|
17875
|
-
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium owt-
|
|
17903
|
+
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-start", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "text-base font-medium owt-field-label md:min-w-[120px] sm:pr-4 sm:pt-1 mb-1 sm:mb-0", label: formatLevelLabel(activeLevel.level_mnemonic), required: isRequired }), jsxRuntimeExports.jsx("div", { className: "flex-1 min-w-0", children: jsxRuntimeExports.jsxs("select", { value: encodedValue, onChange: (event) => {
|
|
17876
17904
|
const raw = event.target.value;
|
|
17877
17905
|
if (!raw) {
|
|
17878
17906
|
const selectedLevel = chosen ?? step.levels[0];
|
|
@@ -17949,139 +17977,6 @@ const GeoHierarchyWidget = ({ config }) => {
|
|
|
17949
17977
|
return (jsxRuntimeExports.jsxs("div", { className: isReadonly ? 'GeoHierarchyDisplayWidget' : 'GeoHierarchyWidget', children: [isReadonly ? readonlyContent : editContent, loadingLevels && levels.length === 0 && (jsxRuntimeExports.jsx("p", { className: "text-sm owt-text-muted mb-[10px]", children: t?.('common.loading') })), geoError && jsxRuntimeExports.jsx("p", { className: "owt-field-error text-sm mb-[10px]", children: geoError }), !isReadonly && touched && hasError && (jsxRuntimeExports.jsx("p", { className: "owt-field-error text-sm mb-[10px]", children: error[0] || 'This field is required' }))] }));
|
|
17950
17978
|
};
|
|
17951
17979
|
|
|
17952
|
-
const distributeDocsToColumns = (docs, totalDocs) => {
|
|
17953
|
-
const total = totalDocs > 0 ? totalDocs : docs.length;
|
|
17954
|
-
const rowsPerColumn = Math.ceil(total / 3);
|
|
17955
|
-
if (rowsPerColumn <= 0) {
|
|
17956
|
-
return [];
|
|
17957
|
-
}
|
|
17958
|
-
const columns = [];
|
|
17959
|
-
for (let index = 0; index < 3; index += 1) {
|
|
17960
|
-
const column = docs.slice(index * rowsPerColumn, (index + 1) * rowsPerColumn);
|
|
17961
|
-
if (column.length > 0) {
|
|
17962
|
-
columns.push(column);
|
|
17963
|
-
}
|
|
17964
|
-
}
|
|
17965
|
-
return columns;
|
|
17966
|
-
};
|
|
17967
|
-
const getFileName = (file) => file instanceof File ? file.name : file.split('/').pop() || file;
|
|
17968
|
-
const iconButtonClass = 'inline-flex items-center justify-center shrink-0 p-0 border-0 bg-transparent focus:outline-none';
|
|
17969
|
-
const docControlClass = 'w-full h-9 min-w-0 flex items-center rounded-lg px-2.5 box-border';
|
|
17970
|
-
const DocsWidget = ({ config }) => {
|
|
17971
|
-
const { value, error, touched, isEnabled, onChange, onBlur, config: widgetConfig, } = useBaseWidget({ config });
|
|
17972
|
-
const { t } = useWidgetContext();
|
|
17973
|
-
const documents = widgetConfig['documents'] || [];
|
|
17974
|
-
const totalDocs = widgetConfig['widget-total-docs'] || documents.length;
|
|
17975
|
-
const docColumns = distributeDocsToColumns(documents, totalDocs);
|
|
17976
|
-
const isReadonly = Boolean(widgetConfig['widget-readonly']);
|
|
17977
|
-
const currentValue = value && typeof value === 'object' && !Array.isArray(value)
|
|
17978
|
-
? value
|
|
17979
|
-
: {};
|
|
17980
|
-
const fileInputRefs = React.useRef({});
|
|
17981
|
-
const handleFileChange = async (docKey, e) => {
|
|
17982
|
-
const files = e.target.files;
|
|
17983
|
-
if (!files || files.length === 0)
|
|
17984
|
-
return;
|
|
17985
|
-
const file = files[0];
|
|
17986
|
-
const doc = documents.find((d) => d['document-key'] === docKey);
|
|
17987
|
-
const maxSize = doc?.['document-max-size'];
|
|
17988
|
-
if (maxSize && file.size > maxSize) {
|
|
17989
|
-
console.error(`File "${file.name}" exceeds max size of ${maxSize} bytes`);
|
|
17990
|
-
return;
|
|
17991
|
-
}
|
|
17992
|
-
try {
|
|
17993
|
-
const serialized = await serializeFile(file);
|
|
17994
|
-
const updated = {
|
|
17995
|
-
...currentValue,
|
|
17996
|
-
[docKey]: { ...serialized, label: doc?.['document-label'] ?? docKey },
|
|
17997
|
-
[`${docKey}_source_filename`]: file.name,
|
|
17998
|
-
};
|
|
17999
|
-
onChange(updated);
|
|
18000
|
-
}
|
|
18001
|
-
catch (err) {
|
|
18002
|
-
console.error('Error serializing file:', err);
|
|
18003
|
-
}
|
|
18004
|
-
if (fileInputRefs.current[docKey]) {
|
|
18005
|
-
fileInputRefs.current[docKey].value = '';
|
|
18006
|
-
}
|
|
18007
|
-
};
|
|
18008
|
-
const handleRemove = (docKey) => {
|
|
18009
|
-
const updated = {
|
|
18010
|
-
...currentValue,
|
|
18011
|
-
[docKey]: null,
|
|
18012
|
-
[`${docKey}_source_filename`]: null,
|
|
18013
|
-
};
|
|
18014
|
-
onChange(updated);
|
|
18015
|
-
};
|
|
18016
|
-
const handlePreview = (file, e) => {
|
|
18017
|
-
if (e) {
|
|
18018
|
-
e.preventDefault();
|
|
18019
|
-
e.stopPropagation();
|
|
18020
|
-
}
|
|
18021
|
-
openFileInNewTab(file);
|
|
18022
|
-
};
|
|
18023
|
-
const getDocValue = (docKey) => {
|
|
18024
|
-
const stored = currentValue[docKey];
|
|
18025
|
-
if (!stored)
|
|
18026
|
-
return null;
|
|
18027
|
-
if (typeof stored === 'string')
|
|
18028
|
-
return stored;
|
|
18029
|
-
if (isSerializedFile(stored)) {
|
|
18030
|
-
try {
|
|
18031
|
-
return deserializeFile(stored);
|
|
18032
|
-
}
|
|
18033
|
-
catch {
|
|
18034
|
-
return null;
|
|
18035
|
-
}
|
|
18036
|
-
}
|
|
18037
|
-
return null;
|
|
18038
|
-
};
|
|
18039
|
-
const getSourceFilename = (docKey, file) => {
|
|
18040
|
-
const stored = currentValue[`${docKey}_source_filename`];
|
|
18041
|
-
if (typeof stored === 'string' && stored)
|
|
18042
|
-
return stored;
|
|
18043
|
-
return file ? getFileName(file) : '';
|
|
18044
|
-
};
|
|
18045
|
-
const renderSlot = (doc) => {
|
|
18046
|
-
const docKey = doc['document-key'];
|
|
18047
|
-
const label = doc['document-label'];
|
|
18048
|
-
const isRequired = doc['document-required'] ?? false;
|
|
18049
|
-
const accept = doc['document-accept'];
|
|
18050
|
-
const file = getDocValue(docKey);
|
|
18051
|
-
const hasFile = !!file;
|
|
18052
|
-
const displayFileName = getSourceFilename(docKey, file);
|
|
18053
|
-
const isEmptyRequired = isRequired && !hasFile;
|
|
18054
|
-
const showValidationError = touched && error.length > 0 && isEmptyRequired;
|
|
18055
|
-
if (isReadonly) {
|
|
18056
|
-
return (jsxRuntimeExports.jsxs("div", { className: "mb-[10px] FileDisplayWidget flex flex-row items-start w-full", children: [jsxRuntimeExports.jsxs("div", { className: "w-1/2 min-w-0 pr-2 text-base owt-text-muted font-medium truncate", style: { fontFamily: 'Roboto, sans-serif' }, title: tSchema(t, label), children: [tSchema(t, label), ":"] }), jsxRuntimeExports.jsx("div", { className: "w-1/2 min-w-0 flex items-center min-h-[1.5rem]", children: hasFile ? (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx("span", { className: "w-10/12 min-w-0 truncate text-base owt-text font-medium", title: displayFileName, children: displayFileName }), jsxRuntimeExports.jsx("button", { type: "button", onClick: (e) => handlePreview(file, e), className: `w-2/12 ${iconButtonClass}`, title: displayFileName, children: jsxRuntimeExports.jsx("img", { src: img$1, alt: t?.('common.view') ?? 'View', className: "h-4 w-4" }) })] })) : (jsxRuntimeExports.jsx("span", { className: "text-base owt-text font-medium", children: "-" })) })] }, docKey));
|
|
18057
|
-
}
|
|
18058
|
-
return (jsxRuntimeExports.jsx("div", { className: "mb-[10px]", children: jsxRuntimeExports.jsxs("div", { className: "flex flex-row items-start w-full", children: [jsxRuntimeExports.jsx(WidgetFieldLabel, { className: "w-1/2 min-w-0 pr-2 text-base font-medium owt-text", label: tSchema(t, label), required: isRequired }), jsxRuntimeExports.jsxs("div", { className: "w-1/2 min-w-0 flex flex-col justify-center min-h-[1.5rem]", children: [!hasFile && (jsxRuntimeExports.jsxs("label", { className: `${docControlClass} cursor-pointer justify-center gap-2 border border-dashed ${!isEnabled ? 'opacity-50 cursor-not-allowed' : ''}`, style: {
|
|
18059
|
-
borderColor: isEmptyRequired
|
|
18060
|
-
? 'var(--owt-widget-error-color)'
|
|
18061
|
-
: 'var(--owt-color-primary-dark)',
|
|
18062
|
-
backgroundColor: 'var(--owt-color-bg)',
|
|
18063
|
-
}, children: [jsxRuntimeExports.jsx("img", { src: img$9, alt: "", className: "h-4 w-4 shrink-0" }), jsxRuntimeExports.jsx("span", { className: "text-sm font-medium owt-text", children: t?.('common.upload') ?? 'Upload' }), jsxRuntimeExports.jsx("input", { type: "file", accept: accept, onChange: (e) => void handleFileChange(docKey, e), onBlur: onBlur, disabled: !isEnabled, className: "hidden", ref: (el) => {
|
|
18064
|
-
fileInputRefs.current[docKey] = el;
|
|
18065
|
-
} })] })), hasFile && (jsxRuntimeExports.jsxs("div", { className: `${docControlClass} gap-2 border owt-border owt-bg`, title: displayFileName, children: [jsxRuntimeExports.jsxs("button", { type: "button", onClick: (e) => handlePreview(file, e), className: `${iconButtonClass} min-w-0 flex-1 gap-2 justify-start`, title: displayFileName, children: [jsxRuntimeExports.jsx("img", { src: img$1, alt: "", className: "h-4 w-4 shrink-0" }), jsxRuntimeExports.jsx("span", { className: "min-w-0 truncate text-sm font-medium owt-text", children: displayFileName })] }), jsxRuntimeExports.jsx("button", { type: "button", onClick: () => handleRemove(docKey), disabled: !isEnabled, className: `inline-flex items-center justify-center shrink-0 h-5 w-5 p-0 border-0 rounded-full owt-bg-alt focus:outline-none ${!isEnabled ? 'opacity-50 cursor-not-allowed' : ''}`, title: t?.('common.remove') ?? 'Remove', children: jsxRuntimeExports.jsx("img", { src: img, alt: t?.('common.remove') ?? 'Remove', className: "h-2.5 w-2.5" }) })] })), showValidationError && (jsxRuntimeExports.jsx("p", { className: "owt-field-error text-sm mt-1", children: error[0] }))] })] }) }, docKey));
|
|
18066
|
-
};
|
|
18067
|
-
return (jsxRuntimeExports.jsx("div", { className: isReadonly ? 'DocsDisplayWidget mb-[10px]' : 'DocsWidget mb-[10px]', children: jsxRuntimeExports.jsx("div", { className: "flex flex-col lg:grid w-full", style: { gridTemplateColumns: `repeat(${docColumns.length || 1}, minmax(0, 1fr))` }, children: docColumns.map((column, columnIndex) => {
|
|
18068
|
-
const isLast = columnIndex === docColumns.length - 1;
|
|
18069
|
-
const columnClassName = [
|
|
18070
|
-
'flex flex-col min-w-0 relative',
|
|
18071
|
-
columnIndex > 0 ? 'lg:pl-10' : '',
|
|
18072
|
-
isLast ? '' : 'lg:pr-10',
|
|
18073
|
-
]
|
|
18074
|
-
.filter(Boolean)
|
|
18075
|
-
.join(' ');
|
|
18076
|
-
return (jsxRuntimeExports.jsxs("div", { className: columnClassName, children: [!isLast && (jsxRuntimeExports.jsx("div", { className: "hidden lg:block absolute right-0 top-0 w-px", style: {
|
|
18077
|
-
bottom: '5px',
|
|
18078
|
-
backgroundColor: isReadonly
|
|
18079
|
-
? 'var(--owt-panel-divider-color)'
|
|
18080
|
-
: 'var(--owt-color-primary)',
|
|
18081
|
-
} })), column.map((doc) => renderSlot(doc))] }, `docs-column-${columnIndex}`));
|
|
18082
|
-
}) }) }));
|
|
18083
|
-
};
|
|
18084
|
-
|
|
18085
17980
|
const registerDefaultWidgets = () => {
|
|
18086
17981
|
widgetRegistry.register({ widget: 'text', component: TextInputWidget });
|
|
18087
17982
|
widgetRegistry.register({ widget: 'textarea', component: TextAreaWidget });
|
|
@@ -18105,7 +18000,6 @@ const registerDefaultWidgets = () => {
|
|
|
18105
18000
|
widgetRegistry.register({ widget: 'parent-lookup', component: ParentLookupWidget });
|
|
18106
18001
|
widgetRegistry.register({ widget: 'multi-select', component: MultiSelectWidget });
|
|
18107
18002
|
widgetRegistry.register({ widget: 'geo-hierarchy', component: GeoHierarchyWidget });
|
|
18108
|
-
widgetRegistry.register({ widget: 'docs', component: DocsWidget });
|
|
18109
18003
|
};
|
|
18110
18004
|
registerDefaultWidgets();
|
|
18111
18005
|
|
|
@@ -18218,7 +18112,6 @@ exports.DateInputWidget = DateInputWidget;
|
|
|
18218
18112
|
exports.DateTimeInputWidget = DateTimeInputWidget;
|
|
18219
18113
|
exports.DialogTableWidget = DialogTableWidget;
|
|
18220
18114
|
exports.DisplayWidget = DisplayWidget;
|
|
18221
|
-
exports.DocsWidget = DocsWidget;
|
|
18222
18115
|
exports.FileInputWidget = FileInputWidget;
|
|
18223
18116
|
exports.GeoHierarchyWidget = GeoHierarchyWidget;
|
|
18224
18117
|
exports.HeaderSectionWidget = HeaderSectionWidget;
|
|
@@ -18233,6 +18126,7 @@ exports.ProfileWidget = ProfileWidget;
|
|
|
18233
18126
|
exports.PropertyEditor = PropertyEditor;
|
|
18234
18127
|
exports.RadioWidget = RadioWidget;
|
|
18235
18128
|
exports.RegisterLookupWidget = RegisterLookupWidget;
|
|
18129
|
+
exports.SECTION_FILE_TAG = SECTION_FILE_TAG;
|
|
18236
18130
|
exports.ScoresDisplayWidget = ScoresDisplayWidget;
|
|
18237
18131
|
exports.SectionBuilder = SectionBuilder;
|
|
18238
18132
|
exports.SectionRenderer = SectionRenderer;
|
|
@@ -18272,7 +18166,9 @@ exports.getWidgetCategory = getWidgetCategory;
|
|
|
18272
18166
|
exports.getWidgetValue = getWidgetValue;
|
|
18273
18167
|
exports.hasVisibilityRules = hasVisibilityRules;
|
|
18274
18168
|
exports.isAllowedKey = isAllowedKey;
|
|
18169
|
+
exports.isFreshSectionFileEntry = isFreshSectionFileEntry;
|
|
18275
18170
|
exports.isGeoHierarchyDataSource = isGeoHierarchyDataSource;
|
|
18171
|
+
exports.isStoredDocumentRef = isStoredDocumentRef;
|
|
18276
18172
|
exports.isWidgetValueEmpty = isWidgetValueEmpty;
|
|
18277
18173
|
exports.normalizeNumericDefault = normalizeNumericDefault;
|
|
18278
18174
|
exports.normalizeOptionRules = normalizeOptionRules;
|
|
@@ -18306,7 +18202,6 @@ exports.useWidgetCascade = useWidgetCascade;
|
|
|
18306
18202
|
exports.useWidgetContext = useWidgetContext;
|
|
18307
18203
|
exports.useWidgetEventBus = useWidgetEventBus;
|
|
18308
18204
|
exports.useWidgetTheme = useWidgetTheme;
|
|
18309
|
-
exports.validateDocsWidget = validateDocsWidget;
|
|
18310
18205
|
exports.validateNumericValue = validateNumericValue;
|
|
18311
18206
|
exports.validateWidget = validateWidget;
|
|
18312
18207
|
exports.widgetRegistry = widgetRegistry;
|