@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.esm.js
CHANGED
|
@@ -211,10 +211,16 @@ const getWidgetValue = (values, dataPath, widgetId) => {
|
|
|
211
211
|
return getValueByPath(values, dataPath);
|
|
212
212
|
}
|
|
213
213
|
const result = {};
|
|
214
|
+
let hasDefined = false;
|
|
214
215
|
for (const [key, path] of Object.entries(dataPath)) {
|
|
215
|
-
|
|
216
|
+
const pathValue = getValueByPath(values, path);
|
|
217
|
+
result[key] = pathValue;
|
|
218
|
+
if (pathValue !== undefined) {
|
|
219
|
+
hasDefined = true;
|
|
220
|
+
}
|
|
216
221
|
}
|
|
217
|
-
|
|
222
|
+
// Avoid returning `{ label: undefined, ... }` which looks like an empty select option.
|
|
223
|
+
return hasDefined ? result : undefined;
|
|
218
224
|
};
|
|
219
225
|
/**
|
|
220
226
|
* Set value in widget state using data path.
|
|
@@ -274,79 +280,6 @@ const setWidgetValue = (currentValues, dataPath, widgetId, value) => {
|
|
|
274
280
|
return widgetId ? { ...newValues, [widgetId]: value } : newValues;
|
|
275
281
|
};
|
|
276
282
|
|
|
277
|
-
const isFile = (value) => {
|
|
278
|
-
return value instanceof File;
|
|
279
|
-
};
|
|
280
|
-
const isSerializedFile = (value) => {
|
|
281
|
-
return value && typeof value === 'object' && value.__type === 'File';
|
|
282
|
-
};
|
|
283
|
-
const serializeFile = async (file) => {
|
|
284
|
-
return new Promise((resolve, reject) => {
|
|
285
|
-
const reader = new FileReader();
|
|
286
|
-
reader.onload = () => {
|
|
287
|
-
const base64 = reader.result.split(',')[1];
|
|
288
|
-
resolve({
|
|
289
|
-
__type: 'File',
|
|
290
|
-
name: file.name,
|
|
291
|
-
type: file.type,
|
|
292
|
-
size: file.size,
|
|
293
|
-
lastModified: file.lastModified,
|
|
294
|
-
data: base64,
|
|
295
|
-
});
|
|
296
|
-
};
|
|
297
|
-
reader.onerror = reject;
|
|
298
|
-
reader.readAsDataURL(file);
|
|
299
|
-
});
|
|
300
|
-
};
|
|
301
|
-
const deserializeFile = (serialized) => {
|
|
302
|
-
const byteCharacters = atob(serialized.data);
|
|
303
|
-
const byteNumbers = new Array(byteCharacters.length);
|
|
304
|
-
for (let i = 0; i < byteCharacters.length; i++) {
|
|
305
|
-
byteNumbers[i] = byteCharacters.charCodeAt(i);
|
|
306
|
-
}
|
|
307
|
-
const byteArray = new Uint8Array(byteNumbers);
|
|
308
|
-
const blob = new Blob([byteArray], { type: serialized.type });
|
|
309
|
-
return new File([blob], serialized.name, {
|
|
310
|
-
type: serialized.type,
|
|
311
|
-
lastModified: serialized.lastModified,
|
|
312
|
-
});
|
|
313
|
-
};
|
|
314
|
-
const serializeValue = async (value) => {
|
|
315
|
-
if (value === null || value === undefined) {
|
|
316
|
-
return value;
|
|
317
|
-
}
|
|
318
|
-
if (isFile(value)) {
|
|
319
|
-
return await serializeFile(value);
|
|
320
|
-
}
|
|
321
|
-
if (Array.isArray(value)) {
|
|
322
|
-
return Promise.all(value.map(item => serializeValue(item)));
|
|
323
|
-
}
|
|
324
|
-
if (value && typeof value === 'object' && !(value instanceof Date) && !(value instanceof RegExp)) {
|
|
325
|
-
const result = {};
|
|
326
|
-
for (const [key, val] of Object.entries(value)) {
|
|
327
|
-
result[key] = await serializeValue(val);
|
|
328
|
-
}
|
|
329
|
-
return result;
|
|
330
|
-
}
|
|
331
|
-
return value;
|
|
332
|
-
};
|
|
333
|
-
const deserializeValue = (value) => {
|
|
334
|
-
if (isSerializedFile(value)) {
|
|
335
|
-
return deserializeFile(value);
|
|
336
|
-
}
|
|
337
|
-
if (Array.isArray(value)) {
|
|
338
|
-
return value.map(item => deserializeValue(item));
|
|
339
|
-
}
|
|
340
|
-
if (value && typeof value === 'object') {
|
|
341
|
-
const result = {};
|
|
342
|
-
for (const [key, val] of Object.entries(value)) {
|
|
343
|
-
result[key] = deserializeValue(val);
|
|
344
|
-
}
|
|
345
|
-
return result;
|
|
346
|
-
}
|
|
347
|
-
return value;
|
|
348
|
-
};
|
|
349
|
-
|
|
350
283
|
const VALIDATION_PATTERNS = {
|
|
351
284
|
email: {
|
|
352
285
|
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])?)*$/,
|
|
@@ -445,35 +378,6 @@ const validateWidget = (value, validation, required = false, skipRequired = fals
|
|
|
445
378
|
}
|
|
446
379
|
return errors;
|
|
447
380
|
};
|
|
448
|
-
const isDocsSlotFilled = (stored) => {
|
|
449
|
-
if (stored == null || stored === '') {
|
|
450
|
-
return false;
|
|
451
|
-
}
|
|
452
|
-
if (typeof stored === 'string') {
|
|
453
|
-
return stored.trim().length > 0;
|
|
454
|
-
}
|
|
455
|
-
if (typeof File !== 'undefined' && stored instanceof File) {
|
|
456
|
-
return true;
|
|
457
|
-
}
|
|
458
|
-
return isSerializedFile(stored);
|
|
459
|
-
};
|
|
460
|
-
const validateDocsWidget = (value, documents, skipRequired = false) => {
|
|
461
|
-
if (skipRequired || !documents?.length) {
|
|
462
|
-
return [];
|
|
463
|
-
}
|
|
464
|
-
const docsValue = value && typeof value === 'object' && !Array.isArray(value)
|
|
465
|
-
? value
|
|
466
|
-
: {};
|
|
467
|
-
const errors = [];
|
|
468
|
-
for (const doc of documents) {
|
|
469
|
-
if (!doc['document-required'])
|
|
470
|
-
continue;
|
|
471
|
-
if (!isDocsSlotFilled(docsValue[doc['document-key']])) {
|
|
472
|
-
errors.push('This document is required');
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
return errors;
|
|
476
|
-
};
|
|
477
381
|
const createZodSchema = (validation, required = false) => {
|
|
478
382
|
if (!validation && !required) {
|
|
479
383
|
return null;
|
|
@@ -1808,6 +1712,9 @@ const OWT_FIELD_STYLES = `
|
|
|
1808
1712
|
.owt-text-muted {
|
|
1809
1713
|
color: var(--owt-color-text-muted);
|
|
1810
1714
|
}
|
|
1715
|
+
.owt-field-label {
|
|
1716
|
+
color: var(--owt-color-text-muted);
|
|
1717
|
+
}
|
|
1811
1718
|
.owt-bg {
|
|
1812
1719
|
background-color: var(--owt-color-bg);
|
|
1813
1720
|
}
|
|
@@ -1952,6 +1859,93 @@ const WidgetProvider = ({ store, dataSourceRequestHandler, schemaData, hostConte
|
|
|
1952
1859
|
}, children: [jsxRuntimeExports.jsx("style", { className: "owt-field-styles", children: OWT_FIELD_STYLES }), children] }) }) }) }) }));
|
|
1953
1860
|
};
|
|
1954
1861
|
|
|
1862
|
+
const isFile = (value) => {
|
|
1863
|
+
return value instanceof File;
|
|
1864
|
+
};
|
|
1865
|
+
const isSerializedFile = (value) => {
|
|
1866
|
+
return value && typeof value === 'object' && value.__type === 'File';
|
|
1867
|
+
};
|
|
1868
|
+
const serializeFile = async (file) => {
|
|
1869
|
+
return new Promise((resolve, reject) => {
|
|
1870
|
+
const reader = new FileReader();
|
|
1871
|
+
reader.onload = () => {
|
|
1872
|
+
const base64 = reader.result.split(',')[1];
|
|
1873
|
+
resolve({
|
|
1874
|
+
__type: 'File',
|
|
1875
|
+
name: file.name,
|
|
1876
|
+
type: file.type,
|
|
1877
|
+
size: file.size,
|
|
1878
|
+
lastModified: file.lastModified,
|
|
1879
|
+
data: base64,
|
|
1880
|
+
});
|
|
1881
|
+
};
|
|
1882
|
+
reader.onerror = reject;
|
|
1883
|
+
reader.readAsDataURL(file);
|
|
1884
|
+
});
|
|
1885
|
+
};
|
|
1886
|
+
const deserializeFile = (serialized) => {
|
|
1887
|
+
const byteCharacters = atob(serialized.data);
|
|
1888
|
+
const byteNumbers = new Array(byteCharacters.length);
|
|
1889
|
+
for (let i = 0; i < byteCharacters.length; i++) {
|
|
1890
|
+
byteNumbers[i] = byteCharacters.charCodeAt(i);
|
|
1891
|
+
}
|
|
1892
|
+
const byteArray = new Uint8Array(byteNumbers);
|
|
1893
|
+
const blob = new Blob([byteArray], { type: serialized.type });
|
|
1894
|
+
return new File([blob], serialized.name, {
|
|
1895
|
+
type: serialized.type,
|
|
1896
|
+
lastModified: serialized.lastModified,
|
|
1897
|
+
});
|
|
1898
|
+
};
|
|
1899
|
+
const serializeValue = async (value) => {
|
|
1900
|
+
if (value === null || value === undefined) {
|
|
1901
|
+
return value;
|
|
1902
|
+
}
|
|
1903
|
+
if (isFile(value)) {
|
|
1904
|
+
return await serializeFile(value);
|
|
1905
|
+
}
|
|
1906
|
+
if (Array.isArray(value)) {
|
|
1907
|
+
return Promise.all(value.map(item => serializeValue(item)));
|
|
1908
|
+
}
|
|
1909
|
+
if (value && typeof value === 'object' && !(value instanceof Date) && !(value instanceof RegExp)) {
|
|
1910
|
+
const result = {};
|
|
1911
|
+
for (const [key, val] of Object.entries(value)) {
|
|
1912
|
+
result[key] = await serializeValue(val);
|
|
1913
|
+
}
|
|
1914
|
+
return result;
|
|
1915
|
+
}
|
|
1916
|
+
return value;
|
|
1917
|
+
};
|
|
1918
|
+
const deserializeValue = (value) => {
|
|
1919
|
+
if (isSerializedFile(value)) {
|
|
1920
|
+
return deserializeFile(value);
|
|
1921
|
+
}
|
|
1922
|
+
if (Array.isArray(value)) {
|
|
1923
|
+
return value.map(item => deserializeValue(item));
|
|
1924
|
+
}
|
|
1925
|
+
if (value && typeof value === 'object') {
|
|
1926
|
+
const result = {};
|
|
1927
|
+
for (const [key, val] of Object.entries(value)) {
|
|
1928
|
+
result[key] = deserializeValue(val);
|
|
1929
|
+
}
|
|
1930
|
+
return result;
|
|
1931
|
+
}
|
|
1932
|
+
return value;
|
|
1933
|
+
};
|
|
1934
|
+
|
|
1935
|
+
const isStoredDocumentRef = (value) => {
|
|
1936
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
1937
|
+
return false;
|
|
1938
|
+
if (isSerializedFile(value))
|
|
1939
|
+
return false;
|
|
1940
|
+
const doc = value;
|
|
1941
|
+
return (typeof doc.label === 'string' &&
|
|
1942
|
+
doc.label.length > 0 &&
|
|
1943
|
+
typeof doc.document_id === 'string' &&
|
|
1944
|
+
doc.document_id.length > 0 &&
|
|
1945
|
+
typeof doc.presigned_url === 'string' &&
|
|
1946
|
+
doc.presigned_url.length > 0);
|
|
1947
|
+
};
|
|
1948
|
+
|
|
1955
1949
|
const EMPTY_ERRORS = [];
|
|
1956
1950
|
const EMPTY_DATA_SOURCE = [];
|
|
1957
1951
|
const useBaseWidget = (options) => {
|
|
@@ -1967,7 +1961,6 @@ const useBaseWidget = (options) => {
|
|
|
1967
1961
|
const loading = useSelector((state) => state.widget.loading[widgetId] || false);
|
|
1968
1962
|
const dataSourceOptions = useSelector((state) => state.widget.dataSources[widgetId] ?? EMPTY_DATA_SOURCE);
|
|
1969
1963
|
const isLayoutWidget = config['widget-type'] === 'layout';
|
|
1970
|
-
const isDocsWidget = config.widget === 'docs';
|
|
1971
1964
|
const userHasSetValueRef = useRef(false);
|
|
1972
1965
|
const valuesRef = useRef(values);
|
|
1973
1966
|
const loadingRef = useRef(loading);
|
|
@@ -1982,6 +1975,15 @@ const useBaseWidget = (options) => {
|
|
|
1982
1975
|
if (!obj || typeof obj !== 'object' || Array.isArray(obj)) {
|
|
1983
1976
|
return obj;
|
|
1984
1977
|
}
|
|
1978
|
+
if (typeof File !== 'undefined' && obj instanceof File) {
|
|
1979
|
+
return obj;
|
|
1980
|
+
}
|
|
1981
|
+
if (isSerializedFile(obj) || isStoredDocumentRef(obj)) {
|
|
1982
|
+
return obj;
|
|
1983
|
+
}
|
|
1984
|
+
if ('document_id' in obj && ('presigned_url' in obj || 'source_filename' in obj || 'label' in obj)) {
|
|
1985
|
+
return obj;
|
|
1986
|
+
}
|
|
1985
1987
|
if ('value' in obj) {
|
|
1986
1988
|
return obj.value;
|
|
1987
1989
|
}
|
|
@@ -2000,19 +2002,6 @@ const useBaseWidget = (options) => {
|
|
|
2000
2002
|
if (isLayoutWidget) {
|
|
2001
2003
|
return undefined; // Layout widgets don't have values
|
|
2002
2004
|
}
|
|
2003
|
-
if (isDocsWidget) {
|
|
2004
|
-
let docsValue = values[widgetId];
|
|
2005
|
-
if (docsValue === undefined && config['widget-data-path']) {
|
|
2006
|
-
docsValue = getWidgetValue(values, config['widget-data-path'], widgetId);
|
|
2007
|
-
}
|
|
2008
|
-
if (userHasSetValueRef.current) {
|
|
2009
|
-
return docsValue;
|
|
2010
|
-
}
|
|
2011
|
-
if (docsValue === null) {
|
|
2012
|
-
return null;
|
|
2013
|
-
}
|
|
2014
|
-
return docsValue !== undefined ? docsValue : config['widget-data-default'];
|
|
2015
|
-
}
|
|
2016
2005
|
let value = config['widget-data-path']
|
|
2017
2006
|
? getWidgetValue(values, config['widget-data-path'], widgetId)
|
|
2018
2007
|
: values[widgetId];
|
|
@@ -2035,13 +2024,13 @@ const useBaseWidget = (options) => {
|
|
|
2035
2024
|
return null; // User explicitly cleared it, don't use default
|
|
2036
2025
|
}
|
|
2037
2026
|
return value !== undefined ? value : config['widget-data-default'];
|
|
2038
|
-
}, [values, config, widgetId, isLayoutWidget,
|
|
2027
|
+
}, [values, config, widgetId, isLayoutWidget, extractValueFromObject]);
|
|
2039
2028
|
const lastMirroredValueRef = useRef(null);
|
|
2040
2029
|
// Mirror value from dataPath to widgetId in Redux state if it's not already there.
|
|
2041
2030
|
// This is essential for widgets that depend on this widget via 'dependsOn' using its widgetId,
|
|
2042
2031
|
// CRITICAL: This ensures that dependencies are resolved correctly when entering Edit mode.
|
|
2043
2032
|
useEffect(() => {
|
|
2044
|
-
if (isLayoutWidget ||
|
|
2033
|
+
if (isLayoutWidget || !config['widget-data-path']) {
|
|
2045
2034
|
return;
|
|
2046
2035
|
}
|
|
2047
2036
|
const rawValue = getWidgetValue(values, config['widget-data-path'], widgetId);
|
|
@@ -2121,9 +2110,7 @@ const useBaseWidget = (options) => {
|
|
|
2121
2110
|
dispatch(setValues(updatedValues));
|
|
2122
2111
|
}
|
|
2123
2112
|
if (validate) {
|
|
2124
|
-
const validationErrors =
|
|
2125
|
-
? validateDocsWidget(newValue, config['documents'])
|
|
2126
|
-
: validateWidget(newValue, config['widget-data-validation'], resolveIsRequired(currentValues));
|
|
2113
|
+
const validationErrors = validateWidget(newValue, config['widget-data-validation'], resolveIsRequired(currentValues));
|
|
2127
2114
|
dispatch(setError({ widgetId, errors: validationErrors }));
|
|
2128
2115
|
}
|
|
2129
2116
|
if (onValueChange) {
|
|
@@ -2137,16 +2124,11 @@ const useBaseWidget = (options) => {
|
|
|
2137
2124
|
timestamp: Date.now(),
|
|
2138
2125
|
});
|
|
2139
2126
|
}
|
|
2140
|
-
}, [config, widgetId, dispatch, onValueChange, eventBus, resolveIsRequired
|
|
2127
|
+
}, [config, widgetId, dispatch, onValueChange, eventBus, resolveIsRequired]);
|
|
2141
2128
|
const handleBlur = useCallback(() => {
|
|
2142
2129
|
dispatch(setTouched({ widgetId, touched: true }));
|
|
2143
2130
|
const latestValues = valuesRef.current;
|
|
2144
|
-
const
|
|
2145
|
-
? latestValues[widgetId] ?? getWidgetValue(latestValues, config['widget-data-path'], widgetId)
|
|
2146
|
-
: currentValue;
|
|
2147
|
-
const validationErrors = isDocsWidget
|
|
2148
|
-
? validateDocsWidget(valueToValidate, config['documents'])
|
|
2149
|
-
: validateWidget(valueToValidate, config['widget-data-validation'], resolveIsRequired(latestValues));
|
|
2131
|
+
const validationErrors = validateWidget(currentValue, config['widget-data-validation'], resolveIsRequired(latestValues));
|
|
2150
2132
|
dispatch(setError({ widgetId, errors: validationErrors }));
|
|
2151
2133
|
if (eventBus) {
|
|
2152
2134
|
eventBus.publish({
|
|
@@ -2156,7 +2138,7 @@ const useBaseWidget = (options) => {
|
|
|
2156
2138
|
timestamp: Date.now(),
|
|
2157
2139
|
});
|
|
2158
2140
|
}
|
|
2159
|
-
}, [currentValue, config, widgetId, dispatch, eventBus, resolveIsRequired
|
|
2141
|
+
}, [currentValue, config, widgetId, dispatch, eventBus, resolveIsRequired]);
|
|
2160
2142
|
const getFieldValue = useCallback((path) => {
|
|
2161
2143
|
return getWidgetValue(values, path, '');
|
|
2162
2144
|
}, [values]);
|
|
@@ -2517,7 +2499,9 @@ const PanelRenderer = ({ panel, dataSourceRequestHandler, schemaData, onValueCha
|
|
|
2517
2499
|
top: 0,
|
|
2518
2500
|
bottom: '5px',
|
|
2519
2501
|
width: '1px',
|
|
2520
|
-
backgroundColor: isEditMode
|
|
2502
|
+
backgroundColor: isEditMode
|
|
2503
|
+
? 'var(--owt-color-primary-dark)'
|
|
2504
|
+
: 'var(--owt-panel-divider-color)',
|
|
2521
2505
|
} }))] }) }, nestedPanel['panel-id'] || `panel-${index}`));
|
|
2522
2506
|
}), widgets.map((widgetConfig, index) => (jsxRuntimeExports.jsx(WidgetRenderer, { config: widgetConfig, dataSourceRequestHandler: dataSourceRequestHandler, schemaData: schemaData, onValueChange: onValueChange }, widgetConfig['widget-id'] || `widget-${index}`)))] }));
|
|
2523
2507
|
return (jsxRuntimeExports.jsx("div", { className: `panel panel-${orientation}`, "data-panel-id": panel['panel-id'], style: orientation === 'horizontal' ? { width: '100%' } : {}, children: content }));
|
|
@@ -2645,8 +2629,9 @@ const collectWidgets = (panels) => {
|
|
|
2645
2629
|
/**
|
|
2646
2630
|
* @param skipRequired - Skip required checks for per-section Save/Next navigation;
|
|
2647
2631
|
* format and range validation still run.
|
|
2632
|
+
* @param includeSupportingDocuments - When false (e.g. IntakeForm), skip supporting-doc checks.
|
|
2648
2633
|
*/
|
|
2649
|
-
const sectionValidate = (section, currentSchemaData, dispatch, skipRequired = false) => {
|
|
2634
|
+
const sectionValidate = (section, currentSchemaData, dispatch, skipRequired = false, includeSupportingDocuments = true) => {
|
|
2650
2635
|
const allWidgets = collectWidgets(section.panels);
|
|
2651
2636
|
let isValid = true;
|
|
2652
2637
|
for (const widget of allWidgets) {
|
|
@@ -2666,9 +2651,7 @@ const sectionValidate = (section, currentSchemaData, dispatch, skipRequired = fa
|
|
|
2666
2651
|
}
|
|
2667
2652
|
const value = getWidgetValue(currentSchemaData, widget['widget-data-path'], widgetId);
|
|
2668
2653
|
const isRequired = shouldRequireWidget(widget['widget-data-options'], currentSchemaData, widget['widget-required'] ?? false);
|
|
2669
|
-
const errors = widget
|
|
2670
|
-
? validateDocsWidget(value, widget['documents'], skipRequired)
|
|
2671
|
-
: validateWidget(value, widget['widget-data-validation'], isRequired, skipRequired);
|
|
2654
|
+
const errors = validateWidget(value, widget['widget-data-validation'], isRequired, skipRequired);
|
|
2672
2655
|
if (errors.length > 0) {
|
|
2673
2656
|
isValid = false;
|
|
2674
2657
|
dispatch(setTouched({ widgetId, touched: true }));
|
|
@@ -2679,24 +2662,26 @@ const sectionValidate = (section, currentSchemaData, dispatch, skipRequired = fa
|
|
|
2679
2662
|
dispatch(setError({ widgetId, errors: [] }));
|
|
2680
2663
|
}
|
|
2681
2664
|
}
|
|
2682
|
-
|
|
2683
|
-
|
|
2684
|
-
|
|
2685
|
-
|
|
2686
|
-
|
|
2687
|
-
|
|
2688
|
-
|
|
2689
|
-
|
|
2690
|
-
|
|
2691
|
-
|
|
2692
|
-
|
|
2693
|
-
|
|
2694
|
-
|
|
2695
|
-
|
|
2696
|
-
|
|
2665
|
+
if (includeSupportingDocuments) {
|
|
2666
|
+
section['section-supporting-documents']?.forEach((doc, index) => {
|
|
2667
|
+
const widgetId = `supporting-doc-${section['section-id']}-${index}`;
|
|
2668
|
+
if (!skipRequired && doc['document-required']) {
|
|
2669
|
+
const file = getValueByPath(currentSchemaData, doc['document-data-path']);
|
|
2670
|
+
if (!file) {
|
|
2671
|
+
isValid = false;
|
|
2672
|
+
dispatch(setTouched({ widgetId, touched: true }));
|
|
2673
|
+
dispatch(setError({
|
|
2674
|
+
widgetId,
|
|
2675
|
+
errors: ['This document is required'],
|
|
2676
|
+
}));
|
|
2677
|
+
}
|
|
2678
|
+
else {
|
|
2679
|
+
dispatch(setTouched({ widgetId, touched: false }));
|
|
2680
|
+
dispatch(setError({ widgetId, errors: [] }));
|
|
2681
|
+
}
|
|
2697
2682
|
}
|
|
2698
|
-
}
|
|
2699
|
-
}
|
|
2683
|
+
});
|
|
2684
|
+
}
|
|
2700
2685
|
return isValid;
|
|
2701
2686
|
};
|
|
2702
2687
|
|
|
@@ -2842,12 +2827,225 @@ const createDocumentWidgetConfig = (doc, sectionId, index, mode, isDraft) => {
|
|
|
2842
2827
|
'widget-readonly': mode === 'IntakeForm' && isDraft === false,
|
|
2843
2828
|
'widget-data-options': {
|
|
2844
2829
|
accept,
|
|
2845
|
-
multiple: false,
|
|
2846
2830
|
maxSize: doc['document-max-size'],
|
|
2847
2831
|
},
|
|
2848
2832
|
};
|
|
2849
2833
|
};
|
|
2850
2834
|
|
|
2835
|
+
/** Origin tags attached to entries in `SectionChanges.section_files`. */
|
|
2836
|
+
const SECTION_FILE_TAG = {
|
|
2837
|
+
PROFILE: '_profile',
|
|
2838
|
+
SUPPORTING_DOCS: '_supporting_docs',
|
|
2839
|
+
DIRECT_FILE: '_direct_file',
|
|
2840
|
+
};
|
|
2841
|
+
const fieldFromPath = (path) => path.includes('.') ? path.split('.').slice(1).join('.') : path;
|
|
2842
|
+
const isFreshUpload = (value) => (typeof File !== 'undefined' && value instanceof File) || isSerializedFile(value);
|
|
2843
|
+
const isCollectableFileValue = (value) => isFreshUpload(value) || isStoredDocumentRef(value);
|
|
2844
|
+
const isFreshSectionFileEntry = (entry) => isSerializedFile(entry);
|
|
2845
|
+
const getProfileImageUrlPaths = (panels) => {
|
|
2846
|
+
const paths = [];
|
|
2847
|
+
collectWidgets(panels)
|
|
2848
|
+
.filter((widget) => widget.widget === 'header-section')
|
|
2849
|
+
.forEach((widget) => {
|
|
2850
|
+
const widgetPath = widget['widget-data-path'];
|
|
2851
|
+
if (!widgetPath || typeof widgetPath !== 'object' || Array.isArray(widgetPath))
|
|
2852
|
+
return;
|
|
2853
|
+
const imageUrlPath = widgetPath.imageUrl;
|
|
2854
|
+
if (imageUrlPath)
|
|
2855
|
+
paths.push(imageUrlPath);
|
|
2856
|
+
});
|
|
2857
|
+
return paths;
|
|
2858
|
+
};
|
|
2859
|
+
const collectProfileFiles = (widgets, sourceData) => {
|
|
2860
|
+
const files = [];
|
|
2861
|
+
for (const widget of widgets) {
|
|
2862
|
+
if (widget.widget !== 'header-section')
|
|
2863
|
+
continue;
|
|
2864
|
+
const widgetPath = widget['widget-data-path'];
|
|
2865
|
+
if (!widgetPath || typeof widgetPath !== 'object' || Array.isArray(widgetPath))
|
|
2866
|
+
continue;
|
|
2867
|
+
const paths = widgetPath;
|
|
2868
|
+
if (!paths.imageUrl)
|
|
2869
|
+
continue;
|
|
2870
|
+
const value = getValueByPath(sourceData, paths.imageUrl);
|
|
2871
|
+
if (!isCollectableFileValue(value))
|
|
2872
|
+
continue;
|
|
2873
|
+
const field = paths.image ? fieldFromPath(paths.image) : 'record_image_document_id';
|
|
2874
|
+
files.push({
|
|
2875
|
+
value,
|
|
2876
|
+
tag: SECTION_FILE_TAG.PROFILE,
|
|
2877
|
+
field,
|
|
2878
|
+
label: isStoredDocumentRef(value) ? value.label : 'profile image',
|
|
2879
|
+
});
|
|
2880
|
+
}
|
|
2881
|
+
return files;
|
|
2882
|
+
};
|
|
2883
|
+
const collectSupportingDocFiles = (section, sourceData, skipPaths) => {
|
|
2884
|
+
const files = [];
|
|
2885
|
+
const supportingDocuments = section['section-supporting-documents'] || [];
|
|
2886
|
+
for (const doc of supportingDocuments) {
|
|
2887
|
+
const path = doc['document-data-path'];
|
|
2888
|
+
if (!path || skipPaths.has(path))
|
|
2889
|
+
continue;
|
|
2890
|
+
const value = getValueByPath(sourceData, path);
|
|
2891
|
+
if (!isCollectableFileValue(value))
|
|
2892
|
+
continue;
|
|
2893
|
+
files.push({
|
|
2894
|
+
value,
|
|
2895
|
+
tag: SECTION_FILE_TAG.SUPPORTING_DOCS,
|
|
2896
|
+
field: fieldFromPath(path),
|
|
2897
|
+
label: (isStoredDocumentRef(value) ? value.label : undefined) ||
|
|
2898
|
+
doc['document-label'] ||
|
|
2899
|
+
fieldFromPath(path),
|
|
2900
|
+
});
|
|
2901
|
+
}
|
|
2902
|
+
return files;
|
|
2903
|
+
};
|
|
2904
|
+
const collectDirectFileWidgetFiles = (widgets, sourceData, skipPaths) => {
|
|
2905
|
+
const files = [];
|
|
2906
|
+
for (const widget of widgets) {
|
|
2907
|
+
if (widget.widget !== 'file')
|
|
2908
|
+
continue;
|
|
2909
|
+
const widgetId = widget['widget-id'] || '';
|
|
2910
|
+
// Supporting-doc slots are collected via section-supporting-documents.
|
|
2911
|
+
if (widgetId.startsWith('supporting-doc-'))
|
|
2912
|
+
continue;
|
|
2913
|
+
const widgetPath = widget['widget-data-path'];
|
|
2914
|
+
if (!widgetPath || typeof widgetPath !== 'string' || skipPaths.has(widgetPath))
|
|
2915
|
+
continue;
|
|
2916
|
+
const value = getValueByPath(sourceData, widgetPath);
|
|
2917
|
+
if (!isCollectableFileValue(value))
|
|
2918
|
+
continue;
|
|
2919
|
+
const field = fieldFromPath(widgetPath);
|
|
2920
|
+
files.push({
|
|
2921
|
+
value,
|
|
2922
|
+
tag: SECTION_FILE_TAG.DIRECT_FILE,
|
|
2923
|
+
field,
|
|
2924
|
+
label: (isStoredDocumentRef(value) ? value.label : undefined) ||
|
|
2925
|
+
widget['widget-label'] ||
|
|
2926
|
+
field,
|
|
2927
|
+
});
|
|
2928
|
+
}
|
|
2929
|
+
return files;
|
|
2930
|
+
};
|
|
2931
|
+
/**
|
|
2932
|
+
* Sync collection for dirty checks / snapshots.
|
|
2933
|
+
* Fresh uploads and existing stored document refs are returned with origin tags.
|
|
2934
|
+
*/
|
|
2935
|
+
const collectAllSectionFilesSync = (section, sourceData, options) => {
|
|
2936
|
+
const widgets = collectWidgets(section.panels);
|
|
2937
|
+
const profilePaths = getProfileImageUrlPaths(section.panels);
|
|
2938
|
+
const skipPaths = new Set(profilePaths);
|
|
2939
|
+
const includeSupportingDocuments = options?.includeSupportingDocuments !== false;
|
|
2940
|
+
return [
|
|
2941
|
+
...collectProfileFiles(widgets, sourceData),
|
|
2942
|
+
...(includeSupportingDocuments
|
|
2943
|
+
? collectSupportingDocFiles(section, sourceData, skipPaths)
|
|
2944
|
+
: []),
|
|
2945
|
+
...collectDirectFileWidgetFiles(widgets, sourceData, skipPaths),
|
|
2946
|
+
];
|
|
2947
|
+
};
|
|
2948
|
+
/** Fingerprint for dirty comparison (avoids File / base64 noise). */
|
|
2949
|
+
const fingerprintSectionFiles = (files) => files.map(({ value, tag, field, label }) => {
|
|
2950
|
+
if (isStoredDocumentRef(value)) {
|
|
2951
|
+
return {
|
|
2952
|
+
tag,
|
|
2953
|
+
field,
|
|
2954
|
+
label,
|
|
2955
|
+
document_id: value.document_id,
|
|
2956
|
+
source_filename: value.source_filename,
|
|
2957
|
+
presigned_url: value.presigned_url,
|
|
2958
|
+
};
|
|
2959
|
+
}
|
|
2960
|
+
return {
|
|
2961
|
+
tag,
|
|
2962
|
+
field,
|
|
2963
|
+
label,
|
|
2964
|
+
name: value.name,
|
|
2965
|
+
size: value.size,
|
|
2966
|
+
type: value.type,
|
|
2967
|
+
lastModified: value.lastModified,
|
|
2968
|
+
};
|
|
2969
|
+
});
|
|
2970
|
+
/**
|
|
2971
|
+
* Collect every section file into `section_files`:
|
|
2972
|
+
* - fresh uploads as serialized File blobs (`__type: "File"`)
|
|
2973
|
+
* - unchanged existing docs as `{ label, document_id, presigned_url, source_filename }`
|
|
2974
|
+
*/
|
|
2975
|
+
const collectAllSectionFiles = async (section, sourceData, options) => {
|
|
2976
|
+
const rawFiles = collectAllSectionFilesSync(section, sourceData, options);
|
|
2977
|
+
const result = [];
|
|
2978
|
+
for (const raw of rawFiles) {
|
|
2979
|
+
if (isStoredDocumentRef(raw.value)) {
|
|
2980
|
+
result.push({
|
|
2981
|
+
label: raw.value.label,
|
|
2982
|
+
document_id: raw.value.document_id,
|
|
2983
|
+
presigned_url: raw.value.presigned_url,
|
|
2984
|
+
...(raw.value.source_filename
|
|
2985
|
+
? { source_filename: raw.value.source_filename }
|
|
2986
|
+
: {}),
|
|
2987
|
+
tag: raw.tag,
|
|
2988
|
+
...(raw.field ? { field: raw.field } : {}),
|
|
2989
|
+
...(raw.document_key ? { document_key: raw.document_key } : {}),
|
|
2990
|
+
});
|
|
2991
|
+
continue;
|
|
2992
|
+
}
|
|
2993
|
+
const serialized = raw.value instanceof File ? await serializeFile(raw.value) : raw.value;
|
|
2994
|
+
result.push({
|
|
2995
|
+
...serialized,
|
|
2996
|
+
tag: raw.tag,
|
|
2997
|
+
...(raw.label ? { label: raw.label } : {}),
|
|
2998
|
+
...(raw.field ? { field: raw.field } : {}),
|
|
2999
|
+
...(raw.document_key ? { document_key: raw.document_key } : {}),
|
|
3000
|
+
});
|
|
3001
|
+
}
|
|
3002
|
+
return result;
|
|
3003
|
+
};
|
|
3004
|
+
/** Paths for file widgets / supporting docs — values travel in `section_files`, not `records`. */
|
|
3005
|
+
const getSectionFileBlobPaths = (section, options) => {
|
|
3006
|
+
const paths = [...getProfileImageUrlPaths(section.panels)];
|
|
3007
|
+
const includeSupportingDocuments = options?.includeSupportingDocuments !== false;
|
|
3008
|
+
collectWidgets(section.panels).forEach((widget) => {
|
|
3009
|
+
if (widget.widget !== 'file')
|
|
3010
|
+
return;
|
|
3011
|
+
const widgetId = widget['widget-id'] || '';
|
|
3012
|
+
if (widgetId.startsWith('supporting-doc-'))
|
|
3013
|
+
return;
|
|
3014
|
+
const widgetPath = widget['widget-data-path'];
|
|
3015
|
+
if (typeof widgetPath === 'string' && widgetPath.length > 0) {
|
|
3016
|
+
paths.push(widgetPath);
|
|
3017
|
+
}
|
|
3018
|
+
});
|
|
3019
|
+
if (includeSupportingDocuments) {
|
|
3020
|
+
(section['section-supporting-documents'] || []).forEach((doc) => {
|
|
3021
|
+
const path = doc['document-data-path'];
|
|
3022
|
+
if (path)
|
|
3023
|
+
paths.push(path);
|
|
3024
|
+
});
|
|
3025
|
+
}
|
|
3026
|
+
return paths;
|
|
3027
|
+
};
|
|
3028
|
+
/**
|
|
3029
|
+
* Remove file-widget fields from records (fresh uploads, stored docs, empty placeholders).
|
|
3030
|
+
* Those values are carried only in `section_files`.
|
|
3031
|
+
*/
|
|
3032
|
+
const stripSectionFileBlobs = (records, blobPaths) => {
|
|
3033
|
+
if (blobPaths.length === 0)
|
|
3034
|
+
return records;
|
|
3035
|
+
const fieldKeys = blobPaths.map(fieldFromPath);
|
|
3036
|
+
return records.map((record) => {
|
|
3037
|
+
if (typeof record !== 'object' || record === null)
|
|
3038
|
+
return record;
|
|
3039
|
+
const copy = { ...record };
|
|
3040
|
+
for (const key of fieldKeys) {
|
|
3041
|
+
if (!Object.prototype.hasOwnProperty.call(copy, key))
|
|
3042
|
+
continue;
|
|
3043
|
+
delete copy[key];
|
|
3044
|
+
}
|
|
3045
|
+
return copy;
|
|
3046
|
+
});
|
|
3047
|
+
};
|
|
3048
|
+
|
|
2851
3049
|
const collectWidgetPathSnapshot = (widgets, sourceData) => {
|
|
2852
3050
|
const snapshot = {};
|
|
2853
3051
|
let hasTable = false;
|
|
@@ -2911,24 +3109,13 @@ const buildSectionRecords = (widgets, sourceData, { sectionRegisterId, editActio
|
|
|
2911
3109
|
}
|
|
2912
3110
|
return extractTableRecordsFromSnapshot(snapshot, widgets);
|
|
2913
3111
|
};
|
|
2914
|
-
const collectSectionSupportingFiles = (section, sourceData) => {
|
|
2915
|
-
const files = [];
|
|
2916
|
-
const supportingDocuments = section['section-supporting-documents'] || [];
|
|
2917
|
-
supportingDocuments.forEach((doc) => {
|
|
2918
|
-
const path = doc['document-data-path'];
|
|
2919
|
-
if (path) {
|
|
2920
|
-
files.push(getValueByPath(sourceData, path));
|
|
2921
|
-
}
|
|
2922
|
-
});
|
|
2923
|
-
return files;
|
|
2924
|
-
};
|
|
2925
3112
|
/** Save flow: records for change detection and onSectionSave payloads. */
|
|
2926
3113
|
const trackSectionChanges = (widgets, sourceData, sectionRegisterId) => buildSectionRecords(widgets, sourceData, {
|
|
2927
3114
|
sectionRegisterId,
|
|
2928
3115
|
editAction: 'always',
|
|
2929
3116
|
whenEmpty: 'empty-array',
|
|
2930
3117
|
});
|
|
2931
|
-
/** Dirty-state baseline: records +
|
|
3118
|
+
/** Dirty-state baseline: records + all section files. */
|
|
2932
3119
|
const buildSectionSnapshot = (section, sourceData, hasSupportingDocuments, sectionRegisterId) => {
|
|
2933
3120
|
const sectionWidgets = collectWidgets(section.panels);
|
|
2934
3121
|
const records = sectionWidgets.length > 0
|
|
@@ -2940,26 +3127,51 @@ const buildSectionSnapshot = (section, sourceData, hasSupportingDocuments, secti
|
|
|
2940
3127
|
: buildSectionRecords(sectionWidgets, sourceData, {
|
|
2941
3128
|
whenEmpty: 'raw-snapshot',
|
|
2942
3129
|
});
|
|
2943
|
-
const files =
|
|
2944
|
-
|
|
2945
|
-
|
|
3130
|
+
const files = fingerprintSectionFiles(collectAllSectionFilesSync(section, sourceData, {
|
|
3131
|
+
includeSupportingDocuments: hasSupportingDocuments,
|
|
3132
|
+
}));
|
|
2946
3133
|
return { records, files };
|
|
2947
3134
|
};
|
|
2948
3135
|
/** Form submit / draft: full SectionChanges payload for one section. */
|
|
2949
3136
|
function buildSectionChanges(section, storeValues, options) {
|
|
2950
3137
|
const sectionWidgets = collectWidgets(section.panels);
|
|
2951
|
-
const { sectionRegisterId } = options || {};
|
|
2952
|
-
const
|
|
3138
|
+
const { sectionRegisterId, includeSupportingDocuments = true } = options || {};
|
|
3139
|
+
const fileOptions = { includeSupportingDocuments };
|
|
3140
|
+
const records = stripSectionFileBlobs(buildSectionRecords(sectionWidgets, storeValues, {
|
|
2953
3141
|
sectionRegisterId,
|
|
2954
3142
|
editAction: 'when-register-id',
|
|
2955
3143
|
whenEmpty: 'single-record',
|
|
3144
|
+
}), getSectionFileBlobPaths(section, fileOptions));
|
|
3145
|
+
// Fresh uploads (serialized) + unchanged stored document refs.
|
|
3146
|
+
const sectionFiles = collectAllSectionFilesSync(section, storeValues, fileOptions)
|
|
3147
|
+
.filter((raw) => isSerializedFile(raw.value) || isStoredDocumentRef(raw.value))
|
|
3148
|
+
.map(({ value, tag, label, field, document_key }) => {
|
|
3149
|
+
if (isStoredDocumentRef(value)) {
|
|
3150
|
+
return {
|
|
3151
|
+
label: value.label,
|
|
3152
|
+
document_id: value.document_id,
|
|
3153
|
+
presigned_url: value.presigned_url,
|
|
3154
|
+
...(value.source_filename
|
|
3155
|
+
? { source_filename: value.source_filename }
|
|
3156
|
+
: {}),
|
|
3157
|
+
tag,
|
|
3158
|
+
...(field ? { field } : {}),
|
|
3159
|
+
...(document_key ? { document_key } : {}),
|
|
3160
|
+
};
|
|
3161
|
+
}
|
|
3162
|
+
return {
|
|
3163
|
+
...value,
|
|
3164
|
+
tag,
|
|
3165
|
+
...(label ? { label } : {}),
|
|
3166
|
+
...(field ? { field } : {}),
|
|
3167
|
+
...(document_key ? { document_key } : {}),
|
|
3168
|
+
};
|
|
2956
3169
|
});
|
|
2957
|
-
const files = collectSectionSupportingFiles(section, storeValues);
|
|
2958
3170
|
return {
|
|
2959
3171
|
section_id: options?.dbSectionId ?? section['section-id'],
|
|
2960
3172
|
section_register_id: sectionRegisterId,
|
|
2961
3173
|
records,
|
|
2962
|
-
|
|
3174
|
+
...(sectionFiles.length > 0 ? { section_files: sectionFiles } : {}),
|
|
2963
3175
|
};
|
|
2964
3176
|
}
|
|
2965
3177
|
|
|
@@ -3005,11 +3217,11 @@ const pickAllSectionFields = (baseline, current) => {
|
|
|
3005
3217
|
return fields;
|
|
3006
3218
|
};
|
|
3007
3219
|
const toRowList = (records) => records.filter(isPlainRecord);
|
|
3008
|
-
const diffFormRecord = (baselineRecords, currentRecords, internalRecordId) => {
|
|
3220
|
+
const diffFormRecord = (baselineRecords, currentRecords, internalRecordId, hasFileChanges = false) => {
|
|
3009
3221
|
const baseline = toRowList(baselineRecords)[0] ?? {};
|
|
3010
3222
|
const current = toRowList(currentRecords)[0] ?? {};
|
|
3011
3223
|
const changedFields = pickChangedFields(baseline, current);
|
|
3012
|
-
if (Object.keys(changedFields).length === 0)
|
|
3224
|
+
if (Object.keys(changedFields).length === 0 && !hasFileChanges)
|
|
3013
3225
|
return [];
|
|
3014
3226
|
const payload = {
|
|
3015
3227
|
...pickAllSectionFields(baseline, current),
|
|
@@ -3087,10 +3299,10 @@ const diffTableRows = (baselineRecords, currentRecords, tableColumnKeys) => {
|
|
|
3087
3299
|
});
|
|
3088
3300
|
return result;
|
|
3089
3301
|
};
|
|
3090
|
-
function diffSectionChangeRecords(baselineRecords, currentRecords, { isTable, internalRecordId, tableColumnKeys }) {
|
|
3302
|
+
function diffSectionChangeRecords(baselineRecords, currentRecords, { isTable, internalRecordId, tableColumnKeys, hasFileChanges, }) {
|
|
3091
3303
|
return isTable
|
|
3092
3304
|
? diffTableRows(baselineRecords, currentRecords, tableColumnKeys)
|
|
3093
|
-
: diffFormRecord(baselineRecords, currentRecords, internalRecordId);
|
|
3305
|
+
: diffFormRecord(baselineRecords, currentRecords, internalRecordId, hasFileChanges);
|
|
3094
3306
|
}
|
|
3095
3307
|
|
|
3096
3308
|
const cloneValue = (value) => {
|
|
@@ -3241,73 +3453,6 @@ const revertSectionValues = ({ section, store, dispatch, schemaData, contextSche
|
|
|
3241
3453
|
dispatch(replaceValues(newStoreValues));
|
|
3242
3454
|
};
|
|
3243
3455
|
|
|
3244
|
-
const collectDocsWidgetFiles = (panels, sourceData) => {
|
|
3245
|
-
const files = [];
|
|
3246
|
-
const docsWidgets = collectWidgets(panels).filter((w) => w.widget === 'docs');
|
|
3247
|
-
docsWidgets.forEach((widget) => {
|
|
3248
|
-
const widgetPath = widget['widget-data-path'];
|
|
3249
|
-
if (!widgetPath || typeof widgetPath !== 'string')
|
|
3250
|
-
return;
|
|
3251
|
-
const docsValue = getValueByPath(sourceData, widgetPath);
|
|
3252
|
-
if (!docsValue || typeof docsValue !== 'object' || Array.isArray(docsValue))
|
|
3253
|
-
return;
|
|
3254
|
-
const documents = widget['documents'] || [];
|
|
3255
|
-
documents.forEach((doc) => {
|
|
3256
|
-
const key = doc['document-key'];
|
|
3257
|
-
const file = docsValue[key];
|
|
3258
|
-
if (file && isSerializedFile(file)) {
|
|
3259
|
-
files.push({ ...file, label: doc['document-label'] ?? key });
|
|
3260
|
-
}
|
|
3261
|
-
});
|
|
3262
|
-
});
|
|
3263
|
-
return files;
|
|
3264
|
-
};
|
|
3265
|
-
/**
|
|
3266
|
-
* Strip the base-64 blobs of freshly-uploaded `docs` files from the save
|
|
3267
|
-
* records (they travel in `SectionChanges.files` instead) while preserving
|
|
3268
|
-
* already-uploaded documents that are stored as view-URL strings.
|
|
3269
|
-
*/
|
|
3270
|
-
const stripDocsWidgetFields = (records, panels) => {
|
|
3271
|
-
const docsWidgets = collectWidgets(panels).filter((w) => w.widget === 'docs');
|
|
3272
|
-
if (docsWidgets.length === 0)
|
|
3273
|
-
return records;
|
|
3274
|
-
const fieldKeys = docsWidgets
|
|
3275
|
-
.map((w) => {
|
|
3276
|
-
const path = w['widget-data-path'];
|
|
3277
|
-
if (!path || typeof path !== 'string')
|
|
3278
|
-
return null;
|
|
3279
|
-
return path.includes('.') ? path.split('.').slice(1).join('.') : path;
|
|
3280
|
-
})
|
|
3281
|
-
.filter((k) => k !== null);
|
|
3282
|
-
if (fieldKeys.length === 0)
|
|
3283
|
-
return records;
|
|
3284
|
-
return records.map((record) => {
|
|
3285
|
-
if (typeof record !== 'object' || record === null)
|
|
3286
|
-
return record;
|
|
3287
|
-
const copy = { ...record };
|
|
3288
|
-
for (const key of fieldKeys) {
|
|
3289
|
-
const docsObject = copy[key];
|
|
3290
|
-
if (!docsObject || typeof docsObject !== 'object' || Array.isArray(docsObject)) {
|
|
3291
|
-
delete copy[key];
|
|
3292
|
-
continue;
|
|
3293
|
-
}
|
|
3294
|
-
// Keep only the string URLs of already-uploaded docs; drop base-64 blobs.
|
|
3295
|
-
const preserved = {};
|
|
3296
|
-
for (const [docKey, docValue] of Object.entries(docsObject)) {
|
|
3297
|
-
if (typeof docValue === 'string' && docValue.length > 0) {
|
|
3298
|
-
preserved[docKey] = docValue;
|
|
3299
|
-
}
|
|
3300
|
-
}
|
|
3301
|
-
if (Object.keys(preserved).length > 0) {
|
|
3302
|
-
copy[key] = preserved;
|
|
3303
|
-
}
|
|
3304
|
-
else {
|
|
3305
|
-
delete copy[key];
|
|
3306
|
-
}
|
|
3307
|
-
}
|
|
3308
|
-
return copy;
|
|
3309
|
-
});
|
|
3310
|
-
};
|
|
3311
3456
|
const readSectionInternalRecordId = (source, sectionRegisterId) => {
|
|
3312
3457
|
if (!sectionRegisterId)
|
|
3313
3458
|
return undefined;
|
|
@@ -3318,60 +3463,32 @@ const readSectionInternalRecordId = (source, sectionRegisterId) => {
|
|
|
3318
3463
|
const id = sectionData.internal_record_id;
|
|
3319
3464
|
return typeof id === 'string' && id.length > 0 ? id : undefined;
|
|
3320
3465
|
};
|
|
3321
|
-
const extractProfileImage = (records) => {
|
|
3322
|
-
let profileImage = null;
|
|
3323
|
-
const clonedRecords = records.map((record) => {
|
|
3324
|
-
if (typeof record !== 'object' || record === null)
|
|
3325
|
-
return record;
|
|
3326
|
-
const copy = { ...record };
|
|
3327
|
-
for (const [key, value] of Object.entries(copy)) {
|
|
3328
|
-
if (value instanceof File) {
|
|
3329
|
-
profileImage = value;
|
|
3330
|
-
copy[key] = '';
|
|
3331
|
-
}
|
|
3332
|
-
else if (isSerializedFile(value)) {
|
|
3333
|
-
try {
|
|
3334
|
-
profileImage = deserializeFile(value);
|
|
3335
|
-
copy[key] = '';
|
|
3336
|
-
}
|
|
3337
|
-
catch (err) {
|
|
3338
|
-
console.error('Failed to deserialize profile image:', err);
|
|
3339
|
-
}
|
|
3340
|
-
}
|
|
3341
|
-
}
|
|
3342
|
-
return copy;
|
|
3343
|
-
});
|
|
3344
|
-
return { records: clonedRecords, profileImage };
|
|
3345
|
-
};
|
|
3346
3466
|
const executeSectionSave = async ({ store, dispatch, section, schemaData, contextSchemaData, hasSupportingDocuments, dbSectionId, sectionRegisterId, sectionFieldsOnly = false, skipRequired = false, onSectionSave, }) => {
|
|
3347
3467
|
const sectionWidgets = collectWidgets(section.panels);
|
|
3348
3468
|
const currentState = store.getState().widget;
|
|
3349
3469
|
let currentSchemaData = currentState.values || {};
|
|
3350
|
-
const
|
|
3470
|
+
const fileOptions = { includeSupportingDocuments: hasSupportingDocuments };
|
|
3471
|
+
const isSectionValid = sectionValidate(section, currentSchemaData, dispatch, skipRequired, hasSupportingDocuments);
|
|
3351
3472
|
if (!isSectionValid) {
|
|
3352
3473
|
return { validated: false, saved: false, currentSchemaData };
|
|
3353
3474
|
}
|
|
3354
3475
|
const baselineSource = (schemaData || contextSchemaData || {});
|
|
3355
3476
|
const baselineRecords = trackSectionChanges(sectionWidgets, baselineSource, sectionRegisterId);
|
|
3356
3477
|
const newSchemaData = trackSectionChanges(sectionWidgets, currentSchemaData, sectionRegisterId);
|
|
3357
|
-
const sectionFiles =
|
|
3358
|
-
|
|
3359
|
-
|
|
3360
|
-
|
|
3361
|
-
|
|
3362
|
-
|
|
3363
|
-
|
|
3364
|
-
// Collect files from any docs widgets and add them to the save payload.
|
|
3365
|
-
const docsFiles = collectDocsWidgetFiles(section.panels, currentSchemaData);
|
|
3366
|
-
sectionFiles.push(...docsFiles);
|
|
3367
|
-
if (JSON.stringify(baselineRecords) === JSON.stringify(newSchemaData) && docsFiles.length === 0) {
|
|
3478
|
+
const sectionFiles = await collectAllSectionFiles(section, currentSchemaData, fileOptions);
|
|
3479
|
+
// Existing stored docs are included for payload continuity; only fresh uploads
|
|
3480
|
+
// should drive "file changed" / no-op detection.
|
|
3481
|
+
const freshSectionFiles = sectionFiles.filter(isFreshSectionFileEntry);
|
|
3482
|
+
const blobPaths = getSectionFileBlobPaths(section, fileOptions);
|
|
3483
|
+
if (JSON.stringify(baselineRecords) === JSON.stringify(newSchemaData) &&
|
|
3484
|
+
freshSectionFiles.length === 0) {
|
|
3368
3485
|
return { validated: true, saved: false, currentSchemaData };
|
|
3369
3486
|
}
|
|
3370
|
-
|
|
3371
|
-
|
|
3372
|
-
|
|
3487
|
+
// Strip file fields from records — they travel only in `section_files`.
|
|
3488
|
+
let records = stripSectionFileBlobs([...newSchemaData], blobPaths);
|
|
3489
|
+
const fullCurrentRecords = records;
|
|
3373
3490
|
if (sectionFieldsOnly) {
|
|
3374
|
-
const baselineStripped =
|
|
3491
|
+
const baselineStripped = stripSectionFileBlobs([...baselineRecords], blobPaths);
|
|
3375
3492
|
const isTable = sectionWidgets.some((widget) => isTableLikeWidget(widget));
|
|
3376
3493
|
const internalRecordId = readSectionInternalRecordId(baselineSource, sectionRegisterId) ??
|
|
3377
3494
|
readSectionInternalRecordId(currentSchemaData, sectionRegisterId);
|
|
@@ -3389,18 +3506,28 @@ const executeSectionSave = async ({ store, dispatch, section, schemaData, contex
|
|
|
3389
3506
|
isTable,
|
|
3390
3507
|
internalRecordId,
|
|
3391
3508
|
tableColumnKeys,
|
|
3509
|
+
hasFileChanges: freshSectionFiles.length > 0,
|
|
3392
3510
|
});
|
|
3393
|
-
if (records.length === 0 &&
|
|
3511
|
+
if (records.length === 0 && freshSectionFiles.length === 0) {
|
|
3394
3512
|
return { validated: true, saved: false, currentSchemaData };
|
|
3395
3513
|
}
|
|
3514
|
+
if (records.length === 0 && freshSectionFiles.length > 0) {
|
|
3515
|
+
const currentRecord = fullCurrentRecords.find((record) => typeof record === 'object' && record !== null);
|
|
3516
|
+
records = [
|
|
3517
|
+
{
|
|
3518
|
+
...(currentRecord ?? {}),
|
|
3519
|
+
edit_action: 'UPDATE',
|
|
3520
|
+
...(internalRecordId ? { internal_record_id: internalRecordId } : {}),
|
|
3521
|
+
},
|
|
3522
|
+
];
|
|
3523
|
+
}
|
|
3396
3524
|
}
|
|
3397
3525
|
try {
|
|
3398
3526
|
await onSectionSave?.({
|
|
3399
3527
|
section_id: dbSectionId ?? section['section-id'],
|
|
3400
3528
|
section_register_id: sectionRegisterId,
|
|
3401
3529
|
records,
|
|
3402
|
-
|
|
3403
|
-
...(profileImage ? { image: profileImage } : {}),
|
|
3530
|
+
...(sectionFiles.length > 0 ? { section_files: sectionFiles } : {}),
|
|
3404
3531
|
});
|
|
3405
3532
|
}
|
|
3406
3533
|
catch (error) {
|
|
@@ -3714,45 +3841,9 @@ const WidgetFieldLabel = ({ label, required = false, className = '', title, }) =
|
|
|
3714
3841
|
const { t } = useWidgetContext();
|
|
3715
3842
|
const translatedLabel = tSchema(t, label);
|
|
3716
3843
|
const tooltip = title !== undefined ? tSchema(t, title) : translatedLabel;
|
|
3717
|
-
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: "*" })] }));
|
|
3844
|
+
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: "*" })] }));
|
|
3718
3845
|
};
|
|
3719
3846
|
|
|
3720
|
-
const canPreviewInWeb = (file) => {
|
|
3721
|
-
let mimeType;
|
|
3722
|
-
let fileName;
|
|
3723
|
-
if (file instanceof File) {
|
|
3724
|
-
mimeType = file.type;
|
|
3725
|
-
fileName = file.name.toLowerCase();
|
|
3726
|
-
}
|
|
3727
|
-
else {
|
|
3728
|
-
try {
|
|
3729
|
-
const parsed = new URL(file);
|
|
3730
|
-
fileName = parsed.pathname.toLowerCase();
|
|
3731
|
-
}
|
|
3732
|
-
catch {
|
|
3733
|
-
fileName = file.split('?')[0].split('#')[0].toLowerCase();
|
|
3734
|
-
}
|
|
3735
|
-
mimeType = '';
|
|
3736
|
-
}
|
|
3737
|
-
if (mimeType) {
|
|
3738
|
-
if (mimeType.startsWith('image/'))
|
|
3739
|
-
return true;
|
|
3740
|
-
if (mimeType === 'application/pdf')
|
|
3741
|
-
return true;
|
|
3742
|
-
if (mimeType.startsWith('text/'))
|
|
3743
|
-
return true;
|
|
3744
|
-
if (mimeType === 'application/json')
|
|
3745
|
-
return true;
|
|
3746
|
-
}
|
|
3747
|
-
const extension = fileName.split('.').pop() || '';
|
|
3748
|
-
const previewableExtensions = [
|
|
3749
|
-
'jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'bmp', 'ico',
|
|
3750
|
-
'pdf',
|
|
3751
|
-
'txt', 'csv', 'json', 'xml', 'html', 'css', 'js', 'ts', 'tsx', 'jsx',
|
|
3752
|
-
'md', 'markdown', 'yaml', 'yml',
|
|
3753
|
-
];
|
|
3754
|
-
return previewableExtensions.includes(extension.toLowerCase());
|
|
3755
|
-
};
|
|
3756
3847
|
const openFileInNewTab = (file) => {
|
|
3757
3848
|
if (typeof file === 'string') {
|
|
3758
3849
|
window.open(file, '_blank', 'noopener,noreferrer');
|
|
@@ -3764,13 +3855,11 @@ const openFileInNewTab = (file) => {
|
|
|
3764
3855
|
window.setTimeout(() => URL.revokeObjectURL(url), 60000);
|
|
3765
3856
|
};
|
|
3766
3857
|
|
|
3767
|
-
var img$d = "data:image/png;base64,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";
|
|
3768
|
-
|
|
3769
|
-
var img$c = "data:image/png;base64,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";
|
|
3858
|
+
var img$c = "data:image/png;base64,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";
|
|
3770
3859
|
|
|
3771
|
-
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";
|
|
3860
|
+
var img$b = "data:image/png;base64,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";
|
|
3772
3861
|
|
|
3773
|
-
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==";
|
|
3862
|
+
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";
|
|
3774
3863
|
|
|
3775
3864
|
var img$9 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGxmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDIgNzkuMTY0NDYwLCAyMDIwLzA1LzEyLTE2OjA0OjE3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMiAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjUtMDktMjRUMTI6Mjc6NDArMDU6MzAiIHhtcDpNZXRhZGF0YURhdGU9IjIwMjYtMDEtMDJUMTY6NTA6MDQrMDU6MzAiIHhtcDpNb2RpZnlEYXRlPSIyMDI2LTAxLTAyVDE2OjUwOjA0KzA1OjMwIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjljMDI0ZTVhLWJiMWItNDBiMi05NThmLTg5YjExMTE5NGI4MSIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjMzZDZiMTBiLTQzNjYtYTc0Ny1iOTZlLWI4ZTBhZjQxMTkzOCIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjI1M2M1ZmRhLTlkYzctNGQ0MC04Y2E3LThmMTQ2MmU4OWMxNSIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MjUzYzVmZGEtOWRjNy00ZDQwLThjYTctOGYxNDYyZTg5YzE1IiBzdEV2dDp3aGVuPSIyMDI1LTA5LTI0VDEyOjI3OjQwKzA1OjMwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjEuMiAoTWFjaW50b3NoKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6MDQ5N2Y5YmYtMWZiMi00MWJlLTg5ZGItZGFiMDZmMjEwODE4IiBzdEV2dDp3aGVuPSIyMDI1LTA5LTI0VDEyOjI3OjQwKzA1OjMwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjEuMiAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6OWMwMjRlNWEtYmIxYi00MGIyLTk1OGYtODliMTExMTk0YjgxIiBzdEV2dDp3aGVuPSIyMDI2LTAxLTAyVDE2OjUwOjA0KzA1OjMwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjEuMiAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7pSLHQ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";
|
|
3776
3865
|
|
|
@@ -3792,202 +3881,125 @@ var img$1 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAasAAAGmCAYAAADCj6uzA
|
|
|
3792
3881
|
|
|
3793
3882
|
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==";
|
|
3794
3883
|
|
|
3884
|
+
const getFileName = (file) => file instanceof File ? file.name : file.split('/').pop() || file;
|
|
3885
|
+
const iconButtonClass = 'inline-flex items-center justify-center shrink-0 p-0 border-0 bg-transparent focus:outline-none';
|
|
3886
|
+
const docControlClass = 'w-full h-9 min-w-0 flex items-center rounded-lg px-2.5 box-border';
|
|
3795
3887
|
const FileInputWidget = ({ config }) => {
|
|
3796
3888
|
const { value, error, touched, isEnabled, isRequired, onChange, onBlur, config: widgetConfig, } = useBaseWidget({ config });
|
|
3797
3889
|
const { t } = useWidgetContext();
|
|
3798
3890
|
const accept = widgetConfig['widget-data-options']?.accept;
|
|
3799
|
-
const multiple = widgetConfig['widget-data-options']?.multiple || false;
|
|
3800
3891
|
const maxSize = widgetConfig['widget-data-options']?.maxSize;
|
|
3801
|
-
const
|
|
3802
|
-
const [
|
|
3892
|
+
const isReadonly = Boolean(widgetConfig['widget-readonly']);
|
|
3893
|
+
const [localFile, setLocalFile] = useState(null);
|
|
3894
|
+
const fileInputRef = useRef(null);
|
|
3803
3895
|
const deserializedValue = useMemo(() => {
|
|
3804
3896
|
if (!value)
|
|
3805
3897
|
return null;
|
|
3806
3898
|
return deserializeValue(value);
|
|
3807
3899
|
}, [value]);
|
|
3900
|
+
const storedDocument = useMemo(() => {
|
|
3901
|
+
if (isStoredDocumentRef(deserializedValue))
|
|
3902
|
+
return deserializedValue;
|
|
3903
|
+
if (isStoredDocumentRef(value))
|
|
3904
|
+
return value;
|
|
3905
|
+
return null;
|
|
3906
|
+
}, [deserializedValue, value]);
|
|
3808
3907
|
useEffect(() => {
|
|
3809
|
-
if (deserializedValue) {
|
|
3810
|
-
|
|
3811
|
-
if (Array.isArray(deserializedValue)) {
|
|
3812
|
-
const files = deserializedValue.filter((v) => v instanceof File);
|
|
3813
|
-
setLocalFiles(files.length > 0 ? files : null);
|
|
3814
|
-
}
|
|
3815
|
-
else {
|
|
3816
|
-
setLocalFiles(null);
|
|
3817
|
-
}
|
|
3818
|
-
}
|
|
3819
|
-
else {
|
|
3820
|
-
if (deserializedValue instanceof File) {
|
|
3821
|
-
setLocalFiles(deserializedValue);
|
|
3822
|
-
}
|
|
3823
|
-
else {
|
|
3824
|
-
setLocalFiles(null);
|
|
3825
|
-
}
|
|
3826
|
-
}
|
|
3908
|
+
if (deserializedValue instanceof File) {
|
|
3909
|
+
setLocalFile(deserializedValue);
|
|
3827
3910
|
}
|
|
3828
3911
|
else {
|
|
3829
|
-
|
|
3912
|
+
setLocalFile(null);
|
|
3830
3913
|
}
|
|
3831
|
-
}, [deserializedValue
|
|
3914
|
+
}, [deserializedValue]);
|
|
3832
3915
|
const handleFileChange = async (e) => {
|
|
3833
3916
|
const files = e.target.files;
|
|
3834
3917
|
if (!files || files.length === 0) {
|
|
3835
3918
|
onChange(null);
|
|
3836
|
-
|
|
3919
|
+
setLocalFile(null);
|
|
3837
3920
|
return;
|
|
3838
3921
|
}
|
|
3839
|
-
|
|
3840
|
-
|
|
3841
|
-
|
|
3842
|
-
|
|
3843
|
-
return;
|
|
3844
|
-
}
|
|
3845
|
-
}
|
|
3846
|
-
}
|
|
3847
|
-
const fileArray = Array.from(files);
|
|
3848
|
-
if (multiple) {
|
|
3849
|
-
setLocalFiles(fileArray);
|
|
3850
|
-
}
|
|
3851
|
-
else {
|
|
3852
|
-
setLocalFiles(fileArray[0]);
|
|
3922
|
+
const file = files[0];
|
|
3923
|
+
if (maxSize && file.size > maxSize) {
|
|
3924
|
+
console.error(`File ${file.name} exceeds maximum size of ${maxSize} bytes`);
|
|
3925
|
+
return;
|
|
3853
3926
|
}
|
|
3927
|
+
setLocalFile(file);
|
|
3854
3928
|
try {
|
|
3855
|
-
const serialized = await serializeValue(
|
|
3929
|
+
const serialized = await serializeValue(file);
|
|
3856
3930
|
onChange(serialized);
|
|
3857
3931
|
}
|
|
3858
3932
|
catch (error) {
|
|
3859
3933
|
console.error('Error serializing file:', error);
|
|
3860
|
-
|
|
3861
|
-
|
|
3862
|
-
|
|
3863
|
-
|
|
3864
|
-
onChange({ name: fileArray[0].name, size: fileArray[0].size, type: fileArray[0].type });
|
|
3865
|
-
}
|
|
3934
|
+
onChange({ name: file.name, size: file.size, type: file.type });
|
|
3935
|
+
}
|
|
3936
|
+
if (fileInputRef.current) {
|
|
3937
|
+
fileInputRef.current.value = '';
|
|
3866
3938
|
}
|
|
3867
3939
|
};
|
|
3868
|
-
const
|
|
3869
|
-
|
|
3870
|
-
|
|
3871
|
-
|
|
3872
|
-
|
|
3873
|
-
if (!multiple && localFiles instanceof File) {
|
|
3874
|
-
return [localFiles];
|
|
3875
|
-
}
|
|
3940
|
+
const handleRemove = () => {
|
|
3941
|
+
onChange(null);
|
|
3942
|
+
setLocalFile(null);
|
|
3943
|
+
if (fileInputRef.current) {
|
|
3944
|
+
fileInputRef.current.value = '';
|
|
3876
3945
|
}
|
|
3877
|
-
|
|
3878
|
-
|
|
3879
|
-
|
|
3880
|
-
|
|
3881
|
-
|
|
3882
|
-
|
|
3883
|
-
|
|
3884
|
-
|
|
3885
|
-
|
|
3886
|
-
|
|
3887
|
-
|
|
3888
|
-
|
|
3946
|
+
};
|
|
3947
|
+
const getFile = () => {
|
|
3948
|
+
if (localFile instanceof File) {
|
|
3949
|
+
return localFile;
|
|
3950
|
+
}
|
|
3951
|
+
if (deserializedValue instanceof File) {
|
|
3952
|
+
return deserializedValue;
|
|
3953
|
+
}
|
|
3954
|
+
if (typeof deserializedValue === 'string') {
|
|
3955
|
+
return deserializedValue;
|
|
3956
|
+
}
|
|
3957
|
+
if (storedDocument) {
|
|
3958
|
+
return storedDocument.presigned_url;
|
|
3959
|
+
}
|
|
3960
|
+
if (deserializedValue && typeof deserializedValue === 'object' && isSerializedFile(deserializedValue)) {
|
|
3961
|
+
try {
|
|
3962
|
+
return deserializeFile(deserializedValue);
|
|
3889
3963
|
}
|
|
3890
|
-
|
|
3891
|
-
|
|
3892
|
-
return [deserializeFile(deserializedValue)];
|
|
3893
|
-
}
|
|
3894
|
-
catch (e) {
|
|
3895
|
-
console.error('Error deserializing file:', e);
|
|
3896
|
-
}
|
|
3964
|
+
catch (e) {
|
|
3965
|
+
console.error('Error deserializing file:', e);
|
|
3897
3966
|
}
|
|
3898
3967
|
}
|
|
3899
|
-
return
|
|
3968
|
+
return null;
|
|
3900
3969
|
};
|
|
3901
|
-
const
|
|
3902
|
-
const
|
|
3903
|
-
|
|
3904
|
-
|
|
3905
|
-
|
|
3970
|
+
const file = getFile();
|
|
3971
|
+
const hasFile = !!file || !!storedDocument;
|
|
3972
|
+
const displayFileName = storedDocument
|
|
3973
|
+
? storedDocument.source_filename || storedDocument.label
|
|
3974
|
+
: file
|
|
3975
|
+
? getFileName(file)
|
|
3976
|
+
: '';
|
|
3977
|
+
const isEmptyRequired = isRequired && !hasFile;
|
|
3978
|
+
const showValidationError = touched && error.length > 0 && isEmptyRequired;
|
|
3979
|
+
const label = tSchema(t, widgetConfig['widget-label']);
|
|
3980
|
+
const handlePreview = (previewFile, e) => {
|
|
3906
3981
|
if (e) {
|
|
3907
3982
|
e.preventDefault();
|
|
3908
3983
|
e.stopPropagation();
|
|
3909
3984
|
}
|
|
3910
|
-
if (!
|
|
3985
|
+
if (!previewFile)
|
|
3911
3986
|
return;
|
|
3912
|
-
|
|
3913
|
-
if (canPreviewInWeb(file)) {
|
|
3914
|
-
openFileInNewTab(file);
|
|
3915
|
-
}
|
|
3916
|
-
};
|
|
3917
|
-
const renderFileDisplay = () => {
|
|
3918
|
-
if (files.length === 0) {
|
|
3919
|
-
return null;
|
|
3920
|
-
}
|
|
3921
|
-
if (files.length === 1) {
|
|
3922
|
-
const file = files[0];
|
|
3923
|
-
const fileName = file instanceof File ? file.name : file.split('/').pop() || file;
|
|
3924
|
-
const canPreview = canPreviewInWeb(file);
|
|
3925
|
-
const fileIconElement = (jsxRuntimeExports.jsx("img", { src: img$a, alt: "File icon", style: {
|
|
3926
|
-
width: '15px',
|
|
3927
|
-
height: '18px',
|
|
3928
|
-
aspectRatio: '5/6',
|
|
3929
|
-
marginRight: '8px',
|
|
3930
|
-
flexShrink: 0
|
|
3931
|
-
} }));
|
|
3932
|
-
if (canPreview) {
|
|
3933
|
-
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 })] }));
|
|
3934
|
-
}
|
|
3935
|
-
else {
|
|
3936
|
-
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 })] }));
|
|
3937
|
-
}
|
|
3938
|
-
}
|
|
3939
|
-
return (jsxRuntimeExports.jsx("div", { className: "flex flex-wrap gap-2", children: files.map((file, index) => {
|
|
3940
|
-
const fileName = file instanceof File ? file.name : file.split('/').pop() || file;
|
|
3941
|
-
const canPreview = canPreviewInWeb(file);
|
|
3942
|
-
const fileIconElement = (jsxRuntimeExports.jsx("img", { src: img$a, alt: "File icon", style: {
|
|
3943
|
-
width: '15px',
|
|
3944
|
-
height: '18px',
|
|
3945
|
-
aspectRatio: '5/6',
|
|
3946
|
-
marginRight: '8px',
|
|
3947
|
-
flexShrink: 0
|
|
3948
|
-
} }));
|
|
3949
|
-
if (canPreview) {
|
|
3950
|
-
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));
|
|
3951
|
-
}
|
|
3952
|
-
else {
|
|
3953
|
-
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));
|
|
3954
|
-
}
|
|
3955
|
-
}) }));
|
|
3987
|
+
openFileInNewTab(previewFile);
|
|
3956
3988
|
};
|
|
3957
|
-
if (
|
|
3958
|
-
|
|
3959
|
-
|
|
3960
|
-
}
|
|
3961
|
-
|
|
3962
|
-
|
|
3963
|
-
|
|
3964
|
-
|
|
3965
|
-
|
|
3966
|
-
maxWidth: '180px',
|
|
3967
|
-
height: '30px',
|
|
3968
|
-
paddingLeft: '12px',
|
|
3969
|
-
paddingRight: '12px',
|
|
3970
|
-
borderRadius: '10px'
|
|
3971
|
-
}, children: [jsxRuntimeExports.jsx("span", { style: {
|
|
3972
|
-
color: isSupportingDocument ? 'var(--owt-color-text-muted)' : 'var(--owt-color-text-muted)',
|
|
3973
|
-
fontFamily: 'Roboto',
|
|
3974
|
-
fontSize: '16px',
|
|
3975
|
-
fontStyle: 'normal',
|
|
3976
|
-
fontWeight: 400,
|
|
3977
|
-
lineHeight: '24px',
|
|
3978
|
-
textAlign: 'left'
|
|
3979
|
-
}, children: t?.('common.uploadFile') || 'Upload File' }), jsxRuntimeExports.jsx("img", { src: img$9, alt: "Upload", style: {
|
|
3980
|
-
width: '18px',
|
|
3981
|
-
height: '18px',
|
|
3982
|
-
aspectRatio: '1/1',
|
|
3983
|
-
display: 'block',
|
|
3984
|
-
flexShrink: 0
|
|
3985
|
-
} }), 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) }) }))] })] }) }));
|
|
3989
|
+
if (isReadonly) {
|
|
3990
|
+
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: "-" })) })] }));
|
|
3991
|
+
}
|
|
3992
|
+
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: {
|
|
3993
|
+
borderColor: isEmptyRequired
|
|
3994
|
+
? 'var(--owt-widget-error-color)'
|
|
3995
|
+
: 'var(--owt-color-primary-dark)',
|
|
3996
|
+
backgroundColor: 'var(--owt-color-bg)',
|
|
3997
|
+
}, 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] }))] })] }) }));
|
|
3986
3998
|
};
|
|
3987
3999
|
|
|
3988
4000
|
const SupportingDocuments = ({ sectionId, documents, mode, isDraft, expanded = true, onToggleExpanded, collapsible = false, }) => {
|
|
3989
4001
|
const { t } = useWidgetContext();
|
|
3990
|
-
if (documents.length === 0)
|
|
4002
|
+
if (mode === 'IntakeForm' || documents.length === 0)
|
|
3991
4003
|
return null;
|
|
3992
4004
|
const title = t?.('common.supportedDocuments') || 'Supported Documents';
|
|
3993
4005
|
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) => {
|
|
@@ -4022,6 +4034,8 @@ const SectionStyles = ({ sectionClassId, gridId, columnSpan, hasTableWidget, rea
|
|
|
4022
4034
|
height: auto !important;
|
|
4023
4035
|
}
|
|
4024
4036
|
.${sectionClassId} label.owt-text,
|
|
4037
|
+
.${sectionClassId} label.owt-field-label,
|
|
4038
|
+
.${sectionClassId} .owt-field-label,
|
|
4025
4039
|
.${sectionClassId} .text-base.owt-text-muted {
|
|
4026
4040
|
font-weight: 400 !important;
|
|
4027
4041
|
color: var(--owt-color-text-muted) !important;
|
|
@@ -4247,7 +4261,7 @@ const EditSectionPortal = ({ mode, isEditMode, editSectionPosition, sectionClass
|
|
|
4247
4261
|
top: 0;
|
|
4248
4262
|
bottom: 5px;
|
|
4249
4263
|
width: 1px;
|
|
4250
|
-
background-color: var(--owt-color-primary);
|
|
4264
|
+
background-color: var(--owt-color-primary-dark);
|
|
4251
4265
|
}
|
|
4252
4266
|
#${editGridId} > .section-divider {
|
|
4253
4267
|
flex: 0 0 100%;
|
|
@@ -4267,14 +4281,14 @@ const EditSectionPortal = ({ mode, isEditMode, editSectionPosition, sectionClass
|
|
|
4267
4281
|
width: '100%',
|
|
4268
4282
|
maxWidth: '100%',
|
|
4269
4283
|
height: '1px',
|
|
4270
|
-
backgroundColor: 'var(--owt-color-primary)',
|
|
4284
|
+
backgroundColor: 'var(--owt-color-primary-dark)',
|
|
4271
4285
|
margin: '25px 0 0 0',
|
|
4272
4286
|
} }), 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: {
|
|
4273
4287
|
flex: '0 0 100%',
|
|
4274
4288
|
width: '100%',
|
|
4275
4289
|
maxWidth: '100%',
|
|
4276
4290
|
height: '1px',
|
|
4277
|
-
backgroundColor: 'var(--owt-color-primary)',
|
|
4291
|
+
backgroundColor: 'var(--owt-color-primary-dark)',
|
|
4278
4292
|
marginTop: hasSupportingDocuments ? '20px' : '25px',
|
|
4279
4293
|
marginBottom: '20px',
|
|
4280
4294
|
} }), jsxRuntimeExports.jsx(SectionEditControls, { onCancel: onCancel, onSave: onSave, isDirty: isDirty })] })] })] }), document.body);
|
|
@@ -4319,7 +4333,9 @@ const IntakeFormLayout = ({ section, sectionId, gridId, sectionIndex, isExpanded
|
|
|
4319
4333
|
width: '100%',
|
|
4320
4334
|
maxWidth: '100%',
|
|
4321
4335
|
height: '1px',
|
|
4322
|
-
backgroundColor:
|
|
4336
|
+
backgroundColor: isDraft !== false
|
|
4337
|
+
? 'var(--owt-color-primary-dark)'
|
|
4338
|
+
: 'var(--owt-panel-divider-color)',
|
|
4323
4339
|
margin: '15px 0 0 0',
|
|
4324
4340
|
} }), hasSupportingDocuments && (jsxRuntimeExports.jsx(SupportingDocuments, { sectionId: sectionId, documents: supportingDocuments, mode: "IntakeForm", isDraft: isDraft })), jsxRuntimeExports.jsxs("div", { className: "intake-form-edit-controls", style: {
|
|
4325
4341
|
display: 'flex',
|
|
@@ -4375,7 +4391,6 @@ const RegistryViewLayout = ({ mode, section, gridId, editableSection, dataSource
|
|
|
4375
4391
|
borderRadius: '4px',
|
|
4376
4392
|
fontSize: '12px',
|
|
4377
4393
|
fontWeight: 600,
|
|
4378
|
-
textTransform: 'uppercase',
|
|
4379
4394
|
letterSpacing: '0.5px',
|
|
4380
4395
|
backgroundColor: changeRequestType === 'new'
|
|
4381
4396
|
? 'var(--owt-color-success)'
|
|
@@ -4385,21 +4400,21 @@ const RegistryViewLayout = ({ mode, section, gridId, editableSection, dataSource
|
|
|
4385
4400
|
: 'var(--owt-color-error)',
|
|
4386
4401
|
whiteSpace: 'nowrap',
|
|
4387
4402
|
boxShadow: changeRequestType === 'new' ? '0 2px 4px color-mix(in srgb, var(--owt-color-success) 30%, transparent)' : 'none',
|
|
4388
|
-
}, children: changeRequestType === 'new' ? '
|
|
4389
|
-
? { paddingBottom: '30px' }
|
|
4390
|
-
: {}, 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: {
|
|
4403
|
+
}, 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: {
|
|
4391
4404
|
flex: '0 0 100%',
|
|
4392
4405
|
width: '100%',
|
|
4393
4406
|
maxWidth: '100%',
|
|
4394
4407
|
height: '1px',
|
|
4395
4408
|
marginTop: !isEditMode ? '10px' : 0,
|
|
4396
|
-
marginBottom: '14px',
|
|
4397
|
-
backgroundColor:
|
|
4398
|
-
|
|
4409
|
+
marginBottom: mode === 'CRView' ? '28px' : '14px',
|
|
4410
|
+
backgroundColor: isEditMode
|
|
4411
|
+
? 'var(--owt-color-primary-dark)'
|
|
4412
|
+
: 'var(--owt-panel-divider-color)',
|
|
4413
|
+
} }), 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: {
|
|
4399
4414
|
fontFamily: 'Roboto, sans-serif',
|
|
4400
4415
|
fontSize: '16px',
|
|
4401
4416
|
color: 'var(--owt-color-text-muted)',
|
|
4402
|
-
}, children: [t
|
|
4417
|
+
}, 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" })] }) }))] })] }));
|
|
4403
4418
|
};
|
|
4404
4419
|
|
|
4405
4420
|
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, }) => {
|
|
@@ -4415,7 +4430,7 @@ const SectionRenderer = ({ section, dataSourceRequestHandler: propDataSourceRequ
|
|
|
4415
4430
|
const { columnSpan, hasTable: hasTableWidget, hasExplicitTableSpan } = useMemo(() => resolveSectionColumnSpan(section.panels, gridColumnSpan), [section.panels, gridColumnSpan]);
|
|
4416
4431
|
const readonlyStyles = useMemo(() => buildReadonlyStyleSelectors(sectionClassId), [sectionClassId]);
|
|
4417
4432
|
const supportingDocuments = section['section-supporting-documents'] || [];
|
|
4418
|
-
const hasSupportingDocuments = supportingDocuments.length > 0;
|
|
4433
|
+
const hasSupportingDocuments = mode !== 'IntakeForm' && supportingDocuments.length > 0;
|
|
4419
4434
|
const { isExpanded, handleAccordionToggle } = useIntakeFormAccordion(mode, sectionIndex, expandedSectionIndex, isAccessible, onExpandSection);
|
|
4420
4435
|
const { isEditMode, sectionRef, sectionHeight, editSectionPosition, enterEditMode, exitEditMode, } = useSectionEditPortal(forceExitEdit);
|
|
4421
4436
|
const widgetsEditable = mode === 'IntakeForm' ? isDraft !== false : isEditMode;
|
|
@@ -4542,12 +4557,13 @@ const SectionsContainer = ({ sections, dataSourceRequestHandler: propDataSourceR
|
|
|
4542
4557
|
validate: async () => {
|
|
4543
4558
|
if (modeRef.current !== 'IntakeForm')
|
|
4544
4559
|
checkNoUnsavedChanges();
|
|
4560
|
+
const includeSupportingDocuments = modeRef.current !== 'IntakeForm';
|
|
4545
4561
|
const values = getValues();
|
|
4546
4562
|
let allValid = true;
|
|
4547
4563
|
let firstInvalidIndex = null;
|
|
4548
4564
|
for (let i = 0; i < safeSections.length; i++) {
|
|
4549
4565
|
const section = safeSections[i];
|
|
4550
|
-
const valid = sectionValidate(section, values, dispatch);
|
|
4566
|
+
const valid = sectionValidate(section, values, dispatch, false, includeSupportingDocuments);
|
|
4551
4567
|
if (!valid) {
|
|
4552
4568
|
if (firstInvalidIndex === null)
|
|
4553
4569
|
firstInvalidIndex = i;
|
|
@@ -4563,18 +4579,19 @@ const SectionsContainer = ({ sections, dataSourceRequestHandler: propDataSourceR
|
|
|
4563
4579
|
validateAndGetData: async () => {
|
|
4564
4580
|
if (modeRef.current !== 'IntakeForm')
|
|
4565
4581
|
checkNoUnsavedChanges();
|
|
4582
|
+
const includeSupportingDocuments = modeRef.current !== 'IntakeForm';
|
|
4566
4583
|
const values = getValues();
|
|
4567
4584
|
const results = [];
|
|
4568
4585
|
let firstInvalidIndex = null;
|
|
4569
4586
|
for (let i = 0; i < safeSections.length; i++) {
|
|
4570
4587
|
const section = safeSections[i];
|
|
4571
|
-
const valid = sectionValidate(section, values, dispatch);
|
|
4588
|
+
const valid = sectionValidate(section, values, dispatch, false, includeSupportingDocuments);
|
|
4572
4589
|
if (!valid) {
|
|
4573
4590
|
if (firstInvalidIndex === null)
|
|
4574
4591
|
firstInvalidIndex = i;
|
|
4575
4592
|
}
|
|
4576
4593
|
else {
|
|
4577
|
-
results.push(buildSectionChanges(section, values));
|
|
4594
|
+
results.push(buildSectionChanges(section, values, { includeSupportingDocuments }));
|
|
4578
4595
|
}
|
|
4579
4596
|
}
|
|
4580
4597
|
if (firstInvalidIndex !== null) {
|
|
@@ -4586,11 +4603,12 @@ const SectionsContainer = ({ sections, dataSourceRequestHandler: propDataSourceR
|
|
|
4586
4603
|
return results;
|
|
4587
4604
|
},
|
|
4588
4605
|
getStructuredData: () => {
|
|
4606
|
+
const includeSupportingDocuments = modeRef.current !== 'IntakeForm';
|
|
4589
4607
|
const values = getValues();
|
|
4590
4608
|
const results = [];
|
|
4591
4609
|
for (let i = 0; i < safeSections.length; i++) {
|
|
4592
4610
|
const section = safeSections[i];
|
|
4593
|
-
results.push(buildSectionChanges(section, values));
|
|
4611
|
+
results.push(buildSectionChanges(section, values, { includeSupportingDocuments }));
|
|
4594
4612
|
}
|
|
4595
4613
|
return results;
|
|
4596
4614
|
},
|
|
@@ -4709,7 +4727,6 @@ const WIDGET_TYPES = [
|
|
|
4709
4727
|
'parent-lookup',
|
|
4710
4728
|
'multi-select',
|
|
4711
4729
|
'geo-hierarchy',
|
|
4712
|
-
'docs',
|
|
4713
4730
|
];
|
|
4714
4731
|
function getWidgetCategory(widget) {
|
|
4715
4732
|
switch (widget) {
|
|
@@ -4719,7 +4736,6 @@ function getWidgetCategory(widget) {
|
|
|
4719
4736
|
case 'profile':
|
|
4720
4737
|
case 'header-section':
|
|
4721
4738
|
case 'scores-display':
|
|
4722
|
-
case 'docs':
|
|
4723
4739
|
return 'layout';
|
|
4724
4740
|
default:
|
|
4725
4741
|
return 'input';
|
|
@@ -6269,7 +6285,7 @@ const JSONEditorPanel = ({ initialText, onChange, onRawDraftChange, onRawValidat
|
|
|
6269
6285
|
border: 'none',
|
|
6270
6286
|
borderRadius: '4px',
|
|
6271
6287
|
background: 'transparent',
|
|
6272
|
-
color: 'var(--owt-color-text-muted
|
|
6288
|
+
color: 'var(--owt-color-text-muted)',
|
|
6273
6289
|
cursor: 'pointer',
|
|
6274
6290
|
display: 'flex',
|
|
6275
6291
|
alignItems: 'center',
|
|
@@ -6280,7 +6296,7 @@ const JSONEditorPanel = ({ initialText, onChange, onRawDraftChange, onRawValidat
|
|
|
6280
6296
|
marginBottom: '8px',
|
|
6281
6297
|
padding: '10px 12px',
|
|
6282
6298
|
borderRadius: '8px',
|
|
6283
|
-
background: 'var(--owt-color-error-light
|
|
6299
|
+
background: 'var(--owt-color-error-light)',
|
|
6284
6300
|
border: '1px solid var(--owt-color-error)',
|
|
6285
6301
|
color: 'var(--owt-color-error)',
|
|
6286
6302
|
fontSize: '12px',
|
|
@@ -6290,7 +6306,7 @@ const JSONEditorPanel = ({ initialText, onChange, onRawDraftChange, onRawValidat
|
|
|
6290
6306
|
padding: '4px 10px',
|
|
6291
6307
|
borderRadius: '8px',
|
|
6292
6308
|
border: '1px solid var(--owt-color-error)',
|
|
6293
|
-
background: 'var(--owt-color-bg
|
|
6309
|
+
background: 'var(--owt-color-bg)',
|
|
6294
6310
|
color: 'var(--owt-color-error)',
|
|
6295
6311
|
cursor: 'pointer',
|
|
6296
6312
|
fontSize: '12px',
|
|
@@ -6309,7 +6325,7 @@ const JSONEditorPanel = ({ initialText, onChange, onRawDraftChange, onRawValidat
|
|
|
6309
6325
|
width: '52px',
|
|
6310
6326
|
overflow: 'hidden',
|
|
6311
6327
|
borderRight: '1px solid var(--owt-color-border-light)',
|
|
6312
|
-
background: 'var(--owt-color-bg-alt
|
|
6328
|
+
background: 'var(--owt-color-bg-alt)',
|
|
6313
6329
|
padding: '20px 8px 20px 12px',
|
|
6314
6330
|
boxSizing: 'border-box',
|
|
6315
6331
|
userSelect: 'none',
|
|
@@ -6322,9 +6338,9 @@ const JSONEditorPanel = ({ initialText, onChange, onRawDraftChange, onRawValidat
|
|
|
6322
6338
|
fontFamily: 'Monaco, Menlo, "Ubuntu Mono", Consolas, "source-code-pro", monospace',
|
|
6323
6339
|
fontSize: `${EDITOR_FONT_SIZE}px`,
|
|
6324
6340
|
textAlign: 'right',
|
|
6325
|
-
color: isHighlighted ? 'var(--owt-color-error)' : 'var(--owt-color-text-muted
|
|
6341
|
+
color: isHighlighted ? 'var(--owt-color-error)' : 'var(--owt-color-text-muted)',
|
|
6326
6342
|
fontWeight: isHighlighted ? 700 : 400,
|
|
6327
|
-
background: isHighlighted ? 'var(--owt-color-error-light
|
|
6343
|
+
background: isHighlighted ? 'var(--owt-color-error-light)' : 'transparent',
|
|
6328
6344
|
borderRadius: '4px',
|
|
6329
6345
|
}, children: lineNumber }, lineNumber));
|
|
6330
6346
|
}) }), jsxRuntimeExports.jsxs("div", { style: {
|
|
@@ -6353,7 +6369,7 @@ const JSONEditorPanel = ({ initialText, onChange, onRawDraftChange, onRawValidat
|
|
|
6353
6369
|
whiteSpace: 'pre-wrap',
|
|
6354
6370
|
wordBreak: 'break-word',
|
|
6355
6371
|
color: 'transparent',
|
|
6356
|
-
background: isHighlighted ? 'var(--owt-color-error-light
|
|
6372
|
+
background: isHighlighted ? 'var(--owt-color-error-light)' : 'transparent',
|
|
6357
6373
|
boxShadow: isHighlighted ? 'inset 3px 0 0 var(--owt-color-error)' : 'none',
|
|
6358
6374
|
}, children: line.length > 0 ? line : ' ' }, `highlight-${lineNumber}`));
|
|
6359
6375
|
}) }), jsxRuntimeExports.jsx("textarea", { ref: textareaRef, value: rawJsonText, onChange: (e) => handleRawJsonChange(e.target.value), onScroll: handleTextareaScroll, style: {
|
|
@@ -11251,27 +11267,27 @@ const VisualBuilderPanel = ({ section, selectedNode, onSelectNode, onSectionChan
|
|
|
11251
11267
|
minHeight: 0,
|
|
11252
11268
|
}, children: [jsxRuntimeExports.jsxs("div", { style: {
|
|
11253
11269
|
padding: '20px',
|
|
11254
|
-
background: 'var(--owt-color-bg
|
|
11270
|
+
background: 'var(--owt-color-bg)',
|
|
11255
11271
|
display: 'flex',
|
|
11256
11272
|
justifyContent: 'space-between',
|
|
11257
11273
|
alignItems: 'center',
|
|
11258
11274
|
flexShrink: 0,
|
|
11259
|
-
}, children: [jsxRuntimeExports.jsx("div", { style: { fontWeight: 600, fontSize: '16px', color: 'var(--owt-color-text
|
|
11275
|
+
}, 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: {
|
|
11260
11276
|
padding: '8px 16px',
|
|
11261
|
-
border: '1px solid var(--owt-color-border
|
|
11277
|
+
border: '1px solid var(--owt-color-border)',
|
|
11262
11278
|
borderRadius: '10px',
|
|
11263
|
-
background: 'var(--owt-btn-primary-bg
|
|
11264
|
-
color: 'var(--owt-btn-primary-color
|
|
11279
|
+
background: 'var(--owt-btn-primary-bg)',
|
|
11280
|
+
color: 'var(--owt-btn-primary-color)',
|
|
11265
11281
|
fontWeight: 600,
|
|
11266
11282
|
cursor: 'pointer',
|
|
11267
11283
|
fontSize: '12px',
|
|
11268
11284
|
whiteSpace: 'nowrap',
|
|
11269
11285
|
}, children: t?.('sectionBuilder.addPanel') || '+ Add Panel' }), jsxRuntimeExports.jsx("button", { onClick: () => handleAddWidget(), style: {
|
|
11270
11286
|
padding: '8px 16px',
|
|
11271
|
-
border: '1px solid var(--owt-color-border
|
|
11287
|
+
border: '1px solid var(--owt-color-border)',
|
|
11272
11288
|
borderRadius: '10px',
|
|
11273
|
-
background: 'var(--owt-btn-primary-bg
|
|
11274
|
-
color: 'var(--owt-btn-primary-color
|
|
11289
|
+
background: 'var(--owt-btn-primary-bg)',
|
|
11290
|
+
color: 'var(--owt-btn-primary-color)',
|
|
11275
11291
|
fontWeight: 600,
|
|
11276
11292
|
cursor: 'pointer',
|
|
11277
11293
|
fontSize: '12px',
|
|
@@ -11281,7 +11297,7 @@ const VisualBuilderPanel = ({ section, selectedNode, onSelectNode, onSectionChan
|
|
|
11281
11297
|
border: 'none',
|
|
11282
11298
|
borderRadius: '4px',
|
|
11283
11299
|
background: 'transparent',
|
|
11284
|
-
color: 'var(--owt-color-text-muted
|
|
11300
|
+
color: 'var(--owt-color-text-muted)',
|
|
11285
11301
|
cursor: 'pointer',
|
|
11286
11302
|
display: 'flex',
|
|
11287
11303
|
alignItems: 'center',
|
|
@@ -11292,23 +11308,23 @@ const VisualBuilderPanel = ({ section, selectedNode, onSelectNode, onSectionChan
|
|
|
11292
11308
|
flex: '1 1 0%',
|
|
11293
11309
|
display: 'flex',
|
|
11294
11310
|
overflow: 'hidden',
|
|
11295
|
-
border: '1px solid var(--owt-color-border
|
|
11311
|
+
border: '1px solid var(--owt-color-border)',
|
|
11296
11312
|
borderRadius: '10px',
|
|
11297
11313
|
minHeight: 0,
|
|
11298
11314
|
}, children: [jsxRuntimeExports.jsxs("div", { style: {
|
|
11299
11315
|
flex: '1 1 0%',
|
|
11300
11316
|
width: '45%',
|
|
11301
|
-
borderRight: '1px solid var(--owt-color-border
|
|
11317
|
+
borderRight: '1px solid var(--owt-color-border)',
|
|
11302
11318
|
display: 'flex',
|
|
11303
11319
|
flexDirection: 'column',
|
|
11304
11320
|
minHeight: 0,
|
|
11305
11321
|
overflow: 'hidden',
|
|
11306
11322
|
}, children: [jsxRuntimeExports.jsxs("div", { style: {
|
|
11307
11323
|
padding: '12px 15px',
|
|
11308
|
-
borderBottom: '1px solid var(--owt-color-border-light
|
|
11309
|
-
background: 'var(--owt-color-bg
|
|
11324
|
+
borderBottom: '1px solid var(--owt-color-border-light)',
|
|
11325
|
+
background: 'var(--owt-color-bg)',
|
|
11310
11326
|
flexShrink: 0,
|
|
11311
|
-
}, children: [jsxRuntimeExports.jsx("div", { style: { fontSize: '12px', fontWeight: 700, color: 'var(--owt-color-text
|
|
11327
|
+
}, 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: () => {
|
|
11312
11328
|
if (selectedNode?.type === 'panel') {
|
|
11313
11329
|
onAddWidget(selectedNode.id, paletteWidgetType);
|
|
11314
11330
|
}
|
|
@@ -11319,13 +11335,13 @@ const VisualBuilderPanel = ({ section, selectedNode, onSelectNode, onSectionChan
|
|
|
11319
11335
|
padding: '8px 12px',
|
|
11320
11336
|
border: 'none',
|
|
11321
11337
|
borderRadius: '6px',
|
|
11322
|
-
background: 'var(--owt-color-text
|
|
11323
|
-
color: 'var(--owt-color-bg
|
|
11338
|
+
background: 'var(--owt-color-text)',
|
|
11339
|
+
color: 'var(--owt-color-bg)',
|
|
11324
11340
|
cursor: 'pointer',
|
|
11325
11341
|
fontSize: '12px',
|
|
11326
11342
|
fontWeight: 700,
|
|
11327
11343
|
whiteSpace: 'nowrap',
|
|
11328
|
-
}, children: t?.('sectionBuilder.add') || 'Add' })] }), jsxRuntimeExports.jsx("div", { style: { marginTop: '8px', fontSize: '11px', color: 'var(--owt-color-text-muted
|
|
11344
|
+
}, children: t?.('sectionBuilder.add') || 'Add' })] }), jsxRuntimeExports.jsx("div", { style: { marginTop: '8px', fontSize: '11px', color: 'var(--owt-color-text-muted)' }, children: t?.('sectionBuilder.paletteTip') ||
|
|
11329
11345
|
'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: {
|
|
11330
11346
|
flex: '1 1 0%',
|
|
11331
11347
|
width: '55%',
|
|
@@ -11674,7 +11690,7 @@ const SectionBuilder = ({ initialSection, onChange, onSave, onNotify, }) => {
|
|
|
11674
11690
|
left: 0,
|
|
11675
11691
|
right: 0,
|
|
11676
11692
|
bottom: 0,
|
|
11677
|
-
background: '
|
|
11693
|
+
background: 'var(--owt-color-overlay)',
|
|
11678
11694
|
zIndex: 9998,
|
|
11679
11695
|
}, onClick: toggleMaximize })), jsxRuntimeExports.jsxs("div", { style: {
|
|
11680
11696
|
display: 'flex',
|
|
@@ -11683,7 +11699,7 @@ const SectionBuilder = ({ initialSection, onChange, onSave, onNotify, }) => {
|
|
|
11683
11699
|
height: isMaximized ? '100vh' : undefined,
|
|
11684
11700
|
width: isMaximized ? '100vw' : '100%',
|
|
11685
11701
|
minHeight: 0,
|
|
11686
|
-
background: 'var(--owt-color-bg
|
|
11702
|
+
background: 'var(--owt-color-bg)',
|
|
11687
11703
|
fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
|
|
11688
11704
|
overflow: 'hidden',
|
|
11689
11705
|
border: 'none',
|
|
@@ -11693,19 +11709,19 @@ const SectionBuilder = ({ initialSection, onChange, onSave, onNotify, }) => {
|
|
|
11693
11709
|
zIndex: isMaximized ? 9999 : 'auto',
|
|
11694
11710
|
}, children: [jsxRuntimeExports.jsxs("div", { style: {
|
|
11695
11711
|
padding: '12px 16px',
|
|
11696
|
-
borderBottom: '1px solid var(--owt-color-border-light
|
|
11712
|
+
borderBottom: '1px solid var(--owt-color-border-light)',
|
|
11697
11713
|
display: 'flex',
|
|
11698
11714
|
alignItems: 'center',
|
|
11699
11715
|
justifyContent: 'space-between',
|
|
11700
|
-
background: 'var(--owt-color-bg
|
|
11716
|
+
background: 'var(--owt-color-bg)',
|
|
11701
11717
|
flexShrink: 0,
|
|
11702
|
-
}, 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
|
|
11718
|
+
}, 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: {
|
|
11703
11719
|
padding: '6px 10px',
|
|
11704
11720
|
borderRadius: '9999px',
|
|
11705
11721
|
border: 'none',
|
|
11706
11722
|
cursor: 'pointer',
|
|
11707
|
-
background: mode === 'graphical' ? 'var(--owt-color-text
|
|
11708
|
-
color: mode === 'graphical' ? 'var(--owt-color-bg
|
|
11723
|
+
background: mode === 'graphical' ? 'var(--owt-color-text)' : 'transparent',
|
|
11724
|
+
color: mode === 'graphical' ? 'var(--owt-color-bg)' : 'var(--owt-color-text)',
|
|
11709
11725
|
fontSize: '12px',
|
|
11710
11726
|
fontWeight: 700,
|
|
11711
11727
|
}, children: t?.('sectionBuilder.graphical') || 'Graphical' }), jsxRuntimeExports.jsx("button", { type: "button", onClick: switchToRaw, style: {
|
|
@@ -11713,28 +11729,28 @@ const SectionBuilder = ({ initialSection, onChange, onSave, onNotify, }) => {
|
|
|
11713
11729
|
borderRadius: '9999px',
|
|
11714
11730
|
border: 'none',
|
|
11715
11731
|
cursor: 'pointer',
|
|
11716
|
-
background: mode === 'raw' ? 'var(--owt-color-text
|
|
11717
|
-
color: mode === 'raw' ? 'var(--owt-color-bg
|
|
11732
|
+
background: mode === 'raw' ? 'var(--owt-color-text)' : 'transparent',
|
|
11733
|
+
color: mode === 'raw' ? 'var(--owt-color-bg)' : 'var(--owt-color-text)',
|
|
11718
11734
|
fontSize: '12px',
|
|
11719
11735
|
fontWeight: 700,
|
|
11720
11736
|
}, 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: {
|
|
11721
11737
|
padding: '8px 12px',
|
|
11722
11738
|
borderRadius: '10px',
|
|
11723
11739
|
border: 'none',
|
|
11724
|
-
background: 'var(--owt-color-primary-accent
|
|
11725
|
-
color: 'var(--owt-color-bg
|
|
11740
|
+
background: 'var(--owt-color-primary-accent)',
|
|
11741
|
+
color: 'var(--owt-color-bg)',
|
|
11726
11742
|
cursor: 'pointer',
|
|
11727
11743
|
fontSize: '12px',
|
|
11728
11744
|
fontWeight: 700,
|
|
11729
11745
|
}, title: t?.('sectionBuilder.previewSection') || 'Preview Section', children: t?.('sectionBuilder.preview') || 'Preview' }), jsxRuntimeExports.jsx("button", { type: "button", onClick: handleReset, style: {
|
|
11730
11746
|
padding: '8px 12px',
|
|
11731
11747
|
borderRadius: '10px',
|
|
11732
|
-
border: '1px solid var(--owt-color-border
|
|
11733
|
-
background: 'var(--owt-color-bg
|
|
11748
|
+
border: '1px solid var(--owt-color-border)',
|
|
11749
|
+
background: 'var(--owt-color-bg)',
|
|
11734
11750
|
cursor: 'pointer',
|
|
11735
11751
|
fontSize: '12px',
|
|
11736
11752
|
fontWeight: 700,
|
|
11737
|
-
color: 'var(--owt-color-text
|
|
11753
|
+
color: 'var(--owt-color-text)',
|
|
11738
11754
|
}, children: t?.('sectionBuilder.reset') || 'Reset' }), onSave && (jsxRuntimeExports.jsx("button", { type: "button", onClick: () => {
|
|
11739
11755
|
if (mode === 'raw') {
|
|
11740
11756
|
const validation = parseSectionJson(rawDraft);
|
|
@@ -11752,8 +11768,8 @@ const SectionBuilder = ({ initialSection, onChange, onSave, onNotify, }) => {
|
|
|
11752
11768
|
padding: '8px 12px',
|
|
11753
11769
|
borderRadius: '10px',
|
|
11754
11770
|
border: 'none',
|
|
11755
|
-
background: 'var(--owt-color-text
|
|
11756
|
-
color: 'var(--owt-color-bg
|
|
11771
|
+
background: 'var(--owt-color-text)',
|
|
11772
|
+
color: 'var(--owt-color-bg)',
|
|
11757
11773
|
cursor: 'pointer',
|
|
11758
11774
|
fontSize: '12px',
|
|
11759
11775
|
fontWeight: 700,
|
|
@@ -11766,14 +11782,14 @@ const SectionBuilder = ({ initialSection, onChange, onSave, onNotify, }) => {
|
|
|
11766
11782
|
left: 0,
|
|
11767
11783
|
right: 0,
|
|
11768
11784
|
bottom: 0,
|
|
11769
|
-
background: '
|
|
11785
|
+
background: 'var(--owt-color-overlay)',
|
|
11770
11786
|
zIndex: 10000,
|
|
11771
11787
|
display: 'flex',
|
|
11772
11788
|
alignItems: 'center',
|
|
11773
11789
|
justifyContent: 'center',
|
|
11774
11790
|
padding: '20px',
|
|
11775
11791
|
}, onClick: () => setShowPreview(false), children: jsxRuntimeExports.jsxs("div", { style: {
|
|
11776
|
-
background: 'var(--owt-color-bg
|
|
11792
|
+
background: 'var(--owt-color-bg)',
|
|
11777
11793
|
borderRadius: '8px',
|
|
11778
11794
|
width: '100%',
|
|
11779
11795
|
minWidth: '700px',
|
|
@@ -11782,21 +11798,21 @@ const SectionBuilder = ({ initialSection, onChange, onSave, onNotify, }) => {
|
|
|
11782
11798
|
maxHeight: '90vh',
|
|
11783
11799
|
display: 'flex',
|
|
11784
11800
|
flexDirection: 'column',
|
|
11785
|
-
boxShadow: '0 4px 20px
|
|
11801
|
+
boxShadow: '0 4px 20px var(--owt-color-shadow)',
|
|
11786
11802
|
}, onClick: (e) => e.stopPropagation(), children: [jsxRuntimeExports.jsxs("div", { style: {
|
|
11787
11803
|
padding: '15px 20px',
|
|
11788
|
-
borderBottom: '1px solid var(--owt-color-border-light
|
|
11804
|
+
borderBottom: '1px solid var(--owt-color-border-light)',
|
|
11789
11805
|
display: 'flex',
|
|
11790
11806
|
justifyContent: 'space-between',
|
|
11791
11807
|
alignItems: 'center',
|
|
11792
|
-
background: 'var(--owt-color-bg-alt
|
|
11793
|
-
}, children: [jsxRuntimeExports.jsx("h2", { style: { margin: 0, fontSize: '18px', fontWeight: 600, color: 'var(--owt-color-text
|
|
11808
|
+
background: 'var(--owt-color-bg-alt)',
|
|
11809
|
+
}, 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: {
|
|
11794
11810
|
background: 'transparent',
|
|
11795
11811
|
border: 'none',
|
|
11796
11812
|
cursor: 'pointer',
|
|
11797
11813
|
fontSize: '18px',
|
|
11798
11814
|
padding: '5px 10px',
|
|
11799
|
-
color: 'var(--owt-color-text-muted
|
|
11815
|
+
color: 'var(--owt-color-text-muted)',
|
|
11800
11816
|
}, "aria-label": t?.('sectionBuilder.closePreview') || 'Close preview', children: "\u00D7" })] }), jsxRuntimeExports.jsx("div", { style: { flex: 1, overflow: 'auto', padding: '20px' }, children: jsxRuntimeExports.jsx(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)] }));
|
|
11801
11817
|
};
|
|
11802
11818
|
|
|
@@ -12097,9 +12113,9 @@ const TextInputWidget = ({ config }) => {
|
|
|
12097
12113
|
}, [displayValue, widgetConfig, t]);
|
|
12098
12114
|
if (widgetConfig['widget-readonly']) {
|
|
12099
12115
|
const label = tSchema(t, widgetConfig['widget-label']);
|
|
12100
|
-
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-
|
|
12116
|
+
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 }) })] }));
|
|
12101
12117
|
}
|
|
12102
|
-
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-
|
|
12118
|
+
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
|
|
12103
12119
|
? 'decimal'
|
|
12104
12120
|
: formatConfig?.characterType === 'numeric' || formatConfig?.characterType === 'numeric-decimal'
|
|
12105
12121
|
? 'numeric'
|
|
@@ -12227,9 +12243,9 @@ const NumberInputWidget = ({ config }) => {
|
|
|
12227
12243
|
const label = tSchema(t, widgetConfig['widget-label']);
|
|
12228
12244
|
const numValue = getNumericValue();
|
|
12229
12245
|
const display = numValue !== null ? formatNumber(numValue, formatConfig) : '';
|
|
12230
|
-
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-
|
|
12246
|
+
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 }) })] }));
|
|
12231
12247
|
}
|
|
12232
|
-
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-
|
|
12248
|
+
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({
|
|
12233
12249
|
error: (touched && error.length > 0) || (widgetConfig['widget-required'] && (value === null || value === undefined || value === '')),
|
|
12234
12250
|
disabled: !isEnabled || widgetConfig['widget-readonly'],
|
|
12235
12251
|
className: `w-full sm:w-[180px] max-w-full h-[30px] px-3 owt-shadow-sm ${textAlignClass}`,
|
|
@@ -12302,10 +12318,10 @@ const BooleanWidget = ({ config }) => {
|
|
|
12302
12318
|
else {
|
|
12303
12319
|
displayValue = falseLabel;
|
|
12304
12320
|
}
|
|
12305
|
-
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-
|
|
12321
|
+
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 }) })] }));
|
|
12306
12322
|
}
|
|
12307
12323
|
if (controlType === 'checkbox') {
|
|
12308
|
-
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-
|
|
12324
|
+
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] }))] })] }) }));
|
|
12309
12325
|
}
|
|
12310
12326
|
if (controlType === 'radio') {
|
|
12311
12327
|
const containerClass = orientation === 'horizontal'
|
|
@@ -12313,9 +12329,9 @@ const BooleanWidget = ({ config }) => {
|
|
|
12313
12329
|
: 'flex flex-col items-start gap-2';
|
|
12314
12330
|
const radioDisabled = !isEnabled || widgetConfig['widget-readonly'];
|
|
12315
12331
|
const optionDisabledClass = radioDisabled ? 'opacity-50 cursor-not-allowed' : '';
|
|
12316
|
-
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-
|
|
12332
|
+
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] }))] })] }) }));
|
|
12317
12333
|
}
|
|
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 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
|
|
12319
12335
|
? 'owt-boolean-chip owt-boolean-chip-selected'
|
|
12320
12336
|
: '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
|
|
12321
12337
|
? 'owt-boolean-chip owt-boolean-chip-selected'
|
|
@@ -12524,9 +12540,9 @@ const DateInputWidget = ({ config }) => {
|
|
|
12524
12540
|
else {
|
|
12525
12541
|
displayValue = '-';
|
|
12526
12542
|
}
|
|
12527
|
-
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-
|
|
12543
|
+
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 }) })] }));
|
|
12528
12544
|
}
|
|
12529
|
-
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-
|
|
12545
|
+
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({
|
|
12530
12546
|
error: showValidationError || showRequiredError,
|
|
12531
12547
|
disabled: !isEnabled || widgetConfig['widget-readonly'],
|
|
12532
12548
|
className: 'w-full sm:w-[180px] max-w-full h-[30px] px-3 owt-shadow-sm',
|
|
@@ -12905,9 +12921,9 @@ const DateTimeInputWidget = ({ config }) => {
|
|
|
12905
12921
|
else {
|
|
12906
12922
|
displayValue = '-';
|
|
12907
12923
|
}
|
|
12908
|
-
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-
|
|
12924
|
+
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 }) })] }));
|
|
12909
12925
|
}
|
|
12910
|
-
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-
|
|
12926
|
+
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({
|
|
12911
12927
|
error: (touched && error.length > 0) || (widgetConfig['widget-required'] && (!value || value === '')),
|
|
12912
12928
|
disabled: !isEnabled || widgetConfig['widget-readonly'],
|
|
12913
12929
|
className: 'w-full sm:w-[180px] max-w-full h-[30px] px-3 owt-shadow-sm',
|
|
@@ -12925,9 +12941,9 @@ const SelectWidget = ({ config }) => {
|
|
|
12925
12941
|
: loading
|
|
12926
12942
|
? '-'
|
|
12927
12943
|
: (value != null && value !== '' ? tSchema(t, String(value)) : '-');
|
|
12928
|
-
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-
|
|
12944
|
+
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 }) })] }));
|
|
12929
12945
|
}
|
|
12930
|
-
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-
|
|
12946
|
+
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", {
|
|
12931
12947
|
// value={value || ''}
|
|
12932
12948
|
// onChange={(e) => onChange(e.target.value === '' ? undefined : e.target.value)}
|
|
12933
12949
|
value: value === undefined || value === null ? '' : String(value), onChange: (e) => {
|
|
@@ -13004,9 +13020,9 @@ const RadioWidget = ({ config }) => {
|
|
|
13004
13020
|
const displayValue = selectedOption
|
|
13005
13021
|
? tSchema(t, selectedOption.label)
|
|
13006
13022
|
: (allowUnset && currentValue === null ? '-' : '');
|
|
13007
|
-
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-
|
|
13023
|
+
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 }) })] }));
|
|
13008
13024
|
}
|
|
13009
|
-
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-
|
|
13025
|
+
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] }))] })] }) }));
|
|
13010
13026
|
};
|
|
13011
13027
|
|
|
13012
13028
|
const CheckboxWidget = ({ config }) => {
|
|
@@ -13021,9 +13037,9 @@ const CheckboxWidget = ({ config }) => {
|
|
|
13021
13037
|
if (widgetConfig['widget-readonly']) {
|
|
13022
13038
|
const label = tSchema(t, widgetConfig['widget-label']);
|
|
13023
13039
|
const displayValue = isChecked ? 'Yes' : 'No';
|
|
13024
|
-
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-
|
|
13040
|
+
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 }) })] }));
|
|
13025
13041
|
}
|
|
13026
|
-
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-
|
|
13042
|
+
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] }))] })] }) }));
|
|
13027
13043
|
}
|
|
13028
13044
|
const processedOptions = useMemo(() => {
|
|
13029
13045
|
let options = [...dataSourceOptions];
|
|
@@ -13080,9 +13096,9 @@ const CheckboxWidget = ({ config }) => {
|
|
|
13080
13096
|
const displayValue = selectedOptions.length > 0
|
|
13081
13097
|
? selectedOptions.map(opt => tSchema(t, opt.label)).join(', ')
|
|
13082
13098
|
: '-';
|
|
13083
|
-
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-
|
|
13099
|
+
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 }) })] }));
|
|
13084
13100
|
}
|
|
13085
|
-
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-
|
|
13101
|
+
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] }))] })] }) }));
|
|
13086
13102
|
};
|
|
13087
13103
|
|
|
13088
13104
|
const PhoneInputWidget = ({ config }) => {
|
|
@@ -13093,9 +13109,9 @@ const PhoneInputWidget = ({ config }) => {
|
|
|
13093
13109
|
: (value || '');
|
|
13094
13110
|
if (widgetConfig['widget-readonly']) {
|
|
13095
13111
|
const label = tSchema(t, widgetConfig['widget-label']);
|
|
13096
|
-
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-
|
|
13112
|
+
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 || '-' }) })] }));
|
|
13097
13113
|
}
|
|
13098
|
-
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-
|
|
13114
|
+
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({
|
|
13099
13115
|
error: (touched && error.length > 0) || (widgetConfig['widget-required'] && (!value || value === '')),
|
|
13100
13116
|
disabled: !isEnabled || widgetConfig['widget-readonly'],
|
|
13101
13117
|
className: 'w-full sm:w-[180px] max-w-full h-[30px] px-3 owt-shadow-sm',
|
|
@@ -13133,7 +13149,7 @@ const DisplayWidget = ({ config }) => {
|
|
|
13133
13149
|
if (!label || label.trim() === '') {
|
|
13134
13150
|
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 }));
|
|
13135
13151
|
}
|
|
13136
|
-
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-
|
|
13152
|
+
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 }) })] }));
|
|
13137
13153
|
};
|
|
13138
13154
|
|
|
13139
13155
|
const getDateColumnConstraintError = (column, cellValue, rowValues, resolveSchemaLabel) => {
|
|
@@ -13419,6 +13435,13 @@ const TableWidget = ({ config }) => {
|
|
|
13419
13435
|
if (!rowData) {
|
|
13420
13436
|
return false;
|
|
13421
13437
|
}
|
|
13438
|
+
const hasValue = columns.some((col) => {
|
|
13439
|
+
const value = rowData[col['column-key']];
|
|
13440
|
+
return value !== null && value !== undefined && value !== '';
|
|
13441
|
+
});
|
|
13442
|
+
if (!hasValue) {
|
|
13443
|
+
return false;
|
|
13444
|
+
}
|
|
13422
13445
|
return isTableRowDataValid(rowData, columns, isReadonly, resolveSchemaLabel);
|
|
13423
13446
|
}, [resolveNewRowData, columns, isReadonly, resolveSchemaLabel]);
|
|
13424
13447
|
const showConfirmation = useCallback((message, onConfirm, onCancel) => {
|
|
@@ -14243,6 +14266,8 @@ const DialogTableWidget = ({ config }) => {
|
|
|
14243
14266
|
}
|
|
14244
14267
|
const cleaned = finalizeDialogRowPayload(payload);
|
|
14245
14268
|
if (dialogMode === 'add') {
|
|
14269
|
+
if (Object.keys(cleaned).length === 0)
|
|
14270
|
+
return;
|
|
14246
14271
|
const savedRow = { ...cleaned, edit_action: 'ADD' };
|
|
14247
14272
|
onChange([...rows, savedRow]);
|
|
14248
14273
|
closeDialog();
|
|
@@ -14497,7 +14522,6 @@ const ProfileWidget = ({ config }) => {
|
|
|
14497
14522
|
}
|
|
14498
14523
|
const format = widgetConfig['widget-data-format'] || {};
|
|
14499
14524
|
const imageSize = format.imageSize || 80;
|
|
14500
|
-
const nameColor = format.nameColor || 'var(--owt-color-primary-dark)';
|
|
14501
14525
|
const showIdLabel = format.showIdLabel !== false;
|
|
14502
14526
|
const widgetClassId = `profile-widget-${config['widget-id']}`;
|
|
14503
14527
|
return (jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [jsxRuntimeExports.jsx("style", { children: `
|
|
@@ -14555,7 +14579,7 @@ const ProfileWidget = ({ config }) => {
|
|
|
14555
14579
|
.${widgetClassId} .profile-name {
|
|
14556
14580
|
font-size: 1.25rem;
|
|
14557
14581
|
font-weight: 600;
|
|
14558
|
-
color:
|
|
14582
|
+
color: var(--owt-color-primary-dark);
|
|
14559
14583
|
line-height: 1.4;
|
|
14560
14584
|
word-wrap: break-word;
|
|
14561
14585
|
max-width: 100%;
|
|
@@ -14585,7 +14609,7 @@ const ProfileWidget = ({ config }) => {
|
|
|
14585
14609
|
if (placeholder) {
|
|
14586
14610
|
placeholder.style.display = 'flex';
|
|
14587
14611
|
}
|
|
14588
|
-
} })) : null, jsxRuntimeExports.jsx("div", { className: "profile-avatar-placeholder", style: { display: imageUrl ? 'none' : 'flex' }, children: jsxRuntimeExports.jsx("img", { src: img$
|
|
14612
|
+
} })) : 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 })] }))] })] })] }));
|
|
14589
14613
|
};
|
|
14590
14614
|
|
|
14591
14615
|
const TextAreaWidget = ({ config }) => {
|
|
@@ -14632,7 +14656,7 @@ const TextAreaWidget = ({ config }) => {
|
|
|
14632
14656
|
const errorMessage = hasError ? error[0] : '';
|
|
14633
14657
|
if (isReadonly) {
|
|
14634
14658
|
const displayValue = getStringValue() || '-';
|
|
14635
|
-
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-
|
|
14659
|
+
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: {
|
|
14636
14660
|
fontFamily: 'Roboto, sans-serif',
|
|
14637
14661
|
height: '56px',
|
|
14638
14662
|
minHeight: '56px',
|
|
@@ -14643,7 +14667,7 @@ const TextAreaWidget = ({ config }) => {
|
|
|
14643
14667
|
border: 'none',
|
|
14644
14668
|
}, children: displayValue }) })] }));
|
|
14645
14669
|
}
|
|
14646
|
-
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-
|
|
14670
|
+
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({
|
|
14647
14671
|
error: hasError,
|
|
14648
14672
|
disabled: !isEnabled,
|
|
14649
14673
|
className: 'w-full px-3 py-2 owt-shadow-sm',
|
|
@@ -14661,11 +14685,6 @@ const TextAreaWidget = ({ config }) => {
|
|
|
14661
14685
|
}, children: charCounterText }))] }), hasError && (jsxRuntimeExports.jsx("p", { className: "owt-field-error text-sm mt-1", children: errorMessage }))] })] }) }));
|
|
14662
14686
|
};
|
|
14663
14687
|
|
|
14664
|
-
const DEFAULT_STATUS_COLORS = {
|
|
14665
|
-
active: 'var(--owt-color-success)',
|
|
14666
|
-
inactive: 'var(--owt-color-warning)',
|
|
14667
|
-
archived: 'var(--owt-color-text-muted)',
|
|
14668
|
-
};
|
|
14669
14688
|
const DEFAULT_LABELS = {
|
|
14670
14689
|
functionalId: 'Functional Record ID',
|
|
14671
14690
|
status: 'Record Status',
|
|
@@ -14872,11 +14891,6 @@ const HeaderSectionWidget = ({ config }) => {
|
|
|
14872
14891
|
}, [completionScoreRaw, idealScoreRaw]);
|
|
14873
14892
|
const format = (widgetConfig['widget-data-format'] || {});
|
|
14874
14893
|
const imageSize = format.imageSize || 120;
|
|
14875
|
-
const nameColor = format.nameColor || 'var(--owt-color-primary-dark)';
|
|
14876
|
-
const statusColors = {
|
|
14877
|
-
...DEFAULT_STATUS_COLORS,
|
|
14878
|
-
...(format.statusColors || {}),
|
|
14879
|
-
};
|
|
14880
14894
|
const updateFieldValue = useCallback((fieldKey, newValue) => {
|
|
14881
14895
|
const path = paths[fieldKey];
|
|
14882
14896
|
if (!path)
|
|
@@ -14890,7 +14904,6 @@ const HeaderSectionWidget = ({ config }) => {
|
|
|
14890
14904
|
const opt = statusOptions.find((o) => String(o.value).toLowerCase() === String(statusValue).toLowerCase());
|
|
14891
14905
|
return opt ? opt.label : String(statusValue);
|
|
14892
14906
|
}, [statusValue, statusOptions]);
|
|
14893
|
-
const statusColor = statusColors[String(statusValue).toLowerCase()] || 'var(--owt-color-text-muted)';
|
|
14894
14907
|
const fileInputRef = useRef(null);
|
|
14895
14908
|
const handleImageUpload = useCallback(async (e) => {
|
|
14896
14909
|
const file = e.target.files?.[0];
|
|
@@ -15084,7 +15097,7 @@ const HeaderSectionWidget = ({ config }) => {
|
|
|
15084
15097
|
.${cls} .hdr-name {
|
|
15085
15098
|
font-size: 1.25rem;
|
|
15086
15099
|
font-weight: 600;
|
|
15087
|
-
color:
|
|
15100
|
+
color: var(--owt-color-primary-dark);
|
|
15088
15101
|
line-height: 1.4;
|
|
15089
15102
|
word-wrap: break-word;
|
|
15090
15103
|
}
|
|
@@ -15124,12 +15137,25 @@ const HeaderSectionWidget = ({ config }) => {
|
|
|
15124
15137
|
font-size: 0.75rem;
|
|
15125
15138
|
font-weight: 600;
|
|
15126
15139
|
color: var(--owt-color-bg);
|
|
15140
|
+
background-color: var(--owt-color-text-muted);
|
|
15127
15141
|
max-width: 100%;
|
|
15128
15142
|
overflow: hidden;
|
|
15129
15143
|
text-overflow: ellipsis;
|
|
15130
15144
|
white-space: nowrap;
|
|
15131
15145
|
}
|
|
15132
15146
|
|
|
15147
|
+
.${cls} .hdr-status-badge[data-status="active"] {
|
|
15148
|
+
background-color: var(--owt-color-success);
|
|
15149
|
+
}
|
|
15150
|
+
|
|
15151
|
+
.${cls} .hdr-status-badge[data-status="inactive"] {
|
|
15152
|
+
background-color: var(--owt-color-warning);
|
|
15153
|
+
}
|
|
15154
|
+
|
|
15155
|
+
.${cls} .hdr-status-badge[data-status="archived"] {
|
|
15156
|
+
background-color: var(--owt-color-text-muted);
|
|
15157
|
+
}
|
|
15158
|
+
|
|
15133
15159
|
.${cls} .hdr-meta-row {
|
|
15134
15160
|
display: flex;
|
|
15135
15161
|
align-items: baseline;
|
|
@@ -15219,7 +15245,7 @@ const HeaderSectionWidget = ({ config }) => {
|
|
|
15219
15245
|
.parentElement?.querySelector('.hdr-avatar-placeholder');
|
|
15220
15246
|
if (placeholder)
|
|
15221
15247
|
placeholder.style.display = 'flex';
|
|
15222
|
-
} })) : null, jsxRuntimeExports.jsx("div", { className: "hdr-avatar-placeholder", style: { display: displayImageUrl ? 'none' : 'flex' }, children: jsxRuntimeExports.jsx("img", { src: img$
|
|
15248
|
+
} })) : 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: () => {
|
|
15223
15249
|
if (isReasonMissing)
|
|
15224
15250
|
setShowReasonRequired(true);
|
|
15225
15251
|
}, onChange: (e) => {
|
|
@@ -15534,6 +15560,7 @@ function unwrapPayload(response) {
|
|
|
15534
15560
|
}
|
|
15535
15561
|
const IdAuthenticationWidget = ({ config, schemaData: propSchemaData }) => {
|
|
15536
15562
|
const { dataSourceRequestHandler, schemaData: ctxSchemaData, t } = useWidgetContext();
|
|
15563
|
+
const themeRoot = useOwtThemeRootProps();
|
|
15537
15564
|
const values = useSelector((state) => state.widget.values);
|
|
15538
15565
|
const schemaData = (propSchemaData || ctxSchemaData || {});
|
|
15539
15566
|
const widgetId = config['widget-id'];
|
|
@@ -15827,7 +15854,7 @@ const IdAuthenticationWidget = ({ config, schemaData: propSchemaData }) => {
|
|
|
15827
15854
|
font-size: 14px;
|
|
15828
15855
|
font-weight: 500;
|
|
15829
15856
|
color: var(--owt-color-text);
|
|
15830
|
-
background:
|
|
15857
|
+
background: var(--owt-color-bg);
|
|
15831
15858
|
border: none;
|
|
15832
15859
|
border-radius: 0;
|
|
15833
15860
|
padding: 0;
|
|
@@ -15841,8 +15868,8 @@ const IdAuthenticationWidget = ({ config, schemaData: propSchemaData }) => {
|
|
|
15841
15868
|
padding: 8px 24px;
|
|
15842
15869
|
line-height: 1.5;
|
|
15843
15870
|
border-radius: var(--owt-btn-border-radius);
|
|
15844
|
-
border: 1px solid var(--owt-
|
|
15845
|
-
background-color: var(--owt-color-primary
|
|
15871
|
+
border: 1px solid var(--owt-btn-primary-border);
|
|
15872
|
+
background-color: var(--owt-color-primary);
|
|
15846
15873
|
color: var(--owt-color-bg);
|
|
15847
15874
|
font-family: Roboto, sans-serif;
|
|
15848
15875
|
cursor: pointer;
|
|
@@ -15856,7 +15883,7 @@ const IdAuthenticationWidget = ({ config, schemaData: propSchemaData }) => {
|
|
|
15856
15883
|
|
|
15857
15884
|
.${cls} .auth-error {
|
|
15858
15885
|
font-size: 12px;
|
|
15859
|
-
color: var(--owt-color
|
|
15886
|
+
color: var(--owt-widget-error-color);
|
|
15860
15887
|
font-weight: 700;
|
|
15861
15888
|
line-height: 1.3;
|
|
15862
15889
|
text-align: left;
|
|
@@ -15934,7 +15961,7 @@ const IdAuthenticationWidget = ({ config, schemaData: propSchemaData }) => {
|
|
|
15934
15961
|
max-width: none;
|
|
15935
15962
|
}
|
|
15936
15963
|
}
|
|
15937
|
-
` }), 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) => {
|
|
15964
|
+
` }), 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) => {
|
|
15938
15965
|
if (e.target === e.currentTarget) {
|
|
15939
15966
|
setOverlayUrl(null);
|
|
15940
15967
|
emitHostEvent({ type: 'overlay_closed' });
|
|
@@ -16003,6 +16030,7 @@ const RecordDisplayPanel = ({ row, widgetIdPrefix, className = '', isEditMode =
|
|
|
16003
16030
|
min-width: 0 !important;
|
|
16004
16031
|
overflow: hidden !important;
|
|
16005
16032
|
}
|
|
16033
|
+
.register-lookup-record-panel .DisplayFieldWidget > .text-base.owt-field-label,
|
|
16006
16034
|
.register-lookup-record-panel .DisplayFieldWidget > .text-base.owt-text-muted {
|
|
16007
16035
|
width: 50% !important;
|
|
16008
16036
|
min-width: 50% !important;
|
|
@@ -16244,7 +16272,7 @@ const RegisterLookupWidget = ({ config }) => {
|
|
|
16244
16272
|
error: hasError,
|
|
16245
16273
|
disabled: !isEnabled,
|
|
16246
16274
|
className: 'flex items-center gap-2 w-full sm:w-[180px] max-w-full px-3 h-[30px] text-sm cursor-pointer',
|
|
16247
|
-
}), children: [jsxRuntimeExports.jsx("img", { src: img$
|
|
16275
|
+
}), 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: {
|
|
16248
16276
|
...themeRoot.style,
|
|
16249
16277
|
position: 'fixed',
|
|
16250
16278
|
top: modalPos.y,
|
|
@@ -16264,14 +16292,14 @@ const RegisterLookupWidget = ({ config }) => {
|
|
|
16264
16292
|
e.preventDefault();
|
|
16265
16293
|
isDragging.current = true;
|
|
16266
16294
|
dragOrigin.current = { mouseX: e.clientX, mouseY: e.clientY, posX: modalPos.x, posY: modalPos.y };
|
|
16267
|
-
}, 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$
|
|
16295
|
+
}, 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) => {
|
|
16268
16296
|
if (e.key === 'Enter') {
|
|
16269
16297
|
e.preventDefault();
|
|
16270
16298
|
runSearch(searchText, 1);
|
|
16271
16299
|
}
|
|
16272
|
-
}, 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$
|
|
16300
|
+
}, 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
|
|
16273
16301
|
? t?.('common.noResults', { defaultValue: 'No results found' })
|
|
16274
|
-
: 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]
|
|
16302
|
+
: 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 })] })] })] }))] }));
|
|
16275
16303
|
};
|
|
16276
16304
|
|
|
16277
16305
|
const parentLookupRecordCache = new Map();
|
|
@@ -16553,12 +16581,12 @@ const ParentLookupWidget = ({ config, value: valueProp, error: errorProp, touche
|
|
|
16553
16581
|
className: `w-full sm:w-[180px] max-w-full h-[30px] px-3 owt-shadow-sm ${!isEnabled || isReadonly ? '' : 'cursor-pointer'}`,
|
|
16554
16582
|
}), style: { borderRadius: '10px' }, title: hasValue ? displayName : placeholder, children: [jsxRuntimeExports.jsx("option", { value: "", children: placeholder }), hasValue && jsxRuntimeExports.jsx("option", { value: "__selected__", children: displayName })] }));
|
|
16555
16583
|
if (isReadonly && !isCompact) {
|
|
16556
|
-
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-
|
|
16584
|
+
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 : '-' })] }));
|
|
16557
16585
|
}
|
|
16558
16586
|
if (isReadonly && isCompact) {
|
|
16559
16587
|
return (jsxRuntimeExports.jsx("span", { className: "text-sm truncate block", style: { color: 'inherit' }, children: hasValue ? displayName : '-' }));
|
|
16560
16588
|
}
|
|
16561
|
-
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-
|
|
16589
|
+
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: () => {
|
|
16562
16590
|
setIsOpen(false);
|
|
16563
16591
|
onBlur();
|
|
16564
16592
|
} }), jsxRuntimeExports.jsxs("div", { className: `${themeRoot.className} flex flex-col overflow-hidden`, style: {
|
|
@@ -16589,12 +16617,12 @@ const ParentLookupWidget = ({ config, value: valueProp, error: errorProp, touche
|
|
|
16589
16617
|
}, 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: () => {
|
|
16590
16618
|
setIsOpen(false);
|
|
16591
16619
|
onBlur();
|
|
16592
|
-
}, 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$
|
|
16620
|
+
}, 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) => {
|
|
16593
16621
|
if (e.key === 'Enter') {
|
|
16594
16622
|
e.preventDefault();
|
|
16595
16623
|
runSearch(searchText, 1);
|
|
16596
16624
|
}
|
|
16597
|
-
}, 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$
|
|
16625
|
+
}, 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
|
|
16598
16626
|
? t?.('common.noResults', { defaultValue: 'No results found' })
|
|
16599
16627
|
: t?.('common.searchHint', {
|
|
16600
16628
|
defaultValue: 'Type and press Enter or click search',
|
|
@@ -16618,7 +16646,7 @@ const ParentLookupWidget = ({ config, value: valueProp, error: errorProp, touche
|
|
|
16618
16646
|
clearSelection();
|
|
16619
16647
|
setIsOpen(false);
|
|
16620
16648
|
onBlur();
|
|
16621
|
-
}, 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]
|
|
16649
|
+
}, 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 })] })] })] })] }))] }));
|
|
16622
16650
|
};
|
|
16623
16651
|
|
|
16624
16652
|
const MultiSelectWidget = ({ config }) => {
|
|
@@ -16857,7 +16885,7 @@ const MultiSelectWidget = ({ config }) => {
|
|
|
16857
16885
|
}) }), 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;
|
|
16858
16886
|
if (widgetConfig['widget-readonly']) {
|
|
16859
16887
|
const fieldLabel = widgetConfig['widget-label'];
|
|
16860
|
-
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-
|
|
16888
|
+
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'
|
|
16861
16889
|
? createPortal(listPopupPanel, document.body)
|
|
16862
16890
|
: null] })] }));
|
|
16863
16891
|
}
|
|
@@ -16889,7 +16917,7 @@ const MultiSelectWidget = ({ config }) => {
|
|
|
16889
16917
|
const isChecked = selectedValues.includes(option.value);
|
|
16890
16918
|
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));
|
|
16891
16919
|
})) })] })) : null;
|
|
16892
|
-
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-
|
|
16920
|
+
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: () => {
|
|
16893
16921
|
if (!disabled)
|
|
16894
16922
|
setIsOpen((prev) => !prev);
|
|
16895
16923
|
}, onBlur: () => {
|
|
@@ -17838,7 +17866,7 @@ function resolveDisplayValue(levelId, selectedValues, options, resolvedLabels, l
|
|
|
17838
17866
|
return loading ? '-' : selected;
|
|
17839
17867
|
}
|
|
17840
17868
|
function ReadonlyLevelRow({ level, displayValue, }) {
|
|
17841
|
-
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-
|
|
17869
|
+
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 }) })] }));
|
|
17842
17870
|
}
|
|
17843
17871
|
function renderFormSteps({ columnSteps, selectedValues, options, loadingLevels, loadingLevelId, isEnabled, isRequired, isComplete, touched, hasError, t, onBlur, handleValueChange, formatLevelLabel, }) {
|
|
17844
17872
|
return columnSteps.map((step) => {
|
|
@@ -17854,7 +17882,7 @@ function renderFormSteps({ columnSteps, selectedValues, options, loadingLevels,
|
|
|
17854
17882
|
((isRequired && !isComplete && !levelHasValue) ||
|
|
17855
17883
|
(touched && hasError && !levelHasValue));
|
|
17856
17884
|
const label = formatLevelLabel(level.level_mnemonic);
|
|
17857
|
-
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-
|
|
17885
|
+
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) => {
|
|
17858
17886
|
const nextValue = event.target.value;
|
|
17859
17887
|
void handleValueChange(level.level_id, nextValue === '' ? undefined : nextValue);
|
|
17860
17888
|
}, 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));
|
|
@@ -17870,7 +17898,7 @@ function renderFormSteps({ columnSteps, selectedValues, options, loadingLevels,
|
|
|
17870
17898
|
const showLevelError = !parentUnselected &&
|
|
17871
17899
|
((isRequired && !isComplete && !encodedValue) ||
|
|
17872
17900
|
(touched && hasError && !encodedValue));
|
|
17873
|
-
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-
|
|
17901
|
+
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) => {
|
|
17874
17902
|
const raw = event.target.value;
|
|
17875
17903
|
if (!raw) {
|
|
17876
17904
|
const selectedLevel = chosen ?? step.levels[0];
|
|
@@ -17947,139 +17975,6 @@ const GeoHierarchyWidget = ({ config }) => {
|
|
|
17947
17975
|
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' }))] }));
|
|
17948
17976
|
};
|
|
17949
17977
|
|
|
17950
|
-
const distributeDocsToColumns = (docs, totalDocs) => {
|
|
17951
|
-
const total = totalDocs > 0 ? totalDocs : docs.length;
|
|
17952
|
-
const rowsPerColumn = Math.ceil(total / 3);
|
|
17953
|
-
if (rowsPerColumn <= 0) {
|
|
17954
|
-
return [];
|
|
17955
|
-
}
|
|
17956
|
-
const columns = [];
|
|
17957
|
-
for (let index = 0; index < 3; index += 1) {
|
|
17958
|
-
const column = docs.slice(index * rowsPerColumn, (index + 1) * rowsPerColumn);
|
|
17959
|
-
if (column.length > 0) {
|
|
17960
|
-
columns.push(column);
|
|
17961
|
-
}
|
|
17962
|
-
}
|
|
17963
|
-
return columns;
|
|
17964
|
-
};
|
|
17965
|
-
const getFileName = (file) => file instanceof File ? file.name : file.split('/').pop() || file;
|
|
17966
|
-
const iconButtonClass = 'inline-flex items-center justify-center shrink-0 p-0 border-0 bg-transparent focus:outline-none';
|
|
17967
|
-
const docControlClass = 'w-full h-9 min-w-0 flex items-center rounded-lg px-2.5 box-border';
|
|
17968
|
-
const DocsWidget = ({ config }) => {
|
|
17969
|
-
const { value, error, touched, isEnabled, onChange, onBlur, config: widgetConfig, } = useBaseWidget({ config });
|
|
17970
|
-
const { t } = useWidgetContext();
|
|
17971
|
-
const documents = widgetConfig['documents'] || [];
|
|
17972
|
-
const totalDocs = widgetConfig['widget-total-docs'] || documents.length;
|
|
17973
|
-
const docColumns = distributeDocsToColumns(documents, totalDocs);
|
|
17974
|
-
const isReadonly = Boolean(widgetConfig['widget-readonly']);
|
|
17975
|
-
const currentValue = value && typeof value === 'object' && !Array.isArray(value)
|
|
17976
|
-
? value
|
|
17977
|
-
: {};
|
|
17978
|
-
const fileInputRefs = useRef({});
|
|
17979
|
-
const handleFileChange = async (docKey, e) => {
|
|
17980
|
-
const files = e.target.files;
|
|
17981
|
-
if (!files || files.length === 0)
|
|
17982
|
-
return;
|
|
17983
|
-
const file = files[0];
|
|
17984
|
-
const doc = documents.find((d) => d['document-key'] === docKey);
|
|
17985
|
-
const maxSize = doc?.['document-max-size'];
|
|
17986
|
-
if (maxSize && file.size > maxSize) {
|
|
17987
|
-
console.error(`File "${file.name}" exceeds max size of ${maxSize} bytes`);
|
|
17988
|
-
return;
|
|
17989
|
-
}
|
|
17990
|
-
try {
|
|
17991
|
-
const serialized = await serializeFile(file);
|
|
17992
|
-
const updated = {
|
|
17993
|
-
...currentValue,
|
|
17994
|
-
[docKey]: { ...serialized, label: doc?.['document-label'] ?? docKey },
|
|
17995
|
-
[`${docKey}_source_filename`]: file.name,
|
|
17996
|
-
};
|
|
17997
|
-
onChange(updated);
|
|
17998
|
-
}
|
|
17999
|
-
catch (err) {
|
|
18000
|
-
console.error('Error serializing file:', err);
|
|
18001
|
-
}
|
|
18002
|
-
if (fileInputRefs.current[docKey]) {
|
|
18003
|
-
fileInputRefs.current[docKey].value = '';
|
|
18004
|
-
}
|
|
18005
|
-
};
|
|
18006
|
-
const handleRemove = (docKey) => {
|
|
18007
|
-
const updated = {
|
|
18008
|
-
...currentValue,
|
|
18009
|
-
[docKey]: null,
|
|
18010
|
-
[`${docKey}_source_filename`]: null,
|
|
18011
|
-
};
|
|
18012
|
-
onChange(updated);
|
|
18013
|
-
};
|
|
18014
|
-
const handlePreview = (file, e) => {
|
|
18015
|
-
if (e) {
|
|
18016
|
-
e.preventDefault();
|
|
18017
|
-
e.stopPropagation();
|
|
18018
|
-
}
|
|
18019
|
-
openFileInNewTab(file);
|
|
18020
|
-
};
|
|
18021
|
-
const getDocValue = (docKey) => {
|
|
18022
|
-
const stored = currentValue[docKey];
|
|
18023
|
-
if (!stored)
|
|
18024
|
-
return null;
|
|
18025
|
-
if (typeof stored === 'string')
|
|
18026
|
-
return stored;
|
|
18027
|
-
if (isSerializedFile(stored)) {
|
|
18028
|
-
try {
|
|
18029
|
-
return deserializeFile(stored);
|
|
18030
|
-
}
|
|
18031
|
-
catch {
|
|
18032
|
-
return null;
|
|
18033
|
-
}
|
|
18034
|
-
}
|
|
18035
|
-
return null;
|
|
18036
|
-
};
|
|
18037
|
-
const getSourceFilename = (docKey, file) => {
|
|
18038
|
-
const stored = currentValue[`${docKey}_source_filename`];
|
|
18039
|
-
if (typeof stored === 'string' && stored)
|
|
18040
|
-
return stored;
|
|
18041
|
-
return file ? getFileName(file) : '';
|
|
18042
|
-
};
|
|
18043
|
-
const renderSlot = (doc) => {
|
|
18044
|
-
const docKey = doc['document-key'];
|
|
18045
|
-
const label = doc['document-label'];
|
|
18046
|
-
const isRequired = doc['document-required'] ?? false;
|
|
18047
|
-
const accept = doc['document-accept'];
|
|
18048
|
-
const file = getDocValue(docKey);
|
|
18049
|
-
const hasFile = !!file;
|
|
18050
|
-
const displayFileName = getSourceFilename(docKey, file);
|
|
18051
|
-
const isEmptyRequired = isRequired && !hasFile;
|
|
18052
|
-
const showValidationError = touched && error.length > 0 && isEmptyRequired;
|
|
18053
|
-
if (isReadonly) {
|
|
18054
|
-
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));
|
|
18055
|
-
}
|
|
18056
|
-
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: {
|
|
18057
|
-
borderColor: isEmptyRequired
|
|
18058
|
-
? 'var(--owt-widget-error-color)'
|
|
18059
|
-
: 'var(--owt-color-primary-dark)',
|
|
18060
|
-
backgroundColor: 'var(--owt-color-bg)',
|
|
18061
|
-
}, 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) => {
|
|
18062
|
-
fileInputRefs.current[docKey] = el;
|
|
18063
|
-
} })] })), 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));
|
|
18064
|
-
};
|
|
18065
|
-
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) => {
|
|
18066
|
-
const isLast = columnIndex === docColumns.length - 1;
|
|
18067
|
-
const columnClassName = [
|
|
18068
|
-
'flex flex-col min-w-0 relative',
|
|
18069
|
-
columnIndex > 0 ? 'lg:pl-10' : '',
|
|
18070
|
-
isLast ? '' : 'lg:pr-10',
|
|
18071
|
-
]
|
|
18072
|
-
.filter(Boolean)
|
|
18073
|
-
.join(' ');
|
|
18074
|
-
return (jsxRuntimeExports.jsxs("div", { className: columnClassName, children: [!isLast && (jsxRuntimeExports.jsx("div", { className: "hidden lg:block absolute right-0 top-0 w-px", style: {
|
|
18075
|
-
bottom: '5px',
|
|
18076
|
-
backgroundColor: isReadonly
|
|
18077
|
-
? 'var(--owt-panel-divider-color)'
|
|
18078
|
-
: 'var(--owt-color-primary)',
|
|
18079
|
-
} })), column.map((doc) => renderSlot(doc))] }, `docs-column-${columnIndex}`));
|
|
18080
|
-
}) }) }));
|
|
18081
|
-
};
|
|
18082
|
-
|
|
18083
17978
|
const registerDefaultWidgets = () => {
|
|
18084
17979
|
widgetRegistry.register({ widget: 'text', component: TextInputWidget });
|
|
18085
17980
|
widgetRegistry.register({ widget: 'textarea', component: TextAreaWidget });
|
|
@@ -18103,7 +17998,6 @@ const registerDefaultWidgets = () => {
|
|
|
18103
17998
|
widgetRegistry.register({ widget: 'parent-lookup', component: ParentLookupWidget });
|
|
18104
17999
|
widgetRegistry.register({ widget: 'multi-select', component: MultiSelectWidget });
|
|
18105
18000
|
widgetRegistry.register({ widget: 'geo-hierarchy', component: GeoHierarchyWidget });
|
|
18106
|
-
widgetRegistry.register({ widget: 'docs', component: DocsWidget });
|
|
18107
18001
|
};
|
|
18108
18002
|
registerDefaultWidgets();
|
|
18109
18003
|
|
|
@@ -18210,5 +18104,5 @@ const translateUISchema = (schema, translate) => {
|
|
|
18210
18104
|
};
|
|
18211
18105
|
};
|
|
18212
18106
|
|
|
18213
|
-
export { BooleanWidget, CheckboxWidget, DateInputWidget, DateTimeInputWidget, DialogTableWidget, DisplayWidget,
|
|
18107
|
+
export { BooleanWidget, CheckboxWidget, DateInputWidget, DateTimeInputWidget, DialogTableWidget, DisplayWidget, FileInputWidget, GeoHierarchyWidget, HeaderSectionWidget, IdAuthenticationWidget, JSONEditorPanel, MultiSelectWidget, NumberInputWidget, PanelRenderer, ParentLookupWidget, PhoneInputWidget, ProfileWidget, PropertyEditor, RadioWidget, RegisterLookupWidget, SECTION_FILE_TAG, ScoresDisplayWidget, SectionBuilder, SectionRenderer, SectionTree, SectionsContainer, SelectWidget, TableWidget, TextAreaWidget, TextInputWidget, VisualBuilderPanel, WIDGET_TYPES, WidgetEventBus, WidgetProvider, WidgetRenderer, applyCaseControl, applyDecimalPrecision, applyMask, createDefaultWidgetConfig, createWidgetStore, createZodSchema, deleteValueByPath, evaluateCondition, evaluateWidgetConditions, filterByCharacterType, formatCurrency, formatDate, formatNumber, formatPhone, formatValue, getApiDataSource, getCachedApiDataSource, getFormattedNumberLength, getSchemaDataSource, getStaticDataSource, getValueByPath, getWidgetCategory, getWidgetValue, hasVisibilityRules, isAllowedKey, isFreshSectionFileEntry, isGeoHierarchyDataSource, isStoredDocumentRef, isWidgetValueEmpty, normalizeNumericDefault, normalizeOptionRules, owtFieldInputClass, parseDataPath, parseNumber, registerDefaultWidgets, removeMask, replaceValues, resetAll, resetWidget, resolveWidgetIdValue, setDataSource, setError, setLoading, setTouched, setValue, setValueByPath, setValues, setWidgetValue, shouldEnableWidget, shouldRequireWidget, shouldShowWidget, themeToCSSVariables, transformDataSourceOptions, translatePanelConfig, translateUISchema, translateWidgetConfig, useBaseWidget, useWidgetCascade, useWidgetContext, useWidgetEventBus, useWidgetTheme, validateNumericValue, validateWidget, widgetRegistry };
|
|
18214
18108
|
//# sourceMappingURL=index.esm.js.map
|