@oneblink/apps-react 8.8.0 → 8.9.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/components/ArcGISWebMap.d.ts +6 -3
- package/dist/components/ArcGISWebMap.js +58 -14
- package/dist/components/ArcGISWebMap.js.map +1 -1
- package/dist/components/formStore/table/FormElementTableCell.js +13 -7
- package/dist/components/formStore/table/FormElementTableCell.js.map +1 -1
- package/dist/components/renderer/attachments/DropdownMenu.d.ts +2 -1
- package/dist/components/renderer/attachments/DropdownMenu.js +2 -2
- package/dist/components/renderer/attachments/DropdownMenu.js.map +1 -1
- package/dist/components/renderer/attachments/FileCard.d.ts +2 -1
- package/dist/components/renderer/attachments/FileCard.js +1 -1
- package/dist/components/renderer/attachments/FileCard.js.map +1 -1
- package/dist/form-elements/FormElementArcGISWebMap.d.ts +2 -1
- package/dist/form-elements/FormElementArcGISWebMap.js +127 -6
- package/dist/form-elements/FormElementArcGISWebMap.js.map +1 -1
- package/dist/form-elements/FormElementFile.d.ts +2 -1
- package/dist/form-elements/FormElementFile.js +9 -4
- package/dist/form-elements/FormElementFile.js.map +1 -1
- package/dist/services/attachments.d.ts +1 -1
- package/dist/services/attachments.js.map +1 -1
- package/dist/services/checkIfAttachmentsExist.js +13 -0
- package/dist/services/checkIfAttachmentsExist.js.map +1 -1
- package/dist/services/form-validation/extensions.d.ts +0 -3
- package/dist/services/form-validation/extensions.js +1 -7
- package/dist/services/form-validation/extensions.js.map +1 -1
- package/dist/services/form-validation/validateSubmission.js +22 -5
- package/dist/services/form-validation/validateSubmission.js.map +1 -1
- package/package.json +2 -2
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"DropdownMenu.js","sourceRoot":"","sources":["../../../../src/components/renderer/attachments/DropdownMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,OAAO,eAAe,MAAM,gCAAgC,CAAA;AAC5D,OAAO,sBAAsB,MAAM,uCAAuC,CAAA;AAC1E,OAAO,YAAY,MAAM,oBAAoB,CAAA;
|
1
|
+
{"version":3,"file":"DropdownMenu.js","sourceRoot":"","sources":["../../../../src/components/renderer/attachments/DropdownMenu.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAA;AAEvB,OAAO,eAAe,MAAM,gCAAgC,CAAA;AAC5D,OAAO,sBAAsB,MAAM,uCAAuC,CAAA;AAC1E,OAAO,YAAY,MAAM,oBAAoB,CAAA;AAW7C,MAAM,YAAY,GAAG,CAAC,EACpB,OAAO,EACP,QAAQ,EACR,UAAU,EACV,OAAO,EACP,aAAa,GACP,EAAE,EAAE;IACV,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACtC,MAAM,CAAC,aAAa,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;IAElE,sBAAsB,CACpB,WAAW,EACX,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACrB,IAAI,aAAa,EAAE,CAAC;YAClB,QAAQ,EAAE,CAAA;QACZ,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAC9B,CAAA;IAED,OAAO,CACL,6BACE,SAAS,EAAE,IAAI,CAAC,kCAAkC,EAAE;YAClD,WAAW,EAAE,aAAa;SAC3B,CAAC,EACF,GAAG,EAAE,WAAW;QAEhB,6BAAK,SAAS,EAAC,kBAAkB;YAC/B,gCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,uDAAuD,mBACnD,MAAM,mBACN,eAAe,EAC7B,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ;gBAE5C,oBAAC,YAAY,IAAC,SAAS,EAAC,qBAAqB,gBAAyB,CAC/D,CACL;QACN,6BAAK,SAAS,EAAC,eAAe,EAAC,IAAI,EAAC,MAAM;YACxC,6BAAK,SAAS,EAAC,kBAAkB;gBAC9B,OAAO,IAAI,CACV,2BACE,SAAS,EAAC,yCAAyC,EACnD,OAAO,EAAE,GAAG,EAAE;wBACZ,QAAQ,EAAE,CAAA;wBACV,OAAO,EAAE,CAAA;oBACX,CAAC,EACD,IAAI,EAAC,UAAU,YAGb,CACL;gBACA,UAAU,IAAI,CACb,2BACE,SAAS,EAAC,4CAA4C,EACtD,OAAO,EAAE,GAAG,EAAE;wBACZ,QAAQ,EAAE,CAAA;wBACV,UAAU,EAAE,CAAA;oBACd,CAAC,EACD,IAAI,EAAC,UAAU,eAGb,CACL;gBACA,aAAa,IAAI,CAChB,2BACE,IAAI,EAAE,aAAa,EACnB,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,YAAY,EAChB,SAAS,EAAC,wCAAwC,EAClD,KAAK,EAAE;wBACL,OAAO,EAAE,MAAM;wBACf,UAAU,EAAE,QAAQ;wBACpB,GAAG,EAAE,CAAC;qBACP,EACD,OAAO,EAAE,GAAG,EAAE;wBACZ,QAAQ,EAAE,CAAA;oBACZ,CAAC;oBAED,yCAAiB;oBACjB,oBAAC,YAAY,IAAC,SAAS,EAAC,YAAY,kBAA2B,CAC7D,CACL;gBACA,QAAQ,IAAI,CACX,2BACE,SAAS,EAAE,IAAI,CAAC,0CAA0C,EAAE;wBAC1D,8BAA8B,EAAE,OAAO,CAAC,QAAQ;qBACjD,CAAC,EACF,OAAO,EAAE,GAAG,EAAE;wBACZ,QAAQ,EAAE,CAAA;wBACV,QAAQ,EAAE,CAAA;oBACZ,CAAC,EACD,IAAI,EAAC,UAAU,aAGb,CACL,CACG,CACF,CACF,CACP,CAAA;AACH,CAAC,CAAA;AAED,eAAe,KAAK,CAAC,IAAI,CAAQ,YAAY,CAAC,CAAA","sourcesContent":["import * as React from 'react'\nimport clsx from 'clsx'\nimport { FormTypes } from '@oneblink/types'\nimport useBooleanState from '../../../hooks/useBooleanState'\nimport useClickOutsideElement from '../../../hooks/useClickOutsideElement'\nimport MaterialIcon from '../../MaterialIcon'\n\ninterface Props {\n element: FormTypes.FilesElement\n /** If set to `undefined`, the remove button will be hidden */\n onRemove: (() => void) | undefined\n onDownload?: () => void\n onRetry?: () => void\n attachmentUrl: string | null | undefined\n}\n\nconst DropdownMenu = ({\n element,\n onRemove,\n onDownload,\n onRetry,\n attachmentUrl,\n}: Props) => {\n const dropDownRef = React.useRef(null)\n const [isShowingMore, showMore, hideMore] = useBooleanState(false)\n\n useClickOutsideElement(\n dropDownRef,\n React.useCallback(() => {\n if (isShowingMore) {\n hideMore()\n }\n }, [hideMore, isShowingMore]),\n )\n\n return (\n <div\n className={clsx('dropdown is-right ob-files__menu', {\n 'is-active': isShowingMore,\n })}\n ref={dropDownRef}\n >\n <div className=\"dropdown-trigger\">\n <button\n type=\"button\"\n className=\"button ob-files__menu-button cypress-file-menu-button\"\n aria-haspopup=\"true\"\n aria-controls=\"dropdown-menu\"\n onClick={isShowingMore ? hideMore : showMore}\n >\n <MaterialIcon className=\"ob-files__menu-icon\">more_vert</MaterialIcon>\n </button>\n </div>\n <div className=\"dropdown-menu\" role=\"menu\">\n <div className=\"dropdown-content\">\n {onRetry && (\n <a\n className=\"dropdown-item cypress-file-retry-button\"\n onClick={() => {\n hideMore()\n onRetry()\n }}\n role=\"menuitem\"\n >\n Retry\n </a>\n )}\n {onDownload && (\n <a\n className=\"dropdown-item cypress-file-download-button\"\n onClick={() => {\n hideMore()\n onDownload()\n }}\n role=\"menuitem\"\n >\n Download\n </a>\n )}\n {attachmentUrl && (\n <a\n href={attachmentUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"dropdown-item cypress-file-open-button\"\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 2,\n }}\n onClick={() => {\n hideMore()\n }}\n >\n <span>Open</span>\n <MaterialIcon className=\"icon-small\">open_in_new</MaterialIcon>\n </a>\n )}\n {onRemove && (\n <a\n className={clsx('dropdown-item cypress-file-remove-button', {\n 'ob-files__menu-remove-hidden': element.readOnly,\n })}\n onClick={() => {\n hideMore()\n onRemove()\n }}\n role=\"menuitem\"\n >\n Remove\n </a>\n )}\n </div>\n </div>\n </div>\n )\n}\n\nexport default React.memo<Props>(DropdownMenu)\n"]}
|
@@ -10,7 +10,8 @@ type Props = {
|
|
10
10
|
isContentTypeImage?: boolean;
|
11
11
|
fileName: string;
|
12
12
|
attachmentUrl: string | undefined | null;
|
13
|
-
|
13
|
+
/** If set to `undefined`, the remove button will be hidden */
|
14
|
+
onRemove: (() => void) | undefined;
|
14
15
|
onDownload?: () => void;
|
15
16
|
onRetry?: () => void;
|
16
17
|
progress: undefined | number;
|
@@ -19,7 +19,7 @@ function FileCard({ element, isUploading, isUploadPaused, uploadErrorMessage, lo
|
|
19
19
|
return (React.createElement("div", { className: "column is-one-quarter-ob" },
|
20
20
|
React.createElement("div", { className: "ob-files__box" },
|
21
21
|
React.createElement("div", { className: "ob-files__content" },
|
22
|
-
React.createElement("a", { href: attachmentUrl || '', target: "_blank", rel: "noreferrer", className: "
|
22
|
+
React.createElement("a", { href: attachmentUrl || '', target: "_blank", rel: "noreferrer", className: "cypress-file-download-button", style: { pointerEvents: attachmentUrl ? 'auto' : 'none' } },
|
23
23
|
React.createElement(FileCardContent, { attachmentUrl: attachmentUrl, alt: `${element.label}: Attachment ${index + 1}`, isContentTypeImage: isContentTypeImage }))),
|
24
24
|
React.createElement(DropdownMenu, { element: element, onDownload: onDownload, onRetry: onRetry, onRemove: onRemove, attachmentUrl: attachmentUrl || '' }),
|
25
25
|
React.createElement("div", { className: "ob-files__file-name is-size-6" },
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"FileCard.js","sourceRoot":"","sources":["../../../../src/components/renderer/attachments/FileCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,eAAe,MAAM,mBAAmB,CAAA;AAC/C,OAAO,gBAAgB,MAAM,oBAAoB,CAAA;AACjD,OAAO,EACL,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,8CAA8C,CAAA;AACrD,OAAO,WAAW,MAAM,eAAe,CAAA;AACvC,OAAO,YAAY,MAAM,gBAAgB,CAAA;
|
1
|
+
{"version":3,"file":"FileCard.js","sourceRoot":"","sources":["../../../../src/components/renderer/attachments/FileCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,eAAe,MAAM,mBAAmB,CAAA;AAC/C,OAAO,gBAAgB,MAAM,oBAAoB,CAAA;AACjD,OAAO,EACL,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,8CAA8C,CAAA;AACrD,OAAO,WAAW,MAAM,eAAe,CAAA;AACvC,OAAO,YAAY,MAAM,gBAAgB,CAAA;AAoBzC,SAAS,QAAQ,CAAC,EAChB,OAAO,EACP,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,sBAAsB,EACtB,sBAAsB,EACtB,kBAAkB,EAClB,aAAa,EACb,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,KAAK,GACC;IACN,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACrC,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC7C,OAAO,IAAI,KAAK,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,wBAAwB,CAAC,CAAA;QACxE,CAAC;QACD,IAAI,CAAC,6BAA6B,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,CAAC;YACtD,OAAO,IAAI,KAAK,CAAC,GAAG,QAAQ,yBAAyB,CAAC,CAAA;QACxD,CAAC;QACD,IAAI,kBAAkB,EAAE,CAAC;YACvB,OAAO,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;QACtC,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAA;IAE3C,OAAO,CACL,6BAAK,SAAS,EAAC,0BAA0B;QACvC,6BAAK,SAAS,EAAC,eAAe;YAC5B,6BAAK,SAAS,EAAC,mBAAmB;gBAChC,2BACE,IAAI,EAAE,aAAa,IAAI,EAAE,EACzB,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,YAAY,EAChB,SAAS,EAAC,8BAA8B,EACxC,KAAK,EAAE,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE;oBAEzD,oBAAC,eAAe,IACd,aAAa,EAAE,aAAa,EAC5B,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,gBAAgB,KAAK,GAAG,CAAC,EAAE,EAChD,kBAAkB,EAAE,kBAAkB,GACtC,CACA,CACA;YACN,oBAAC,YAAY,IACX,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,aAAa,IAAI,EAAE,GAClC;YAEF,6BAAK,SAAS,EAAC,+BAA+B;gBAC5C,8BAAM,SAAS,EAAC,2BAA2B,IAAE,QAAQ,CAAQ;gBAC7D,oBAAC,gBAAgB,IACf,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,WAAW,EACxB,sBAAsB,EAAE,sBAAsB,EAC9C,sBAAsB,EAAE,sBAAsB,EAC9C,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,QAAQ,GAClB;gBACF,oBAAC,WAAW,IAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,WAAW,GAAI,CACzD,CACF,CACF,CACP,CAAA;AACH,CAAC;AAED,eAAe,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA","sourcesContent":["import * as React from 'react'\nimport { FormTypes } from '@oneblink/types'\nimport FileCardContent from './FileCardContent'\nimport AttachmentStatus from './AttachmentStatus'\nimport {\n checkFileNameIsValid,\n checkFileNameExtensionIsValid,\n} from '../../../services/form-validation/validators'\nimport ProgressBar from './ProgressBar'\nimport DropdownMenu from './DropdownMenu'\n\ntype Props = {\n element: FormTypes.FilesElement\n isUploading?: boolean\n isUploadPaused?: boolean\n uploadErrorMessage?: string\n loadAttachmentUrlError?: Error\n isLoadingAttachmentUrl?: boolean\n isContentTypeImage?: boolean\n fileName: string\n attachmentUrl: string | undefined | null\n /** If set to `undefined`, the remove button will be hidden */\n onRemove: (() => void) | undefined\n onDownload?: () => void\n onRetry?: () => void\n progress: undefined | number\n index: number\n}\n\nfunction FileCard({\n element,\n isUploading,\n isUploadPaused,\n uploadErrorMessage,\n loadAttachmentUrlError,\n isLoadingAttachmentUrl,\n isContentTypeImage,\n attachmentUrl,\n fileName,\n onDownload,\n onRemove,\n onRetry,\n progress,\n index,\n}: Props) {\n const uploadError = React.useMemo(() => {\n if (!checkFileNameIsValid(element, fileName)) {\n return new Error(`${fileName.split('.').pop()} files are not allowed`)\n }\n if (!checkFileNameExtensionIsValid(element, fileName)) {\n return new Error(`${fileName} must have an extension`)\n }\n if (uploadErrorMessage) {\n return new Error(uploadErrorMessage)\n }\n }, [element, fileName, uploadErrorMessage])\n\n return (\n <div className=\"column is-one-quarter-ob\">\n <div className=\"ob-files__box\">\n <div className=\"ob-files__content\">\n <a\n href={attachmentUrl || ''}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"cypress-file-download-button\"\n style={{ pointerEvents: attachmentUrl ? 'auto' : 'none' }}\n >\n <FileCardContent\n attachmentUrl={attachmentUrl}\n alt={`${element.label}: Attachment ${index + 1}`}\n isContentTypeImage={isContentTypeImage}\n />\n </a>\n </div>\n <DropdownMenu\n element={element}\n onDownload={onDownload}\n onRetry={onRetry}\n onRemove={onRemove}\n attachmentUrl={attachmentUrl || ''}\n />\n\n <div className=\"ob-files__file-name is-size-6\">\n <span className=\"ob-files__file-name-inner\">{fileName}</span>\n <AttachmentStatus\n isUploading={isUploading}\n isUploadPaused={isUploadPaused}\n uploadError={uploadError}\n loadAttachmentUrlError={loadAttachmentUrlError}\n isLoadingAttachmentUrl={isLoadingAttachmentUrl}\n attachmentUrl={attachmentUrl}\n progress={progress}\n />\n <ProgressBar progress={progress} isShowing={!!isUploading} />\n </div>\n </div>\n </div>\n )\n}\n\nexport default React.memo(FileCard)\n"]}
|
@@ -2,6 +2,7 @@ import React from 'react';
|
|
2
2
|
import { FormTypes } from '@oneblink/types';
|
3
3
|
import { ArcGISWebMapElementValue } from '@oneblink/types/typescript/arcgis';
|
4
4
|
import { FormElementValueChangeHandler, IsDirtyProps } from '../types/form';
|
5
|
+
export declare const defaultAutoSnapshotButtonLabel = "Finish Drawing";
|
5
6
|
type Props = {
|
6
7
|
id: string;
|
7
8
|
element: FormTypes.ArcGISWebMapElement;
|
@@ -11,6 +12,6 @@ type Props = {
|
|
11
12
|
validationMessage: string | undefined;
|
12
13
|
} & IsDirtyProps;
|
13
14
|
export declare function stringifyArcgisInput(value: ArcGISWebMapElementValue | undefined): string;
|
14
|
-
declare function FormElementArcGISWebMap({ id, element, value, onChange, displayValidationMessage, isDirty, validationMessage,
|
15
|
+
declare function FormElementArcGISWebMap({ id, element, value, onChange, displayValidationMessage, isDirty, validationMessage, }: Props): React.JSX.Element;
|
15
16
|
declare const _default: React.MemoExoticComponent<typeof FormElementArcGISWebMap>;
|
16
17
|
export default _default;
|
@@ -1,27 +1,148 @@
|
|
1
|
-
import React, { Suspense } from 'react';
|
1
|
+
import React, { Suspense, useCallback, useMemo, useRef, useState } from 'react';
|
2
2
|
import OnLoading from '../components/renderer/OnLoading';
|
3
3
|
import useIsOffline from '../hooks/useIsOffline';
|
4
4
|
import FormElementLabelContainer from '../components/renderer/FormElementLabelContainer';
|
5
5
|
import useElementAriaDescribedby from '../hooks/useElementAriaDescribedby';
|
6
6
|
import { LookupNotificationContext } from '../hooks/useLookupNotification';
|
7
7
|
import FormElementValidationMessage from '../components/renderer/FormElementValidationMessage';
|
8
|
+
import { urlToBlobAsync } from '../services/blob-utils';
|
9
|
+
import { generateErrorAttachment, prepareNewAttachment, } from '../services/attachments';
|
10
|
+
import clsx from 'clsx';
|
11
|
+
import FormElementFile from './FormElementFile';
|
12
|
+
import useAttachments from '../hooks/attachments/useAttachments';
|
13
|
+
import CustomisableButtonInner from '../components/renderer/CustomisableButtonInner';
|
14
|
+
import { generateArcGISAutomatedSnapshotFileName } from '../components/ArcGISWebMap';
|
8
15
|
const ArcGISWebMap = React.lazy(() => import('../components/ArcGISWebMap'));
|
16
|
+
export const defaultAutoSnapshotButtonLabel = 'Finish Drawing';
|
9
17
|
export function stringifyArcgisInput(value) {
|
10
18
|
return JSON.stringify(value === null || value === void 0 ? void 0 : value.userInput);
|
11
19
|
}
|
12
|
-
function FormElementArcGISWebMap({ id, element, value, onChange, displayValidationMessage, isDirty, validationMessage,
|
20
|
+
function FormElementArcGISWebMap({ id, element, value, onChange, displayValidationMessage, isDirty, validationMessage, }) {
|
21
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
13
22
|
const ariaDescribedby = useElementAriaDescribedby(id, element);
|
14
23
|
const isOffline = useIsOffline();
|
15
24
|
const { isLookingUp } = React.useContext(LookupNotificationContext);
|
16
25
|
const isDisplayingValidationMessage = (isDirty || displayValidationMessage) && !!validationMessage && !isLookingUp;
|
26
|
+
const filesElement = useMemo(() => {
|
27
|
+
return {
|
28
|
+
...element,
|
29
|
+
type: 'files',
|
30
|
+
restrictFileTypes: false,
|
31
|
+
};
|
32
|
+
}, [element]);
|
33
|
+
const handleChangeAttachments = useCallback((e, data) => {
|
34
|
+
onChange(element, {
|
35
|
+
value: (existingValue) => ({
|
36
|
+
...existingValue,
|
37
|
+
snapshotImages: (!data.value
|
38
|
+
? undefined
|
39
|
+
: Array.isArray(data.value)
|
40
|
+
? data.value
|
41
|
+
: data.value(existingValue === null || existingValue === void 0 ? void 0 : existingValue.snapshotImages)),
|
42
|
+
}),
|
43
|
+
});
|
44
|
+
}, [element, onChange]);
|
45
|
+
// An empty function to set is dirty because there are multiple ways
|
46
|
+
// to provide input into this component and we don't want any of them
|
47
|
+
// to trigger the validation message(s) for the other means of input.
|
48
|
+
const fakeSetIsDirty = useCallback(() => undefined, []);
|
49
|
+
const { removeAttachment, changeAttachment } = useAttachments(filesElement, handleChangeAttachments, fakeSetIsDirty);
|
50
|
+
const takeScreenShotRef = useRef();
|
51
|
+
const takeSnapshot = useCallback(async (fileName, view) => {
|
52
|
+
if (!takeScreenShotRef.current) {
|
53
|
+
return;
|
54
|
+
}
|
55
|
+
const takeScreenShot = takeScreenShotRef.current;
|
56
|
+
try {
|
57
|
+
const screenshot = await takeScreenShot(view);
|
58
|
+
const blob = await urlToBlobAsync(screenshot.dataUrl);
|
59
|
+
const snapshotImage = prepareNewAttachment(blob, fileName, element);
|
60
|
+
onChange(element, {
|
61
|
+
value: (existingValue) => ({
|
62
|
+
...existingValue,
|
63
|
+
snapshotImages: [
|
64
|
+
...((existingValue === null || existingValue === void 0 ? void 0 : existingValue.snapshotImages) || []),
|
65
|
+
snapshotImage,
|
66
|
+
],
|
67
|
+
}),
|
68
|
+
});
|
69
|
+
}
|
70
|
+
catch (error) {
|
71
|
+
console.warn('Error taking manual screenshot', error);
|
72
|
+
const snapshotImage = generateErrorAttachment(undefined, fileName, element, error.message);
|
73
|
+
onChange(element, {
|
74
|
+
value: (existingValue) => ({
|
75
|
+
...existingValue,
|
76
|
+
snapshotImages: [
|
77
|
+
...((existingValue === null || existingValue === void 0 ? void 0 : existingValue.snapshotImages) || []),
|
78
|
+
snapshotImage,
|
79
|
+
],
|
80
|
+
}),
|
81
|
+
});
|
82
|
+
}
|
83
|
+
}, [element, onChange]);
|
84
|
+
const [isTakingManualSnapshot, setIsTakingManualSnapshot] = useState(false);
|
85
|
+
const takeManualSnapshot = useCallback(async () => {
|
86
|
+
setIsTakingManualSnapshot(true);
|
87
|
+
await takeSnapshot(`${element.name}_manual.png`);
|
88
|
+
setIsTakingManualSnapshot(false);
|
89
|
+
}, [element.name, takeSnapshot]);
|
90
|
+
const automatedSnapshotFileName = useMemo(() => {
|
91
|
+
return generateArcGISAutomatedSnapshotFileName(element);
|
92
|
+
}, [element]);
|
93
|
+
const [isTakingAutoSnapshots, setIsTakingAutoSnapshots] = useState(false);
|
94
|
+
const takeAutoSnapshots = useCallback(async () => {
|
95
|
+
setIsTakingAutoSnapshots(true);
|
96
|
+
onChange(element, {
|
97
|
+
value: (existingValue) => {
|
98
|
+
var _a;
|
99
|
+
return ({
|
100
|
+
...existingValue,
|
101
|
+
snapshotImages: (_a = existingValue === null || existingValue === void 0 ? void 0 : existingValue.snapshotImages) === null || _a === void 0 ? void 0 : _a.filter((snapshotImage) => {
|
102
|
+
return snapshotImage.fileName !== automatedSnapshotFileName;
|
103
|
+
}),
|
104
|
+
});
|
105
|
+
},
|
106
|
+
});
|
107
|
+
for (const autoSnapshotView of element.autoSnapshotViews || []) {
|
108
|
+
await takeSnapshot(automatedSnapshotFileName, autoSnapshotView);
|
109
|
+
}
|
110
|
+
setIsTakingAutoSnapshots(false);
|
111
|
+
}, [automatedSnapshotFileName, element, onChange, takeSnapshot]);
|
17
112
|
return (React.createElement("div", { className: "cypress-arcgis-web-map" },
|
18
113
|
React.createElement(FormElementLabelContainer, { className: "ob-arcgis-web-map", id: id, element: element, required: element.required },
|
19
114
|
isOffline ? (React.createElement("figure", { className: "ob-figure" },
|
20
115
|
React.createElement("div", { className: "figure-content has-text-centered" },
|
21
|
-
React.createElement("h4", { className: "title is-4", role: "alert" }, "This Web Map is not available as you are currently offline")))) : (React.createElement(
|
22
|
-
|
23
|
-
|
24
|
-
|
116
|
+
React.createElement("h4", { className: "title is-4", role: "alert" }, "This Web Map is not available as you are currently offline")))) : (React.createElement("figure", { className: "ob-figure" },
|
117
|
+
React.createElement(Suspense, { fallback: React.createElement("div", { className: "arcgis-web-map figure-content-absolute-center" },
|
118
|
+
React.createElement(OnLoading, { small: true })) },
|
119
|
+
React.createElement(ArcGISWebMap, { element: element, id: id, "aria-describedby": ariaDescribedby, value: value, onChange: onChange, takeScreenShotRef: takeScreenShotRef })))),
|
120
|
+
(!!element.manualSnapshotsEnabled ||
|
121
|
+
!!((_a = element.autoSnapshotViews) === null || _a === void 0 ? void 0 : _a.length)) && (React.createElement("div", null,
|
122
|
+
React.createElement("div", { className: "buttons ob-buttons ob-arcgis-web-map__buttons" },
|
123
|
+
!!element.manualSnapshotsEnabled && (React.createElement("button", { type: "button", className: clsx('is-primary button ob-button ob-button__capture-snapshot ob-arcgis-web-map__button cypress-arcgis-web-map-capture-snapshot-button', {
|
124
|
+
'is-loading': isTakingManualSnapshot,
|
125
|
+
}), onClick: takeManualSnapshot, disabled: element.readOnly ||
|
126
|
+
isTakingManualSnapshot ||
|
127
|
+
(!!element.maxManualSnapshots &&
|
128
|
+
(((_c = (_b = value === null || value === void 0 ? void 0 : value.snapshotImages) === null || _b === void 0 ? void 0 : _b.filter((snapshotImage) => snapshotImage.fileName !== automatedSnapshotFileName)) === null || _c === void 0 ? void 0 : _c.length) || 0) >= element.maxManualSnapshots) },
|
129
|
+
React.createElement(CustomisableButtonInner, { label: ((_d = element.manualSnapshotButton) === null || _d === void 0 ? void 0 : _d.label) || 'Capture Image', icon: (_e = element.manualSnapshotButton) === null || _e === void 0 ? void 0 : _e.icon }))),
|
130
|
+
!!((_f = element.autoSnapshotViews) === null || _f === void 0 ? void 0 : _f.length) && (React.createElement("button", { type: "button", className: clsx('is-primary button ob-button ob-button__finish-drawing ob-arcgis-web-map__button cypress-arcgis-web-map-finish-drawing-button', {
|
131
|
+
'is-loading': isTakingAutoSnapshots,
|
132
|
+
}), onClick: takeAutoSnapshots, disabled: element.readOnly ||
|
133
|
+
isTakingAutoSnapshots ||
|
134
|
+
((_g = value === null || value === void 0 ? void 0 : value.snapshotImages) === null || _g === void 0 ? void 0 : _g.some((snapshotImage) => snapshotImage.fileName === automatedSnapshotFileName)) },
|
135
|
+
React.createElement(CustomisableButtonInner, { label: ((_h = element.autoSnapshotButton) === null || _h === void 0 ? void 0 : _h.label) ||
|
136
|
+
defaultAutoSnapshotButtonLabel, icon: (_j = element.autoSnapshotButton) === null || _j === void 0 ? void 0 : _j.icon })))))),
|
137
|
+
!!((_k = value === null || value === void 0 ? void 0 : value.snapshotImages) === null || _k === void 0 ? void 0 : _k.length) && (React.createElement("div", { className: "control cypress-files-control has-margin-top-9" },
|
138
|
+
React.createElement("div", { className: "columns is-multiline ob-columns-container" }, value.snapshotImages.map((snapshotImage, index, snapshotImages) => {
|
139
|
+
const attachment = snapshotImage;
|
140
|
+
return (React.createElement(FormElementFile, { key: attachment.type ? attachment._id : attachment.id, element: filesElement, onRemove: snapshotImage.fileName !== automatedSnapshotFileName
|
141
|
+
? removeAttachment
|
142
|
+
: undefined, file: attachment, onChange: changeAttachment, disableUpload: !!element.maxManualSnapshots &&
|
143
|
+
snapshotImages.filter((snapshotImage) => snapshotImage.fileName !==
|
144
|
+
automatedSnapshotFileName).length > element.maxManualSnapshots, index: index }));
|
145
|
+
})))),
|
25
146
|
isDisplayingValidationMessage && (React.createElement(FormElementValidationMessage, { message: validationMessage })))));
|
26
147
|
}
|
27
148
|
export default React.memo(FormElementArcGISWebMap);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"FormElementArcGISWebMap.js","sourceRoot":"","sources":["../../src/form-elements/FormElementArcGISWebMap.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEvC,OAAO,SAAS,MAAM,kCAAkC,CAAA;AACxD,OAAO,YAAY,MAAM,uBAAuB,CAAA;AAChD,OAAO,yBAAyB,MAAM,kDAAkD,CAAA;AACxF,OAAO,yBAAyB,MAAM,oCAAoC,CAAA;AAG1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAC1E,OAAO,4BAA4B,MAAM,qDAAqD,CAAA;AAC9F,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAA;AAW3E,MAAM,UAAU,oBAAoB,CAClC,KAA2C;IAE3C,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,SAAS,CAAC,CAAA;AACzC,CAAC;AAED,SAAS,uBAAuB,CAAC,EAC/B,EAAE,EACF,OAAO,EACP,KAAK,EACL,QAAQ,EACR,wBAAwB,EACxB,OAAO,EACP,iBAAiB,EACjB,UAAU,GACJ;IACN,MAAM,eAAe,GAAG,yBAAyB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IAC9D,MAAM,SAAS,GAAG,YAAY,EAAE,CAAA;IAChC,MAAM,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,yBAAyB,CAAC,CAAA;IACnE,MAAM,6BAA6B,GACjC,CAAC,OAAO,IAAI,wBAAwB,CAAC,IAAI,CAAC,CAAC,iBAAiB,IAAI,CAAC,WAAW,CAAA;IAE9E,OAAO,CACL,6BAAK,SAAS,EAAC,wBAAwB;QACrC,oBAAC,yBAAyB,IACxB,SAAS,EAAC,mBAAmB,EAC7B,EAAE,EAAE,EAAE,EACN,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAEzB,SAAS,CAAC,CAAC,CAAC,CACX,gCAAQ,SAAS,EAAC,WAAW;gBAC3B,6BAAK,SAAS,EAAC,kCAAkC;oBAC/C,4BAAI,SAAS,EAAC,YAAY,EAAC,IAAI,EAAC,OAAO,iEAElC,CACD,CACC,CACV,CAAC,CAAC,CAAC,CACF,oBAAC,QAAQ,IACP,QAAQ,EACN;oBACE,oBAAC,SAAS,OAAG;oBACb,6BAAK,SAAS,EAAC,gBAAgB,GAAG,CACjC;gBAGL,oBAAC,YAAY,IACX,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,EAAE,sBACY,eAAe,EACjC,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,GACtB,CACO,CACZ;YACA,6BAA6B,IAAI,CAChC,oBAAC,4BAA4B,IAAC,OAAO,EAAE,iBAAiB,GAAI,CAC7D,CACyB,CACxB,CACP,CAAA;AACH,CAAC;AAED,eAAe,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA","sourcesContent":["import React, { Suspense } from 'react'\nimport { FormTypes } from '@oneblink/types'\nimport OnLoading from '../components/renderer/OnLoading'\nimport useIsOffline from '../hooks/useIsOffline'\nimport FormElementLabelContainer from '../components/renderer/FormElementLabelContainer'\nimport useElementAriaDescribedby from '../hooks/useElementAriaDescribedby'\nimport { ArcGISWebMapElementValue } from '@oneblink/types/typescript/arcgis'\nimport { FormElementValueChangeHandler, IsDirtyProps } from '../types/form'\nimport { LookupNotificationContext } from '../hooks/useLookupNotification'\nimport FormElementValidationMessage from '../components/renderer/FormElementValidationMessage'\nconst ArcGISWebMap = React.lazy(() => import('../components/ArcGISWebMap'))\n\ntype Props = {\n id: string\n element: FormTypes.ArcGISWebMapElement\n value: ArcGISWebMapElementValue | undefined\n onChange: FormElementValueChangeHandler<ArcGISWebMapElementValue>\n displayValidationMessage: boolean\n validationMessage: string | undefined\n} & IsDirtyProps\n\nexport function stringifyArcgisInput(\n value: ArcGISWebMapElementValue | undefined,\n) {\n return JSON.stringify(value?.userInput)\n}\n\nfunction FormElementArcGISWebMap({\n id,\n element,\n value,\n onChange,\n displayValidationMessage,\n isDirty,\n validationMessage,\n setIsDirty,\n}: Props) {\n const ariaDescribedby = useElementAriaDescribedby(id, element)\n const isOffline = useIsOffline()\n const { isLookingUp } = React.useContext(LookupNotificationContext)\n const isDisplayingValidationMessage =\n (isDirty || displayValidationMessage) && !!validationMessage && !isLookingUp\n\n return (\n <div className=\"cypress-arcgis-web-map\">\n <FormElementLabelContainer\n className=\"ob-arcgis-web-map\"\n id={id}\n element={element}\n required={element.required}\n >\n {isOffline ? (\n <figure className=\"ob-figure\">\n <div className=\"figure-content has-text-centered\">\n <h4 className=\"title is-4\" role=\"alert\">\n This Web Map is not available as you are currently offline\n </h4>\n </div>\n </figure>\n ) : (\n <Suspense\n fallback={\n <>\n <OnLoading />\n <div className=\"arcgis-web-map\" />\n </>\n }\n >\n <ArcGISWebMap\n element={element}\n id={id}\n aria-describedby={ariaDescribedby}\n value={value}\n onChange={onChange}\n setIsDirty={setIsDirty}\n />\n </Suspense>\n )}\n {isDisplayingValidationMessage && (\n <FormElementValidationMessage message={validationMessage} />\n )}\n </FormElementLabelContainer>\n </div>\n )\n}\n\nexport default React.memo(FormElementArcGISWebMap)\n"]}
|
1
|
+
{"version":3,"file":"FormElementArcGISWebMap.js","sourceRoot":"","sources":["../../src/form-elements/FormElementArcGISWebMap.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { Suspense, useCallback, useMemo, useRef, useState } from 'react'\nimport { ArcGISTypes, FormTypes, SubmissionTypes } from '@oneblink/types'\nimport OnLoading from '../components/renderer/OnLoading'\nimport useIsOffline from '../hooks/useIsOffline'\nimport FormElementLabelContainer from '../components/renderer/FormElementLabelContainer'\nimport useElementAriaDescribedby from '../hooks/useElementAriaDescribedby'\nimport { ArcGISWebMapElementValue } from '@oneblink/types/typescript/arcgis'\nimport { FormElementValueChangeHandler, IsDirtyProps } from '../types/form'\nimport { LookupNotificationContext } from '../hooks/useLookupNotification'\nimport FormElementValidationMessage from '../components/renderer/FormElementValidationMessage'\nimport { urlToBlobAsync } from '../services/blob-utils'\nimport {\n generateErrorAttachment,\n prepareNewAttachment,\n} from '../services/attachments'\nimport clsx from 'clsx'\nimport { attachmentsService } from '@oneblink/apps'\nimport FormElementFile from './FormElementFile'\nimport useAttachments from '../hooks/attachments/useAttachments'\nimport CustomisableButtonInner from '../components/renderer/CustomisableButtonInner'\nimport { generateArcGISAutomatedSnapshotFileName } from '../components/ArcGISWebMap'\n\nconst ArcGISWebMap = React.lazy(() => import('../components/ArcGISWebMap'))\nexport const defaultAutoSnapshotButtonLabel = 'Finish Drawing'\n\ntype Props = {\n id: string\n element: FormTypes.ArcGISWebMapElement\n value: ArcGISWebMapElementValue | undefined\n onChange: FormElementValueChangeHandler<ArcGISWebMapElementValue>\n displayValidationMessage: boolean\n validationMessage: string | undefined\n} & IsDirtyProps\n\nexport function stringifyArcgisInput(\n value: ArcGISWebMapElementValue | undefined,\n) {\n return JSON.stringify(value?.userInput)\n}\n\nfunction FormElementArcGISWebMap({\n id,\n element,\n value,\n onChange,\n displayValidationMessage,\n isDirty,\n validationMessage,\n}: Props) {\n const ariaDescribedby = useElementAriaDescribedby(id, element)\n const isOffline = useIsOffline()\n const { isLookingUp } = React.useContext(LookupNotificationContext)\n const isDisplayingValidationMessage =\n (isDirty || displayValidationMessage) && !!validationMessage && !isLookingUp\n\n const filesElement = useMemo<FormTypes.FilesElement>(() => {\n return {\n ...element,\n type: 'files',\n restrictFileTypes: false,\n }\n }, [element])\n\n const handleChangeAttachments = useCallback<\n FormElementValueChangeHandler<attachmentsService.Attachment[]>\n >(\n (e, data) => {\n onChange(element, {\n value: (existingValue) => ({\n ...existingValue,\n snapshotImages: (!data.value\n ? undefined\n : Array.isArray(data.value)\n ? data.value\n : data.value(\n existingValue?.snapshotImages,\n )) as SubmissionTypes.FormSubmissionAttachment[],\n }),\n })\n },\n [element, onChange],\n )\n\n // An empty function to set is dirty because there are multiple ways\n // to provide input into this component and we don't want any of them\n // to trigger the validation message(s) for the other means of input.\n const fakeSetIsDirty = useCallback(() => undefined, [])\n const { removeAttachment, changeAttachment } = useAttachments(\n filesElement,\n handleChangeAttachments,\n fakeSetIsDirty,\n )\n\n const takeScreenShotRef = useRef<\n (view?: ArcGISTypes.ArcGISWebMapElementValue['view']) => Promise<{\n dataUrl: string\n }>\n >()\n\n const takeSnapshot = useCallback(\n async (\n fileName: string,\n view?: ArcGISTypes.ArcGISWebMapElementValue['view'],\n ) => {\n if (!takeScreenShotRef.current) {\n return\n }\n const takeScreenShot = takeScreenShotRef.current\n\n try {\n const screenshot = await takeScreenShot(view)\n const blob = await urlToBlobAsync(screenshot.dataUrl)\n const snapshotImage: unknown = prepareNewAttachment(\n blob,\n fileName,\n element,\n )\n onChange(element, {\n value: (existingValue) => ({\n ...existingValue,\n snapshotImages: [\n ...(existingValue?.snapshotImages || []),\n snapshotImage as SubmissionTypes.FormSubmissionAttachment,\n ],\n }),\n })\n } catch (error) {\n console.warn('Error taking manual screenshot', error)\n const snapshotImage: unknown = generateErrorAttachment(\n undefined,\n fileName,\n element,\n (error as Error).message,\n )\n onChange(element, {\n value: (existingValue) => ({\n ...existingValue,\n snapshotImages: [\n ...(existingValue?.snapshotImages || []),\n snapshotImage as SubmissionTypes.FormSubmissionAttachment,\n ],\n }),\n })\n }\n },\n [element, onChange],\n )\n\n const [isTakingManualSnapshot, setIsTakingManualSnapshot] = useState(false)\n const takeManualSnapshot = useCallback(async () => {\n setIsTakingManualSnapshot(true)\n await takeSnapshot(`${element.name}_manual.png`)\n setIsTakingManualSnapshot(false)\n }, [element.name, takeSnapshot])\n\n const automatedSnapshotFileName = useMemo(() => {\n return generateArcGISAutomatedSnapshotFileName(element)\n }, [element])\n const [isTakingAutoSnapshots, setIsTakingAutoSnapshots] = useState(false)\n const takeAutoSnapshots = useCallback(async () => {\n setIsTakingAutoSnapshots(true)\n onChange(element, {\n value: (existingValue) => ({\n ...existingValue,\n snapshotImages: existingValue?.snapshotImages?.filter(\n (snapshotImage) => {\n return snapshotImage.fileName !== automatedSnapshotFileName\n },\n ),\n }),\n })\n for (const autoSnapshotView of element.autoSnapshotViews || []) {\n await takeSnapshot(automatedSnapshotFileName, autoSnapshotView)\n }\n setIsTakingAutoSnapshots(false)\n }, [automatedSnapshotFileName, element, onChange, takeSnapshot])\n\n return (\n <div className=\"cypress-arcgis-web-map\">\n <FormElementLabelContainer\n className=\"ob-arcgis-web-map\"\n id={id}\n element={element}\n required={element.required}\n >\n {isOffline ? (\n <figure className=\"ob-figure\">\n <div className=\"figure-content has-text-centered\">\n <h4 className=\"title is-4\" role=\"alert\">\n This Web Map is not available as you are currently offline\n </h4>\n </div>\n </figure>\n ) : (\n <figure className=\"ob-figure\">\n <Suspense\n fallback={\n <div className=\"arcgis-web-map figure-content-absolute-center\">\n <OnLoading small />\n </div>\n }\n >\n <ArcGISWebMap\n element={element}\n id={id}\n aria-describedby={ariaDescribedby}\n value={value}\n onChange={onChange}\n takeScreenShotRef={takeScreenShotRef}\n />\n </Suspense>\n </figure>\n )}\n\n {(!!element.manualSnapshotsEnabled ||\n !!element.autoSnapshotViews?.length) && (\n <div>\n <div className=\"buttons ob-buttons ob-arcgis-web-map__buttons\">\n {!!element.manualSnapshotsEnabled && (\n <button\n type=\"button\"\n className={clsx(\n 'is-primary button ob-button ob-button__capture-snapshot ob-arcgis-web-map__button cypress-arcgis-web-map-capture-snapshot-button',\n {\n 'is-loading': isTakingManualSnapshot,\n },\n )}\n onClick={takeManualSnapshot}\n disabled={\n element.readOnly ||\n isTakingManualSnapshot ||\n (!!element.maxManualSnapshots &&\n (value?.snapshotImages?.filter(\n (snapshotImage) =>\n snapshotImage.fileName !== automatedSnapshotFileName,\n )?.length || 0) >= element.maxManualSnapshots)\n }\n >\n <CustomisableButtonInner\n label={\n element.manualSnapshotButton?.label || 'Capture Image'\n }\n icon={element.manualSnapshotButton?.icon}\n />\n </button>\n )}\n\n {!!element.autoSnapshotViews?.length && (\n <button\n type=\"button\"\n className={clsx(\n 'is-primary button ob-button ob-button__finish-drawing ob-arcgis-web-map__button cypress-arcgis-web-map-finish-drawing-button',\n {\n 'is-loading': isTakingAutoSnapshots,\n },\n )}\n onClick={takeAutoSnapshots}\n disabled={\n element.readOnly ||\n isTakingAutoSnapshots ||\n value?.snapshotImages?.some(\n (snapshotImage) =>\n snapshotImage.fileName === automatedSnapshotFileName,\n )\n }\n >\n <CustomisableButtonInner\n label={\n element.autoSnapshotButton?.label ||\n defaultAutoSnapshotButtonLabel\n }\n icon={element.autoSnapshotButton?.icon}\n />\n </button>\n )}\n </div>\n </div>\n )}\n\n {!!value?.snapshotImages?.length && (\n <div className=\"control cypress-files-control has-margin-top-9\">\n <div className=\"columns is-multiline ob-columns-container\">\n {value.snapshotImages.map(\n (snapshotImage, index, snapshotImages) => {\n const attachment =\n snapshotImage as unknown as attachmentsService.Attachment\n return (\n <FormElementFile\n key={attachment.type ? attachment._id : attachment.id}\n element={filesElement}\n onRemove={\n snapshotImage.fileName !== automatedSnapshotFileName\n ? removeAttachment\n : undefined\n }\n file={attachment}\n onChange={changeAttachment}\n disableUpload={\n !!element.maxManualSnapshots &&\n snapshotImages.filter(\n (snapshotImage) =>\n snapshotImage.fileName !==\n automatedSnapshotFileName,\n ).length > element.maxManualSnapshots\n }\n index={index}\n />\n )\n },\n )}\n </div>\n </div>\n )}\n\n {isDisplayingValidationMessage && (\n <FormElementValidationMessage message={validationMessage} />\n )}\n </FormElementLabelContainer>\n </div>\n )\n}\n\nexport default React.memo(FormElementArcGISWebMap)\n"]}
|
@@ -4,7 +4,8 @@ import { OnChange } from '../hooks/attachments/useAttachment';
|
|
4
4
|
import { attachmentsService } from '@oneblink/apps';
|
5
5
|
type Props = {
|
6
6
|
element: FormTypes.FilesElement;
|
7
|
-
|
7
|
+
/** If set to `undefined`, the remove button will be hidden */
|
8
|
+
onRemove: ((id: string) => void) | undefined;
|
8
9
|
file: attachmentsService.Attachment;
|
9
10
|
disableUpload: boolean;
|
10
11
|
onChange: OnChange;
|
@@ -4,11 +4,16 @@ import useAttachment from '../hooks/attachments/useAttachment';
|
|
4
4
|
import FileCard from '../components/renderer/attachments/FileCard';
|
5
5
|
const FormElementFile = ({ element, onRemove, file, onChange, disableUpload, index, }) => {
|
6
6
|
const attachmentResult = useAttachment(file, element, onChange, disableUpload);
|
7
|
-
const handleRemove = React.
|
8
|
-
if (!
|
9
|
-
return
|
7
|
+
const handleRemove = React.useMemo(() => {
|
8
|
+
if (!onRemove) {
|
9
|
+
return;
|
10
10
|
}
|
11
|
-
return
|
11
|
+
return () => {
|
12
|
+
if (!file.type) {
|
13
|
+
return onRemove(file.id);
|
14
|
+
}
|
15
|
+
return onRemove(file._id);
|
16
|
+
};
|
12
17
|
}, [file, onRemove]);
|
13
18
|
const handleDownload = React.useCallback(async () => {
|
14
19
|
await downloadAttachment(file);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"FormElementFile.js","sourceRoot":"","sources":["../../src/form-elements/FormElementFile.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,kBAAkB,MAAM,2BAA2B,CAAA;AAE1D,OAAO,aAA2B,MAAM,oCAAoC,CAAA;AAC5E,OAAO,QAAQ,MAAM,6CAA6C,CAAA;
|
1
|
+
{"version":3,"file":"FormElementFile.js","sourceRoot":"","sources":["../../src/form-elements/FormElementFile.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,kBAAkB,MAAM,2BAA2B,CAAA;AAE1D,OAAO,aAA2B,MAAM,oCAAoC,CAAA;AAC5E,OAAO,QAAQ,MAAM,6CAA6C,CAAA;AAalE,MAAM,eAAe,GAAG,CAAC,EACvB,OAAO,EACP,QAAQ,EACR,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,KAAK,GACC,EAAE,EAAE;IACV,MAAM,gBAAgB,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAA;IAE9E,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACtC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAM;QACR,CAAC;QACD,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YAC1B,CAAC;YACD,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC3B,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;IAEpB,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;QAClD,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAA;IAChC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IAEV,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACrC,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACvC,OAAO,GAAG,EAAE;gBACV,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE;oBACjB,IAAI,EAAE,KAAK;oBACX,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,SAAS,EAAE,IAAI,CAAC,SAAS;iBAC1B,CAAC,CAAA;YACJ,CAAC,CAAA;QACH,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;IAEpB,OAAO,CACL,oBAAC,QAAQ,IACP,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,gBAAgB,CAAC,WAAW,EACzC,cAAc,EAAE,aAAa,EAC7B,kBAAkB,EAAE,gBAAgB,CAAC,kBAAkB,EACvD,sBAAsB,EAAE,gBAAgB,CAAC,sBAAsB,EAC/D,sBAAsB,EAAE,gBAAgB,CAAC,sBAAsB,EAC/D,aAAa,EAAE,gBAAgB,CAAC,aAAa,EAC7C,kBAAkB,EAAE,gBAAgB,CAAC,kBAAkB,EACvD,QAAQ,EAAE,IAAI,CAAC,QAAQ,EACvB,UAAU,EAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,EACrE,QAAQ,EAAE,YAAY,EACtB,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,EACnC,KAAK,EAAE,KAAK,GACZ,CACH,CAAA;AACH,CAAC,CAAA;AAED,eAAe,KAAK,CAAC,IAAI,CAAQ,eAAe,CAAC,CAAA","sourcesContent":["import * as React from 'react'\nimport downloadAttachment from '../services/download-file'\nimport { FormTypes } from '@oneblink/types'\nimport useAttachment, { OnChange } from '../hooks/attachments/useAttachment'\nimport FileCard from '../components/renderer/attachments/FileCard'\nimport { attachmentsService } from '@oneblink/apps'\n\ntype Props = {\n element: FormTypes.FilesElement\n /** If set to `undefined`, the remove button will be hidden */\n onRemove: ((id: string) => void) | undefined\n file: attachmentsService.Attachment\n disableUpload: boolean\n onChange: OnChange\n index: number\n}\n\nconst FormElementFile = ({\n element,\n onRemove,\n file,\n onChange,\n disableUpload,\n index,\n}: Props) => {\n const attachmentResult = useAttachment(file, element, onChange, disableUpload)\n\n const handleRemove = React.useMemo(() => {\n if (!onRemove) {\n return\n }\n return () => {\n if (!file.type) {\n return onRemove(file.id)\n }\n return onRemove(file._id)\n }\n }, [file, onRemove])\n\n const handleDownload = React.useCallback(async () => {\n await downloadAttachment(file)\n }, [file])\n\n const handleRetry = React.useMemo(() => {\n if (file.type === 'ERROR' && file.data) {\n return () => {\n onChange(file._id, {\n type: 'NEW',\n _id: file._id,\n data: file.data,\n fileName: file.fileName,\n isPrivate: file.isPrivate,\n })\n }\n }\n }, [file, onChange])\n\n return (\n <FileCard\n element={element}\n isUploading={attachmentResult.isUploading}\n isUploadPaused={disableUpload}\n uploadErrorMessage={attachmentResult.uploadErrorMessage}\n loadAttachmentUrlError={attachmentResult.loadAttachmentUrlError}\n isLoadingAttachmentUrl={attachmentResult.isLoadingAttachmentUrl}\n attachmentUrl={attachmentResult.attachmentUrl}\n isContentTypeImage={attachmentResult.isContentTypeImage}\n fileName={file.fileName}\n onDownload={attachmentResult.canDownload ? handleDownload : undefined}\n onRemove={handleRemove}\n onRetry={handleRetry}\n progress={attachmentResult.progress}\n index={index}\n />\n )\n}\n\nexport default React.memo<Props>(FormElementFile)\n"]}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { FormTypes } from '@oneblink/types';
|
2
2
|
import { attachmentsService } from '@oneblink/apps';
|
3
|
-
export declare function generateErrorAttachment(blob: Blob, fileName: string, element: FormTypes.FormElementBinaryStorage, errorMessage: string, errorType?: attachmentsService.AttachmentError['errorType']): attachmentsService.AttachmentError;
|
3
|
+
export declare function generateErrorAttachment(blob: Blob | undefined, fileName: string, element: FormTypes.FormElementBinaryStorage, errorMessage: string, errorType?: attachmentsService.AttachmentError['errorType']): attachmentsService.AttachmentError;
|
4
4
|
export declare function prepareNewAttachment(blob: Blob, fileName: string, element: FormTypes.FormElementBinaryStorage): attachmentsService.AttachmentNew;
|
5
5
|
export declare function checkIfContentTypeIsImage(contentType: string): boolean;
|
6
6
|
export declare function parseFilesAsAttachmentsLegacy(files: File[], onAnnotateCanvas?: (file: File, canvas: HTMLCanvasElement) => void): Promise<Array<{
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/services/attachments.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAsB,MAAM,gBAAgB,CAAA;AAC3D,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAA;AACjC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAE/D,MAAM,UAAU,uBAAuB,CACrC,
|
1
|
+
{"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/services/attachments.ts"],"names":[],"mappings":"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","sourcesContent":["import { FormTypes } from '@oneblink/types'\nimport { Sentry, attachmentsService } from '@oneblink/apps'\nimport { v4 as uuid } from 'uuid'\nimport { blobToCanvas, getBlobOrientation } from './blob-utils'\n\nexport function generateErrorAttachment(\n blob: Blob | undefined,\n fileName: string,\n element: FormTypes.FormElementBinaryStorage,\n errorMessage: string,\n errorType?: attachmentsService.AttachmentError['errorType'],\n): attachmentsService.AttachmentError {\n return {\n _id: uuid(),\n data: blob,\n fileName,\n isPrivate: element.storageType !== 'public',\n type: 'ERROR',\n errorMessage,\n errorType,\n }\n}\n\nexport function prepareNewAttachment(\n blob: Blob,\n fileName: string,\n element: FormTypes.FormElementBinaryStorage,\n): attachmentsService.AttachmentNew {\n return {\n _id: uuid(),\n data: blob,\n fileName,\n isPrivate: element.storageType !== 'public',\n type: 'NEW',\n }\n}\n\nexport function checkIfContentTypeIsImage(contentType: string) {\n return contentType.indexOf('image/') === 0\n}\n\nexport async function parseFilesAsAttachmentsLegacy(\n files: File[],\n onAnnotateCanvas?: (file: File, canvas: HTMLCanvasElement) => void,\n): Promise<Array<{ data: string; fileName: string; contentType: string }>> {\n const attachments: Array<{\n data: string\n fileName: string\n contentType: string\n }> = []\n\n for (const file of files) {\n const result = await correctFileOrientation(file, onAnnotateCanvas)\n\n if (result instanceof Blob) {\n console.log('Attempting to parse File as attachment', file)\n\n const base64data = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = function () {\n resolve(reader.result as string)\n }\n reader.onerror = function () {\n reject(new Error('Could not read file from data url'))\n }\n reader.readAsDataURL(file)\n })\n\n attachments.push({\n fileName: file.name,\n contentType: file.type,\n data: base64data,\n })\n } else {\n attachments.push({\n fileName: file.name,\n contentType: file.type,\n data: result.toDataURL(),\n })\n }\n }\n\n return attachments\n}\n\nexport async function correctFileOrientation(\n file: File,\n onAnnotateCanvas?: (file: File, canvas: HTMLCanvasElement) => void,\n): Promise<Blob | HTMLCanvasElement> {\n try {\n if (!checkIfContentTypeIsImage(file.type)) {\n return file\n }\n\n console.log('Attempting to parse File as image attachment', file)\n\n const orientation = await getBlobOrientation(file)\n if (\n (typeof orientation !== 'number' || orientation === 1) &&\n !onAnnotateCanvas\n ) {\n console.log('Skipping orientation correction for image')\n return file\n }\n\n console.log(\n 'Loading image onto canvas to correct orientation using image meta data',\n { orientation },\n )\n const canvas = await blobToCanvas(file, orientation)\n if (onAnnotateCanvas) {\n onAnnotateCanvas(file, canvas)\n }\n return canvas\n } catch (err) {\n console.warn('Failed to rotate the orientation of a file:', err)\n Sentry.captureException(err)\n return file\n }\n}\n"]}
|
@@ -93,6 +93,7 @@ function checkIfAttachmentsExistForFormElements(formElements, submission, attach
|
|
93
93
|
}
|
94
94
|
break;
|
95
95
|
}
|
96
|
+
case 'arcGISWebMap':
|
96
97
|
case 'camera':
|
97
98
|
case 'draw':
|
98
99
|
case 'compliance':
|
@@ -131,6 +132,18 @@ function checkIfAttachmentsExistForFormElements(formElements, submission, attach
|
|
131
132
|
}
|
132
133
|
break;
|
133
134
|
}
|
135
|
+
case 'arcGISWebMap': {
|
136
|
+
const arcGISWebMapElementValue = value;
|
137
|
+
const snapshotImages = validateAttachmentsExists(arcGISWebMapElementValue.snapshotImages, attachmentRetentionInDays);
|
138
|
+
if (snapshotImages) {
|
139
|
+
hasChanges = true;
|
140
|
+
result[formElement.name] = {
|
141
|
+
...value,
|
142
|
+
snapshotImages,
|
143
|
+
};
|
144
|
+
}
|
145
|
+
break;
|
146
|
+
}
|
134
147
|
}
|
135
148
|
}
|
136
149
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"checkIfAttachmentsExist.js","sourceRoot":"","sources":["../../src/services/checkIfAttachmentsExist.ts"],"names":[],"mappings":"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","sourcesContent":["import { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport { v4 as uuid } from 'uuid'\nimport { attachmentsService } from '@oneblink/apps'\n\nimport { Value as FormElementComplianceValue } from '../form-elements/FormElementCompliance'\n\nexport function validateAttachmentExists(\n attachment: attachmentsService.Attachment,\n attachmentRetentionInDays: number | undefined,\n): attachmentsService.AttachmentError | void {\n if (attachment.type || !attachment.uploadedAt || !attachmentRetentionInDays) {\n return\n }\n\n const uploadedAt = new Date(attachment.uploadedAt)\n const expiresAt = new Date(attachment.uploadedAt)\n expiresAt.setDate(uploadedAt.getDate() + attachmentRetentionInDays)\n const now = new Date()\n console.log('Checking if attachment still exists', {\n uploadedAt,\n expiresAt,\n attachment,\n })\n // check if attachment exists\n if (expiresAt > now) {\n return\n }\n\n const attachmentError: attachmentsService.AttachmentError = {\n type: 'ERROR',\n errorMessage:\n \"This attachment has been removed based on your administrator's data retention policy, please remove it and upload it again.\",\n _id: uuid(),\n fileName: attachment.fileName,\n isPrivate: attachment.isPrivate,\n }\n return attachmentError\n}\n\nfunction validateAttachmentsExists(\n attachments: unknown,\n attachmentRetentionInDays: number | undefined,\n): attachmentsService.Attachment[] | void {\n if (!Array.isArray(attachments)) {\n return\n }\n const newAttachments = [...attachments]\n let hasChanges = false\n for (let index = 0; index < newAttachments.length; index++) {\n const attachmentError = validateAttachmentExists(\n newAttachments[index] as attachmentsService.Attachment,\n attachmentRetentionInDays,\n )\n if (attachmentError) {\n hasChanges = true\n newAttachments[index] = attachmentError\n }\n }\n if (hasChanges) {\n return newAttachments\n }\n}\n\nfunction checkIfAttachmentsExistForFormElements(\n formElements: FormTypes.FormElement[],\n submission: SubmissionTypes.S3SubmissionData['submission'],\n attachmentRetentionInDays: number | undefined,\n): SubmissionTypes.S3SubmissionData['submission'] | void {\n const result: SubmissionTypes.S3SubmissionData['submission'] = {\n ...submission,\n }\n let hasChanges = false\n for (const formElement of formElements) {\n switch (formElement.type) {\n case 'section':\n case 'page': {\n const newSubmission = checkIfAttachmentsExistForFormElements(\n formElement.elements,\n result,\n attachmentRetentionInDays,\n )\n if (newSubmission) {\n hasChanges = true\n Object.assign(result, newSubmission)\n }\n break\n }\n case 'form': {\n const nestedSubmission = submission[formElement.name]\n if (!nestedSubmission || typeof nestedSubmission !== 'object') {\n break\n }\n const newSubmission = checkIfAttachmentsExistForFormElements(\n formElement.elements || [],\n nestedSubmission as SubmissionTypes.S3SubmissionData['submission'],\n attachmentRetentionInDays,\n )\n if (newSubmission) {\n hasChanges = true\n result[formElement.name] = newSubmission\n }\n break\n }\n case 'repeatableSet': {\n const entries = submission[formElement.name]\n if (!Array.isArray(entries)) {\n break\n }\n const newEntries = [...entries]\n let hasEntryChanges = false\n for (let index = 0; index < entries.length; index++) {\n const entry = entries[index]\n if (typeof entry === 'object') {\n const newEntry = checkIfAttachmentsExistForFormElements(\n formElement.elements,\n entry,\n attachmentRetentionInDays,\n )\n if (newEntry) {\n hasEntryChanges = true\n newEntries[index] = newEntry\n }\n }\n }\n if (hasEntryChanges) {\n hasChanges = true\n result[formElement.name] = newEntries\n }\n break\n }\n case 'camera':\n case 'draw':\n case 'compliance':\n case 'files': {\n const value = submission[formElement.name]\n if (!value) {\n break\n }\n\n // If the attachment has a type, it has not finished uploading\n switch (formElement.type) {\n case 'camera':\n case 'draw': {\n const attachmentError = validateAttachmentExists(\n value as attachmentsService.Attachment,\n attachmentRetentionInDays,\n )\n if (attachmentError) {\n hasChanges = true\n result[formElement.name] = attachmentError\n }\n break\n }\n case 'compliance': {\n const newAttachments = validateAttachmentsExists(\n (value as FormElementComplianceValue).files,\n attachmentRetentionInDays,\n )\n if (newAttachments) {\n hasChanges = true\n result[formElement.name] = {\n ...(value as FormElementComplianceValue),\n files: newAttachments,\n }\n }\n break\n }\n case 'files': {\n const newAttachments = validateAttachmentsExists(\n value,\n attachmentRetentionInDays,\n )\n if (newAttachments) {\n hasChanges = true\n result[formElement.name] = newAttachments\n }\n break\n }\n }\n }\n }\n }\n if (hasChanges) {\n return result\n }\n}\n\nexport default function checkIfAttachmentsExist(\n form: FormTypes.Form,\n submission: SubmissionTypes.S3SubmissionData['submission'],\n attachmentRetentionInDays: number | undefined,\n): SubmissionTypes.S3SubmissionData['submission'] | void {\n return checkIfAttachmentsExistForFormElements(\n form.elements,\n submission,\n attachmentRetentionInDays,\n )\n}\n"]}
|
1
|
+
{"version":3,"file":"checkIfAttachmentsExist.js","sourceRoot":"","sources":["../../src/services/checkIfAttachmentsExist.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArcGISTypes, FormTypes, SubmissionTypes } from '@oneblink/types'\nimport { v4 as uuid } from 'uuid'\nimport { attachmentsService } from '@oneblink/apps'\n\nimport { Value as FormElementComplianceValue } from '../form-elements/FormElementCompliance'\n\nexport function validateAttachmentExists(\n attachment: attachmentsService.Attachment,\n attachmentRetentionInDays: number | undefined,\n): attachmentsService.AttachmentError | void {\n if (attachment.type || !attachment.uploadedAt || !attachmentRetentionInDays) {\n return\n }\n\n const uploadedAt = new Date(attachment.uploadedAt)\n const expiresAt = new Date(attachment.uploadedAt)\n expiresAt.setDate(uploadedAt.getDate() + attachmentRetentionInDays)\n const now = new Date()\n console.log('Checking if attachment still exists', {\n uploadedAt,\n expiresAt,\n attachment,\n })\n // check if attachment exists\n if (expiresAt > now) {\n return\n }\n\n const attachmentError: attachmentsService.AttachmentError = {\n type: 'ERROR',\n errorMessage:\n \"This attachment has been removed based on your administrator's data retention policy, please remove it and upload it again.\",\n _id: uuid(),\n fileName: attachment.fileName,\n isPrivate: attachment.isPrivate,\n }\n return attachmentError\n}\n\nfunction validateAttachmentsExists(\n attachments: unknown,\n attachmentRetentionInDays: number | undefined,\n): attachmentsService.Attachment[] | void {\n if (!Array.isArray(attachments)) {\n return\n }\n const newAttachments = [...attachments]\n let hasChanges = false\n for (let index = 0; index < newAttachments.length; index++) {\n const attachmentError = validateAttachmentExists(\n newAttachments[index] as attachmentsService.Attachment,\n attachmentRetentionInDays,\n )\n if (attachmentError) {\n hasChanges = true\n newAttachments[index] = attachmentError\n }\n }\n if (hasChanges) {\n return newAttachments\n }\n}\n\nfunction checkIfAttachmentsExistForFormElements(\n formElements: FormTypes.FormElement[],\n submission: SubmissionTypes.S3SubmissionData['submission'],\n attachmentRetentionInDays: number | undefined,\n): SubmissionTypes.S3SubmissionData['submission'] | void {\n const result: SubmissionTypes.S3SubmissionData['submission'] = {\n ...submission,\n }\n let hasChanges = false\n for (const formElement of formElements) {\n switch (formElement.type) {\n case 'section':\n case 'page': {\n const newSubmission = checkIfAttachmentsExistForFormElements(\n formElement.elements,\n result,\n attachmentRetentionInDays,\n )\n if (newSubmission) {\n hasChanges = true\n Object.assign(result, newSubmission)\n }\n break\n }\n case 'form': {\n const nestedSubmission = submission[formElement.name]\n if (!nestedSubmission || typeof nestedSubmission !== 'object') {\n break\n }\n const newSubmission = checkIfAttachmentsExistForFormElements(\n formElement.elements || [],\n nestedSubmission as SubmissionTypes.S3SubmissionData['submission'],\n attachmentRetentionInDays,\n )\n if (newSubmission) {\n hasChanges = true\n result[formElement.name] = newSubmission\n }\n break\n }\n case 'repeatableSet': {\n const entries = submission[formElement.name]\n if (!Array.isArray(entries)) {\n break\n }\n const newEntries = [...entries]\n let hasEntryChanges = false\n for (let index = 0; index < entries.length; index++) {\n const entry = entries[index]\n if (typeof entry === 'object') {\n const newEntry = checkIfAttachmentsExistForFormElements(\n formElement.elements,\n entry,\n attachmentRetentionInDays,\n )\n if (newEntry) {\n hasEntryChanges = true\n newEntries[index] = newEntry\n }\n }\n }\n if (hasEntryChanges) {\n hasChanges = true\n result[formElement.name] = newEntries\n }\n break\n }\n case 'arcGISWebMap':\n case 'camera':\n case 'draw':\n case 'compliance':\n case 'files': {\n const value = submission[formElement.name]\n if (!value) {\n break\n }\n\n // If the attachment has a type, it has not finished uploading\n switch (formElement.type) {\n case 'camera':\n case 'draw': {\n const attachmentError = validateAttachmentExists(\n value as attachmentsService.Attachment,\n attachmentRetentionInDays,\n )\n if (attachmentError) {\n hasChanges = true\n result[formElement.name] = attachmentError\n }\n break\n }\n case 'compliance': {\n const newAttachments = validateAttachmentsExists(\n (value as FormElementComplianceValue).files,\n attachmentRetentionInDays,\n )\n if (newAttachments) {\n hasChanges = true\n result[formElement.name] = {\n ...(value as FormElementComplianceValue),\n files: newAttachments,\n }\n }\n break\n }\n case 'files': {\n const newAttachments = validateAttachmentsExists(\n value,\n attachmentRetentionInDays,\n )\n if (newAttachments) {\n hasChanges = true\n result[formElement.name] = newAttachments\n }\n break\n }\n case 'arcGISWebMap': {\n const arcGISWebMapElementValue =\n value as ArcGISTypes.ArcGISWebMapElementValue\n const snapshotImages = validateAttachmentsExists(\n arcGISWebMapElementValue.snapshotImages,\n attachmentRetentionInDays,\n )\n if (snapshotImages) {\n hasChanges = true\n result[formElement.name] = {\n ...value,\n snapshotImages,\n }\n }\n break\n }\n }\n }\n }\n }\n if (hasChanges) {\n return result\n }\n}\n\nexport default function checkIfAttachmentsExist(\n form: FormTypes.Form,\n submission: SubmissionTypes.S3SubmissionData['submission'],\n attachmentRetentionInDays: number | undefined,\n): SubmissionTypes.S3SubmissionData['submission'] | void {\n return checkIfAttachmentsExistForFormElements(\n form.elements,\n submission,\n attachmentRetentionInDays,\n )\n}\n"]}
|
@@ -1,7 +1,5 @@
|
|
1
1
|
import { FormTypes } from '@oneblink/types';
|
2
|
-
import { FormElementBinaryStorageValue } from '../../types/attachments';
|
3
2
|
import { CaptchaType, ExecutedLookups, FormElementsConditionallyShown } from '../../types/form';
|
4
|
-
import { Value as FormElementComplianceValue } from '../../form-elements/FormElementCompliance';
|
5
3
|
declare const validationExtensions: {
|
6
4
|
lookups({ executedLookups, formElement, }: {
|
7
5
|
formElement: FormTypes.LookupFormElement & FormTypes.FormElementRequired;
|
@@ -10,7 +8,6 @@ declare const validationExtensions: {
|
|
10
8
|
presence(value: unknown, { required, requiredMessage }: FormTypes.FormElementRequired, message: string): string[];
|
11
9
|
regex<DefaultValue>(value: unknown, formElement: FormTypes.FormElementWithInput<DefaultValue>): string[];
|
12
10
|
attachment(value: unknown): string[];
|
13
|
-
attachments(value: FormElementBinaryStorageValue[] | FormElementComplianceValue | undefined): string[];
|
14
11
|
numberRegex(value: unknown, formElement: FormTypes.NumberElement): string[];
|
15
12
|
nestedElements(value: unknown, { formElement, formElements, formElementsConditionallyShown, executedLookups, captchaType, isOffline, }: {
|
16
13
|
formElement: FormTypes.FormElementWithName;
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import validateSubmission from './validateSubmission';
|
2
|
-
import { generateLookupValidationMessage, getInvalidAttachment,
|
2
|
+
import { generateLookupValidationMessage, getInvalidAttachment, } from './validators';
|
3
3
|
import { validators } from './validate-dot-js';
|
4
4
|
const validationExtensions = {
|
5
5
|
lookups({ executedLookups, formElement, }) {
|
@@ -41,12 +41,6 @@ const validationExtensions = {
|
|
41
41
|
}
|
42
42
|
return [];
|
43
43
|
},
|
44
|
-
attachments(value) {
|
45
|
-
if (Array.isArray(value)) {
|
46
|
-
return validateAttachments(value);
|
47
|
-
}
|
48
|
-
return validateAttachments(value === null || value === void 0 ? void 0 : value.files);
|
49
|
-
},
|
50
44
|
numberRegex(value, formElement) {
|
51
45
|
if (formElement.regexPattern &&
|
52
46
|
typeof value === 'number' &&
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../../src/services/form-validation/extensions.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../../src/services/form-validation/extensions.ts"],"names":[],"mappings":"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","sourcesContent":["import { FormTypes, SubmissionTypes } from '@oneblink/types'\nimport {\n CaptchaType,\n ExecutedLookups,\n FormElementsConditionallyShown,\n} from '../../types/form'\nimport validateSubmission from './validateSubmission'\nimport {\n generateLookupValidationMessage,\n getInvalidAttachment,\n} from './validators'\nimport { validators } from './validate-dot-js'\n\nconst validationExtensions = {\n lookups({\n executedLookups,\n formElement,\n }: {\n formElement: FormTypes.LookupFormElement & FormTypes.FormElementRequired\n executedLookups: ExecutedLookups\n }): string[] {\n if (!formElement.isDataLookup && !formElement.isElementLookup) {\n return []\n }\n\n // Lookups must only be executed on required form elements\n if (formElement && !formElement.required) {\n return []\n }\n\n const elementExecutedLookups = executedLookups?.[formElement.name]\n if (elementExecutedLookups === true) {\n return []\n }\n\n return [generateLookupValidationMessage(formElement.lookupButton)]\n },\n\n presence(\n value: unknown,\n { required, requiredMessage }: FormTypes.FormElementRequired,\n message: string,\n ) {\n if (required) {\n return validators.presence(value, {\n message: requiredMessage || message,\n })\n }\n return []\n },\n\n regex<DefaultValue>(\n value: unknown,\n formElement: FormTypes.FormElementWithInput<DefaultValue>,\n ) {\n if (formElement.regexPattern) {\n return validators.regexValidation(value, {\n pattern: formElement.regexPattern,\n flags: formElement.regexFlags,\n message: formElement.regexMessage,\n })\n }\n return []\n },\n\n attachment(value: unknown): string[] {\n const attachmentError = getInvalidAttachment(value)\n if (attachmentError) {\n return [attachmentError.errorMessage]\n }\n return []\n },\n\n numberRegex(value: unknown, formElement: FormTypes.NumberElement) {\n if (\n formElement.regexPattern &&\n typeof value === 'number' &&\n !Number.isNaN(value)\n ) {\n return validationExtensions.regex(value.toString(), formElement)\n }\n return []\n },\n\n nestedElements(\n value: unknown,\n {\n formElement,\n formElements,\n formElementsConditionallyShown,\n executedLookups,\n captchaType,\n isOffline,\n }: {\n formElement: FormTypes.FormElementWithName\n formElements: FormTypes.FormElementWithName[] | undefined\n formElementsConditionallyShown: FormElementsConditionallyShown | undefined\n executedLookups: ExecutedLookups\n captchaType: CaptchaType\n isOffline: boolean\n },\n ) {\n if (formElements) {\n const nestedExecutedLookupsValue =\n executedLookups !== undefined &&\n typeof executedLookups !== 'boolean' &&\n !Array.isArray(executedLookups)\n ? executedLookups[formElement.name]\n : {}\n\n const formElementConditionallyShown =\n formElementsConditionallyShown?.[formElement.name]\n const errors = validateSubmission({\n elements: formElements as FormTypes.FormElementWithName[],\n submission: value as SubmissionTypes.S3SubmissionData['submission'],\n formElementsConditionallyShown:\n formElementConditionallyShown?.type === 'formElements'\n ? formElementConditionallyShown.formElements\n : undefined,\n executedLookups:\n typeof nestedExecutedLookupsValue !== 'boolean' &&\n !Array.isArray(nestedExecutedLookupsValue)\n ? nestedExecutedLookupsValue\n : {},\n captchaType,\n isOffline,\n })\n if (errors) {\n return {\n type: 'formElements' as const,\n formElements: errors,\n }\n }\n }\n },\n\n offline(isOffline: boolean, message: string) {\n return isOffline ? [message] : []\n },\n}\n\nexport default validationExtensions\n"]}
|