@oneblink/apps-react 0.6.2 → 1.0.0-beta.1
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/OneBlinkAutoSaveForm.js +2 -2
- package/dist/OneBlinkAutoSaveForm.js.map +1 -1
- package/dist/OneBlinkFormBase.js +4 -4
- package/dist/OneBlinkFormBase.js.map +1 -1
- package/dist/OneBlinkFormStoreView.d.ts +8 -0
- package/dist/OneBlinkFormStoreView.js +55 -0
- package/dist/OneBlinkFormStoreView.js.map +1 -0
- package/dist/components/CopyToClipboardIconButton.d.ts +10 -0
- package/dist/components/CopyToClipboardIconButton.js +42 -0
- package/dist/components/CopyToClipboardIconButton.js.map +1 -0
- package/dist/components/CustomAccordion.d.ts +27 -0
- package/dist/components/CustomAccordion.js +40 -0
- package/dist/components/CustomAccordion.js.map +1 -0
- package/dist/components/ErrorMessage.d.ts +13 -0
- package/dist/components/ErrorMessage.js +13 -0
- package/dist/components/ErrorMessage.js.map +1 -0
- package/dist/components/ErrorSnackbar.d.ts +8 -0
- package/dist/components/ErrorSnackbar.js +49 -0
- package/dist/components/ErrorSnackbar.js.map +1 -0
- package/dist/components/Lists.d.ts +10 -0
- package/dist/components/Lists.js +43 -0
- package/dist/components/Lists.js.map +1 -0
- package/dist/components/LoadingWithMessage.d.ts +6 -0
- package/dist/components/LoadingWithMessage.js +12 -0
- package/dist/components/LoadingWithMessage.js.map +1 -0
- package/dist/components/NoResourcesYet.d.ts +12 -0
- package/dist/components/NoResourcesYet.js +7 -0
- package/dist/components/NoResourcesYet.js.map +1 -0
- package/dist/components/formStore/ColumnsConfigurationButton.d.ts +10 -0
- package/dist/components/formStore/ColumnsConfigurationButton.js +29 -0
- package/dist/components/formStore/ColumnsConfigurationButton.js.map +1 -0
- package/dist/components/formStore/DownloadSubmissionDataButton.d.ts +13 -0
- package/dist/components/formStore/DownloadSubmissionDataButton.js +45 -0
- package/dist/components/formStore/DownloadSubmissionDataButton.js.map +1 -0
- package/dist/components/formStore/FormStore.d.ts +9 -0
- package/dist/components/formStore/FormStore.js +103 -0
- package/dist/components/formStore/FormStore.js.map +1 -0
- package/dist/components/formStore/display/ElementDisplay.d.ts +23 -0
- package/dist/components/formStore/display/ElementDisplay.js +78 -0
- package/dist/components/formStore/display/ElementDisplay.js.map +1 -0
- package/dist/components/formStore/display/FormStoreIcon.d.ts +2 -0
- package/dist/components/formStore/display/FormStoreIcon.js +3 -0
- package/dist/components/formStore/display/FormStoreIcon.js.map +1 -0
- package/dist/components/formStore/table/ActionedByTableCell.d.ts +11 -0
- package/dist/components/formStore/table/ActionedByTableCell.js +44 -0
- package/dist/components/formStore/table/ActionedByTableCell.js.map +1 -0
- package/dist/components/formStore/table/ColumnFilters.d.ts +9 -0
- package/dist/components/formStore/table/ColumnFilters.js +180 -0
- package/dist/components/formStore/table/ColumnFilters.js.map +1 -0
- package/dist/components/formStore/table/FormElementTableCell.d.ts +10 -0
- package/dist/components/formStore/table/FormElementTableCell.js +195 -0
- package/dist/components/formStore/table/FormElementTableCell.js.map +1 -0
- package/dist/components/formStore/table/HeaderCellMoreButton.d.ts +9 -0
- package/dist/components/formStore/table/HeaderCellMoreButton.js +49 -0
- package/dist/components/formStore/table/HeaderCellMoreButton.js.map +1 -0
- package/dist/components/formStore/table/RepeatableSetCell.d.ts +9 -0
- package/dist/components/formStore/table/RepeatableSetCell.js +63 -0
- package/dist/components/formStore/table/RepeatableSetCell.js.map +1 -0
- package/dist/components/formStore/table/RepeatableSetCellAccordion.d.ts +9 -0
- package/dist/components/formStore/table/RepeatableSetCellAccordion.js +12 -0
- package/dist/components/formStore/table/RepeatableSetCellAccordion.js.map +1 -0
- package/dist/components/formStore/table/TableCellCopyButton.d.ts +7 -0
- package/dist/components/formStore/table/TableCellCopyButton.js +31 -0
- package/dist/components/formStore/table/TableCellCopyButton.js.map +1 -0
- package/dist/components/formStore/table/generateColumns.d.ts +18 -0
- package/dist/components/formStore/table/generateColumns.js +233 -0
- package/dist/components/formStore/table/generateColumns.js.map +1 -0
- package/dist/components/formStore/table/index.d.ts +17 -0
- package/dist/components/formStore/table/index.js +194 -0
- package/dist/components/formStore/table/index.js.map +1 -0
- package/dist/components/formStore/table/useFormStoreTable.d.ts +12 -0
- package/dist/components/formStore/table/useFormStoreTable.js +130 -0
- package/dist/components/formStore/table/useFormStoreTable.js.map +1 -0
- package/dist/components/messages/LargeIconMessage.d.ts +14 -0
- package/dist/components/messages/LargeIconMessage.js +68 -0
- package/dist/components/messages/LargeIconMessage.js.map +1 -0
- package/dist/components/pickers/V4CompatibleDatePicker.d.ts +30 -0
- package/dist/components/pickers/V4CompatibleDatePicker.js +58 -0
- package/dist/components/pickers/V4CompatibleDatePicker.js.map +1 -0
- package/dist/components/pickers/V4CompatibleDateTimePicker.d.ts +29 -0
- package/dist/components/pickers/V4CompatibleDateTimePicker.js +58 -0
- package/dist/components/pickers/V4CompatibleDateTimePicker.js.map +1 -0
- package/dist/components/pickers/V4CompatibleTimePicker.d.ts +26 -0
- package/dist/components/pickers/V4CompatibleTimePicker.js +41 -0
- package/dist/components/pickers/V4CompatibleTimePicker.js.map +1 -0
- package/dist/components/{AnnotationModal.d.ts → renderer/AnnotationModal.d.ts} +0 -0
- package/dist/components/{AnnotationModal.js → renderer/AnnotationModal.js} +2 -2
- package/dist/components/renderer/AnnotationModal.js.map +1 -0
- package/dist/components/{AutocompleteDropdown.d.ts → renderer/AutocompleteDropdown.d.ts} +0 -0
- package/dist/components/{AutocompleteDropdown.js → renderer/AutocompleteDropdown.js} +1 -1
- package/dist/components/renderer/AutocompleteDropdown.js.map +1 -0
- package/dist/components/{CopyToClipboardButton.d.ts → renderer/CopyToClipboardButton.d.ts} +0 -0
- package/dist/components/{CopyToClipboardButton.js → renderer/CopyToClipboardButton.js} +1 -1
- package/dist/components/renderer/CopyToClipboardButton.js.map +1 -0
- package/dist/components/{CustomisableButtonInner.d.ts → renderer/CustomisableButtonInner.d.ts} +0 -0
- package/dist/components/{CustomisableButtonInner.js → renderer/CustomisableButtonInner.js} +0 -0
- package/dist/components/renderer/CustomisableButtonInner.js.map +1 -0
- package/dist/components/{FormElementLabelContainer.d.ts → renderer/FormElementLabelContainer.d.ts} +0 -0
- package/dist/components/{FormElementLabelContainer.js → renderer/FormElementLabelContainer.js} +0 -0
- package/dist/components/renderer/FormElementLabelContainer.js.map +1 -0
- package/dist/components/{FormElementOptions.d.ts → renderer/FormElementOptions.d.ts} +0 -0
- package/dist/components/{FormElementOptions.js → renderer/FormElementOptions.js} +0 -0
- package/dist/components/renderer/FormElementOptions.js.map +1 -0
- package/dist/components/{LookupButton.d.ts → renderer/LookupButton.d.ts} +0 -0
- package/dist/components/{LookupButton.js → renderer/LookupButton.js} +3 -3
- package/dist/components/renderer/LookupButton.js.map +1 -0
- package/dist/components/{LookupNotification.d.ts → renderer/LookupNotification.d.ts} +1 -1
- package/dist/components/{LookupNotification.js → renderer/LookupNotification.js} +9 -9
- package/dist/components/renderer/LookupNotification.js.map +1 -0
- package/dist/components/{Modal.d.ts → renderer/Modal.d.ts} +0 -0
- package/dist/components/{Modal.js → renderer/Modal.js} +0 -0
- package/dist/components/renderer/Modal.js.map +1 -0
- package/dist/components/{OnLoading.d.ts → renderer/OnLoading.d.ts} +0 -0
- package/dist/components/{OnLoading.js → renderer/OnLoading.js} +0 -0
- package/dist/components/renderer/OnLoading.js.map +1 -0
- package/dist/components/{OneBlinkAppsErrorOriginalMessage.d.ts → renderer/OneBlinkAppsErrorOriginalMessage.d.ts} +0 -0
- package/dist/components/{OneBlinkAppsErrorOriginalMessage.js → renderer/OneBlinkAppsErrorOriginalMessage.js} +0 -0
- package/dist/components/renderer/OneBlinkAppsErrorOriginalMessage.js.map +1 -0
- package/dist/components/{OneBlinkFormElements.d.ts → renderer/OneBlinkFormElements.d.ts} +1 -1
- package/dist/components/{OneBlinkFormElements.js → renderer/OneBlinkFormElements.js} +36 -36
- package/dist/components/renderer/OneBlinkFormElements.js.map +1 -0
- package/dist/components/{PageFormElements.d.ts → renderer/PageFormElements.d.ts} +1 -1
- package/dist/components/{PageFormElements.js → renderer/PageFormElements.js} +3 -3
- package/dist/components/renderer/PageFormElements.js.map +1 -0
- package/dist/components/{ToggleAllCheckbox.d.ts → renderer/ToggleAllCheckbox.d.ts} +1 -1
- package/dist/components/{ToggleAllCheckbox.js → renderer/ToggleAllCheckbox.js} +0 -0
- package/dist/components/renderer/ToggleAllCheckbox.js.map +1 -0
- package/dist/components/{attachments → renderer/attachments}/AttachmentStatus.d.ts +0 -0
- package/dist/components/{attachments → renderer/attachments}/AttachmentStatus.js +1 -1
- package/dist/components/renderer/attachments/AttachmentStatus.js.map +1 -0
- package/dist/components/{attachments → renderer/attachments}/FileCard.d.ts +0 -0
- package/dist/components/{attachments → renderer/attachments}/FileCard.js +4 -4
- package/dist/components/renderer/attachments/FileCard.js.map +1 -0
- package/dist/components/{attachments → renderer/attachments}/FileCardContent.d.ts +0 -0
- package/dist/components/{attachments → renderer/attachments}/FileCardContent.js +0 -0
- package/dist/components/renderer/attachments/FileCardContent.js.map +1 -0
- package/dist/components/{attachments → renderer/attachments}/Files.d.ts +0 -0
- package/dist/components/{attachments → renderer/attachments}/Files.js +0 -0
- package/dist/components/renderer/attachments/Files.js.map +1 -0
- package/dist/components/{attachments → renderer/attachments}/ImagePreviewUnavailable.d.ts +0 -0
- package/dist/components/{attachments → renderer/attachments}/ImagePreviewUnavailable.js +1 -1
- package/dist/components/renderer/attachments/ImagePreviewUnavailable.js.map +1 -0
- package/dist/components/{attachments → renderer/attachments}/UploadingAttachment.d.ts +0 -0
- package/dist/components/{attachments → renderer/attachments}/UploadingAttachment.js +1 -1
- package/dist/components/renderer/attachments/UploadingAttachment.js.map +1 -0
- package/dist/form-elements/FormElementABN.js +3 -3
- package/dist/form-elements/FormElementABN.js.map +1 -1
- package/dist/form-elements/FormElementAutocomplete.js +3 -3
- package/dist/form-elements/FormElementAutocomplete.js.map +1 -1
- package/dist/form-elements/FormElementBSB.js +3 -3
- package/dist/form-elements/FormElementBSB.js.map +1 -1
- package/dist/form-elements/FormElementBarcodeScanner.js +4 -4
- package/dist/form-elements/FormElementBarcodeScanner.js.map +1 -1
- package/dist/form-elements/FormElementBoolean.js +1 -1
- package/dist/form-elements/FormElementBoolean.js.map +1 -1
- package/dist/form-elements/FormElementCamera.js +6 -6
- package/dist/form-elements/FormElementCamera.js.map +1 -1
- package/dist/form-elements/FormElementCheckBoxes.js +4 -4
- package/dist/form-elements/FormElementCheckBoxes.js.map +1 -1
- package/dist/form-elements/FormElementCivicaStreetName.js +2 -2
- package/dist/form-elements/FormElementCivicaStreetName.js.map +1 -1
- package/dist/form-elements/FormElementCompliance.js +2 -2
- package/dist/form-elements/FormElementCompliance.js.map +1 -1
- package/dist/form-elements/FormElementDate.js +4 -4
- package/dist/form-elements/FormElementDate.js.map +1 -1
- package/dist/form-elements/FormElementDateTime.js +4 -4
- package/dist/form-elements/FormElementDateTime.js.map +1 -1
- package/dist/form-elements/FormElementEmail.js +3 -3
- package/dist/form-elements/FormElementEmail.js.map +1 -1
- package/dist/form-elements/FormElementFiles/FormElementFile.js +1 -1
- package/dist/form-elements/FormElementFiles/FormElementFile.js.map +1 -1
- package/dist/form-elements/FormElementFiles/FormElementFiles.js +1 -1
- package/dist/form-elements/FormElementFiles/FormElementFiles.js.map +1 -1
- package/dist/form-elements/FormElementFiles/legacy/FormElementFiles.js +2 -2
- package/dist/form-elements/FormElementFiles/legacy/FormElementFiles.js.map +1 -1
- package/dist/form-elements/FormElementForm.js +1 -1
- package/dist/form-elements/FormElementForm.js.map +1 -1
- package/dist/form-elements/FormElementGeoscapeAddress.js +2 -2
- package/dist/form-elements/FormElementGeoscapeAddress.js.map +1 -1
- package/dist/form-elements/FormElementLocation.js +2 -2
- package/dist/form-elements/FormElementLocation.js.map +1 -1
- package/dist/form-elements/FormElementNumber.js +3 -3
- package/dist/form-elements/FormElementNumber.js.map +1 -1
- package/dist/form-elements/FormElementPointAddress.js +2 -2
- package/dist/form-elements/FormElementPointAddress.js.map +1 -1
- package/dist/form-elements/FormElementRadio.js +2 -2
- package/dist/form-elements/FormElementRadio.js.map +1 -1
- package/dist/form-elements/FormElementRepeatableSet.js +3 -3
- package/dist/form-elements/FormElementRepeatableSet.js.map +1 -1
- package/dist/form-elements/FormElementSection.d.ts +1 -1
- package/dist/form-elements/FormElementSection.js +1 -1
- package/dist/form-elements/FormElementSection.js.map +1 -1
- package/dist/form-elements/FormElementSelect.js +4 -4
- package/dist/form-elements/FormElementSelect.js.map +1 -1
- package/dist/form-elements/FormElementSignature.js +4 -4
- package/dist/form-elements/FormElementSignature.js.map +1 -1
- package/dist/form-elements/FormElementTelephone.js +3 -3
- package/dist/form-elements/FormElementTelephone.js.map +1 -1
- package/dist/form-elements/FormElementText.js +3 -3
- package/dist/form-elements/FormElementText.js.map +1 -1
- package/dist/form-elements/FormElementTextarea.js +3 -3
- package/dist/form-elements/FormElementTextarea.js.map +1 -1
- package/dist/form-elements/FormElementTime.js +4 -4
- package/dist/form-elements/FormElementTime.js.map +1 -1
- package/dist/hooks/useInfiniteScrollDataLoad.d.ts +28 -0
- package/dist/hooks/useInfiniteScrollDataLoad.js +118 -0
- package/dist/hooks/useInfiniteScrollDataLoad.js.map +1 -0
- package/dist/hooks/useIsHovering.d.ts +5 -0
- package/dist/hooks/useIsHovering.js +13 -0
- package/dist/hooks/useIsHovering.js.map +1 -0
- package/dist/hooks/useLegacyElements.d.ts +16 -0
- package/dist/hooks/useLegacyElements.js +55 -0
- package/dist/hooks/useLegacyElements.js.map +1 -0
- package/dist/hooks/useQuery.d.ts +2 -0
- package/dist/hooks/useQuery.js +8 -0
- package/dist/hooks/useQuery.js.map +1 -0
- package/dist/hooks/useSubmissionIdIsValid.d.ts +4 -0
- package/dist/hooks/useSubmissionIdIsValid.js +21 -0
- package/dist/hooks/useSubmissionIdIsValid.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/services/defaultCoordinates.js +1 -1
- package/dist/services/defaultCoordinates.js.map +1 -1
- package/dist/services/generate-default-data.js +1 -1
- package/dist/services/generate-default-data.js.map +1 -1
- package/package.json +10 -3
- package/dist/components/AnnotationModal.js.map +0 -1
- package/dist/components/AutocompleteDropdown.js.map +0 -1
- package/dist/components/CopyToClipboardButton.js.map +0 -1
- package/dist/components/CustomisableButtonInner.js.map +0 -1
- package/dist/components/FormElementLabelContainer.js.map +0 -1
- package/dist/components/FormElementOptions.js.map +0 -1
- package/dist/components/LookupButton.js.map +0 -1
- package/dist/components/LookupNotification.js.map +0 -1
- package/dist/components/Modal.js.map +0 -1
- package/dist/components/OnLoading.js.map +0 -1
- package/dist/components/OneBlinkAppsErrorOriginalMessage.js.map +0 -1
- package/dist/components/OneBlinkFormElements.js.map +0 -1
- package/dist/components/PageFormElements.js.map +0 -1
- package/dist/components/ToggleAllCheckbox.js.map +0 -1
- package/dist/components/attachments/AttachmentStatus.js.map +0 -1
- package/dist/components/attachments/FileCard.js.map +0 -1
- package/dist/components/attachments/FileCardContent.js.map +0 -1
- package/dist/components/attachments/Files.js.map +0 -1
- package/dist/components/attachments/ImagePreviewUnavailable.js.map +0 -1
- package/dist/components/attachments/UploadingAttachment.js.map +0 -1
@@ -0,0 +1,118 @@
|
|
1
|
+
import * as React from 'react';
|
2
|
+
import useQuery from './useQuery';
|
3
|
+
export default function useInfiniteScrollDataLoad({ limit, debounceSearchMs, onDefaultFilters, onSearch, onValidateFilters, }) {
|
4
|
+
const query = useQuery();
|
5
|
+
const [{ forceReload, shouldDebounce, offset, filters }, setOffsetState] = React.useState(() => {
|
6
|
+
return {
|
7
|
+
forceReload: false,
|
8
|
+
shouldDebounce: true,
|
9
|
+
offset: 0,
|
10
|
+
filters: onDefaultFilters(query),
|
11
|
+
};
|
12
|
+
});
|
13
|
+
const onChangeFilters = React.useCallback((changeHandler, shouldDebounce) => {
|
14
|
+
setOffsetState((currentState) => ({
|
15
|
+
...currentState,
|
16
|
+
afterRefresh: false,
|
17
|
+
shouldDebounce,
|
18
|
+
offset: 0,
|
19
|
+
filters: changeHandler(currentState.filters),
|
20
|
+
}));
|
21
|
+
}, []);
|
22
|
+
const [{ isLoading, records, error, nextOffset }, setState] = React.useState({
|
23
|
+
isLoading: true,
|
24
|
+
records: [],
|
25
|
+
error: null,
|
26
|
+
nextOffset: 0,
|
27
|
+
});
|
28
|
+
const fetchRecords = React.useCallback(async (abortSignal) => {
|
29
|
+
if (onValidateFilters) {
|
30
|
+
const isValid = onValidateFilters(filters);
|
31
|
+
if (!isValid) {
|
32
|
+
return;
|
33
|
+
}
|
34
|
+
}
|
35
|
+
setState((currentState) => ({
|
36
|
+
...currentState,
|
37
|
+
error: null,
|
38
|
+
records: offset === 0 ? [] : currentState.records,
|
39
|
+
isLoading: true,
|
40
|
+
}));
|
41
|
+
try {
|
42
|
+
const result = await onSearch(filters, {
|
43
|
+
limit,
|
44
|
+
offset,
|
45
|
+
}, abortSignal);
|
46
|
+
setState((currentState) => ({
|
47
|
+
error: null,
|
48
|
+
records: [...currentState.records, ...result.records],
|
49
|
+
isLoading: false,
|
50
|
+
nextOffset: result.meta.nextOffset || 0,
|
51
|
+
}));
|
52
|
+
}
|
53
|
+
catch (error) {
|
54
|
+
if (abortSignal.aborted) {
|
55
|
+
return;
|
56
|
+
}
|
57
|
+
console.warn('An error occurred while fetching records', error);
|
58
|
+
setState((currentState) => ({
|
59
|
+
...currentState,
|
60
|
+
error: error,
|
61
|
+
isLoading: false,
|
62
|
+
}));
|
63
|
+
}
|
64
|
+
}, [onValidateFilters, filters, offset, onSearch, limit]);
|
65
|
+
React.useEffect(() => {
|
66
|
+
const controller = new AbortController();
|
67
|
+
const timeoutId = setTimeout(() => {
|
68
|
+
fetchRecords(controller.signal);
|
69
|
+
}, shouldDebounce ? debounceSearchMs || 0 : 0);
|
70
|
+
return () => {
|
71
|
+
clearTimeout(timeoutId);
|
72
|
+
controller.abort();
|
73
|
+
};
|
74
|
+
}, [debounceSearchMs, fetchRecords, shouldDebounce, forceReload]);
|
75
|
+
const onLoad = React.useCallback((newOffset) => {
|
76
|
+
setOffsetState((currentState) => {
|
77
|
+
return {
|
78
|
+
...currentState,
|
79
|
+
offset: typeof newOffset === 'number' ? newOffset : currentState.offset,
|
80
|
+
forceReload: !currentState.forceReload,
|
81
|
+
shouldDebounce: false,
|
82
|
+
};
|
83
|
+
});
|
84
|
+
}, []);
|
85
|
+
React.useEffect(() => {
|
86
|
+
const scrollEventListener = () => {
|
87
|
+
// Bails early if we have not fetched data yet and:
|
88
|
+
// - there's an error
|
89
|
+
// - it's already loading
|
90
|
+
// - there's nothing left to load
|
91
|
+
if (!document.body || error || isLoading || !nextOffset) {
|
92
|
+
return;
|
93
|
+
}
|
94
|
+
// Checks that the page has scrolled to the bottom
|
95
|
+
if (window.innerHeight + window.scrollY >= document.body.scrollHeight) {
|
96
|
+
onLoad(nextOffset);
|
97
|
+
}
|
98
|
+
};
|
99
|
+
// Binds our scroll event handler
|
100
|
+
window.addEventListener('scroll', scrollEventListener);
|
101
|
+
return () => {
|
102
|
+
window.removeEventListener('scroll', scrollEventListener);
|
103
|
+
};
|
104
|
+
}, [error, isLoading, nextOffset, onLoad]);
|
105
|
+
const onRefresh = React.useCallback(() => {
|
106
|
+
onLoad(0);
|
107
|
+
}, [onLoad]);
|
108
|
+
return {
|
109
|
+
isLoading,
|
110
|
+
loadError: error,
|
111
|
+
records,
|
112
|
+
onRefresh,
|
113
|
+
onTryAgain: onLoad,
|
114
|
+
filters,
|
115
|
+
onChangeFilters,
|
116
|
+
};
|
117
|
+
}
|
118
|
+
//# sourceMappingURL=useInfiniteScrollDataLoad.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"useInfiniteScrollDataLoad.js","sourceRoot":"","sources":["../../src/hooks/useInfiniteScrollDataLoad.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\n\nimport useQuery from './useQuery'\n\nexport type ChangeHandler<T> = (filters: T) => T\nexport type OnChangeFilters<T> = (\n changeHandler: ChangeHandler<T>,\n shouldDebounce: boolean,\n) => void\n\nexport default function useInfiniteScrollDataLoad<Filters, T>({\n limit,\n debounceSearchMs,\n onDefaultFilters,\n onSearch,\n onValidateFilters,\n}: {\n limit: number\n debounceSearchMs?: number\n onDefaultFilters: (query: ReturnType<typeof useQuery>) => Filters\n onSearch: (\n filters: Filters,\n paging: {\n limit: number\n offset: number\n },\n abortSignal: AbortSignal,\n ) => Promise<{\n records: T[]\n meta: {\n limit: number\n offset: number\n nextOffset?: number | undefined\n }\n }>\n onValidateFilters?: (filters: Filters) => boolean\n}) {\n const query = useQuery()\n\n const [{ forceReload, shouldDebounce, offset, filters }, setOffsetState] =\n React.useState<{\n forceReload: boolean\n shouldDebounce: boolean\n offset: number\n filters: Filters\n }>(() => {\n return {\n forceReload: false,\n shouldDebounce: true,\n offset: 0,\n filters: onDefaultFilters(query),\n }\n })\n\n const onChangeFilters = React.useCallback<OnChangeFilters<Filters>>(\n (changeHandler, shouldDebounce) => {\n setOffsetState((currentState) => ({\n ...currentState,\n afterRefresh: false,\n shouldDebounce,\n offset: 0,\n filters: changeHandler(currentState.filters),\n }))\n },\n [],\n )\n\n const [{ isLoading, records, error, nextOffset }, setState] = React.useState<{\n isLoading: boolean\n records: T[]\n error: Error | null\n nextOffset: number\n }>({\n isLoading: true,\n records: [],\n error: null,\n nextOffset: 0,\n })\n\n const fetchRecords = React.useCallback(\n async (abortSignal) => {\n if (onValidateFilters) {\n const isValid = onValidateFilters(filters)\n if (!isValid) {\n return\n }\n }\n\n setState((currentState) => ({\n ...currentState,\n error: null,\n records: offset === 0 ? [] : currentState.records,\n isLoading: true,\n }))\n try {\n const result = await onSearch(\n filters,\n {\n limit,\n offset,\n },\n abortSignal,\n )\n setState((currentState) => ({\n error: null,\n records: [...currentState.records, ...result.records],\n isLoading: false,\n nextOffset: result.meta.nextOffset || 0,\n }))\n } catch (error) {\n if (abortSignal.aborted) {\n return\n }\n console.warn('An error occurred while fetching records', error)\n setState((currentState) => ({\n ...currentState,\n error: error as Error,\n isLoading: false,\n }))\n }\n },\n [onValidateFilters, filters, offset, onSearch, limit],\n )\n\n React.useEffect(() => {\n const controller = new AbortController()\n const timeoutId = setTimeout(\n () => {\n fetchRecords(controller.signal)\n },\n shouldDebounce ? debounceSearchMs || 0 : 0,\n )\n return () => {\n clearTimeout(timeoutId)\n controller.abort()\n }\n }, [debounceSearchMs, fetchRecords, shouldDebounce, forceReload])\n\n const onLoad = React.useCallback((newOffset?: number) => {\n setOffsetState((currentState) => {\n return {\n ...currentState,\n offset: typeof newOffset === 'number' ? newOffset : currentState.offset,\n forceReload: !currentState.forceReload,\n shouldDebounce: false,\n }\n })\n }, [])\n\n React.useEffect(() => {\n const scrollEventListener = () => {\n // Bails early if we have not fetched data yet and:\n // - there's an error\n // - it's already loading\n // - there's nothing left to load\n if (!document.body || error || isLoading || !nextOffset) {\n return\n }\n\n // Checks that the page has scrolled to the bottom\n if (window.innerHeight + window.scrollY >= document.body.scrollHeight) {\n onLoad(nextOffset)\n }\n }\n // Binds our scroll event handler\n window.addEventListener('scroll', scrollEventListener)\n\n return () => {\n window.removeEventListener('scroll', scrollEventListener)\n }\n }, [error, isLoading, nextOffset, onLoad])\n\n const onRefresh = React.useCallback(() => {\n onLoad(0)\n }, [onLoad])\n\n return {\n isLoading,\n loadError: error,\n records,\n onRefresh,\n onTryAgain: onLoad,\n filters,\n onChangeFilters,\n }\n}\n"]}
|
@@ -0,0 +1,5 @@
|
|
1
|
+
import * as React from 'react';
|
2
|
+
declare const IsHoveringContext: React.Context<boolean>;
|
3
|
+
export declare const IsHoveringProvider: React.ForwardRefExoticComponent<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, keyof React.HTMLAttributes<HTMLDivElement> | "key"> & React.RefAttributes<HTMLDivElement>>;
|
4
|
+
export declare function useIsHovering(): boolean;
|
5
|
+
export default IsHoveringContext;
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import * as React from 'react';
|
2
|
+
import useBooleanState from './useBooleanState';
|
3
|
+
const IsHoveringContext = React.createContext(false);
|
4
|
+
export const IsHoveringProvider = React.forwardRef(function IsHoveringProvider(props, ref) {
|
5
|
+
const [isHovering, startHovering, stopHovering] = useBooleanState(false);
|
6
|
+
return (React.createElement(IsHoveringContext.Provider, { value: isHovering },
|
7
|
+
React.createElement("div", { ...props, onMouseEnter: startHovering, onMouseLeave: stopHovering, ref: ref })));
|
8
|
+
});
|
9
|
+
export function useIsHovering() {
|
10
|
+
return React.useContext(IsHoveringContext);
|
11
|
+
}
|
12
|
+
export default IsHoveringContext;
|
13
|
+
//# sourceMappingURL=useIsHovering.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"useIsHovering.js","sourceRoot":"","sources":["../../src/hooks/useIsHovering.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,eAAe,MAAM,mBAAmB,CAAA;AAE/C,MAAM,iBAAiB,GAAG,KAAK,CAAC,aAAa,CAAU,KAAK,CAAC,CAAA;AAE7D,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC,UAAU,CAGhD,SAAS,kBAAkB,CAAC,KAAkC,EAAE,GAAG;IACnE,MAAM,CAAC,UAAU,EAAE,aAAa,EAAE,YAAY,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;IAExE,OAAO,CACL,oBAAC,iBAAiB,CAAC,QAAQ,IAAC,KAAK,EAAE,UAAU;QAC3C,gCACM,KAAK,EACT,YAAY,EAAE,aAAa,EAC3B,YAAY,EAAE,YAAY,EAC1B,GAAG,EAAE,GAAG,GACR,CACyB,CAC9B,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,MAAM,UAAU,aAAa;IAC3B,OAAO,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAA;AAC5C,CAAC;AAED,eAAe,iBAAiB,CAAA","sourcesContent":["import * as React from 'react'\nimport useBooleanState from './useBooleanState'\n\nconst IsHoveringContext = React.createContext<boolean>(false)\n\nexport const IsHoveringProvider = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<'div'>\n>(function IsHoveringProvider(props: React.ComponentProps<'div'>, ref) {\n const [isHovering, startHovering, stopHovering] = useBooleanState(false)\n\n return (\n <IsHoveringContext.Provider value={isHovering}>\n <div\n {...props}\n onMouseEnter={startHovering}\n onMouseLeave={stopHovering}\n ref={ref}\n />\n </IsHoveringContext.Provider>\n )\n})\n\nexport function useIsHovering() {\n return React.useContext(IsHoveringContext)\n}\n\nexport default IsHoveringContext\n"]}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
import { FormTypes } from '@oneblink/types';
|
2
|
+
export declare const legacyNameRegex: RegExp;
|
3
|
+
declare const useLegacyFormElements: (formElements: FormTypes.FormElement[]) => {
|
4
|
+
formElementsUsingLegacyStorage: {
|
5
|
+
name: string;
|
6
|
+
label: string;
|
7
|
+
id: string;
|
8
|
+
}[];
|
9
|
+
formElementsUsingLegacyNames: {
|
10
|
+
name: string;
|
11
|
+
label: string;
|
12
|
+
id: string;
|
13
|
+
}[];
|
14
|
+
};
|
15
|
+
export default useLegacyFormElements;
|
16
|
+
export declare const useFormElementLegacyConfigMessage: (formElement: FormTypes.FormElement) => string | undefined;
|
@@ -0,0 +1,55 @@
|
|
1
|
+
import { useMemo } from 'react';
|
2
|
+
import { formElementsService, typeCastService } from '@oneblink/sdk-core';
|
3
|
+
export const legacyNameRegex = /[^a-zA-Z\d_-]/;
|
4
|
+
const checkStorageType = (element) => {
|
5
|
+
const storageElement = typeCastService.formElements.toStorageElement(element);
|
6
|
+
if (storageElement &&
|
7
|
+
(!storageElement.storageType || storageElement.storageType === 'legacy')) {
|
8
|
+
return {
|
9
|
+
label: storageElement.label,
|
10
|
+
name: storageElement.name,
|
11
|
+
id: storageElement.id,
|
12
|
+
};
|
13
|
+
}
|
14
|
+
};
|
15
|
+
const checkName = (element) => {
|
16
|
+
const namedElement = typeCastService.formElements.toNamedElement(element);
|
17
|
+
if (!!namedElement && legacyNameRegex.test(namedElement.name)) {
|
18
|
+
const formElementWithoutForm = typeCastService.formElements.toFormElementWithoutForm(namedElement);
|
19
|
+
return {
|
20
|
+
name: namedElement.name,
|
21
|
+
label: (formElementWithoutForm === null || formElementWithoutForm === void 0 ? void 0 : formElementWithoutForm.label) || 'Nested Form',
|
22
|
+
id: namedElement.id,
|
23
|
+
};
|
24
|
+
}
|
25
|
+
};
|
26
|
+
const useLegacyFormElements = (formElements) => {
|
27
|
+
return useMemo(() => {
|
28
|
+
const formElementsUsingLegacyStorage = [];
|
29
|
+
const formElementsUsingLegacyNames = [];
|
30
|
+
formElementsService.forEachFormElement(formElements || [], (element) => {
|
31
|
+
const legacyStorageType = checkStorageType(element);
|
32
|
+
if (legacyStorageType) {
|
33
|
+
formElementsUsingLegacyStorage.push(legacyStorageType);
|
34
|
+
}
|
35
|
+
const legacyName = checkName(element);
|
36
|
+
if (legacyName) {
|
37
|
+
formElementsUsingLegacyNames.push(legacyName);
|
38
|
+
}
|
39
|
+
});
|
40
|
+
return {
|
41
|
+
formElementsUsingLegacyStorage,
|
42
|
+
formElementsUsingLegacyNames,
|
43
|
+
};
|
44
|
+
}, [formElements]);
|
45
|
+
};
|
46
|
+
export default useLegacyFormElements;
|
47
|
+
const formElementLegacyConfigMessage = 'Element is using unsupported configuration';
|
48
|
+
export const useFormElementLegacyConfigMessage = (formElement) => {
|
49
|
+
return useMemo(() => {
|
50
|
+
if (checkStorageType(formElement) || checkName(formElement)) {
|
51
|
+
return formElementLegacyConfigMessage;
|
52
|
+
}
|
53
|
+
}, [formElement]);
|
54
|
+
};
|
55
|
+
//# sourceMappingURL=useLegacyElements.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"useLegacyElements.js","sourceRoot":"","sources":["../../src/hooks/useLegacyElements.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAGzE,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAAA;AAE9C,MAAM,gBAAgB,GAAG,CAAC,OAA8B,EAAE,EAAE;IAC1D,MAAM,cAAc,GAAG,eAAe,CAAC,YAAY,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAC7E,IACE,cAAc;QACd,CAAC,CAAC,cAAc,CAAC,WAAW,IAAI,cAAc,CAAC,WAAW,KAAK,QAAQ,CAAC,EACxE;QACA,OAAO;YACL,KAAK,EAAE,cAAc,CAAC,KAAK;YAC3B,IAAI,EAAE,cAAc,CAAC,IAAI;YACzB,EAAE,EAAE,cAAc,CAAC,EAAE;SACtB,CAAA;KACF;AACH,CAAC,CAAA;AAED,MAAM,SAAS,GAAG,CAAC,OAA8B,EAAE,EAAE;IACnD,MAAM,YAAY,GAChB,eAAe,CAAC,YAAY,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;IACtD,IAAI,CAAC,CAAC,YAAY,IAAI,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;QAC7D,MAAM,sBAAsB,GAC1B,eAAe,CAAC,YAAY,CAAC,wBAAwB,CAAC,YAAY,CAAC,CAAA;QACrE,OAAO;YACL,IAAI,EAAE,YAAY,CAAC,IAAI;YACvB,KAAK,EAAE,CAAA,sBAAsB,aAAtB,sBAAsB,uBAAtB,sBAAsB,CAAE,KAAK,KAAI,aAAa;YACrD,EAAE,EAAE,YAAY,CAAC,EAAE;SACpB,CAAA;KACF;AACH,CAAC,CAAA;AAED,MAAM,qBAAqB,GAAG,CAAC,YAAqC,EAAE,EAAE;IACtE,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,MAAM,8BAA8B,GAI/B,EAAE,CAAA;QACP,MAAM,4BAA4B,GAI7B,EAAE,CAAA;QACP,mBAAmB,CAAC,kBAAkB,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE;YACrE,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;YACnD,IAAI,iBAAiB,EAAE;gBACrB,8BAA8B,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;aACvD;YAED,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;YACrC,IAAI,UAAU,EAAE;gBACd,4BAA4B,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;aAC9C;QACH,CAAC,CAAC,CAAA;QACF,OAAO;YACL,8BAA8B;YAC9B,4BAA4B;SAC7B,CAAA;IACH,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAA;AACpB,CAAC,CAAA;AAED,eAAe,qBAAqB,CAAA;AAEpC,MAAM,8BAA8B,GAClC,4CAA4C,CAAA;AAC9C,MAAM,CAAC,MAAM,iCAAiC,GAAG,CAC/C,WAAkC,EAClC,EAAE;IACF,OAAO,OAAO,CAAqB,GAAG,EAAE;QACtC,IAAI,gBAAgB,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC,WAAW,CAAC,EAAE;YAC3D,OAAO,8BAA8B,CAAA;SACtC;IACH,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;AACnB,CAAC,CAAA","sourcesContent":["import { useMemo } from 'react'\nimport { formElementsService, typeCastService } from '@oneblink/sdk-core'\nimport { FormTypes } from '@oneblink/types'\n\nexport const legacyNameRegex = /[^a-zA-Z\\d_-]/\n\nconst checkStorageType = (element: FormTypes.FormElement) => {\n const storageElement = typeCastService.formElements.toStorageElement(element)\n if (\n storageElement &&\n (!storageElement.storageType || storageElement.storageType === 'legacy')\n ) {\n return {\n label: storageElement.label,\n name: storageElement.name,\n id: storageElement.id,\n }\n }\n}\n\nconst checkName = (element: FormTypes.FormElement) => {\n const namedElement: FormTypes.FormElementWithName | undefined =\n typeCastService.formElements.toNamedElement(element)\n if (!!namedElement && legacyNameRegex.test(namedElement.name)) {\n const formElementWithoutForm =\n typeCastService.formElements.toFormElementWithoutForm(namedElement)\n return {\n name: namedElement.name,\n label: formElementWithoutForm?.label || 'Nested Form',\n id: namedElement.id,\n }\n }\n}\n\nconst useLegacyFormElements = (formElements: FormTypes.FormElement[]) => {\n return useMemo(() => {\n const formElementsUsingLegacyStorage: Array<{\n name: string\n label: string\n id: string\n }> = []\n const formElementsUsingLegacyNames: Array<{\n name: string\n label: string\n id: string\n }> = []\n formElementsService.forEachFormElement(formElements || [], (element) => {\n const legacyStorageType = checkStorageType(element)\n if (legacyStorageType) {\n formElementsUsingLegacyStorage.push(legacyStorageType)\n }\n\n const legacyName = checkName(element)\n if (legacyName) {\n formElementsUsingLegacyNames.push(legacyName)\n }\n })\n return {\n formElementsUsingLegacyStorage,\n formElementsUsingLegacyNames,\n }\n }, [formElements])\n}\n\nexport default useLegacyFormElements\n\nconst formElementLegacyConfigMessage =\n 'Element is using unsupported configuration'\nexport const useFormElementLegacyConfigMessage = (\n formElement: FormTypes.FormElement,\n) => {\n return useMemo<string | undefined>(() => {\n if (checkStorageType(formElement) || checkName(formElement)) {\n return formElementLegacyConfigMessage\n }\n }, [formElement])\n}\n"]}
|
@@ -0,0 +1,8 @@
|
|
1
|
+
import * as React from 'react';
|
2
|
+
import querystring from 'query-string';
|
3
|
+
import { useLocation } from 'react-router-dom';
|
4
|
+
export default function useQuery() {
|
5
|
+
const location = useLocation();
|
6
|
+
return React.useMemo(() => querystring.parse(location.search.substring(1)), [location.search]);
|
7
|
+
}
|
8
|
+
//# sourceMappingURL=useQuery.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"useQuery.js","sourceRoot":"","sources":["../../src/hooks/useQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,WAA4B,MAAM,cAAc,CAAA;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,MAAM,CAAC,OAAO,UAAU,QAAQ;IAC9B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,OAAO,KAAK,CAAC,OAAO,CAClB,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EACrD,CAAC,QAAQ,CAAC,MAAM,CAAC,CAClB,CAAA;AACH,CAAC","sourcesContent":["import * as React from 'react'\nimport querystring, { ParsedQuery } from 'query-string'\nimport { useLocation } from 'react-router-dom'\nexport default function useQuery(): ParsedQuery {\n const location = useLocation()\n return React.useMemo(\n () => querystring.parse(location.search.substring(1)),\n [location.search],\n )\n}\n"]}
|
@@ -0,0 +1,4 @@
|
|
1
|
+
export declare const UUIDValidatorFn: (value: unknown) => boolean;
|
2
|
+
export declare const validateIsUUID: (value: unknown) => boolean;
|
3
|
+
declare const useSubmissionIdValidationMessage: (submissionId: string | undefined) => "Must be a valid Submission Id" | undefined;
|
4
|
+
export default useSubmissionIdValidationMessage;
|
@@ -0,0 +1,21 @@
|
|
1
|
+
import * as React from 'react';
|
2
|
+
const submissionIdInvalidMessage = 'Must be a valid Submission Id';
|
3
|
+
export const UUIDValidatorFn = (value) => {
|
4
|
+
if (value === null || value === undefined || value === '') {
|
5
|
+
return true;
|
6
|
+
}
|
7
|
+
if (typeof value !== 'string') {
|
8
|
+
return false;
|
9
|
+
}
|
10
|
+
return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);
|
11
|
+
};
|
12
|
+
export const validateIsUUID = (value) => !!value || !UUIDValidatorFn(value);
|
13
|
+
const useSubmissionIdValidationMessage = (submissionId) => {
|
14
|
+
return React.useMemo(() => {
|
15
|
+
if (!validateIsUUID(submissionId)) {
|
16
|
+
return submissionIdInvalidMessage;
|
17
|
+
}
|
18
|
+
}, [submissionId]);
|
19
|
+
};
|
20
|
+
export default useSubmissionIdValidationMessage;
|
21
|
+
//# sourceMappingURL=useSubmissionIdIsValid.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"useSubmissionIdIsValid.js","sourceRoot":"","sources":["../../src/hooks/useSubmissionIdIsValid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,MAAM,0BAA0B,GAAG,+BAA+B,CAAA;AAElE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,KAAc,EAAE,EAAE;IAChD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE;QACzD,OAAO,IAAI,CAAA;KACZ;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAC7B,OAAO,KAAK,CAAA;KACb;IAED,OAAO,4EAA4E,CAAC,IAAI,CACtF,KAAK,CACN,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAc,EAAE,EAAE,CAC/C,CAAC,CAAC,KAAK,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAA;AAEpC,MAAM,gCAAgC,GAAG,CAAC,YAAgC,EAAE,EAAE;IAC5E,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACxB,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE;YACjC,OAAO,0BAA0B,CAAA;SAClC;IACH,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAA;AACpB,CAAC,CAAA;AAED,eAAe,gCAAgC,CAAA","sourcesContent":["import * as React from 'react'\n\nconst submissionIdInvalidMessage = 'Must be a valid Submission Id'\n\nexport const UUIDValidatorFn = (value: unknown) => {\n if (value === null || value === undefined || value === '') {\n return true\n }\n\n if (typeof value !== 'string') {\n return false\n }\n\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(\n value,\n )\n}\n\nexport const validateIsUUID = (value: unknown) =>\n !!value || !UUIDValidatorFn(value)\n\nconst useSubmissionIdValidationMessage = (submissionId: string | undefined) => {\n return React.useMemo(() => {\n if (!validateIsUUID(submissionId)) {\n return submissionIdInvalidMessage\n }\n }, [submissionId])\n}\n\nexport default useSubmissionIdValidationMessage\n"]}
|
package/dist/index.d.ts
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
export { OneBlinkFormUncontrolled as OneBlinkForm, OneBlinkFormControlled, } from './OneBlinkForm';
|
2
2
|
export { default as OneBlinkAutoSaveForm } from './OneBlinkAutoSaveForm';
|
3
3
|
export { default as OneBlinkReadOnlyForm } from './OneBlinkReadOnlyForm';
|
4
|
+
export { default as OneBlinkFormStoreView } from './OneBlinkFormStoreView';
|
4
5
|
export { default as useIsMounted } from './hooks/useIsMounted';
|
5
6
|
export { default as useBooleanState } from './hooks/useBooleanState';
|
6
7
|
export { default as useNullableState } from './hooks/useNullableState';
|
@@ -11,3 +12,6 @@ export { default as useAuth, AuthContextProvider } from './hooks/useAuth';
|
|
11
12
|
export { default as useLoadDataState } from './hooks/useLoadDataState';
|
12
13
|
export { default as useFormSubmissionState } from './hooks/useFormSubmissionState';
|
13
14
|
export { default as useFormSubmissionAutoSaveState } from './hooks/useFormSubmissionAutoSaveState';
|
15
|
+
export { default as MuiV4CompatibleDatePicker } from './components/pickers/V4CompatibleDatePicker';
|
16
|
+
export { default as MuiV4CompatibleDateTimePicker } from './components/pickers/V4CompatibleDateTimePicker';
|
17
|
+
export { default as MuiV4CompatibleTimePicker } from './components/pickers/V4CompatibleTimePicker';
|
package/dist/index.js
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
export { OneBlinkFormUncontrolled as OneBlinkForm, OneBlinkFormControlled, } from './OneBlinkForm';
|
2
2
|
export { default as OneBlinkAutoSaveForm } from './OneBlinkAutoSaveForm';
|
3
3
|
export { default as OneBlinkReadOnlyForm } from './OneBlinkReadOnlyForm';
|
4
|
+
export { default as OneBlinkFormStoreView } from './OneBlinkFormStoreView';
|
4
5
|
export { default as useIsMounted } from './hooks/useIsMounted';
|
5
6
|
export { default as useBooleanState } from './hooks/useBooleanState';
|
6
7
|
export { default as useNullableState } from './hooks/useNullableState';
|
@@ -11,4 +12,7 @@ export { default as useAuth, AuthContextProvider } from './hooks/useAuth';
|
|
11
12
|
export { default as useLoadDataState } from './hooks/useLoadDataState';
|
12
13
|
export { default as useFormSubmissionState } from './hooks/useFormSubmissionState';
|
13
14
|
export { default as useFormSubmissionAutoSaveState } from './hooks/useFormSubmissionAutoSaveState';
|
15
|
+
export { default as MuiV4CompatibleDatePicker } from './components/pickers/V4CompatibleDatePicker';
|
16
|
+
export { default as MuiV4CompatibleDateTimePicker } from './components/pickers/V4CompatibleDateTimePicker';
|
17
|
+
export { default as MuiV4CompatibleTimePicker } from './components/pickers/V4CompatibleTimePicker';
|
14
18
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,IAAI,YAAY,EACxC,sBAAsB,GACvB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AACxE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AACxE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACpE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AACtE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAClF,OAAO,EACL,OAAO,IAAI,YAAY,EACvB,wBAAwB,GACzB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACzE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AACtE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAClF,OAAO,EAAE,OAAO,IAAI,8BAA8B,EAAE,MAAM,wCAAwC,CAAA","sourcesContent":["export {\n OneBlinkFormUncontrolled as OneBlinkForm,\n OneBlinkFormControlled,\n} from './OneBlinkForm'\nexport { default as OneBlinkAutoSaveForm } from './OneBlinkAutoSaveForm'\nexport { default as OneBlinkReadOnlyForm } from './OneBlinkReadOnlyForm'\nexport { default as useIsMounted } from './hooks/useIsMounted'\nexport { default as useBooleanState } from './hooks/useBooleanState'\nexport { default as useNullableState } from './hooks/useNullableState'\nexport { default as useClickOutsideElement } from './hooks/useClickOutsideElement'\nexport {\n default as useIsOffline,\n IsOfflineContextProvider,\n} from './hooks/useIsOffline'\nexport { default as useLogin } from './hooks/useLogin'\nexport { default as useAuth, AuthContextProvider } from './hooks/useAuth'\nexport { default as useLoadDataState } from './hooks/useLoadDataState'\nexport { default as useFormSubmissionState } from './hooks/useFormSubmissionState'\nexport { default as useFormSubmissionAutoSaveState } from './hooks/useFormSubmissionAutoSaveState'\n"]}
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,IAAI,YAAY,EACxC,sBAAsB,GACvB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AACxE,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AACxE,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,yBAAyB,CAAA;AAE1E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACpE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AACtE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAClF,OAAO,EACL,OAAO,IAAI,YAAY,EACvB,wBAAwB,GACzB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACzE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AACtE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAClF,OAAO,EAAE,OAAO,IAAI,8BAA8B,EAAE,MAAM,wCAAwC,CAAA;AAElG,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,6CAA6C,CAAA;AAClG,OAAO,EAAE,OAAO,IAAI,6BAA6B,EAAE,MAAM,iDAAiD,CAAA;AAC1G,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,6CAA6C,CAAA","sourcesContent":["export {\n OneBlinkFormUncontrolled as OneBlinkForm,\n OneBlinkFormControlled,\n} from './OneBlinkForm'\nexport { default as OneBlinkAutoSaveForm } from './OneBlinkAutoSaveForm'\nexport { default as OneBlinkReadOnlyForm } from './OneBlinkReadOnlyForm'\nexport { default as OneBlinkFormStoreView } from './OneBlinkFormStoreView'\n\nexport { default as useIsMounted } from './hooks/useIsMounted'\nexport { default as useBooleanState } from './hooks/useBooleanState'\nexport { default as useNullableState } from './hooks/useNullableState'\nexport { default as useClickOutsideElement } from './hooks/useClickOutsideElement'\nexport {\n default as useIsOffline,\n IsOfflineContextProvider,\n} from './hooks/useIsOffline'\nexport { default as useLogin } from './hooks/useLogin'\nexport { default as useAuth, AuthContextProvider } from './hooks/useAuth'\nexport { default as useLoadDataState } from './hooks/useLoadDataState'\nexport { default as useFormSubmissionState } from './hooks/useFormSubmissionState'\nexport { default as useFormSubmissionAutoSaveState } from './hooks/useFormSubmissionAutoSaveState'\n\nexport { default as MuiV4CompatibleDatePicker } from './components/pickers/V4CompatibleDatePicker'\nexport { default as MuiV4CompatibleDateTimePicker } from './components/pickers/V4CompatibleDateTimePicker'\nexport { default as MuiV4CompatibleTimePicker } from './components/pickers/V4CompatibleTimePicker'\n"]}
|
@@ -4,6 +4,6 @@ const auCoords = {
|
|
4
4
|
latitude: -33.861146727854496,
|
5
5
|
longitude: 151.20863228242192,
|
6
6
|
}; //CIRCULAR QUAY, SYDNEY
|
7
|
-
const coords = () => localisationService.
|
7
|
+
const coords = () => localisationService.getLocale() === 'en-US' ? usCoords : auCoords;
|
8
8
|
export default coords;
|
9
9
|
//# sourceMappingURL=defaultCoordinates.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"defaultCoordinates.js","sourceRoot":"","sources":["../../src/services/defaultCoordinates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAEpD,MAAM,QAAQ,GAAG,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,CAAC,iBAAiB,EAAE,CAAA,CAAC,kBAAkB;AAClG,MAAM,QAAQ,GAAG;IACf,QAAQ,EAAE,CAAC,kBAAkB;IAC7B,SAAS,EAAE,kBAAkB;CAC9B,CAAA,CAAC,uBAAuB;AACzB,MAAM,MAAM,GAAG,GAAG,EAAE,CAClB,mBAAmB,CAAC,
|
1
|
+
{"version":3,"file":"defaultCoordinates.js","sourceRoot":"","sources":["../../src/services/defaultCoordinates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAEpD,MAAM,QAAQ,GAAG,EAAE,QAAQ,EAAE,iBAAiB,EAAE,SAAS,EAAE,CAAC,iBAAiB,EAAE,CAAA,CAAC,kBAAkB;AAClG,MAAM,QAAQ,GAAG;IACf,QAAQ,EAAE,CAAC,kBAAkB;IAC7B,SAAS,EAAE,kBAAkB;CAC9B,CAAA,CAAC,uBAAuB;AACzB,MAAM,MAAM,GAAG,GAAG,EAAE,CAClB,mBAAmB,CAAC,SAAS,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAA;AAEnE,eAAe,MAAM,CAAA","sourcesContent":["import { localisationService } from '@oneblink/apps'\n\nconst usCoords = { latitude: 40.75764768718219, longitude: -73.98578582987093 } //TIMES SQUARE, NY\nconst auCoords = {\n latitude: -33.861146727854496,\n longitude: 151.20863228242192,\n} //CIRCULAR QUAY, SYDNEY\nconst coords = () =>\n localisationService.getLocale() === 'en-US' ? usCoords : auCoords\n\nexport default coords\n"]}
|
@@ -88,7 +88,7 @@ export function parseDateValue({ dateOnly, daysOffset, value, }) {
|
|
88
88
|
return;
|
89
89
|
}
|
90
90
|
if (dateOnly) {
|
91
|
-
const { year, month, day } = new Intl.DateTimeFormat(localisationService.
|
91
|
+
const { year, month, day } = new Intl.DateTimeFormat(localisationService.getLocale(), {
|
92
92
|
year: 'numeric',
|
93
93
|
month: '2-digit',
|
94
94
|
day: '2-digit',
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"generate-default-data.js","sourceRoot":"","sources":["../../src/services/generate-default-data.ts"],"names":[],"mappings":"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","sourcesContent":["import { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport { localisationService } from '@oneblink/apps'\nimport { FilesElementFile } from '../form-elements/FormElementFiles/legacy/FormElementFiles'\nimport { Attachment } from '../types/attachments'\nimport { FormSubmissionModel } from '../types/form'\nimport { checkIsUsingLegacyStorage, prepareNewAttachment } from './attachments'\nimport { dataUriToBlobSync } from './blob-utils'\nimport generateCivicaNameRecordElements from './generateCivicaNameRecordElements'\n\nfunction parseAttachment(value: unknown): Attachment | undefined {\n return parseUnknownAsRecord(value, (record) => {\n // Check for attachments that have not been uploaded yet\n if (\n record.data instanceof Blob &&\n typeof record.type === 'string' &&\n typeof record._id === 'string' &&\n typeof record.fileName === 'string' &&\n typeof record.isPrivate === 'boolean'\n ) {\n return record as Attachment\n }\n\n // Check for attachments that have been uploaded already\n if (\n typeof record.id === 'string' &&\n typeof record.fileName === 'string' &&\n typeof record.url === 'string' &&\n typeof record.contentType === 'string' &&\n typeof record.isPrivate === 'boolean' &&\n parseUnknownAsRecord(\n record.s3,\n (s3) =>\n typeof s3.bucket === 'string' &&\n typeof s3.key === 'string' &&\n typeof s3.region === 'string',\n )\n ) {\n return record as SubmissionTypes.FormSubmissionAttachment\n }\n })\n}\n\nfunction parseFile(\n element: FormTypes.FormElementBinaryStorage,\n value: unknown,\n): FilesElementFile | Attachment | undefined {\n return parseUnknownAsRecord(value, (record) => {\n const isUsingLegacyStorage = checkIsUsingLegacyStorage(element)\n if (\n record.type === undefined &&\n typeof record.fileName === 'string' &&\n typeof record.data === 'string'\n ) {\n if (isUsingLegacyStorage) {\n return record as FilesElementFile\n }\n\n const blob = dataUriToBlobSync(record.data)\n return prepareNewAttachment(blob, record.fileName, element)\n }\n\n if (!isUsingLegacyStorage) {\n return parseAttachment(record)\n }\n })\n}\n\nfunction parseFiles(\n element: FormTypes.FormElementBinaryStorage,\n value: unknown,\n): Array<Attachment | FilesElementFile> | undefined {\n if (Array.isArray(value)) {\n const files = value.reduce<Array<Attachment | FilesElementFile>>(\n (files, v) => {\n const file = parseFile(element, v)\n if (file) {\n files.push(file)\n }\n return files\n },\n [],\n )\n if (files.length) {\n return files\n }\n }\n}\n\nexport const generateDate = ({\n daysOffset,\n value,\n dateOnly,\n}: {\n daysOffset: number | undefined\n value: string\n dateOnly: boolean\n}): Date | undefined => {\n if (value === 'NOW') {\n const date = new Date()\n if (daysOffset === undefined) {\n return date\n } else {\n date.setDate(date.getDate() + daysOffset)\n return date\n }\n } else {\n const timestamp = Date.parse(value)\n if (!Number.isNaN(timestamp)) {\n const date = new Date(timestamp)\n if (dateOnly) {\n const offset = date.getTimezoneOffset()\n return new Date(date.getTime() + offset * 60000)\n }\n return date\n }\n }\n}\n\nexport function parseDateValue({\n dateOnly,\n daysOffset,\n value,\n}: {\n dateOnly: boolean\n daysOffset: number | undefined\n value: unknown\n}): string | undefined {\n if (typeof value !== 'string') {\n return\n }\n\n const date = generateDate({ daysOffset, value, dateOnly })\n if (!date) {\n return\n }\n\n if (dateOnly) {\n const { year, month, day } = new Intl.DateTimeFormat(\n localisationService.locale,\n {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n },\n )\n .formatToParts(date)\n .reduce(\n (memo, { type, value }) => ({\n ...memo,\n [type]: value,\n }),\n {\n year: '',\n month: '',\n day: '',\n },\n )\n // This is a workaround for an iOS 15 bug where the year was being returned as 2 digits: https://bugs.webkit.org/show_bug.cgi?id=230827\n const fixedYear = year.length === 2 ? date.getFullYear() : year\n return `${fixedYear}-${month}-${day}`\n } else {\n return date.toISOString()\n }\n}\n\nfunction parseStringValue(value: unknown) {\n if (typeof value === 'string' && !!value) {\n return value\n }\n return\n}\n\nfunction parseNumberValue(value: unknown) {\n if (typeof value === 'number' && !isNaN(value)) {\n return value\n }\n return\n}\n\nfunction parseStringArrayValue(value: unknown) {\n if (Array.isArray(value)) {\n return value.filter((val) => typeof val === 'string')\n }\n return\n}\n\nfunction parseUnknownAsRecord<T>(\n value: unknown,\n validate: (value: Record<string, unknown>) => T | undefined,\n): T | undefined {\n if (typeof value === 'object' && value !== null) {\n return validate(value as Record<string, unknown>)\n }\n}\n\nfunction parseFormSubmissionModel(\n elements: FormTypes.FormElement[],\n value: unknown,\n): FormSubmissionModel | undefined {\n return parseUnknownAsRecord(value, (record) => {\n return elements.reduce<FormSubmissionModel>((model, element) => {\n switch (element.type) {\n case 'section':\n case 'page': {\n const partialModel = parseFormSubmissionModel(element.elements, model)\n Object.assign(model, partialModel)\n break\n }\n default: {\n model[element.name] = parsePreFillData(element, record[element.name])\n }\n }\n\n return model\n }, record)\n })\n}\n\nfunction parsePreFillData(\n element: FormTypes.FormElement,\n value: unknown,\n): unknown {\n switch (element.type) {\n // If a form element is pre-filled and the storage type is not \"legacy\"\n // but the pre-fill data is in the format for the “legacy” storage type\n // (base64), the data should be uploaded to S3 and set in the submission\n // data. The base64 data should not be uploaded with the submission.\n // This is to cater for instances of pre-fill data being created before\n // a form element is updated to “public” or “private”.\n case 'camera':\n case 'draw': {\n if (!value) {\n break\n }\n if (checkIsUsingLegacyStorage(element)) {\n if (typeof value === 'string') {\n return value\n }\n } else if (typeof value === 'string') {\n const blob = dataUriToBlobSync(value)\n return prepareNewAttachment(blob, 'file', element)\n } else {\n return parseAttachment(value)\n }\n break\n }\n case 'files': {\n return parseFiles(element, value)\n }\n case 'compliance': {\n return parseUnknownAsRecord(value, (record) => {\n const selectedValue = parseStringValue(record.value)\n const notes = parseStringValue(record.notes)\n if (selectedValue) {\n return {\n value: selectedValue,\n notes,\n files: parseFiles(element, record.files),\n }\n }\n })\n }\n case 'time':\n case 'datetime':\n case 'date': {\n return parseDateValue({\n dateOnly: element.type === 'date',\n daysOffset: undefined,\n value,\n })\n }\n case 'bsb': {\n const text = parseStringValue(value)\n if (text?.match(/\\d{3}-\\d{3}/)) {\n return text\n }\n return\n }\n case 'text':\n case 'barcodeScanner':\n case 'email':\n case 'telephone':\n case 'textarea':\n case 'radio':\n case 'autocomplete': {\n return parseStringValue(value)\n }\n case 'select': {\n if (element.multi) {\n return parseStringArrayValue(value)\n } else {\n return parseStringValue(value)\n }\n }\n case 'checkboxes': {\n return parseStringArrayValue(value)\n }\n case 'calculation':\n case 'number': {\n return parseNumberValue(value)\n }\n case 'boolean': {\n return typeof value === 'boolean' ? value : false\n }\n case 'abn': {\n return parseUnknownAsRecord(value, (record) => {\n const hasABN = parseUnknownAsRecord(record.ABN, (ABN) => {\n if (parseStringValue(ABN.identifierValue)) {\n return true\n }\n })\n const hasMainName = parseUnknownAsRecord(\n record.mainName,\n (mainName) => {\n if (parseStringValue(mainName.organisationName)) {\n return true\n }\n },\n )\n if (hasABN && hasMainName) {\n return record\n }\n })\n }\n case 'pointAddress':\n case 'geoscapeAddress': {\n return parseUnknownAsRecord(value, (record) => {\n if (parseStringValue(record.addressId)) {\n return record\n }\n })\n }\n case 'civicaNameRecord': {\n return parseUnknownAsRecord(value, (record) => {\n if (\n parseStringValue(record.title) &&\n parseStringValue(record.familyName) &&\n Array.isArray(record.streetAddress)\n ) {\n return record\n }\n })\n }\n case 'civicaStreetName': {\n return parseUnknownAsRecord(value, (record) => {\n if (\n parseStringValue(record.formattedAccount) &&\n parseStringValue(record.formattedStreet)\n ) {\n return record\n }\n })\n }\n case 'form': {\n return parseFormSubmissionModel(element.elements || [], value)\n }\n case 'repeatableSet': {\n if (Array.isArray(element.elements) && Array.isArray(value)) {\n return value.reduce((entries, v) => {\n const entry = parseFormSubmissionModel(element.elements, v)\n if (entry) {\n entries.push(entry)\n }\n return entries\n }, [])\n }\n break\n }\n case 'location': {\n return parseUnknownAsRecord(value, (record) => {\n const latitude = parseNumberValue(record.latitude)\n const longitude = parseNumberValue(record.longitude)\n if (latitude !== undefined && longitude !== undefined) {\n return {\n latitude,\n longitude,\n zoom: parseNumberValue(record.zoom),\n }\n }\n })\n }\n case 'image':\n case 'html':\n case 'summary':\n case 'captcha':\n case 'heading':\n case 'infoPage':\n case 'page':\n case 'section': {\n return\n }\n default: {\n console.warn('Invalid element type used in prefill data', element)\n }\n }\n}\n\nexport default function generateDefaultData(\n elements: FormTypes.FormElement[],\n preFillData: FormSubmissionModel,\n): FormSubmissionModel {\n return elements.reduce<FormSubmissionModel>((m, el) => {\n if (el.type !== 'page' && el.type !== 'section' && el.name in m) {\n m[el.name] = parsePreFillData(el, m[el.name])\n return m\n }\n\n switch (el.type) {\n case 'checkboxes':\n case 'select':\n case 'autocomplete':\n case 'radio':\n case 'compliance': {\n const dv = getOptionsDefaultValue(el)\n if (dv) {\n if (el.type === 'compliance' && typeof dv === 'string') {\n m[el.name] = {\n value: dv,\n }\n } else {\n m[el.name] = dv\n }\n }\n break\n }\n case 'number': {\n if (typeof el.defaultValue === 'number') {\n m[el.name] = el.defaultValue\n } else if (el.isSlider) {\n m[el.name] = el.minNumber\n } else {\n m[el.name] = undefined\n }\n break\n }\n case 'section':\n case 'page': {\n if (Array.isArray(el.elements)) {\n Object.assign(m, generateDefaultData(el.elements, m))\n }\n break\n }\n case 'civicaNameRecord': {\n const nestedElements = generateCivicaNameRecordElements(el, [])\n m[el.name] = generateDefaultData(nestedElements, { ...el.defaultValue })\n break\n }\n case 'form': {\n if (Array.isArray(el.elements)) {\n m[el.name] = generateDefaultData(el.elements, {})\n }\n break\n }\n case 'repeatableSet': {\n if (\n Array.isArray(el.elements) &&\n typeof el.minSetEntries === 'number'\n ) {\n const minSetEntries = el.minSetEntries\n // add min number of entries by default\n const entries = []\n for (let index = 0; index < minSetEntries; index++) {\n const entry = generateDefaultData(el.elements, {})\n entries.push(entry)\n }\n m[el.name] = entries\n }\n break\n }\n case 'date':\n case 'datetime':\n case 'time': {\n if (el.defaultValue) {\n m[el.name] = parseDateValue({\n dateOnly: el.type === 'date',\n daysOffset: el.defaultValueDaysOffset,\n value: el.defaultValue,\n })\n }\n break\n }\n case 'geoscapeAddress':\n case 'pointAddress':\n case 'civicaStreetName':\n case 'camera':\n case 'abn':\n case 'bsb':\n case 'text':\n case 'barcodeScanner':\n case 'email':\n case 'telephone':\n case 'textarea':\n case 'files':\n case 'draw':\n case 'location': {\n if (el.defaultValue) {\n m[el.name] = el.defaultValue\n }\n break\n }\n case 'boolean': {\n m[el.name] = el.defaultValue || false\n break\n }\n case 'captcha':\n case 'heading':\n case 'html':\n case 'image':\n case 'infoPage':\n case 'calculation':\n case 'summary':\n break\n default: {\n console.warn('Default value is not supported for element type', el)\n }\n }\n\n return m\n }, Object.assign({}, preFillData))\n}\n\nconst getOptionsDefaultValue = (el: FormTypes.FormElementWithOptions) => {\n if (!el.defaultValue) {\n return\n }\n // Cater for dynamic options\n if (el.optionsType === 'DYNAMIC' || el.optionsType === 'FRESHDESK_FIELD') {\n return el.defaultValue\n }\n // Cater for multi-select and checkboxes\n else if ((el.type === 'select' && el.multi) || el.type === 'checkboxes') {\n if (Array.isArray(el.defaultValue) && el.defaultValue.length) {\n return el.defaultValue.reduce((optionValues: string[], optionId) => {\n const option = (el.options || []).find(\n (option) => option.id === optionId,\n )\n if (option) {\n optionValues.push(option.value)\n }\n return optionValues\n }, [])\n }\n } else {\n const option = (el.options || []).find(\n (option) => option.id === el.defaultValue,\n )\n if (option) {\n return option.value\n }\n }\n return\n}\n"]}
|
1
|
+
{"version":3,"file":"generate-default-data.js","sourceRoot":"","sources":["../../src/services/generate-default-data.ts"],"names":[],"mappings":"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","sourcesContent":["import { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport { localisationService } from '@oneblink/apps'\nimport { FilesElementFile } from '../form-elements/FormElementFiles/legacy/FormElementFiles'\nimport { Attachment } from '../types/attachments'\nimport { FormSubmissionModel } from '../types/form'\nimport { checkIsUsingLegacyStorage, prepareNewAttachment } from './attachments'\nimport { dataUriToBlobSync } from './blob-utils'\nimport generateCivicaNameRecordElements from './generateCivicaNameRecordElements'\n\nfunction parseAttachment(value: unknown): Attachment | undefined {\n return parseUnknownAsRecord(value, (record) => {\n // Check for attachments that have not been uploaded yet\n if (\n record.data instanceof Blob &&\n typeof record.type === 'string' &&\n typeof record._id === 'string' &&\n typeof record.fileName === 'string' &&\n typeof record.isPrivate === 'boolean'\n ) {\n return record as Attachment\n }\n\n // Check for attachments that have been uploaded already\n if (\n typeof record.id === 'string' &&\n typeof record.fileName === 'string' &&\n typeof record.url === 'string' &&\n typeof record.contentType === 'string' &&\n typeof record.isPrivate === 'boolean' &&\n parseUnknownAsRecord(\n record.s3,\n (s3) =>\n typeof s3.bucket === 'string' &&\n typeof s3.key === 'string' &&\n typeof s3.region === 'string',\n )\n ) {\n return record as SubmissionTypes.FormSubmissionAttachment\n }\n })\n}\n\nfunction parseFile(\n element: FormTypes.FormElementBinaryStorage,\n value: unknown,\n): FilesElementFile | Attachment | undefined {\n return parseUnknownAsRecord(value, (record) => {\n const isUsingLegacyStorage = checkIsUsingLegacyStorage(element)\n if (\n record.type === undefined &&\n typeof record.fileName === 'string' &&\n typeof record.data === 'string'\n ) {\n if (isUsingLegacyStorage) {\n return record as FilesElementFile\n }\n\n const blob = dataUriToBlobSync(record.data)\n return prepareNewAttachment(blob, record.fileName, element)\n }\n\n if (!isUsingLegacyStorage) {\n return parseAttachment(record)\n }\n })\n}\n\nfunction parseFiles(\n element: FormTypes.FormElementBinaryStorage,\n value: unknown,\n): Array<Attachment | FilesElementFile> | undefined {\n if (Array.isArray(value)) {\n const files = value.reduce<Array<Attachment | FilesElementFile>>(\n (files, v) => {\n const file = parseFile(element, v)\n if (file) {\n files.push(file)\n }\n return files\n },\n [],\n )\n if (files.length) {\n return files\n }\n }\n}\n\nexport const generateDate = ({\n daysOffset,\n value,\n dateOnly,\n}: {\n daysOffset: number | undefined\n value: string\n dateOnly: boolean\n}): Date | undefined => {\n if (value === 'NOW') {\n const date = new Date()\n if (daysOffset === undefined) {\n return date\n } else {\n date.setDate(date.getDate() + daysOffset)\n return date\n }\n } else {\n const timestamp = Date.parse(value)\n if (!Number.isNaN(timestamp)) {\n const date = new Date(timestamp)\n if (dateOnly) {\n const offset = date.getTimezoneOffset()\n return new Date(date.getTime() + offset * 60000)\n }\n return date\n }\n }\n}\n\nexport function parseDateValue({\n dateOnly,\n daysOffset,\n value,\n}: {\n dateOnly: boolean\n daysOffset: number | undefined\n value: unknown\n}): string | undefined {\n if (typeof value !== 'string') {\n return\n }\n\n const date = generateDate({ daysOffset, value, dateOnly })\n if (!date) {\n return\n }\n\n if (dateOnly) {\n const { year, month, day } = new Intl.DateTimeFormat(\n localisationService.getLocale(),\n {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n },\n )\n .formatToParts(date)\n .reduce(\n (memo, { type, value }) => ({\n ...memo,\n [type]: value,\n }),\n {\n year: '',\n month: '',\n day: '',\n },\n )\n // This is a workaround for an iOS 15 bug where the year was being returned as 2 digits: https://bugs.webkit.org/show_bug.cgi?id=230827\n const fixedYear = year.length === 2 ? date.getFullYear() : year\n return `${fixedYear}-${month}-${day}`\n } else {\n return date.toISOString()\n }\n}\n\nfunction parseStringValue(value: unknown) {\n if (typeof value === 'string' && !!value) {\n return value\n }\n return\n}\n\nfunction parseNumberValue(value: unknown) {\n if (typeof value === 'number' && !isNaN(value)) {\n return value\n }\n return\n}\n\nfunction parseStringArrayValue(value: unknown) {\n if (Array.isArray(value)) {\n return value.filter((val) => typeof val === 'string')\n }\n return\n}\n\nfunction parseUnknownAsRecord<T>(\n value: unknown,\n validate: (value: Record<string, unknown>) => T | undefined,\n): T | undefined {\n if (typeof value === 'object' && value !== null) {\n return validate(value as Record<string, unknown>)\n }\n}\n\nfunction parseFormSubmissionModel(\n elements: FormTypes.FormElement[],\n value: unknown,\n): FormSubmissionModel | undefined {\n return parseUnknownAsRecord(value, (record) => {\n return elements.reduce<FormSubmissionModel>((model, element) => {\n switch (element.type) {\n case 'section':\n case 'page': {\n const partialModel = parseFormSubmissionModel(element.elements, model)\n Object.assign(model, partialModel)\n break\n }\n default: {\n model[element.name] = parsePreFillData(element, record[element.name])\n }\n }\n\n return model\n }, record)\n })\n}\n\nfunction parsePreFillData(\n element: FormTypes.FormElement,\n value: unknown,\n): unknown {\n switch (element.type) {\n // If a form element is pre-filled and the storage type is not \"legacy\"\n // but the pre-fill data is in the format for the “legacy” storage type\n // (base64), the data should be uploaded to S3 and set in the submission\n // data. The base64 data should not be uploaded with the submission.\n // This is to cater for instances of pre-fill data being created before\n // a form element is updated to “public” or “private”.\n case 'camera':\n case 'draw': {\n if (!value) {\n break\n }\n if (checkIsUsingLegacyStorage(element)) {\n if (typeof value === 'string') {\n return value\n }\n } else if (typeof value === 'string') {\n const blob = dataUriToBlobSync(value)\n return prepareNewAttachment(blob, 'file', element)\n } else {\n return parseAttachment(value)\n }\n break\n }\n case 'files': {\n return parseFiles(element, value)\n }\n case 'compliance': {\n return parseUnknownAsRecord(value, (record) => {\n const selectedValue = parseStringValue(record.value)\n const notes = parseStringValue(record.notes)\n if (selectedValue) {\n return {\n value: selectedValue,\n notes,\n files: parseFiles(element, record.files),\n }\n }\n })\n }\n case 'time':\n case 'datetime':\n case 'date': {\n return parseDateValue({\n dateOnly: element.type === 'date',\n daysOffset: undefined,\n value,\n })\n }\n case 'bsb': {\n const text = parseStringValue(value)\n if (text?.match(/\\d{3}-\\d{3}/)) {\n return text\n }\n return\n }\n case 'text':\n case 'barcodeScanner':\n case 'email':\n case 'telephone':\n case 'textarea':\n case 'radio':\n case 'autocomplete': {\n return parseStringValue(value)\n }\n case 'select': {\n if (element.multi) {\n return parseStringArrayValue(value)\n } else {\n return parseStringValue(value)\n }\n }\n case 'checkboxes': {\n return parseStringArrayValue(value)\n }\n case 'calculation':\n case 'number': {\n return parseNumberValue(value)\n }\n case 'boolean': {\n return typeof value === 'boolean' ? value : false\n }\n case 'abn': {\n return parseUnknownAsRecord(value, (record) => {\n const hasABN = parseUnknownAsRecord(record.ABN, (ABN) => {\n if (parseStringValue(ABN.identifierValue)) {\n return true\n }\n })\n const hasMainName = parseUnknownAsRecord(\n record.mainName,\n (mainName) => {\n if (parseStringValue(mainName.organisationName)) {\n return true\n }\n },\n )\n if (hasABN && hasMainName) {\n return record\n }\n })\n }\n case 'pointAddress':\n case 'geoscapeAddress': {\n return parseUnknownAsRecord(value, (record) => {\n if (parseStringValue(record.addressId)) {\n return record\n }\n })\n }\n case 'civicaNameRecord': {\n return parseUnknownAsRecord(value, (record) => {\n if (\n parseStringValue(record.title) &&\n parseStringValue(record.familyName) &&\n Array.isArray(record.streetAddress)\n ) {\n return record\n }\n })\n }\n case 'civicaStreetName': {\n return parseUnknownAsRecord(value, (record) => {\n if (\n parseStringValue(record.formattedAccount) &&\n parseStringValue(record.formattedStreet)\n ) {\n return record\n }\n })\n }\n case 'form': {\n return parseFormSubmissionModel(element.elements || [], value)\n }\n case 'repeatableSet': {\n if (Array.isArray(element.elements) && Array.isArray(value)) {\n return value.reduce((entries, v) => {\n const entry = parseFormSubmissionModel(element.elements, v)\n if (entry) {\n entries.push(entry)\n }\n return entries\n }, [])\n }\n break\n }\n case 'location': {\n return parseUnknownAsRecord(value, (record) => {\n const latitude = parseNumberValue(record.latitude)\n const longitude = parseNumberValue(record.longitude)\n if (latitude !== undefined && longitude !== undefined) {\n return {\n latitude,\n longitude,\n zoom: parseNumberValue(record.zoom),\n }\n }\n })\n }\n case 'image':\n case 'html':\n case 'summary':\n case 'captcha':\n case 'heading':\n case 'infoPage':\n case 'page':\n case 'section': {\n return\n }\n default: {\n console.warn('Invalid element type used in prefill data', element)\n }\n }\n}\n\nexport default function generateDefaultData(\n elements: FormTypes.FormElement[],\n preFillData: FormSubmissionModel,\n): FormSubmissionModel {\n return elements.reduce<FormSubmissionModel>((m, el) => {\n if (el.type !== 'page' && el.type !== 'section' && el.name in m) {\n m[el.name] = parsePreFillData(el, m[el.name])\n return m\n }\n\n switch (el.type) {\n case 'checkboxes':\n case 'select':\n case 'autocomplete':\n case 'radio':\n case 'compliance': {\n const dv = getOptionsDefaultValue(el)\n if (dv) {\n if (el.type === 'compliance' && typeof dv === 'string') {\n m[el.name] = {\n value: dv,\n }\n } else {\n m[el.name] = dv\n }\n }\n break\n }\n case 'number': {\n if (typeof el.defaultValue === 'number') {\n m[el.name] = el.defaultValue\n } else if (el.isSlider) {\n m[el.name] = el.minNumber\n } else {\n m[el.name] = undefined\n }\n break\n }\n case 'section':\n case 'page': {\n if (Array.isArray(el.elements)) {\n Object.assign(m, generateDefaultData(el.elements, m))\n }\n break\n }\n case 'civicaNameRecord': {\n const nestedElements = generateCivicaNameRecordElements(el, [])\n m[el.name] = generateDefaultData(nestedElements, { ...el.defaultValue })\n break\n }\n case 'form': {\n if (Array.isArray(el.elements)) {\n m[el.name] = generateDefaultData(el.elements, {})\n }\n break\n }\n case 'repeatableSet': {\n if (\n Array.isArray(el.elements) &&\n typeof el.minSetEntries === 'number'\n ) {\n const minSetEntries = el.minSetEntries\n // add min number of entries by default\n const entries = []\n for (let index = 0; index < minSetEntries; index++) {\n const entry = generateDefaultData(el.elements, {})\n entries.push(entry)\n }\n m[el.name] = entries\n }\n break\n }\n case 'date':\n case 'datetime':\n case 'time': {\n if (el.defaultValue) {\n m[el.name] = parseDateValue({\n dateOnly: el.type === 'date',\n daysOffset: el.defaultValueDaysOffset,\n value: el.defaultValue,\n })\n }\n break\n }\n case 'geoscapeAddress':\n case 'pointAddress':\n case 'civicaStreetName':\n case 'camera':\n case 'abn':\n case 'bsb':\n case 'text':\n case 'barcodeScanner':\n case 'email':\n case 'telephone':\n case 'textarea':\n case 'files':\n case 'draw':\n case 'location': {\n if (el.defaultValue) {\n m[el.name] = el.defaultValue\n }\n break\n }\n case 'boolean': {\n m[el.name] = el.defaultValue || false\n break\n }\n case 'captcha':\n case 'heading':\n case 'html':\n case 'image':\n case 'infoPage':\n case 'calculation':\n case 'summary':\n break\n default: {\n console.warn('Default value is not supported for element type', el)\n }\n }\n\n return m\n }, Object.assign({}, preFillData))\n}\n\nconst getOptionsDefaultValue = (el: FormTypes.FormElementWithOptions) => {\n if (!el.defaultValue) {\n return\n }\n // Cater for dynamic options\n if (el.optionsType === 'DYNAMIC' || el.optionsType === 'FRESHDESK_FIELD') {\n return el.defaultValue\n }\n // Cater for multi-select and checkboxes\n else if ((el.type === 'select' && el.multi) || el.type === 'checkboxes') {\n if (Array.isArray(el.defaultValue) && el.defaultValue.length) {\n return el.defaultValue.reduce((optionValues: string[], optionId) => {\n const option = (el.options || []).find(\n (option) => option.id === optionId,\n )\n if (option) {\n optionValues.push(option.value)\n }\n return optionValues\n }, [])\n }\n } else {\n const option = (el.options || []).find(\n (option) => option.id === el.defaultValue,\n )\n if (option) {\n return option.value\n }\n }\n return\n}\n"]}
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "@oneblink/apps-react",
|
3
3
|
"description": "Helper functions for OneBlink apps in ReactJS.",
|
4
|
-
"version": "0.
|
4
|
+
"version": "1.0.0-beta.1",
|
5
5
|
"author": "OneBlink <developers@oneblink.io> (https://oneblink.io)",
|
6
6
|
"bugs": {
|
7
7
|
"url": "https://github.com/oneblink/apps-react/issues"
|
@@ -10,7 +10,11 @@
|
|
10
10
|
"@blinkmobile/geolocation": "^2.0.3",
|
11
11
|
"@emotion/react": "^11.9.0",
|
12
12
|
"@emotion/styled": "^11.8.1",
|
13
|
+
"@mui/icons-material": "^5.6.2",
|
14
|
+
"@mui/lab": "^5.0.0-alpha.79",
|
13
15
|
"@mui/material": "^5.6.1",
|
16
|
+
"@mui/styles": "^5.6.2",
|
17
|
+
"@mui/x-date-pickers": "^5.0.0-alpha.1",
|
14
18
|
"@oneblink/sdk-core": "^0.4.0",
|
15
19
|
"@react-google-maps/api": "2.7.0",
|
16
20
|
"blueimp-load-image": "^5.16.0",
|
@@ -21,6 +25,7 @@
|
|
21
25
|
"clsx": "^1.1.1",
|
22
26
|
"color": "^3.2.1",
|
23
27
|
"copy-to-clipboard": "^3.3.1",
|
28
|
+
"date-fns": "^2.28.0",
|
24
29
|
"escape-string-regexp": "^5.0.0",
|
25
30
|
"file-saver": "^2.0.5",
|
26
31
|
"flatpickr": "^4.6.11",
|
@@ -34,6 +39,7 @@
|
|
34
39
|
"react-google-recaptcha": "^2.1.0",
|
35
40
|
"react-input-mask": "^2.0.4",
|
36
41
|
"react-signature-canvas": "^1.0.5",
|
42
|
+
"react-table": "^7.7.0",
|
37
43
|
"sanitize-html": "^2.7.0",
|
38
44
|
"signature_pad": "^3.0.0-beta.4",
|
39
45
|
"uuid": "^8.3.2",
|
@@ -42,7 +48,7 @@
|
|
42
48
|
},
|
43
49
|
"devDependencies": {
|
44
50
|
"@babel/preset-env": "^7.16.11",
|
45
|
-
"@oneblink/apps": "0.
|
51
|
+
"@oneblink/apps": "^1.0.0-beta.1",
|
46
52
|
"@oneblink/release-cli": "^1.0.0",
|
47
53
|
"@oneblink/types": "github:oneblink/types",
|
48
54
|
"@types/blueimp-load-image": "^5.14.4",
|
@@ -58,6 +64,7 @@
|
|
58
64
|
"@types/react-input-mask": "^3.0.1",
|
59
65
|
"@types/react-router-dom": "^5.3.3",
|
60
66
|
"@types/react-signature-canvas": "^1.0.2",
|
67
|
+
"@types/react-table": "^7.7.11",
|
61
68
|
"@types/sanitize-html": "^2.6.2",
|
62
69
|
"@types/uuid": "^8.3.4",
|
63
70
|
"@types/xml2js": "^0.4.9",
|
@@ -92,7 +99,7 @@
|
|
92
99
|
"main": "./dist/index.js",
|
93
100
|
"module": "./dist/index.js",
|
94
101
|
"peerDependencies": {
|
95
|
-
"@oneblink/apps": "^0.
|
102
|
+
"@oneblink/apps": "^1.0.0 || ^1.0.0-beta.1",
|
96
103
|
"react": "^17.0.0",
|
97
104
|
"react-dom": "^17.0.0",
|
98
105
|
"react-router-dom": "^5.2.0"
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"AnnotationModal.js","sourceRoot":"","sources":["../../src/components/AnnotationModal.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from 'react'\nimport clsx from 'clsx'\nimport SignatureCanvas from 'react-signature-canvas'\n\nimport useBooleanState from '../hooks/useBooleanState'\nimport scrollingService from '../services/scrolling-service'\n\nconst annotationButtonColours = [\n '#000000',\n '#ffffff',\n '#f44336',\n '#e91e63',\n '#9c27b0',\n '#673ab7',\n '#3f51b5',\n '#2196f3',\n '#03a9f4',\n '#00bcd4',\n '#009688',\n '#4caf50',\n '#8bc34a',\n '#cddc39',\n '#ffee58',\n '#ffca28',\n '#ffa726',\n '#ff5722',\n]\n\nfunction AnnotationModal({\n imageSrc,\n onClose,\n onSave,\n}: {\n imageSrc: string\n onClose: () => void\n onSave: (newValue: string) => void\n}) {\n const annotationContentElementRef = React.useRef<HTMLDivElement>(null)\n const bmSignaturePadRef = React.useRef<HTMLDivElement>(null)\n const signatureCanvasRef = React.useRef<SignatureCanvas>(null)\n\n const [isDirty, setDirty] = useBooleanState(false)\n const [penColour, setPenColour] = React.useState(annotationButtonColours[0])\n\n const handleCancelAnnotation = React.useCallback(() => {\n if (signatureCanvasRef.current) {\n console.log('Clearing annotation...')\n signatureCanvasRef.current.clear()\n }\n onClose()\n }, [onClose])\n\n const handleSaveAnnotation = React.useCallback(() => {\n if (signatureCanvasRef.current) {\n onSave(signatureCanvasRef.current.toDataURL())\n }\n }, [onSave])\n\n // SETTING CANVAS FROM PASSED VALUE\n React.useEffect(() => {\n const annotationContentElement = annotationContentElementRef.current\n const bmSignaturePadElement = bmSignaturePadRef.current\n const signatureCanvas = signatureCanvasRef.current\n if (\n !annotationContentElement ||\n !bmSignaturePadElement ||\n !signatureCanvas ||\n typeof imageSrc !== 'string'\n ) {\n return\n }\n const canvasElement = signatureCanvas.getCanvas()\n\n // Disable scrolling to allow for smooth drawing\n scrollingService.disableScrolling()\n\n const maxWidth = annotationContentElement.clientWidth\n const maxHeight = annotationContentElement.clientHeight\n\n const i = new Image()\n i.onload = function () {\n const imageWidth = i.width\n const imageHeight = i.height\n let canvasWidth = imageWidth\n let canvasHeight = imageHeight\n\n if (imageWidth > maxWidth || imageHeight > maxHeight) {\n const widthRatio = maxWidth / imageWidth\n const heightRatio = maxHeight / imageHeight\n const ratio = Math.min(widthRatio, heightRatio)\n\n canvasWidth = ratio * imageWidth\n canvasHeight = ratio * imageHeight\n }\n\n bmSignaturePadElement.style.width = `${canvasWidth}px`\n bmSignaturePadElement.style.height = `${canvasHeight}px`\n bmSignaturePadElement.style.backgroundSize = 'cover'\n bmSignaturePadElement.style.backgroundImage = `url(${imageSrc})`\n canvasElement.width = canvasWidth\n canvasElement.height = canvasHeight\n }\n console.log('imageSrc', imageSrc)\n i.src = imageSrc\n\n return () => {\n scrollingService.enableScrolling()\n }\n }, [imageSrc])\n\n return (\n <div className=\"modal is-active\">\n <div className=\"modal-background-faded\"></div>\n <div className=\"ob-annotation\">\n <div className=\"ob-annotation__buttons ob-annotation__buttons-colours\">\n {annotationButtonColours.map((colour, index) => {\n return (\n <button\n key={index}\n type=\"button\"\n className={clsx(\n 'button ob-annotation__button ob-annotation__button-colour cypress-annotation-colour-button',\n {\n 'is-selected': penColour === colour,\n },\n )}\n onClick={() => setPenColour(colour)}\n style={{ backgroundColor: colour }}\n />\n )\n })}\n </div>\n <div\n ref={annotationContentElementRef}\n className=\"ob-annotation__content\"\n >\n <div\n ref={bmSignaturePadRef}\n className=\"ob-annotation__signature-pad cypress-annotation-signature-pad\"\n >\n <SignatureCanvas\n ref={signatureCanvasRef}\n clearOnResize={false}\n // @ts-expect-error ???\n onEnd={setDirty}\n penColor={penColour}\n />\n </div>\n </div>\n <div className=\"ob-annotation__buttons ob-annotation__buttons-actions\">\n <button\n type=\"button\"\n className=\"button is-light ob-button ob-annotation__button ob-annotation__button-action cypress-annotation-cancel-button\"\n onClick={handleCancelAnnotation}\n >\n Cancel\n </button>\n <button\n type=\"button\"\n className=\"button is-primary ob-button ob-annotation__button ob-annotation__button-action cypress-annotation-save-button\"\n disabled={!isDirty}\n onClick={handleSaveAnnotation}\n >\n Save\n </button>\n </div>\n </div>\n </div>\n )\n}\n\nexport default React.memo(AnnotationModal)\n"]}
|