@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.
Files changed (130) hide show
  1. package/.husky/pre-commit +6 -0
  2. package/.prettierrc.json +10 -0
  3. package/.storybook/StoryDecorator.tsx +22 -0
  4. package/.storybook/main.ts +20 -0
  5. package/.storybook/palettes/green.css +66 -0
  6. package/.storybook/palettes/red.css +66 -0
  7. package/.storybook/preview.css +39 -0
  8. package/.storybook/preview.tsx +31 -0
  9. package/.storybook/tailwind-theme/accentPalette.css +181 -0
  10. package/.storybook/tailwind-theme/backgrounds.css +11 -0
  11. package/.storybook/tailwind-theme/basePalette.css +178 -0
  12. package/dev/publish-alpha.sh +13 -0
  13. package/dev/publish-patch.sh +3 -0
  14. package/eslint.config.js +56 -0
  15. package/package.json +93 -0
  16. package/src/ColorPicker/ColorPicker.tsx +47 -0
  17. package/src/ColorPicker/index.ts +1 -0
  18. package/src/FileBadge/FileBadge.tsx +27 -0
  19. package/src/FileBadge/index.ts +1 -0
  20. package/src/FileCard/FileCard.stories.tsx +69 -0
  21. package/src/FileCard/FileCard.tsx +53 -0
  22. package/src/FileCard/index.ts +1 -0
  23. package/src/FileIcon/FileIcon.tsx +31 -0
  24. package/src/FileIcon/index.ts +1 -0
  25. package/src/FileViewer/FileViewerProvider.stories.tsx +50 -0
  26. package/src/FileViewer/FileViewerProvider.tsx +72 -0
  27. package/src/FileViewer/context.ts +11 -0
  28. package/src/FileViewer/index.ts +3 -0
  29. package/src/FileViewer/typings.ts +5 -0
  30. package/src/ImageCard/ImageCard.stories.tsx +94 -0
  31. package/src/ImageCard/ImageCard.tsx +82 -0
  32. package/src/ImageCard/index.ts +1 -0
  33. package/src/ImageMarkup/ImageMarkup.stories.tsx +65 -0
  34. package/src/ImageMarkup/ImageMarkup.tsx +268 -0
  35. package/src/ImageMarkup/index.ts +1 -0
  36. package/src/ImageViewer/ImageViewer.stories.tsx +57 -0
  37. package/src/ImageViewer/ImageViewer.tsx +124 -0
  38. package/src/ImageViewer/constants.ts +1 -0
  39. package/src/ImageViewer/index.ts +2 -0
  40. package/src/PDFViewer/PDFViewer.stories.tsx +55 -0
  41. package/src/PDFViewer/PDFViewer.tsx +170 -0
  42. package/src/PDFViewer/constants.ts +1 -0
  43. package/src/PDFViewer/index.ts +2 -0
  44. package/src/SpreadsheetViewer/SpreadsheetViewer.stories.tsx +55 -0
  45. package/src/SpreadsheetViewer/SpreadsheetViewer.tsx +162 -0
  46. package/src/SpreadsheetViewer/constants.ts +8 -0
  47. package/src/SpreadsheetViewer/index.ts +2 -0
  48. package/src/forms/builder/DropDispatch.ts +84 -0
  49. package/src/forms/builder/FieldActions.tsx +155 -0
  50. package/src/forms/builder/FieldBuilder.tsx +386 -0
  51. package/src/forms/builder/FieldSectionWithActions.tsx +260 -0
  52. package/src/forms/builder/FieldWithActions.tsx +129 -0
  53. package/src/forms/builder/FieldsEditor.tsx +180 -0
  54. package/src/forms/builder/FormBuilder.stories.tsx +105 -0
  55. package/src/forms/builder/FormBuilder.tsx +237 -0
  56. package/src/forms/builder/constants.ts +18 -0
  57. package/src/forms/builder/hooks.tsx +24 -0
  58. package/src/forms/builder/index.ts +2 -0
  59. package/src/forms/builder/typings.ts +18 -0
  60. package/src/forms/builder/utils.ts +229 -0
  61. package/src/forms/constants.ts +9 -0
  62. package/src/forms/constantsJsx.tsx +67 -0
  63. package/src/forms/fields/BaseField/BaseField.ts +152 -0
  64. package/src/forms/fields/BaseField/hooks.tsx +60 -0
  65. package/src/forms/fields/BaseField/index.ts +4 -0
  66. package/src/forms/fields/BaseField/layouts.tsx +100 -0
  67. package/src/forms/fields/BaseField/typings.ts +9 -0
  68. package/src/forms/fields/BooleanField/BooleanField.tsx +48 -0
  69. package/src/forms/fields/BooleanField/BooleanInput.tsx +54 -0
  70. package/src/forms/fields/BooleanField/index.ts +2 -0
  71. package/src/forms/fields/CustomField/CustomField.tsx +45 -0
  72. package/src/forms/fields/CustomField/FieldInputClonerField/FieldInputCloner.tsx +25 -0
  73. package/src/forms/fields/CustomField/FieldInputClonerField/FieldInputClonerField.tsx +26 -0
  74. package/src/forms/fields/CustomField/FieldInputClonerField/index.ts +3 -0
  75. package/src/forms/fields/CustomField/FieldInputClonerField/typings.ts +8 -0
  76. package/src/forms/fields/CustomField/index.ts +1 -0
  77. package/src/forms/fields/DateField/DateField.tsx +42 -0
  78. package/src/forms/fields/DateField/DateInput.tsx +39 -0
  79. package/src/forms/fields/DateField/index.ts +2 -0
  80. package/src/forms/fields/FieldSection/FieldSection.tsx +173 -0
  81. package/src/forms/fields/FieldSection/FieldSectionLayout.tsx +56 -0
  82. package/src/forms/fields/FieldSection/index.ts +1 -0
  83. package/src/forms/fields/MultiStringField/MultiStringField.tsx +90 -0
  84. package/src/forms/fields/MultiStringField/MultiStringInput.tsx +207 -0
  85. package/src/forms/fields/MultiStringField/index.ts +2 -0
  86. package/src/forms/fields/NumberField/NumberField.tsx +173 -0
  87. package/src/forms/fields/NumberField/NumberInput.tsx +44 -0
  88. package/src/forms/fields/NumberField/index.ts +2 -0
  89. package/src/forms/fields/QrField/QrField.tsx +38 -0
  90. package/src/forms/fields/QrField/QrInput.module.sass +5 -0
  91. package/src/forms/fields/QrField/QrInput.tsx +144 -0
  92. package/src/forms/fields/QrField/index.ts +2 -0
  93. package/src/forms/fields/SelectField/BaseSelectField.ts +73 -0
  94. package/src/forms/fields/SelectField/MultiSelectField.tsx +53 -0
  95. package/src/forms/fields/SelectField/MultiSelectInput.tsx +80 -0
  96. package/src/forms/fields/SelectField/SelectField.tsx +49 -0
  97. package/src/forms/fields/SelectField/SelectInput.tsx +69 -0
  98. package/src/forms/fields/SelectField/index.ts +4 -0
  99. package/src/forms/fields/StringOrTextFields/StringField/StringField.tsx +61 -0
  100. package/src/forms/fields/StringOrTextFields/StringField/StringInput.tsx +41 -0
  101. package/src/forms/fields/StringOrTextFields/StringField/index.ts +2 -0
  102. package/src/forms/fields/StringOrTextFields/StringOrTextField.ts +143 -0
  103. package/src/forms/fields/StringOrTextFields/TextField/TextField.tsx +52 -0
  104. package/src/forms/fields/StringOrTextFields/TextField/TextInput.tsx +42 -0
  105. package/src/forms/fields/StringOrTextFields/TextField/index.ts +2 -0
  106. package/src/forms/fields/StringOrTextFields/index.ts +2 -0
  107. package/src/forms/fields/UploadField/UploadField.tsx +156 -0
  108. package/src/forms/fields/UploadField/UploadInput.tsx +220 -0
  109. package/src/forms/fields/UploadField/index.ts +2 -0
  110. package/src/forms/fields/UploadField/utils.ts +17 -0
  111. package/src/forms/fields/constants.ts +43 -0
  112. package/src/forms/fields/hooks.tsx +26 -0
  113. package/src/forms/fields/index.ts +12 -0
  114. package/src/forms/fields/typings.ts +45 -0
  115. package/src/forms/fields/utils.ts +125 -0
  116. package/src/forms/index.ts +5 -0
  117. package/src/forms/renderer/FormRenderer/FormRenderer.stories.tsx +142 -0
  118. package/src/forms/renderer/FormRenderer/FormRenderer.tsx +135 -0
  119. package/src/forms/renderer/PatchForm/Field.tsx +41 -0
  120. package/src/forms/renderer/PatchForm/PatchForm.stories.tsx +91 -0
  121. package/src/forms/renderer/PatchForm/Provider.tsx +119 -0
  122. package/src/forms/renderer/PatchForm/index.ts +2 -0
  123. package/src/forms/renderer/index.ts +2 -0
  124. package/src/forms/typings.ts +162 -0
  125. package/src/forms/utils.ts +69 -0
  126. package/src/index.ts +11 -0
  127. package/src/vite-env.d.ts +1 -0
  128. package/tailwind.config.ts +8 -0
  129. package/tsconfig.json +26 -0
  130. 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" />
@@ -0,0 +1,8 @@
1
+ import type { Config } from "tailwindcss"
2
+ import animatePlugin from "tailwindcss-animate"
3
+
4
+ export default {
5
+ content: ["./src/**/*.{js,ts,jsx,tsx}"],
6
+ darkMode: ["class", ".dark"],
7
+ plugins: [animatePlugin],
8
+ } satisfies Config
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
+ }))