@lifesg/web-frontend-engine 1.0.0-alpha.4 → 1.0.0-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/README.md +2 -1
  2. package/chunks/heic2any.3b8e0e2e.js +2 -0
  3. package/chunks/heic2any.3b8e0e2e.js.map +1 -0
  4. package/chunks/index.a9be1bad.js +2 -0
  5. package/chunks/index.a9be1bad.js.map +1 -0
  6. package/chunks/index.cb84bb25.js +813 -0
  7. package/chunks/index.cb84bb25.js.map +1 -0
  8. package/chunks/index.f3b64f06.js +10 -0
  9. package/chunks/index.f3b64f06.js.map +1 -0
  10. package/cjs/chunks/heic2any.8d6aeb48.js +2 -0
  11. package/cjs/chunks/heic2any.8d6aeb48.js.map +1 -0
  12. package/cjs/chunks/index.3a31dd0d.js +813 -0
  13. package/cjs/chunks/index.3a31dd0d.js.map +1 -0
  14. package/cjs/chunks/index.42475725.js +2 -0
  15. package/cjs/chunks/index.42475725.js.map +1 -0
  16. package/cjs/chunks/index.4da6edf0.js +10 -0
  17. package/cjs/chunks/index.4da6edf0.js.map +1 -0
  18. package/cjs/index.js +1 -285
  19. package/cjs/index.js.map +1 -1
  20. package/components/fields/checkbox-group/checkbox-group.styles.d.ts +1 -1
  21. package/components/fields/image-upload/image-context/image-context.d.ts +14 -0
  22. package/components/fields/image-upload/image-context/index.d.ts +1 -0
  23. package/components/fields/image-upload/image-input/file-item/file-item.d.ts +11 -0
  24. package/components/fields/image-upload/image-input/file-item/file-item.styles.d.ts +16 -0
  25. package/components/fields/image-upload/image-input/file-item/index.d.ts +1 -0
  26. package/components/fields/image-upload/image-input/image-input.d.ts +17 -0
  27. package/components/fields/image-upload/image-input/image-input.styles.d.ts +8 -0
  28. package/components/fields/image-upload/image-input/index.d.ts +1 -0
  29. package/components/fields/image-upload/image-manager/image-manager.d.ts +22 -0
  30. package/components/fields/image-upload/image-manager/index.d.ts +2 -0
  31. package/components/fields/image-upload/image-review/image-editor/image-editor.d.ts +3 -0
  32. package/components/fields/image-upload/image-review/image-editor/image-editor.styles.d.ts +4 -0
  33. package/components/fields/image-upload/image-review/image-editor/index.d.ts +3 -0
  34. package/components/fields/image-upload/image-review/image-editor/types.d.ts +16 -0
  35. package/components/fields/image-upload/image-review/image-error/image-error.d.ts +8 -0
  36. package/components/fields/image-upload/image-review/image-error/image-error.styles.d.ts +7 -0
  37. package/components/fields/image-upload/image-review/image-error/index.d.ts +1 -0
  38. package/components/fields/image-upload/image-review/image-prompts/image-prompts.d.ts +11 -0
  39. package/components/fields/image-upload/image-review/image-prompts/index.d.ts +1 -0
  40. package/components/fields/image-upload/image-review/image-review.d.ts +15 -0
  41. package/components/fields/image-upload/image-review/image-review.styles.d.ts +31 -0
  42. package/components/fields/image-upload/image-review/image-thumbnails/image-thumbnails.d.ts +11 -0
  43. package/components/fields/image-upload/image-review/image-thumbnails/image-thumbnails.styles.d.ts +14 -0
  44. package/components/fields/image-upload/image-review/image-thumbnails/index.d.ts +1 -0
  45. package/components/fields/image-upload/image-review/index.d.ts +1 -0
  46. package/components/fields/image-upload/image-upload-helper.d.ts +10 -0
  47. package/components/fields/image-upload/image-upload.d.ts +4 -0
  48. package/components/fields/image-upload/index.d.ts +2 -0
  49. package/components/fields/image-upload/types.d.ts +65 -0
  50. package/components/fields/index.d.ts +1 -0
  51. package/components/fields/radio-button/radio-button.styles.d.ts +4 -3
  52. package/components/fields/radio-button/types.d.ts +5 -2
  53. package/components/fields/reset-button/types.d.ts +1 -0
  54. package/components/fields/text-field/types.d.ts +8 -0
  55. package/components/fields/textarea/textarea.styles.d.ts +1 -1
  56. package/components/frontend-engine/event/context-provider.d.ts +14 -0
  57. package/components/frontend-engine/event/index.d.ts +1 -0
  58. package/components/frontend-engine/types.d.ts +23 -19
  59. package/components/frontend-engine/yup/types.d.ts +2 -1
  60. package/components/shared/drag-upload/drag-upload.d.ts +3 -0
  61. package/components/shared/drag-upload/drag-upload.styles.d.ts +4 -0
  62. package/components/shared/drag-upload/index.d.ts +2 -0
  63. package/components/shared/drag-upload/types.d.ts +15 -0
  64. package/components/shared/error-messages.d.ts +27 -4
  65. package/components/shared/index.d.ts +2 -0
  66. package/components/shared/prompt/index.d.ts +2 -0
  67. package/components/shared/prompt/prompt.d.ts +2 -0
  68. package/components/shared/prompt/prompt.styles.d.ts +15 -0
  69. package/components/shared/prompt/types.d.ts +16 -0
  70. package/index.js +1 -285
  71. package/index.js.map +1 -1
  72. package/package.json +8 -2
  73. package/utils/api-client/api-client.d.ts +65 -0
  74. package/utils/api-client/index.d.ts +1 -0
  75. package/utils/file-helper.d.ts +43 -0
  76. package/utils/hooks/index.d.ts +1 -0
  77. package/utils/hooks/use-field-event.d.ts +9 -0
  78. package/utils/hooks/use-previous.d.ts +4 -1
  79. package/utils/image-helper.d.ts +34 -0
  80. package/utils/index.d.ts +4 -0
  81. package/utils/window-helper.d.ts +3 -0
@@ -2,7 +2,7 @@
2
2
  interface ILabelProps {
3
3
  disabled?: boolean | undefined;
4
4
  }
5
- export declare const Label: import("styled-components").StyledComponent<"label", any, ILabelProps, never>;
5
+ export declare const Label: import("styled-components").StyledComponent<"p", any, import("@lifesg/react-design-system/text").TextProps & ILabelProps, never>;
6
6
  export declare const StyledCheckbox: import("styled-components").StyledComponent<({ className, checked, disabled, onChange, onKeyPress, displaySize, ...otherProps }: import("@lifesg/react-design-system/checkbox").CheckboxProps) => JSX.Element, any, {}, never>;
7
7
  export declare const CheckboxContainer: import("styled-components").StyledComponent<"div", any, {}, never>;
8
8
  export declare const ToggleWrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
@@ -0,0 +1,14 @@
1
+ import React, { Dispatch, SetStateAction } from "react";
2
+ import { IImage } from "../types";
3
+ interface IImageContext {
4
+ images: IImage[];
5
+ setImages: Dispatch<SetStateAction<IImage[]>>;
6
+ errorCount: number;
7
+ setErrorCount: Dispatch<SetStateAction<number>>;
8
+ }
9
+ interface Props {
10
+ children: (string | boolean | JSX.Element)[] | (string | boolean | JSX.Element);
11
+ }
12
+ export declare const ImageContext: React.Context<IImageContext>;
13
+ export declare const ImageProvider: ({ children }: Props) => import("react/jsx-runtime").JSX.Element;
14
+ export {};
@@ -0,0 +1 @@
1
+ export * from "./image-context";
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ import { IImage, IImageUploadValidationRule, ISharedImageProps } from "../../types";
3
+ interface IProps extends Omit<ISharedImageProps, "maxFiles"> {
4
+ id?: string;
5
+ index: number;
6
+ fileItem: IImage;
7
+ validation: IImageUploadValidationRule[];
8
+ onDelete: (index: number) => (event: React.MouseEvent<HTMLButtonElement>) => void;
9
+ }
10
+ export declare const FileItem: ({ id, index, fileItem, maxSizeInKb, accepts, onDelete, validation }: IProps) => import("react/jsx-runtime").JSX.Element;
11
+ export {};
@@ -0,0 +1,16 @@
1
+ /// <reference types="react" />
2
+ export declare const Wrapper: import("styled-components").StyledComponent<"div", any, {
3
+ isError?: boolean;
4
+ }, never>;
5
+ export declare const CellInfo: import("styled-components").StyledComponent<"div", any, {}, never>;
6
+ export declare const CellFileSize: import("styled-components").StyledComponent<"div", any, {}, never>;
7
+ export declare const CellProgressBar: import("styled-components").StyledComponent<"div", any, {}, never>;
8
+ export declare const CellDeleteButton: import("styled-components").StyledComponent<"div", any, {}, never>;
9
+ export declare const Thumbnail: import("styled-components").StyledComponent<"div", any, {
10
+ src: string;
11
+ }, never>;
12
+ export declare const TextBody: import("styled-components").StyledComponent<"p", any, import("@lifesg/react-design-system/text").TextProps, never>;
13
+ export declare const MobileFileSize: import("styled-components").StyledComponent<"div", any, {}, never>;
14
+ export declare const ProgressBar: import("styled-components").StyledComponent<"progress", any, {}, never>;
15
+ export declare const ErrorText: import("styled-components").StyledComponent<"h6", any, import("@lifesg/react-design-system/text").TextProps, never>;
16
+ export declare const DeleteButton: import("styled-components").StyledComponent<(props: import("@lifesg/react-design-system/icon-button").IconButtonProps & import("react").RefAttributes<HTMLButtonElement>) => import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>, any, {}, never>;
@@ -0,0 +1 @@
1
+ export * from "./file-item";
@@ -0,0 +1,17 @@
1
+ import { IImageUploadValidationRule, ISharedImageProps } from "../types";
2
+ interface IImageInputProps extends ISharedImageProps {
3
+ label: string;
4
+ buttonLabel?: string | undefined;
5
+ description: string;
6
+ dimensions: {
7
+ width: number;
8
+ height: number;
9
+ };
10
+ validation: IImageUploadValidationRule[];
11
+ errorMessage?: string | undefined;
12
+ }
13
+ /**
14
+ * handles adding of image(s) through drag & drop or file dialog
15
+ */
16
+ export declare const ImageInput: (props: IImageInputProps) => import("react/jsx-runtime").JSX.Element;
17
+ export {};
@@ -0,0 +1,8 @@
1
+ /// <reference types="react" />
2
+ export declare const Wrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
3
+ export declare const Subtitle: import("styled-components").StyledComponent<"p", any, import("@lifesg/react-design-system/text").TextProps, never>;
4
+ export declare const Content: import("styled-components").StyledComponent<"p", any, import("@lifesg/react-design-system/text").TextProps, never>;
5
+ export declare const UploadWrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
6
+ export declare const AddButton: import("styled-components").StyledComponent<(props: import("@lifesg/react-design-system/button").ButtonProps & import("react").RefAttributes<HTMLButtonElement>) => import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>, any, {}, never>;
7
+ export declare const DropThemHereText: import("styled-components").StyledComponent<"p", any, import("@lifesg/react-design-system/text").TextProps, never>;
8
+ export declare const AlertContainer: import("styled-components").StyledComponent<({ type, className, children, actionLink, ...otherProps }: import("@lifesg/react-design-system/alert").AlertProps) => JSX.Element, any, {}, never>;
@@ -0,0 +1 @@
1
+ export * from "./image-input";
@@ -0,0 +1,22 @@
1
+ import { ISharedImageProps, TImageUploadOutputFileType, TUploadMethod } from "../types";
2
+ interface IProps extends Omit<ISharedImageProps, "maxFiles"> {
3
+ editImage: boolean;
4
+ onChange: (...event: any[]) => void;
5
+ compress: boolean;
6
+ dimensions: {
7
+ width: number;
8
+ height: number;
9
+ };
10
+ outputType: TImageUploadOutputFileType;
11
+ upload?: {
12
+ method: TUploadMethod;
13
+ url: string;
14
+ };
15
+ value: any;
16
+ }
17
+ /**
18
+ * manages selected images by listening to images from context provider
19
+ * rename / compress / upload
20
+ */
21
+ export declare const ImageManager: (props: IProps) => any;
22
+ export {};
@@ -0,0 +1,2 @@
1
+ import { ImageManager } from "./image-manager";
2
+ export default ImageManager;
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ import { IImageEditorProps, IImageEditorRef } from "./types";
3
+ export declare const ImageEditor: import("react").ForwardRefExoticComponent<IImageEditorProps & import("react").RefAttributes<IImageEditorRef>>;
@@ -0,0 +1,4 @@
1
+ export declare const Wrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
2
+ export declare const Canvas: import("styled-components").StyledComponent<"canvas", any, {
3
+ canDraw: boolean;
4
+ }, never>;
@@ -0,0 +1,3 @@
1
+ import { ImageEditor } from "./image-editor";
2
+ export default ImageEditor;
3
+ export * from "./types";
@@ -0,0 +1,16 @@
1
+ import { ForwardedRef } from "react";
2
+ export interface IImageEditorProps {
3
+ maxSizeInKb?: number;
4
+ baseImageDataURL?: string;
5
+ drawing?: fabric.Object[];
6
+ color?: string;
7
+ erase?: boolean;
8
+ forwardedRef?: ForwardedRef<IImageEditorRef>;
9
+ }
10
+ export interface IImageEditorRef {
11
+ clearDrawing: VoidFunction;
12
+ export: () => {
13
+ drawing: fabric.Object[];
14
+ dataURL: string;
15
+ };
16
+ }
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ import { IImage, ISharedImageProps } from "../../types";
3
+ interface IProps extends Omit<ISharedImageProps, "maxFiles"> {
4
+ image: IImage;
5
+ onClickOk: (e: React.MouseEvent<HTMLButtonElement>) => void;
6
+ }
7
+ export declare const ImageError: (props: IProps) => import("react/jsx-runtime").JSX.Element;
8
+ export {};
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ export declare const Wrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
3
+ export declare const ErrorIcon: import("styled-components").StyledComponent<"img", any, {}, never>;
4
+ export declare const Content: import("styled-components").StyledComponent<"div", any, {}, never>;
5
+ export declare const BodyText: import("styled-components").StyledComponent<"div", any, {}, never>;
6
+ export declare const NameWrapper: import("styled-components").StyledComponent<"span", any, {}, never>;
7
+ export declare const OkButton: import("styled-components").StyledComponent<(props: import("@lifesg/react-design-system/button").ButtonProps & import("react").RefAttributes<HTMLButtonElement>) => import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>, any, {}, never>;
@@ -0,0 +1 @@
1
+ export * from "./image-error";
@@ -0,0 +1,11 @@
1
+ import { IImage } from "../../types";
2
+ interface IProps {
3
+ onDecideClearDrawing: (decision?: boolean) => void;
4
+ onDecideDelete: (decision: boolean) => void;
5
+ onDecideExit: (decision?: boolean) => void;
6
+ id?: string;
7
+ images: IImage[];
8
+ show?: "delete" | "exit" | "clear-drawing";
9
+ }
10
+ export declare const ImagePrompts: (props: IProps) => import("react/jsx-runtime").JSX.Element;
11
+ export {};
@@ -0,0 +1 @@
1
+ export * from "./image-prompts";
@@ -0,0 +1,15 @@
1
+ import { TFileCapture } from "../../../shared";
2
+ import { ISharedImageProps } from "../types";
3
+ interface IProps extends ISharedImageProps {
4
+ capture?: TFileCapture;
5
+ compress?: boolean | undefined;
6
+ dimensions: {
7
+ width: number;
8
+ height: number;
9
+ };
10
+ onExit: () => void;
11
+ outputType: string;
12
+ show: boolean;
13
+ }
14
+ export declare const ImageReview: (props: IProps) => import("react/jsx-runtime").JSX.Element;
15
+ export {};
@@ -0,0 +1,31 @@
1
+ /// <reference types="react" />
2
+ export declare const ModalBox: import("styled-components").StyledComponent<({ id, children, onClose, showCloseButton, ...otherProps }: import("@lifesg/react-design-system/modal").ModalBoxProps) => JSX.Element, any, {
3
+ statusBarHeight: number;
4
+ }, never>;
5
+ export declare const HeaderSection: import("styled-components").StyledComponent<"div", any, {
6
+ drawActive?: boolean;
7
+ }, never>;
8
+ export declare const ReviewCloseButton: import("styled-components").StyledComponent<(props: import("@lifesg/react-design-system/icon-button").IconButtonProps & import("react").RefAttributes<HTMLButtonElement>) => import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>, any, {}, never>;
9
+ export declare const ReviewTitle: import("styled-components").StyledComponent<"h5", any, import("@lifesg/react-design-system/text").TextProps, never>;
10
+ export declare const EditHeaderButton: import("styled-components").StyledComponent<"button", any, {}, never>;
11
+ export declare const ContentSection: import("styled-components").StyledComponent<"div", any, {}, never>;
12
+ export declare const LoadingPreviewText: import("styled-components").StyledComponent<"h4", any, import("@lifesg/react-design-system/text").TextProps, never>;
13
+ export declare const DrawDeleteButtonWrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
14
+ export declare const DrawDeleteButton: import("styled-components").StyledComponent<(props: import("@lifesg/react-design-system/icon-button").IconButtonProps & import("react").RefAttributes<HTMLButtonElement>) => import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>, any, {}, never>;
15
+ export declare const DrawDeleteButtonText: import("styled-components").StyledComponent<"h6", any, import("@lifesg/react-design-system/text").TextProps & {
16
+ disabled: boolean;
17
+ }, never>;
18
+ export declare const DrawIcon: import("styled-components").StyledComponent<"img", any, {}, never>;
19
+ export declare const DeleteIcon: import("styled-components").StyledComponent<"img", any, {}, never>;
20
+ export declare const ImageEditorWrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
21
+ export declare const FooterSection: import("styled-components").StyledComponent<"div", any, {}, never>;
22
+ export declare const FooterSaveButton: import("styled-components").StyledComponent<(props: import("@lifesg/react-design-system/button").ButtonProps & import("react").RefAttributes<HTMLButtonElement>) => import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>, any, {}, never>;
23
+ export declare const EraserButton: import("styled-components").StyledComponent<"button", any, {
24
+ active?: boolean;
25
+ }, never>;
26
+ export declare const ButtonIcon: import("styled-components").StyledComponent<"img", any, {}, never>;
27
+ export declare const PaletteHolder: import("styled-components").StyledComponent<"div", any, {}, never>;
28
+ export declare const Palette: import("styled-components").StyledComponent<"button", any, {
29
+ color: string;
30
+ colorScheme?: string;
31
+ }, never>;
@@ -0,0 +1,11 @@
1
+ import { TFileCapture } from "../../../../shared";
2
+ import { IImage, ISharedImageProps } from "../../types";
3
+ interface IProps extends Omit<ISharedImageProps, "maxSizeInKb"> {
4
+ activeFileIndex: number;
5
+ capture?: TFileCapture;
6
+ images: IImage[];
7
+ onClickThumbnail: (index: number) => void;
8
+ onSelectFile: (file: File) => void;
9
+ }
10
+ export declare const ImageThumbnails: (props: IProps) => import("react/jsx-runtime").JSX.Element;
11
+ export {};
@@ -0,0 +1,14 @@
1
+ /// <reference types="react" />
2
+ export declare const ThumbnailsWrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
3
+ export declare const ThumbnailItem: import("styled-components").StyledComponent<"button", any, {
4
+ src?: string;
5
+ error?: boolean;
6
+ }, never>;
7
+ export declare const ThumbnailWarningIcon: import("styled-components").StyledComponent<"img", any, {}, never>;
8
+ export declare const LoadingDot: import("styled-components").StyledComponent<"div", any, {}, never>;
9
+ export declare const LoadingBox: import("styled-components").StyledComponent<"div", any, {}, never>;
10
+ export declare const BorderOverlay: import("styled-components").StyledComponent<"div", any, {
11
+ isSelected: boolean;
12
+ }, never>;
13
+ export declare const HiddenFileSelect: import("styled-components").StyledComponent<"input", any, {}, never>;
14
+ export declare const AddImageButton: import("styled-components").StyledComponent<(props: import("@lifesg/react-design-system/icon-button").IconButtonProps & import("react").RefAttributes<HTMLButtonElement>) => import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>, any, {}, never>;
@@ -0,0 +1 @@
1
+ export * from "./image-thumbnails";
@@ -0,0 +1 @@
1
+ export * from "./image-review";
@@ -0,0 +1,10 @@
1
+ import { IImage } from "./types";
2
+ export declare namespace ImageUploadHelper {
3
+ /**
4
+ * picks an available slot
5
+ * slot refers to the index of the file selected
6
+ * this is for tracking so we can remove the correct file when user removes it
7
+ * NOTE: validation for max no. of images should be carried out outside this function, this function will only look for the next available slot
8
+ */
9
+ const findAvailableSlot: (images: IImage[]) => number;
10
+ }
@@ -0,0 +1,4 @@
1
+ import { IGenericFieldProps } from "../../frontend-engine";
2
+ import { IImageUploadSchema } from "./types";
3
+ export declare const ImageUploadInner: (props: IGenericFieldProps<IImageUploadSchema>) => import("react/jsx-runtime").JSX.Element;
4
+ export declare const ImageUpload: (props: IGenericFieldProps<IImageUploadSchema>) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ export * from "./image-upload";
2
+ export * from "./types";
@@ -0,0 +1,65 @@
1
+ import { IFrontendEngineBaseFieldJsonSchema } from "../../frontend-engine";
2
+ import { IYupValidationRule } from "../../frontend-engine/yup/types";
3
+ export type TUploadMethod = "post" | "put" | "patch";
4
+ export declare const ACCEPTED_FILE_TYPES: readonly ["jpg", "gif", "png", "heic", "heif", "webp"];
5
+ export type TImageUploadAcceptedFileType = (typeof ACCEPTED_FILE_TYPES)[number];
6
+ export type TImageUploadOutputFileType = "jpg" | "png";
7
+ export interface IImageUploadValidationRule extends IYupValidationRule {
8
+ /** accepted file types */
9
+ fileType?: TImageUploadAcceptedFileType[] | undefined;
10
+ /** max acceptable file size in kb */
11
+ maxSizeInKb?: number | undefined;
12
+ }
13
+ export interface IImageUploadSchema<V = IImageUploadValidationRule> extends IFrontendEngineBaseFieldJsonSchema<"image-upload", V> {
14
+ buttonLabel?: string | undefined;
15
+ description?: string | undefined;
16
+ editImage?: boolean | undefined;
17
+ outputType?: TImageUploadOutputFileType | undefined;
18
+ uploadOnAddingFile?: {
19
+ method: TUploadMethod;
20
+ url: string;
21
+ } | undefined;
22
+ compress?: boolean | undefined;
23
+ dimensions?: IImageDimensions | undefined;
24
+ }
25
+ export interface ISharedImageProps {
26
+ id?: string | undefined;
27
+ accepts: TImageUploadAcceptedFileType[];
28
+ maxSizeInKb: number;
29
+ maxFiles: number;
30
+ }
31
+ export declare enum EImageStatus {
32
+ INJECTED = -99,
33
+ ERROR_FORMAT = -3,
34
+ ERROR_GENERIC = -2,
35
+ ERROR_SIZE = -1,
36
+ NONE = 0,
37
+ TO_RECOMPRESS = 1,
38
+ COMPRESSED = 2,
39
+ RECOMPRESSED = 2,
40
+ CONVERTED = 2,
41
+ EDITED = 3,
42
+ UPLOAD_READY = 4,
43
+ UPLOADING = 5,
44
+ UPLOADED = 6
45
+ }
46
+ export interface IImage {
47
+ file: File;
48
+ name: string;
49
+ type?: string;
50
+ /** refers to preview dimensions and eventual output dimensions */
51
+ dimensions: IImageDimensions;
52
+ dataURL?: string;
53
+ thumbnailDataURL?: string;
54
+ drawingDataURL?: string;
55
+ drawing?: fabric.Object[];
56
+ status: EImageStatus;
57
+ addedFrom?: "dragInput" | "reviewModal" | "schema";
58
+ uploadProgress: number;
59
+ uploadResponse?: any;
60
+ slot: number;
61
+ }
62
+ export interface IImageDimensions {
63
+ width: number;
64
+ height: number;
65
+ }
@@ -2,6 +2,7 @@ export * from "./checkbox-group";
2
2
  export * from "./chips";
3
3
  export * from "./contact-field";
4
4
  export * from "./date-field";
5
+ export * from "./image-upload";
5
6
  export * from "./multi-select";
6
7
  export * from "./radio-button";
7
8
  export * from "./select";
@@ -2,8 +2,9 @@
2
2
  interface ILabelProps {
3
3
  disabled?: boolean | undefined;
4
4
  }
5
- export declare const Label: import("styled-components").StyledComponent<"label", any, ILabelProps, never>;
6
- export declare const StyledRadioButton: import("styled-components").StyledComponent<({ className, checked, disabled, onChange, ...otherProps }: import("@lifesg/react-design-system/radio-button").RadioButtonProps) => JSX.Element, any, {}, never>;
5
+ export declare const Label: import("styled-components").StyledComponent<"p", any, import("@lifesg/react-design-system").TextProps & ILabelProps, never>;
6
+ export declare const StyledRadioButton: import("styled-components").StyledComponent<({ className, checked, disabled, onChange, ...otherProps }: import("@lifesg/react-design-system").RadioButtonProps) => JSX.Element, any, {}, never>;
7
+ export declare const StyledImageButton: import("styled-components").StyledComponent<(props: import("@lifesg/react-design-system").ImageButtonProps & import("react").RefAttributes<HTMLButtonElement>) => import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>, any, {}, never>;
7
8
  export declare const RadioContainer: import("styled-components").StyledComponent<"div", any, {}, never>;
8
- export declare const ToggleWrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
9
+ export declare const FlexWrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
9
10
  export {};
@@ -4,13 +4,16 @@ interface IOption {
4
4
  label: string;
5
5
  value: string;
6
6
  disabled?: boolean | undefined;
7
+ imgSrc?: string | undefined;
7
8
  }
8
9
  type TCustomOptions = {
9
10
  styleType: "default";
10
11
  } | {
11
12
  styleType: "toggle";
12
- indicator?: boolean;
13
- border?: boolean;
13
+ indicator?: boolean | undefined;
14
+ border?: boolean | undefined;
15
+ } | {
16
+ styleType: "image-button";
14
17
  };
15
18
  export interface IRadioButtonGroupSchema<V = undefined> extends IFrontendEngineBaseFieldJsonSchema<"radio", V>, TComponentOmitProps<RadioButtonProps> {
16
19
  options: IOption[];
@@ -2,4 +2,5 @@ import { ButtonProps } from "@lifesg/react-design-system/button/types";
2
2
  import { IFrontendEngineBaseFieldJsonSchema, TComponentOmitProps } from "../../frontend-engine";
3
3
  export interface IResetButtonSchema extends Omit<IFrontendEngineBaseFieldJsonSchema<"reset">, "validation">, TComponentOmitProps<ButtonProps, "disabled"> {
4
4
  disabled?: boolean | undefined;
5
+ ignoreDefaultValues?: boolean | undefined;
5
6
  }
@@ -1,8 +1,16 @@
1
1
  import { FormInputProps } from "@lifesg/react-design-system/form/types";
2
2
  import { IFrontendEngineBaseFieldJsonSchema, TComponentOmitProps } from "../../frontend-engine";
3
+ type TCustomOptions = {
4
+ preventCopyAndPaste?: boolean | undefined;
5
+ preventDragAndDrop?: boolean | undefined;
6
+ };
3
7
  export interface ITextFieldSchema<V = undefined> extends IFrontendEngineBaseFieldJsonSchema<"text-field", V>, TComponentOmitProps<FormInputProps, "type" | "maxLength"> {
8
+ customOptions?: TCustomOptions | undefined;
4
9
  }
5
10
  export interface IEmailFieldSchema<V = undefined> extends IFrontendEngineBaseFieldJsonSchema<"email-field", V>, TComponentOmitProps<FormInputProps, "type" | "maxLength"> {
11
+ customOptions?: TCustomOptions | undefined;
6
12
  }
7
13
  export interface INumericFieldSchema<V = undefined> extends IFrontendEngineBaseFieldJsonSchema<"numeric-field", V>, TComponentOmitProps<FormInputProps, "type" | "max" | "min"> {
14
+ customOptions?: TCustomOptions | undefined;
8
15
  }
16
+ export {};
@@ -7,5 +7,5 @@ export declare const Wrapper: import("styled-components").StyledComponent<"div",
7
7
  chipPosition?: "top" | "bottom" | undefined;
8
8
  }, never>;
9
9
  export declare const ChipContainer: import("styled-components").StyledComponent<"div", any, {}, never>;
10
- export declare const StyledTextarea: import("styled-components").StyledComponent<(props: import("@lifesg/react-design-system/form/types").FormTextareaProps & import("react").RefAttributes<HTMLTextAreaElement>) => import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>, any, ITextareaProps, never>;
10
+ export declare const StyledTextarea: import("styled-components").StyledComponent<(props: import("@lifesg/react-design-system/input-textarea").TextareaProps & import("react").RefAttributes<HTMLTextAreaElement>) => import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>, any, ITextareaProps, never>;
11
11
  export {};
@@ -0,0 +1,14 @@
1
+ import { ReactElement } from "react";
2
+ /**
3
+ * events are added / removed / dispatched via the eventManager
4
+ * the eventManager is just a div, the handling of events is purely through native event handlers
5
+ */
6
+ interface IEventContext {
7
+ eventManagerRef: React.RefObject<Element>;
8
+ }
9
+ interface IProps {
10
+ children: ReactElement;
11
+ }
12
+ export declare const EventContext: import("react").Context<IEventContext>;
13
+ export declare const EventProvider: ({ children }: IProps) => import("react/jsx-runtime").JSX.Element;
14
+ export {};
@@ -0,0 +1 @@
1
+ export * from "./context-provider";
@@ -3,7 +3,7 @@ import { IFilterSchema } from "../custom/filter/filter/types";
3
3
  import { IAlertSchema, ITextSchema } from "../elements";
4
4
  import { ISectionSchema } from "../elements/section";
5
5
  import { IWrapperSchema } from "../elements/wrapper";
6
- import { ICheckboxGroupSchema, IChipsSchema, IContactFieldSchema, IDateFieldSchema, IEmailFieldSchema, IMultiSelectSchema, INumericFieldSchema, IRadioButtonGroupSchema, IResetButtonSchema, ISelectSchema, ISubmitButtonSchema, ITextFieldSchema, ITextareaSchema, ITimeFieldSchema, IUnitNumberFieldSchema } from "../fields";
6
+ import { ICheckboxGroupSchema, IChipsSchema, IContactFieldSchema, IDateFieldSchema, IEmailFieldSchema, IImageUploadSchema, IMultiSelectSchema, INumericFieldSchema, IRadioButtonGroupSchema, IResetButtonSchema, ISelectSchema, ISubmitButtonSchema, ITextFieldSchema, ITextareaSchema, ITimeFieldSchema, IUnitNumberFieldSchema } from "../fields";
7
7
  import { IYupValidationRule, TRenderRules, TYupSchemaType } from "./yup";
8
8
  export type { IYupValidationRule } from "./yup";
9
9
  export interface IFrontendEngineProps<V = undefined> {
@@ -36,27 +36,30 @@ export interface IFrontendEngineData<V = undefined> {
36
36
  /** Validation strategy before a user submits the form (onSubmit event) */
37
37
  validationMode?: TValidationMode | undefined;
38
38
  }
39
- export type TFrontendEngineFieldSchema<V = undefined> = ITextareaSchema<V> | ITextFieldSchema<V> | IEmailFieldSchema<V> | INumericFieldSchema<V> | ISubmitButtonSchema | ISelectSchema<V> | IMultiSelectSchema<V> | ICheckboxGroupSchema<V> | IDateFieldSchema<V> | IWrapperSchema | IContactFieldSchema<V> | IRadioButtonGroupSchema<V> | ITimeFieldSchema<V> | IChipsSchema<V> | IUnitNumberFieldSchema<V> | IAlertSchema | ITextSchema | IResetButtonSchema | IFilterSchema | ICustomComponentJsonSchema<V>;
39
+ export type TFrontendEngineFieldSchema<V = undefined> = IAlertSchema | ICheckboxGroupSchema<V> | IChipsSchema<V> | IContactFieldSchema<V> | ICustomComponentJsonSchema<V> | IDateFieldSchema<V> | IEmailFieldSchema<V> | IFilterSchema | IImageUploadSchema<V> | IMultiSelectSchema<V> | INumericFieldSchema<V> | IRadioButtonGroupSchema<V> | IResetButtonSchema | ISelectSchema<V> | ISubmitButtonSchema | ITextSchema | ITextareaSchema<V> | ITextFieldSchema<V> | ITimeFieldSchema<V> | IUnitNumberFieldSchema<V> | IWrapperSchema;
40
40
  export type TFrontendEngineValues<T = any> = Record<keyof T, T[keyof T]>;
41
41
  export type TRevalidationMode = Exclude<keyof ValidationMode, "onTouched" | "all">;
42
42
  export type TValidationMode = keyof ValidationMode;
43
43
  export type TErrorMessage = string | string[] | Record<string, string | string[]>;
44
44
  export type TErrorPayload = Record<string, TErrorMessage>;
45
45
  export interface IFrontendEngineRef extends HTMLFormElement {
46
+ addCustomValidation: (type: TYupSchemaType | "mixed", name: string, fn: (value: unknown, arg: unknown) => boolean) => void;
47
+ addFieldEventListener: (type: string, id: string, listener: (ev: Event) => any, options?: boolean | AddEventListenerOptions) => void;
48
+ dispatchFieldEvent: (type: string, id: string, detail?: any) => boolean;
46
49
  /** gets form values */
47
50
  getValues: () => TFrontendEngineValues;
48
- /** sets field value by id */
49
- setValue: UseFormSetValue<TFrontendEngineValues>;
50
51
  /** checks if form is valid */
51
52
  isValid: () => boolean;
52
- /** triggers form submission */
53
- submit: () => void;
54
53
  /** adds custom validation rule */
55
- addCustomValidation: (type: TYupSchemaType | "mixed", name: string, fn: (value: unknown, arg: unknown) => boolean) => void;
56
- /** allows setting of custom errors thrown by endpoints */
57
- setErrors: (errors: TErrorPayload) => void;
54
+ removeFieldEventListener: (type: string, id: string, listener: (ev: Event) => any, options?: boolean | EventListenerOptions) => void;
58
55
  /** resets the form to the default state */
59
56
  reset: UseFormReset<TFrontendEngineValues>;
57
+ /** allows setting of custom errors thrown by endpoints */
58
+ setErrors: (errors: TErrorPayload) => void;
59
+ /** sets field value by id */
60
+ setValue: UseFormSetValue<TFrontendEngineValues>;
61
+ /** triggers form submission */
62
+ submit: () => void;
60
63
  }
61
64
  export interface IFrontendEngineBaseFieldJsonSchema<T, V = undefined, U = undefined> {
62
65
  /** defines what kind of component to be rendered */
@@ -104,20 +107,21 @@ export type TComponentOmitProps<T, V = undefined> = Omit<T, UnionOptionalKeys<V>
104
107
  * - components that can contain values that can get submitted
105
108
  */
106
109
  export declare enum EFieldType {
107
- TEXTAREA = "Textarea",
108
- "TEXT-FIELD" = "TextField",
109
- "NUMERIC-FIELD" = "TextField",
110
- "EMAIL-FIELD" = "TextField",
111
- SUBMIT = "SubmitButton",
112
- SELECT = "Select",
113
- "MULTI-SELECT" = "MultiSelect",
114
- "DATE-FIELD" = "DateField",
115
110
  CHECKBOX = "CheckboxGroup",
111
+ CHIPS = "Chips",
116
112
  "CONTACT-FIELD" = "ContactField",
113
+ "DATE-FIELD" = "DateField",
114
+ "EMAIL-FIELD" = "TextField",
115
+ "IMAGE-UPLOAD" = "ImageUpload",
116
+ "MULTI-SELECT" = "MultiSelect",
117
+ "NUMERIC-FIELD" = "TextField",
117
118
  RADIO = "RadioButtonGroup",
118
- "TIME-FIELD" = "TimeField",
119
- CHIPS = "Chips",
120
119
  RESET = "ResetButton",
120
+ SELECT = "Select",
121
+ SUBMIT = "SubmitButton",
122
+ TEXTAREA = "Textarea",
123
+ "TEXT-FIELD" = "TextField",
124
+ "TIME-FIELD" = "TimeField",
121
125
  "UNIT-NUMBER-FIELD" = "UnitNumberField"
122
126
  }
123
127
  /**
@@ -1,6 +1,6 @@
1
1
  import * as Yup from "yup";
2
2
  export declare const YUP_TYPES: readonly ["string", "number", "boolean", "array", "object"];
3
- export declare const YUP_CONDITIONS: readonly ["required", "length", "min", "max", "matches", "email", "url", "uuid", "positive", "negative", "integer", "lessThan", "moreThan", "when", "filled", "empty", "equals", "notEquals", "includes", "excludes", "uinfin"];
3
+ export declare const YUP_CONDITIONS: readonly ["required", "length", "min", "max", "matches", "email", "url", "uuid", "positive", "negative", "integer", "lessThan", "moreThan", "when", "filled", "empty", "equals", "notEquals", "includes", "excludes", "uinfin", "equalsField"];
4
4
  export type TYupSchemaType = (typeof YUP_TYPES)[number];
5
5
  export type TYupCondition = (typeof YUP_CONDITIONS)[number];
6
6
  interface IYupRule {
@@ -22,6 +22,7 @@ interface IYupRule {
22
22
  includes?: unknown | undefined;
23
23
  excludes?: unknown | undefined;
24
24
  uinfin?: boolean | undefined;
25
+ equalsField?: unknown | undefined;
25
26
  }
26
27
  export interface IYupValidationRule extends IYupRule {
27
28
  required?: boolean | undefined;
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ import { IDragUploadProps, IDragUploadRef } from "./types";
3
+ export declare const DragUpload: import("react").ForwardRefExoticComponent<IDragUploadProps & import("react").RefAttributes<IDragUploadRef>>;
@@ -0,0 +1,4 @@
1
+ export declare const Wrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
2
+ export declare const HiddenInput: import("styled-components").StyledComponent<"input", any, {}, never>;
3
+ export declare const HintContainer: import("styled-components").StyledComponent<"div", any, {}, never>;
4
+ export declare const HintText: import("styled-components").StyledComponent<"p", any, import("@lifesg/react-design-system/text").TextProps, never>;
@@ -0,0 +1,2 @@
1
+ export * from "./drag-upload";
2
+ export * from "./types";
@@ -0,0 +1,15 @@
1
+ /// <reference types="react" />
2
+ export type TFileCapture = boolean | "user" | "environment" | undefined;
3
+ export interface IDragUploadRef {
4
+ fileDialog: () => unknown;
5
+ }
6
+ export interface IDragUploadProps {
7
+ id?: string | undefined;
8
+ capture?: TFileCapture;
9
+ className?: string | undefined;
10
+ /** applies to input field only and not for drag & drop */
11
+ accept?: string[] | undefined;
12
+ children: React.ReactNode;
13
+ hint?: string | undefined;
14
+ onInput: (files: File[]) => void;
15
+ }