@overmap-ai/forms 0.0.1-master.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.husky/pre-commit +6 -0
- package/.prettierrc.json +10 -0
- package/.storybook/StoryDecorator.tsx +22 -0
- package/.storybook/main.ts +20 -0
- package/.storybook/palettes/green.css +66 -0
- package/.storybook/palettes/red.css +66 -0
- package/.storybook/preview.css +39 -0
- package/.storybook/preview.tsx +31 -0
- package/.storybook/tailwind-theme/accentPalette.css +181 -0
- package/.storybook/tailwind-theme/backgrounds.css +11 -0
- package/.storybook/tailwind-theme/basePalette.css +178 -0
- package/dev/publish-alpha.sh +13 -0
- package/dev/publish-patch.sh +3 -0
- package/eslint.config.js +56 -0
- package/package.json +93 -0
- package/src/ColorPicker/ColorPicker.tsx +47 -0
- package/src/ColorPicker/index.ts +1 -0
- package/src/FileBadge/FileBadge.tsx +27 -0
- package/src/FileBadge/index.ts +1 -0
- package/src/FileCard/FileCard.stories.tsx +69 -0
- package/src/FileCard/FileCard.tsx +53 -0
- package/src/FileCard/index.ts +1 -0
- package/src/FileIcon/FileIcon.tsx +31 -0
- package/src/FileIcon/index.ts +1 -0
- package/src/FileViewer/FileViewerProvider.stories.tsx +50 -0
- package/src/FileViewer/FileViewerProvider.tsx +72 -0
- package/src/FileViewer/context.ts +11 -0
- package/src/FileViewer/index.ts +3 -0
- package/src/FileViewer/typings.ts +5 -0
- package/src/ImageCard/ImageCard.stories.tsx +94 -0
- package/src/ImageCard/ImageCard.tsx +82 -0
- package/src/ImageCard/index.ts +1 -0
- package/src/ImageMarkup/ImageMarkup.stories.tsx +65 -0
- package/src/ImageMarkup/ImageMarkup.tsx +268 -0
- package/src/ImageMarkup/index.ts +1 -0
- package/src/ImageViewer/ImageViewer.stories.tsx +57 -0
- package/src/ImageViewer/ImageViewer.tsx +124 -0
- package/src/ImageViewer/constants.ts +1 -0
- package/src/ImageViewer/index.ts +2 -0
- package/src/PDFViewer/PDFViewer.stories.tsx +55 -0
- package/src/PDFViewer/PDFViewer.tsx +170 -0
- package/src/PDFViewer/constants.ts +1 -0
- package/src/PDFViewer/index.ts +2 -0
- package/src/SpreadsheetViewer/SpreadsheetViewer.stories.tsx +55 -0
- package/src/SpreadsheetViewer/SpreadsheetViewer.tsx +162 -0
- package/src/SpreadsheetViewer/constants.ts +8 -0
- package/src/SpreadsheetViewer/index.ts +2 -0
- package/src/forms/builder/DropDispatch.ts +84 -0
- package/src/forms/builder/FieldActions.tsx +155 -0
- package/src/forms/builder/FieldBuilder.tsx +386 -0
- package/src/forms/builder/FieldSectionWithActions.tsx +260 -0
- package/src/forms/builder/FieldWithActions.tsx +129 -0
- package/src/forms/builder/FieldsEditor.tsx +180 -0
- package/src/forms/builder/FormBuilder.stories.tsx +105 -0
- package/src/forms/builder/FormBuilder.tsx +237 -0
- package/src/forms/builder/constants.ts +18 -0
- package/src/forms/builder/hooks.tsx +24 -0
- package/src/forms/builder/index.ts +2 -0
- package/src/forms/builder/typings.ts +18 -0
- package/src/forms/builder/utils.ts +229 -0
- package/src/forms/constants.ts +9 -0
- package/src/forms/constantsJsx.tsx +67 -0
- package/src/forms/fields/BaseField/BaseField.ts +152 -0
- package/src/forms/fields/BaseField/hooks.tsx +60 -0
- package/src/forms/fields/BaseField/index.ts +4 -0
- package/src/forms/fields/BaseField/layouts.tsx +100 -0
- package/src/forms/fields/BaseField/typings.ts +9 -0
- package/src/forms/fields/BooleanField/BooleanField.tsx +48 -0
- package/src/forms/fields/BooleanField/BooleanInput.tsx +54 -0
- package/src/forms/fields/BooleanField/index.ts +2 -0
- package/src/forms/fields/CustomField/CustomField.tsx +45 -0
- package/src/forms/fields/CustomField/FieldInputClonerField/FieldInputCloner.tsx +25 -0
- package/src/forms/fields/CustomField/FieldInputClonerField/FieldInputClonerField.tsx +26 -0
- package/src/forms/fields/CustomField/FieldInputClonerField/index.ts +3 -0
- package/src/forms/fields/CustomField/FieldInputClonerField/typings.ts +8 -0
- package/src/forms/fields/CustomField/index.ts +1 -0
- package/src/forms/fields/DateField/DateField.tsx +42 -0
- package/src/forms/fields/DateField/DateInput.tsx +39 -0
- package/src/forms/fields/DateField/index.ts +2 -0
- package/src/forms/fields/FieldSection/FieldSection.tsx +173 -0
- package/src/forms/fields/FieldSection/FieldSectionLayout.tsx +56 -0
- package/src/forms/fields/FieldSection/index.ts +1 -0
- package/src/forms/fields/MultiStringField/MultiStringField.tsx +90 -0
- package/src/forms/fields/MultiStringField/MultiStringInput.tsx +207 -0
- package/src/forms/fields/MultiStringField/index.ts +2 -0
- package/src/forms/fields/NumberField/NumberField.tsx +173 -0
- package/src/forms/fields/NumberField/NumberInput.tsx +44 -0
- package/src/forms/fields/NumberField/index.ts +2 -0
- package/src/forms/fields/QrField/QrField.tsx +38 -0
- package/src/forms/fields/QrField/QrInput.module.sass +5 -0
- package/src/forms/fields/QrField/QrInput.tsx +144 -0
- package/src/forms/fields/QrField/index.ts +2 -0
- package/src/forms/fields/SelectField/BaseSelectField.ts +73 -0
- package/src/forms/fields/SelectField/MultiSelectField.tsx +53 -0
- package/src/forms/fields/SelectField/MultiSelectInput.tsx +80 -0
- package/src/forms/fields/SelectField/SelectField.tsx +49 -0
- package/src/forms/fields/SelectField/SelectInput.tsx +69 -0
- package/src/forms/fields/SelectField/index.ts +4 -0
- package/src/forms/fields/StringOrTextFields/StringField/StringField.tsx +61 -0
- package/src/forms/fields/StringOrTextFields/StringField/StringInput.tsx +41 -0
- package/src/forms/fields/StringOrTextFields/StringField/index.ts +2 -0
- package/src/forms/fields/StringOrTextFields/StringOrTextField.ts +143 -0
- package/src/forms/fields/StringOrTextFields/TextField/TextField.tsx +52 -0
- package/src/forms/fields/StringOrTextFields/TextField/TextInput.tsx +42 -0
- package/src/forms/fields/StringOrTextFields/TextField/index.ts +2 -0
- package/src/forms/fields/StringOrTextFields/index.ts +2 -0
- package/src/forms/fields/UploadField/UploadField.tsx +156 -0
- package/src/forms/fields/UploadField/UploadInput.tsx +220 -0
- package/src/forms/fields/UploadField/index.ts +2 -0
- package/src/forms/fields/UploadField/utils.ts +17 -0
- package/src/forms/fields/constants.ts +43 -0
- package/src/forms/fields/hooks.tsx +26 -0
- package/src/forms/fields/index.ts +12 -0
- package/src/forms/fields/typings.ts +45 -0
- package/src/forms/fields/utils.ts +125 -0
- package/src/forms/index.ts +5 -0
- package/src/forms/renderer/FormRenderer/FormRenderer.stories.tsx +142 -0
- package/src/forms/renderer/FormRenderer/FormRenderer.tsx +135 -0
- package/src/forms/renderer/PatchForm/Field.tsx +41 -0
- package/src/forms/renderer/PatchForm/PatchForm.stories.tsx +91 -0
- package/src/forms/renderer/PatchForm/Provider.tsx +119 -0
- package/src/forms/renderer/PatchForm/index.ts +2 -0
- package/src/forms/renderer/index.ts +2 -0
- package/src/forms/typings.ts +162 -0
- package/src/forms/utils.ts +69 -0
- package/src/index.ts +11 -0
- package/src/vite-env.d.ts +1 -0
- package/tailwind.config.ts +8 -0
- package/tsconfig.json +26 -0
- package/vite.config.ts +23 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { FormikErrors } from "formik"
|
|
2
|
+
import cloneDeep from "lodash.clonedeep"
|
|
3
|
+
import get from "lodash.get"
|
|
4
|
+
import set from "lodash.set"
|
|
5
|
+
|
|
6
|
+
import { FormikUserFormRevision } from "./builder"
|
|
7
|
+
import { BaseField, BaseFormElement, FieldSection, ISchema, isConditionMet } from "./fields"
|
|
8
|
+
import { Form } from "./typings"
|
|
9
|
+
|
|
10
|
+
export const hasKeys = (errors: object): boolean => {
|
|
11
|
+
return Object.keys(errors).length > 0
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export const validateForm = (schema: ISchema, form: Form | FormikUserFormRevision) => {
|
|
15
|
+
// TODO: Comments
|
|
16
|
+
const errors: FormikErrors<Form | FormikUserFormRevision> = {}
|
|
17
|
+
for (const field of schema.fields) {
|
|
18
|
+
if (field instanceof FieldSection) {
|
|
19
|
+
// if condition is not met, do not validate section
|
|
20
|
+
if (field.condition) {
|
|
21
|
+
const { identifier } = field.condition
|
|
22
|
+
|
|
23
|
+
if (!isConditionMet(field.condition, get(form, identifier))) {
|
|
24
|
+
continue
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
Object.assign(errors, field.getErrors(form))
|
|
28
|
+
} else {
|
|
29
|
+
// REASON: WebStorm is wrong, TypeScript is right. `field` is a BaseFormElement, which may be a BaseField.
|
|
30
|
+
// noinspection SuspiciousTypeOfGuard
|
|
31
|
+
if (!(field instanceof BaseField)) {
|
|
32
|
+
throw new Error("Invalid field type")
|
|
33
|
+
}
|
|
34
|
+
const id = field.getId()
|
|
35
|
+
const error = field.getError(get(form, id), form)
|
|
36
|
+
if (error) set(errors, id, error)
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// only return errors if there are any
|
|
41
|
+
if (hasKeys(errors)) return errors
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const uncontrolledValues: unknown[] = [null, undefined]
|
|
45
|
+
|
|
46
|
+
// If a value is not provided, adds empty values for all fields in the
|
|
47
|
+
// schema so that the form is fully controlled
|
|
48
|
+
export const initialFormValues = (fields: BaseFormElement[], values: Form): Form => {
|
|
49
|
+
return fields.reduce<Form>(
|
|
50
|
+
(acc, field) => {
|
|
51
|
+
// check for field section
|
|
52
|
+
if (field instanceof FieldSection) {
|
|
53
|
+
return { ...acc, ...initialFormValues(field.fields, values) }
|
|
54
|
+
}
|
|
55
|
+
// values must not be undefined or React will error as
|
|
56
|
+
// the input changes from uncontrolled to controlled
|
|
57
|
+
if (uncontrolledValues.includes(get(acc, field.getId()))) {
|
|
58
|
+
set(acc, field.getId(), "")
|
|
59
|
+
}
|
|
60
|
+
return acc
|
|
61
|
+
},
|
|
62
|
+
// TODO: Had to do this because of this error:
|
|
63
|
+
// > Uncaught TypeError: can't define property "description":
|
|
64
|
+
// > Object is not extensible"
|
|
65
|
+
// This means that we can't mutate `acc` because it's frozen for some
|
|
66
|
+
// unknown reason.
|
|
67
|
+
cloneDeep(values),
|
|
68
|
+
)
|
|
69
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from "./ColorPicker"
|
|
2
|
+
export * from "./FileBadge"
|
|
3
|
+
export * from "./FileCard"
|
|
4
|
+
export * from "./FileIcon"
|
|
5
|
+
export * from "./FileViewer"
|
|
6
|
+
export * from "./forms"
|
|
7
|
+
export * from "./ImageCard"
|
|
8
|
+
export * from "./ImageMarkup"
|
|
9
|
+
export * from "./ImageViewer"
|
|
10
|
+
export * from "./PDFViewer"
|
|
11
|
+
export * from "./SpreadsheetViewer"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/// <reference types="vite/client" />
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2020",
|
|
4
|
+
"useDefineForClassFields": true,
|
|
5
|
+
"module": "ESNext",
|
|
6
|
+
"lib": ["ES2020", "DOM", "DOM.Iterable"],
|
|
7
|
+
"skipLibCheck": true,
|
|
8
|
+
"esModuleInterop": true,
|
|
9
|
+
|
|
10
|
+
/* Bundler mode */
|
|
11
|
+
"moduleResolution": "bundler",
|
|
12
|
+
"allowImportingTsExtensions": false,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"moduleDetection": "force",
|
|
15
|
+
"noEmit": true,
|
|
16
|
+
"jsx": "react-jsx",
|
|
17
|
+
|
|
18
|
+
/* Linting */
|
|
19
|
+
"strict": true,
|
|
20
|
+
"noUnusedLocals": true,
|
|
21
|
+
"noUnusedParameters": true,
|
|
22
|
+
"noFallthroughCasesInSwitch": true,
|
|
23
|
+
"noUncheckedSideEffectImports": true
|
|
24
|
+
},
|
|
25
|
+
"include": ["src", ".storybook"],
|
|
26
|
+
}
|
package/vite.config.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { resolve } from "node:path"
|
|
2
|
+
|
|
3
|
+
import tailwindcss from "@tailwindcss/vite"
|
|
4
|
+
import react from "@vitejs/plugin-react"
|
|
5
|
+
import { ConfigEnv, defineConfig } from "vite"
|
|
6
|
+
import dts from "vite-plugin-dts"
|
|
7
|
+
import { externalizeDeps } from "vite-plugin-externalize-deps"
|
|
8
|
+
|
|
9
|
+
const VITE_LIB_NAME = "forms"
|
|
10
|
+
|
|
11
|
+
// https://vitejs.dev/config/
|
|
12
|
+
export default defineConfig(({ mode }: ConfigEnv) => ({
|
|
13
|
+
plugins: [react(), tailwindcss(), dts({ exclude: ["**/*.stories.*", ".storybook/*"] }), externalizeDeps()],
|
|
14
|
+
build: {
|
|
15
|
+
lib: {
|
|
16
|
+
entry: resolve(__dirname, "src/index.ts"),
|
|
17
|
+
name: VITE_LIB_NAME,
|
|
18
|
+
fileName: VITE_LIB_NAME,
|
|
19
|
+
},
|
|
20
|
+
minify: mode !== "development",
|
|
21
|
+
sourcemap: mode === "development",
|
|
22
|
+
},
|
|
23
|
+
}))
|