@nolwenture/formik-jsonschema-form 0.1.0 → 0.1.2

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 (82) hide show
  1. package/package.json +90 -86
  2. package/src/Form.d.ts +4 -0
  3. package/src/Form.js +52 -0
  4. package/src/Form.stories.d.ts +11 -0
  5. package/src/Form.stories.js +135 -0
  6. package/src/Form.test.d.ts +1 -0
  7. package/src/Form.test.js +9 -0
  8. package/src/FormEditor.d.ts +8 -0
  9. package/src/FormEditor.js +74 -0
  10. package/src/FormEditor.stories.d.ts +5 -0
  11. package/src/FormEditor.stories.js +22 -0
  12. package/src/_sampleData.d.ts +10 -0
  13. package/src/_sampleData.js +262 -0
  14. package/src/fields/AnyField.d.ts +3 -0
  15. package/src/fields/AnyField.js +34 -0
  16. package/src/fields/ArrayField.d.ts +3 -0
  17. package/src/fields/ArrayField.js +119 -0
  18. package/src/fields/BooleanField.d.ts +3 -0
  19. package/src/fields/BooleanField.js +22 -0
  20. package/src/fields/DateField.d.ts +3 -0
  21. package/src/fields/DateField.js +22 -0
  22. package/src/fields/NullField.d.ts +3 -0
  23. package/src/fields/NullField.js +19 -0
  24. package/src/fields/NumberField.d.ts +3 -0
  25. package/src/fields/NumberField.js +17 -0
  26. package/src/fields/ObjectField.d.ts +3 -0
  27. package/src/fields/ObjectField.js +56 -0
  28. package/src/fields/SchemaField.d.ts +3 -0
  29. package/src/fields/SchemaField.js +39 -0
  30. package/src/fields/StringField.d.ts +3 -0
  31. package/src/fields/StringField.js +60 -0
  32. package/src/fields/{index.ts → index.d.ts} +0 -0
  33. package/src/fields/index.js +9 -0
  34. package/src/fields/types.d.ts +10 -0
  35. package/src/fields/types.js +10 -0
  36. package/src/formEditorSchemas.d.ts +3 -0
  37. package/src/formEditorSchemas.js +36 -0
  38. package/src/{index.tsx → index.d.ts} +0 -0
  39. package/src/index.js +5 -0
  40. package/src/setupTests.d.ts +1 -0
  41. package/src/{setupTests.ts → setupTests.js} +0 -0
  42. package/src/styledComponents.d.ts +26 -0
  43. package/src/styledComponents.js +89 -0
  44. package/src/templates/ArrayFieldTemplate.d.ts +3 -0
  45. package/src/templates/ArrayFieldTemplate.js +27 -0
  46. package/src/templates/FieldTemplate.d.ts +3 -0
  47. package/src/templates/FieldTemplate.js +27 -0
  48. package/src/templates/ObjectFieldTemplate.d.ts +3 -0
  49. package/src/templates/ObjectFieldTemplate.js +11 -0
  50. package/src/templates/{index.ts → index.d.ts} +0 -0
  51. package/src/templates/index.js +3 -0
  52. package/src/types.d.ts +168 -0
  53. package/src/types.js +14 -0
  54. package/src/utils.d.ts +22 -0
  55. package/src/utils.js +108 -0
  56. package/.storybook/main.js +0 -13
  57. package/.storybook/preview.js +0 -9
  58. package/README.md +0 -46
  59. package/src/Form.stories.tsx +0 -124
  60. package/src/Form.test.tsx +0 -10
  61. package/src/Form.tsx +0 -71
  62. package/src/FormEditor.stories.tsx +0 -17
  63. package/src/FormEditor.tsx +0 -53
  64. package/src/_sampleData.ts +0 -273
  65. package/src/fields/AnyField.tsx +0 -35
  66. package/src/fields/ArrayField.tsx +0 -177
  67. package/src/fields/BooleanField.tsx +0 -23
  68. package/src/fields/DateField.tsx +0 -20
  69. package/src/fields/NullField.tsx +0 -12
  70. package/src/fields/NumberField.tsx +0 -14
  71. package/src/fields/ObjectField.tsx +0 -68
  72. package/src/fields/SchemaField.tsx +0 -37
  73. package/src/fields/StringField.tsx +0 -89
  74. package/src/fields/types.tsx +0 -10
  75. package/src/formEditorSchemas.ts +0 -40
  76. package/src/styledComponents.tsx +0 -107
  77. package/src/templates/ArrayFieldTemplate.tsx +0 -46
  78. package/src/templates/FieldTemplate.tsx +0 -46
  79. package/src/templates/ObjectFieldTemplate.tsx +0 -22
  80. package/src/types.ts +0 -260
  81. package/src/utils.ts +0 -124
  82. package/tsconfig.json +0 -26
@@ -0,0 +1,60 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import { useContext, useMemo } from "react";
14
+ import { FormRegistry } from "../Form";
15
+ import { useExtractUiSchema, useSetDefault } from "../utils";
16
+ function getEnums(_a) {
17
+ var schema = _a.schema;
18
+ var numberOfDefined = [schema.enum, schema.oneOf, schema.anyOf].filter(function (x) { return x; }).length;
19
+ if (numberOfDefined === 0) {
20
+ return;
21
+ }
22
+ if (numberOfDefined > 1) {
23
+ throw new Error('Only one of "enum", "oneOf" or "anyOf" can be defined!');
24
+ }
25
+ if (schema.enum) {
26
+ return {
27
+ type: "select",
28
+ values: schema.enum.map(function (option) { return ({
29
+ const: option,
30
+ title: "".concat(option),
31
+ }); }),
32
+ };
33
+ }
34
+ if (schema.oneOf) {
35
+ return {
36
+ type: "select",
37
+ values: schema.oneOf,
38
+ };
39
+ }
40
+ if (schema.anyOf) {
41
+ return {
42
+ type: "multiSelect",
43
+ values: schema.anyOf,
44
+ };
45
+ }
46
+ }
47
+ export function StringField(props) {
48
+ var _a = useContext(FormRegistry), FieldTemplate = _a.templates.FieldTemplate, FieldInput = _a.components.FieldInput;
49
+ useSetDefault(props);
50
+ var name = props.name, schema = props.schema, uiSchema = props.uiSchema;
51
+ var _b = useExtractUiSchema(uiSchema), type = _b.type, placeholder = _b.placeholder, inputProps = _b.props;
52
+ var enums = useMemo(function () { return getEnums(props); }, [props]);
53
+ switch (enums === null || enums === void 0 ? void 0 : enums.type) {
54
+ case "select":
55
+ case "multiSelect":
56
+ return (_jsx(FieldTemplate, __assign({}, props, { children: _jsxs(FieldInput, __assign({}, __assign({ type: type, placeholder: placeholder }, inputProps), { name: name, formikAs: "select", multiple: enums.type === "multiSelect" }, { children: [enums.type !== "multiSelect" && _jsx("option", { value: "" }), enums === null || enums === void 0 ? void 0 : enums.values.map(function (option, index) { return (_jsx("option", __assign({ value: option.const }, { children: option.title }), index)); })] })) })));
57
+ default:
58
+ return (_jsx(FieldTemplate, __assign({}, props, { children: _jsx(FieldInput, __assign({}, __assign({ type: type, placeholder: placeholder }, inputProps), { name: name })) })));
59
+ }
60
+ }
File without changes
@@ -0,0 +1,9 @@
1
+ export * from "./ArrayField";
2
+ export * from "./BooleanField";
3
+ export * from "./DateField";
4
+ export * from "./NullField";
5
+ export * from "./NumberField";
6
+ export * from "./ObjectField";
7
+ export * from "./SchemaField";
8
+ export * from "./StringField";
9
+ export * from "./AnyField";
@@ -0,0 +1,10 @@
1
+ export declare const COMPONENT_TYPES: {
2
+ array: string;
3
+ boolean: string;
4
+ integer: string;
5
+ number: string;
6
+ object: string;
7
+ string: string;
8
+ null: string;
9
+ any: string;
10
+ };
@@ -0,0 +1,10 @@
1
+ export var COMPONENT_TYPES = {
2
+ array: "ArrayField",
3
+ boolean: "BooleanField",
4
+ integer: "NumberField",
5
+ number: "NumberField",
6
+ object: "ObjectField",
7
+ string: "StringField",
8
+ null: "NullField",
9
+ any: "AnyField",
10
+ };
@@ -0,0 +1,3 @@
1
+ import { Schema, UiSchema } from "./types";
2
+ export declare const schema: Schema;
3
+ export declare const uiSchema: UiSchema;
@@ -0,0 +1,36 @@
1
+ var field = {
2
+ type: "object",
3
+ properties: {
4
+ type: {
5
+ type: "string",
6
+ title: "Field type",
7
+ oneOf: [
8
+ { const: "string", title: "String" },
9
+ { const: "number", title: "Number" },
10
+ { const: "array", title: "Array" },
11
+ { const: "object", title: "Object" },
12
+ ],
13
+ },
14
+ title: {
15
+ type: "string",
16
+ title: "Field title",
17
+ },
18
+ },
19
+ };
20
+ export var schema = {
21
+ type: "object",
22
+ properties: {
23
+ "schema.type": {
24
+ type: "string",
25
+ default: "object",
26
+ },
27
+ "schema.title": {
28
+ type: "string",
29
+ title: "Form title",
30
+ },
31
+ },
32
+ additionalProperties: field,
33
+ };
34
+ export var uiSchema = {
35
+ "schema.type": { props: { type: "hidden" } },
36
+ };
File without changes
package/src/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export * from "./Form";
2
+ export * as styledComponents from "./styledComponents";
3
+ export * as fields from "./fields";
4
+ export * as templates from "./templates";
5
+ export * from "./FormEditor";
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom';
File without changes
@@ -0,0 +1,26 @@
1
+ /// <reference types="react" />
2
+ import * as formik from "formik";
3
+ import { ArrayFieldButtonProps, ObjectFieldButtonProps } from "./types";
4
+ export declare const Form: import("styled-components").StyledComponent<import("react").ForwardRefExoticComponent<Pick<import("react").DetailedHTMLProps<import("react").FormHTMLAttributes<HTMLFormElement>, HTMLFormElement>, "defaultChecked" | "defaultValue" | "suppressContentEditableWarning" | "suppressHydrationWarning" | "accessKey" | "className" | "contentEditable" | "contextMenu" | "dir" | "draggable" | "hidden" | "id" | "lang" | "placeholder" | "slot" | "spellCheck" | "style" | "tabIndex" | "title" | "translate" | "radioGroup" | "role" | "about" | "datatype" | "inlist" | "prefix" | "property" | "resource" | "typeof" | "vocab" | "autoCapitalize" | "autoCorrect" | "autoSave" | "color" | "itemProp" | "itemScope" | "itemType" | "itemID" | "itemRef" | "results" | "security" | "unselectable" | "inputMode" | "is" | "aria-activedescendant" | "aria-atomic" | "aria-autocomplete" | "aria-busy" | "aria-checked" | "aria-colcount" | "aria-colindex" | "aria-colspan" | "aria-controls" | "aria-current" | "aria-describedby" | "aria-details" | "aria-disabled" | "aria-dropeffect" | "aria-errormessage" | "aria-expanded" | "aria-flowto" | "aria-grabbed" | "aria-haspopup" | "aria-hidden" | "aria-invalid" | "aria-keyshortcuts" | "aria-label" | "aria-labelledby" | "aria-level" | "aria-live" | "aria-modal" | "aria-multiline" | "aria-multiselectable" | "aria-orientation" | "aria-owns" | "aria-placeholder" | "aria-posinset" | "aria-pressed" | "aria-readonly" | "aria-relevant" | "aria-required" | "aria-roledescription" | "aria-rowcount" | "aria-rowindex" | "aria-rowspan" | "aria-selected" | "aria-setsize" | "aria-sort" | "aria-valuemax" | "aria-valuemin" | "aria-valuenow" | "aria-valuetext" | "children" | "dangerouslySetInnerHTML" | "onCopy" | "onCopyCapture" | "onCut" | "onCutCapture" | "onPaste" | "onPasteCapture" | "onCompositionEnd" | "onCompositionEndCapture" | "onCompositionStart" | "onCompositionStartCapture" | "onCompositionUpdate" | "onCompositionUpdateCapture" | "onFocus" | "onFocusCapture" | "onBlur" | "onBlurCapture" | "onChange" | "onChangeCapture" | "onBeforeInput" | "onBeforeInputCapture" | "onInput" | "onInputCapture" | "onReset" | "onResetCapture" | "onSubmit" | "onSubmitCapture" | "onInvalid" | "onInvalidCapture" | "onLoad" | "onLoadCapture" | "onError" | "onErrorCapture" | "onKeyDown" | "onKeyDownCapture" | "onKeyPress" | "onKeyPressCapture" | "onKeyUp" | "onKeyUpCapture" | "onAbort" | "onAbortCapture" | "onCanPlay" | "onCanPlayCapture" | "onCanPlayThrough" | "onCanPlayThroughCapture" | "onDurationChange" | "onDurationChangeCapture" | "onEmptied" | "onEmptiedCapture" | "onEncrypted" | "onEncryptedCapture" | "onEnded" | "onEndedCapture" | "onLoadedData" | "onLoadedDataCapture" | "onLoadedMetadata" | "onLoadedMetadataCapture" | "onLoadStart" | "onLoadStartCapture" | "onPause" | "onPauseCapture" | "onPlay" | "onPlayCapture" | "onPlaying" | "onPlayingCapture" | "onProgress" | "onProgressCapture" | "onRateChange" | "onRateChangeCapture" | "onSeeked" | "onSeekedCapture" | "onSeeking" | "onSeekingCapture" | "onStalled" | "onStalledCapture" | "onSuspend" | "onSuspendCapture" | "onTimeUpdate" | "onTimeUpdateCapture" | "onVolumeChange" | "onVolumeChangeCapture" | "onWaiting" | "onWaitingCapture" | "onAuxClick" | "onAuxClickCapture" | "onClick" | "onClickCapture" | "onContextMenu" | "onContextMenuCapture" | "onDoubleClick" | "onDoubleClickCapture" | "onDrag" | "onDragCapture" | "onDragEnd" | "onDragEndCapture" | "onDragEnter" | "onDragEnterCapture" | "onDragExit" | "onDragExitCapture" | "onDragLeave" | "onDragLeaveCapture" | "onDragOver" | "onDragOverCapture" | "onDragStart" | "onDragStartCapture" | "onDrop" | "onDropCapture" | "onMouseDown" | "onMouseDownCapture" | "onMouseEnter" | "onMouseLeave" | "onMouseMove" | "onMouseMoveCapture" | "onMouseOut" | "onMouseOutCapture" | "onMouseOver" | "onMouseOverCapture" | "onMouseUp" | "onMouseUpCapture" | "onSelect" | "onSelectCapture" | "onTouchCancel" | "onTouchCancelCapture" | "onTouchEnd" | "onTouchEndCapture" | "onTouchMove" | "onTouchMoveCapture" | "onTouchStart" | "onTouchStartCapture" | "onPointerDown" | "onPointerDownCapture" | "onPointerMove" | "onPointerMoveCapture" | "onPointerUp" | "onPointerUpCapture" | "onPointerCancel" | "onPointerCancelCapture" | "onPointerEnter" | "onPointerEnterCapture" | "onPointerLeave" | "onPointerLeaveCapture" | "onPointerOver" | "onPointerOverCapture" | "onPointerOut" | "onPointerOutCapture" | "onGotPointerCapture" | "onGotPointerCaptureCapture" | "onLostPointerCapture" | "onLostPointerCaptureCapture" | "onScroll" | "onScrollCapture" | "onWheel" | "onWheelCapture" | "onAnimationStart" | "onAnimationStartCapture" | "onAnimationEnd" | "onAnimationEndCapture" | "onAnimationIteration" | "onAnimationIterationCapture" | "onTransitionEnd" | "onTransitionEndCapture" | "name" | "acceptCharset" | "action" | "autoComplete" | "encType" | "method" | "noValidate" | "target" | "key"> & import("react").RefAttributes<HTMLFormElement>>, any, {}, never>;
5
+ export declare const FormButtonWrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
6
+ export declare const FormButton: import("styled-components").StyledComponent<"button", any, {}, never>;
7
+ export declare const ObjectFieldWrapper: import("styled-components").StyledComponent<"fieldset", any, {}, never>;
8
+ export declare const ObjectFieldTitle: import("styled-components").StyledComponent<"legend", any, {}, never>;
9
+ export declare const ObjectFieldList: import("styled-components").StyledComponent<"ul", any, {}, never>;
10
+ export declare const ObjectFieldItem: import("styled-components").StyledComponent<"li", any, {}, never>;
11
+ export declare const ObjectFieldItemButtons: import("styled-components").StyledComponent<"div", any, {}, never>;
12
+ export declare const ObjectFieldButtonEl: import("styled-components").StyledComponent<"a", any, {}, never>;
13
+ export declare function ObjectFieldButton({ purpose, onClick, }: ObjectFieldButtonProps): JSX.Element;
14
+ export declare const ArrayFieldWrapper: import("styled-components").StyledComponent<"fieldset", any, {}, never>;
15
+ export declare const ArrayFieldTitle: import("styled-components").StyledComponent<"legend", any, {}, never>;
16
+ export declare const ArrayFieldList: import("styled-components").StyledComponent<"ul", any, {}, never>;
17
+ export declare const ArrayFieldItem: import("styled-components").StyledComponent<"li", any, {}, never>;
18
+ export declare const ArrayFieldItemButtons: import("styled-components").StyledComponent<"div", any, {}, never>;
19
+ export declare const ArrayFieldButtonEl: import("styled-components").StyledComponent<"a", any, {}, never>;
20
+ export declare function ArrayFieldButton({ purpose, onClick }: ArrayFieldButtonProps): JSX.Element;
21
+ export declare const FieldWrapper: import("styled-components").StyledComponent<"div", any, {}, never>;
22
+ export declare const FieldTitle: import("styled-components").StyledComponent<"label", any, {}, never>;
23
+ export declare const FieldDescription: import("styled-components").StyledComponent<"p", any, {}, never>;
24
+ export declare const FieldHelp: import("styled-components").StyledComponent<"p", any, {}, never>;
25
+ export declare const ErrorMessage: import("styled-components").StyledComponent<import("react").ComponentType<formik.ErrorMessageProps>, any, {}, never>;
26
+ export declare const FieldInput: import("styled-components").StyledComponent<({ formikAs, ...props }: any) => JSX.Element, any, {}, never>;
@@ -0,0 +1,89 @@
1
+ var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
2
+ if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
3
+ return cooked;
4
+ };
5
+ var __assign = (this && this.__assign) || function () {
6
+ __assign = Object.assign || function(t) {
7
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
8
+ s = arguments[i];
9
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
10
+ t[p] = s[p];
11
+ }
12
+ return t;
13
+ };
14
+ return __assign.apply(this, arguments);
15
+ };
16
+ var __rest = (this && this.__rest) || function (s, e) {
17
+ var t = {};
18
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
19
+ t[p] = s[p];
20
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
21
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
22
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
23
+ t[p[i]] = s[p[i]];
24
+ }
25
+ return t;
26
+ };
27
+ import { jsx as _jsx } from "react/jsx-runtime";
28
+ import styled from "styled-components";
29
+ import * as formik from "formik";
30
+ import { ArrayFieldButtonPurpose, ObjectFieldButtonPurpose, } from "./types";
31
+ export var Form = styled(formik.Form)(templateObject_1 || (templateObject_1 = __makeTemplateObject([""], [""])));
32
+ export var FormButtonWrapper = styled.div(templateObject_2 || (templateObject_2 = __makeTemplateObject([""], [""])));
33
+ export var FormButton = styled.button(templateObject_3 || (templateObject_3 = __makeTemplateObject([""], [""])));
34
+ export var ObjectFieldWrapper = styled.fieldset(templateObject_4 || (templateObject_4 = __makeTemplateObject([""], [""])));
35
+ export var ObjectFieldTitle = styled.legend(templateObject_5 || (templateObject_5 = __makeTemplateObject([""], [""])));
36
+ export var ObjectFieldList = styled.ul(templateObject_6 || (templateObject_6 = __makeTemplateObject(["\n list-style-type: none;\n padding: 0;\n"], ["\n list-style-type: none;\n padding: 0;\n"])));
37
+ export var ObjectFieldItem = styled.li(templateObject_7 || (templateObject_7 = __makeTemplateObject(["\n display: flex;\n"], ["\n display: flex;\n"])));
38
+ export var ObjectFieldItemButtons = styled.div(templateObject_8 || (templateObject_8 = __makeTemplateObject(["\n display: flex;\n margin: 0.5rem;\n"], ["\n display: flex;\n margin: 0.5rem;\n"])));
39
+ export var ObjectFieldButtonEl = styled.a(templateObject_9 || (templateObject_9 = __makeTemplateObject(["\n cursor: pointer;\n border: 1px solid black;\n display: block;\n line-height: 1em;\n height: 1em;\n width: 1em;\n text-align: center;\n"], ["\n cursor: pointer;\n border: 1px solid black;\n display: block;\n line-height: 1em;\n height: 1em;\n width: 1em;\n text-align: center;\n"])));
40
+ export function ObjectFieldButton(_a) {
41
+ var purpose = _a.purpose, onClick = _a.onClick;
42
+ switch (purpose) {
43
+ case ObjectFieldButtonPurpose.ADD:
44
+ return _jsx(ObjectFieldButtonEl, __assign({ onClick: onClick }, { children: "+" }));
45
+ case ObjectFieldButtonPurpose.REMOVE:
46
+ return _jsx(ObjectFieldButtonEl, __assign({ onClick: onClick }, { children: "-" }));
47
+ case ObjectFieldButtonPurpose.MOVE_UP:
48
+ return _jsx(ObjectFieldButtonEl, __assign({ onClick: onClick }, { children: "\u2191" }));
49
+ case ObjectFieldButtonPurpose.MOVE_DOWN:
50
+ return _jsx(ObjectFieldButtonEl, __assign({ onClick: onClick }, { children: "\u2193" }));
51
+ default:
52
+ return (_jsx(ObjectFieldButtonEl, __assign({ onClick: onClick }, { children: "UNKNOWN PURPOSE" })));
53
+ }
54
+ }
55
+ export var ArrayFieldWrapper = ObjectFieldWrapper;
56
+ export var ArrayFieldTitle = ObjectFieldTitle;
57
+ export var ArrayFieldList = ObjectFieldList;
58
+ export var ArrayFieldItem = ObjectFieldItem;
59
+ export var ArrayFieldItemButtons = ObjectFieldItemButtons;
60
+ export var ArrayFieldButtonEl = ObjectFieldButtonEl;
61
+ export function ArrayFieldButton(_a) {
62
+ var purpose = _a.purpose, onClick = _a.onClick;
63
+ switch (purpose) {
64
+ case ArrayFieldButtonPurpose.ADD:
65
+ return _jsx(ArrayFieldButtonEl, __assign({ onClick: onClick }, { children: "+" }));
66
+ case ArrayFieldButtonPurpose.REMOVE:
67
+ return _jsx(ArrayFieldButtonEl, __assign({ onClick: onClick }, { children: "-" }));
68
+ case ArrayFieldButtonPurpose.MOVE_UP:
69
+ return _jsx(ArrayFieldButtonEl, __assign({ onClick: onClick }, { children: "\u2191" }));
70
+ case ArrayFieldButtonPurpose.MOVE_DOWN:
71
+ return _jsx(ArrayFieldButtonEl, __assign({ onClick: onClick }, { children: "\u2193" }));
72
+ default:
73
+ return (_jsx(ArrayFieldButtonEl, __assign({ onClick: onClick }, { children: "UNKNOWN PURPOSE" })));
74
+ }
75
+ }
76
+ export var FieldWrapper = styled.div(templateObject_10 || (templateObject_10 = __makeTemplateObject(["\n margin: 0.5rem 0;\n"], ["\n margin: 0.5rem 0;\n"])));
77
+ export var FieldTitle = styled.label(templateObject_11 || (templateObject_11 = __makeTemplateObject(["\n font-weight: 700;\n"], ["\n font-weight: 700;\n"])));
78
+ export var FieldDescription = styled.p(templateObject_12 || (templateObject_12 = __makeTemplateObject(["\n margin: 0;\n font-size: 0.9em;\n"], ["\n margin: 0;\n font-size: 0.9em;\n"])));
79
+ export var FieldHelp = styled.p(templateObject_13 || (templateObject_13 = __makeTemplateObject(["\n margin: 0;\n font-size: 0.9em;\n"], ["\n margin: 0;\n font-size: 0.9em;\n"])));
80
+ export var ErrorMessage = styled(formik.ErrorMessage)(templateObject_14 || (templateObject_14 = __makeTemplateObject([""], [""])));
81
+ /*
82
+ * Works like Formik field, but "as" props needs to be given with "formikAs", since styled components uses as.
83
+ *
84
+ */
85
+ export var FieldInput = styled(function (_a) {
86
+ var formikAs = _a.formikAs, props = __rest(_a, ["formikAs"]);
87
+ return _jsx(formik.Field, __assign({}, props, { as: formikAs }));
88
+ })(templateObject_15 || (templateObject_15 = __makeTemplateObject([""], [""])));
89
+ var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6, templateObject_7, templateObject_8, templateObject_9, templateObject_10, templateObject_11, templateObject_12, templateObject_13, templateObject_14, templateObject_15;
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ import { ArrayFieldTemplateProps } from "../types";
3
+ export declare function ArrayFieldTemplate(props: ArrayFieldTemplateProps): JSX.Element;
@@ -0,0 +1,27 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import { useContext } from "react";
14
+ import { FormRegistry } from "../Form";
15
+ import { useExtractUiSchema, getDescription, getTitle } from "../utils";
16
+ export function ArrayFieldTemplate(props) {
17
+ var _a = useContext(FormRegistry).components, ArrayFieldWrapper = _a.ArrayFieldWrapper, ArrayFieldTitle = _a.ArrayFieldTitle, FieldDescription = _a.FieldDescription, ErrorMessage = _a.ErrorMessage, FieldHelp = _a.FieldHelp;
18
+ var name = props.name, uiSchema = props.uiSchema, children = props.children;
19
+ var title = getTitle(props);
20
+ var description = getDescription(props);
21
+ var _b = useExtractUiSchema(uiSchema), help = _b.help,
22
+ //TODO: This is not right
23
+ _c = _b.props,
24
+ //TODO: This is not right
25
+ _d = _c === void 0 ? {} : _c, wrappertProps = _d.wrapper, titleProps = _d.title, descriptionProps = _d.description, helpProps = _d.help, errorProps = _d.error;
26
+ return (_jsxs(ArrayFieldWrapper, __assign({}, wrappertProps, { children: [title && (_jsx(ArrayFieldTitle, __assign({}, titleProps, { htmlFor: name }, { children: title }))), description && (_jsx(FieldDescription, __assign({}, descriptionProps, { children: description }))), children, help && _jsx(FieldHelp, __assign({}, helpProps, { children: help })), _jsx(ErrorMessage, __assign({}, errorProps, { name: name }))] })));
27
+ }
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ import { FieldTemplateProps } from "../types";
3
+ export declare function FieldTemplate(props: FieldTemplateProps): JSX.Element;
@@ -0,0 +1,27 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import { useContext } from "react";
14
+ import { FormRegistry } from "../Form";
15
+ import { useExtractUiSchema, getDescription, getTitle } from "../utils";
16
+ export function FieldTemplate(props) {
17
+ var _a = useContext(FormRegistry).components, FieldWrapper = _a.FieldWrapper, FieldTitle = _a.FieldTitle, FieldDescription = _a.FieldDescription, ErrorMessage = _a.ErrorMessage, FieldHelp = _a.FieldHelp;
18
+ var name = props.name, uiSchema = props.uiSchema, children = props.children;
19
+ var title = getTitle(props);
20
+ var description = getDescription(props);
21
+ var _b = useExtractUiSchema(uiSchema), help = _b.help,
22
+ //TODO: This is not right
23
+ _c = _b.props,
24
+ //TODO: This is not right
25
+ _d = _c === void 0 ? {} : _c, wrappertProps = _d.wrapper, titleProps = _d.title, descriptionProps = _d.description, helpProps = _d.help, errorProps = _d.error;
26
+ return (_jsxs(FieldWrapper, __assign({}, wrappertProps, { children: [title && (_jsx(FieldTitle, __assign({}, titleProps, { htmlFor: name }, { children: title }))), description && (_jsx(FieldDescription, __assign({}, descriptionProps, { children: description }))), children, help && _jsx(FieldHelp, __assign({}, helpProps, { children: help })), _jsx(ErrorMessage, __assign({}, errorProps, { name: name }))] })));
27
+ }
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ import { ObjectFieldTemplateProps } from "../types";
3
+ export declare function ObjectFieldTemplate(props: ObjectFieldTemplateProps): JSX.Element;
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useContext } from "react";
3
+ import { FormRegistry } from "../Form";
4
+ import { getDescription, getTitle } from "../utils";
5
+ export function ObjectFieldTemplate(props) {
6
+ var _a = useContext(FormRegistry).components, FieldDescription = _a.FieldDescription, ObjectFieldTitle = _a.ObjectFieldTitle, ObjectFieldWrapper = _a.ObjectFieldWrapper;
7
+ var children = props.children;
8
+ var title = getTitle(props);
9
+ var description = getDescription(props);
10
+ return (_jsxs(ObjectFieldWrapper, { children: [title && _jsx(ObjectFieldTitle, { children: title }), description && _jsx(FieldDescription, { children: description }), children] }));
11
+ }
File without changes
@@ -0,0 +1,3 @@
1
+ export * from "./ArrayFieldTemplate";
2
+ export * from "./FieldTemplate";
3
+ export * from "./ObjectFieldTemplate";
package/src/types.d.ts ADDED
@@ -0,0 +1,168 @@
1
+ import * as React from "react";
2
+ import { JSONSchema7 } from "json-schema";
3
+ export type FormProps<T> = React.PropsWithChildren<{
4
+ /** If true, disabled prop is passed down to each field on the form */
5
+ disabled?: boolean | undefined;
6
+ /** If true, array field schemas missing 'additionalItems' will replace it with 'items' */
7
+ useItemsAsAdditionalItems?: boolean | undefined;
8
+ className?: string | undefined;
9
+ /** Form schema */
10
+ schema: Schema;
11
+ /** Form uiSchema */
12
+ uiSchema?: UiSchema | undefined;
13
+ /** Data that is passed down to all fields. Used for implementing context aware fields */
14
+ formContext?: Record<string, any>;
15
+ /** Dictionary of registered fields */
16
+ fields?: {
17
+ [name: string]: Field;
18
+ } | undefined;
19
+ templates?: Partial<TemplatesType>;
20
+ components?: Partial<ComponentsType>;
21
+ /**
22
+ * If set to true, turns off HTML5 validation
23
+ * @default false
24
+ */
25
+ noHtml5Validate?: boolean | undefined;
26
+ }>;
27
+ export type Schema = JSONSchema7;
28
+ export type UiSchema = {
29
+ "ui:field"?: Field | string;
30
+ "ui:options"?: {
31
+ [key: string]: boolean | number | string | object | any[] | null;
32
+ };
33
+ "ui:props"?: {
34
+ [key: string]: any;
35
+ };
36
+ "ui:help"?: React.ReactNode | React.ReactNode[];
37
+ [name: string]: any;
38
+ };
39
+ export type FormRegistryContextValue = {
40
+ fields: Record<string, Field>;
41
+ templates: TemplatesType;
42
+ components: ComponentsType;
43
+ definitions: Record<string, any>;
44
+ formContext: Record<string, any>;
45
+ useItemsAsAdditionalItems: boolean;
46
+ };
47
+ export interface FieldProps extends Pick<React.HTMLAttributes<HTMLElement>, Exclude<keyof React.HTMLAttributes<HTMLElement>, "onBlur">> {
48
+ name: string;
49
+ schema: Schema;
50
+ uiSchema: UiSchema;
51
+ disabled?: boolean;
52
+ readonly?: boolean;
53
+ required?: boolean;
54
+ [prop: string]: any;
55
+ }
56
+ export type Field = React.FunctionComponent<FieldProps>;
57
+ /*** TEMPLATES ***/
58
+ export type FieldTemplateProps = React.PropsWithChildren<{
59
+ name: string;
60
+ schema: Schema;
61
+ uiSchema?: UiSchema;
62
+ hidden?: boolean;
63
+ required?: boolean;
64
+ readonly?: boolean;
65
+ disabled?: boolean;
66
+ }>;
67
+ export type ArrayFieldTemplateProps = React.PropsWithChildren<{
68
+ name: string;
69
+ schema: Schema;
70
+ uiSchema?: UiSchema;
71
+ hidden?: boolean;
72
+ required?: boolean;
73
+ readonly?: boolean;
74
+ disabled?: boolean;
75
+ }>;
76
+ export type ObjectFieldTemplateProps = {
77
+ schema: Schema;
78
+ uiSchema?: UiSchema;
79
+ required?: boolean;
80
+ children: React.ReactNode;
81
+ };
82
+ export type TemplatesType = {
83
+ FieldTemplate: React.FunctionComponent<FieldTemplateProps>;
84
+ ObjectFieldTemplate: React.FunctionComponent<ObjectFieldTemplateProps>;
85
+ ArrayFieldTemplate: React.FunctionComponent<ArrayFieldTemplateProps>;
86
+ };
87
+ /*** COMPONENTS ***/
88
+ export type ComponentsType = {
89
+ Form: React.FunctionComponent<any>;
90
+ FormButtonWrapper: React.FunctionComponent<any>;
91
+ FormButton: React.FunctionComponent<any>;
92
+ ObjectFieldWrapper: React.FunctionComponent<any>;
93
+ ObjectFieldTitle: React.FunctionComponent<any>;
94
+ ObjectFieldItem: React.FunctionComponent<any>;
95
+ ObjectFieldItemButtons: React.FunctionComponent<any>;
96
+ ObjectFieldList: React.FunctionComponent<any>;
97
+ ObjectFieldButton: React.FunctionComponent<ObjectFieldButtonProps>;
98
+ ArrayFieldWrapper: React.FunctionComponent<any>;
99
+ ArrayFieldTitle: React.FunctionComponent<any>;
100
+ ArrayFieldItem: React.FunctionComponent<any>;
101
+ ArrayFieldItemButtons: React.FunctionComponent<any>;
102
+ ArrayFieldList: React.FunctionComponent<any>;
103
+ ArrayFieldButton: React.FunctionComponent<ArrayFieldButtonProps>;
104
+ FieldWrapper: React.FunctionComponent<any>;
105
+ FieldTitle: React.FunctionComponent<any>;
106
+ FieldDescription: React.FunctionComponent<any>;
107
+ FieldHelp: React.FunctionComponent<any>;
108
+ ErrorMessage: React.FunctionComponent<any>;
109
+ FieldInput: React.FunctionComponent<any>;
110
+ };
111
+ export declare enum ObjectFieldButtonPurpose {
112
+ ADD = 0,
113
+ REMOVE = 1,
114
+ MOVE_UP = 2,
115
+ MOVE_DOWN = 3
116
+ }
117
+ export type ObjectFieldButtonProps = {
118
+ purpose: ObjectFieldButtonPurpose;
119
+ onClick: () => void;
120
+ };
121
+ export declare enum ArrayFieldButtonPurpose {
122
+ ADD = 0,
123
+ REMOVE = 1,
124
+ MOVE_UP = 2,
125
+ MOVE_DOWN = 3
126
+ }
127
+ export type ArrayFieldButtonProps = {
128
+ purpose: ArrayFieldButtonPurpose;
129
+ onClick: () => void;
130
+ };
131
+ /*** ***/
132
+ export type AjvError = {
133
+ message: string;
134
+ name: string;
135
+ params: any;
136
+ property: string;
137
+ stack: string;
138
+ };
139
+ export type ErrorListProps = {
140
+ errorSchema: FormValidation;
141
+ errors: AjvError[];
142
+ schema: Schema;
143
+ uiSchema: UiSchema;
144
+ };
145
+ export type IChangeEvent<T = any> = {
146
+ edit: boolean;
147
+ formData: T;
148
+ errors: AjvError[];
149
+ errorSchema: FormValidation;
150
+ schema: Schema;
151
+ uiSchema: UiSchema;
152
+ status?: string | undefined;
153
+ };
154
+ export type ISubmitEvent<T> = IChangeEvent<T>;
155
+ export type FieldError = string;
156
+ type FieldValidation = {
157
+ __errors: FieldError[];
158
+ addError: (message: string) => void;
159
+ };
160
+ type FormValidation = FieldValidation & {
161
+ [fieldName: string]: FieldValidation;
162
+ };
163
+ export type AddButtonProps = {
164
+ className: string;
165
+ onClick: (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;
166
+ disabled: boolean;
167
+ };
168
+ export {};
package/src/types.js ADDED
@@ -0,0 +1,14 @@
1
+ export var ObjectFieldButtonPurpose;
2
+ (function (ObjectFieldButtonPurpose) {
3
+ ObjectFieldButtonPurpose[ObjectFieldButtonPurpose["ADD"] = 0] = "ADD";
4
+ ObjectFieldButtonPurpose[ObjectFieldButtonPurpose["REMOVE"] = 1] = "REMOVE";
5
+ ObjectFieldButtonPurpose[ObjectFieldButtonPurpose["MOVE_UP"] = 2] = "MOVE_UP";
6
+ ObjectFieldButtonPurpose[ObjectFieldButtonPurpose["MOVE_DOWN"] = 3] = "MOVE_DOWN";
7
+ })(ObjectFieldButtonPurpose || (ObjectFieldButtonPurpose = {}));
8
+ export var ArrayFieldButtonPurpose;
9
+ (function (ArrayFieldButtonPurpose) {
10
+ ArrayFieldButtonPurpose[ArrayFieldButtonPurpose["ADD"] = 0] = "ADD";
11
+ ArrayFieldButtonPurpose[ArrayFieldButtonPurpose["REMOVE"] = 1] = "REMOVE";
12
+ ArrayFieldButtonPurpose[ArrayFieldButtonPurpose["MOVE_UP"] = 2] = "MOVE_UP";
13
+ ArrayFieldButtonPurpose[ArrayFieldButtonPurpose["MOVE_DOWN"] = 3] = "MOVE_DOWN";
14
+ })(ArrayFieldButtonPurpose || (ArrayFieldButtonPurpose = {}));
package/src/utils.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ import { FieldProps, Schema, UiSchema } from "./types";
2
+ export declare function getTitle({ title, uiSchema, schema, name, }: {
3
+ title?: string;
4
+ uiSchema?: UiSchema;
5
+ schema?: Schema;
6
+ name?: string;
7
+ }): any;
8
+ export declare function getDescription({ description, uiSchema, schema, }: {
9
+ description?: string;
10
+ uiSchema?: UiSchema;
11
+ schema?: Schema;
12
+ }): any;
13
+ export declare function useSetDefault(props: FieldProps): void;
14
+ export declare function useExtractUiSchema(props?: UiSchema | undefined): {
15
+ [name: string]: any;
16
+ field?: UiSchema["ui:field"];
17
+ props?: UiSchema["ui:props"];
18
+ help?: UiSchema["ui:help"];
19
+ };
20
+ export declare const guessType: (value: any) => "string" | "number" | "boolean" | "object" | "array" | "null";
21
+ export declare function getSchemaType(schema: Schema): import("json-schema").JSONSchema7TypeName | import("json-schema").JSONSchema7TypeName[] | undefined;
22
+ export declare function warnFromUnsupportedKeys(componentName: string, data: Record<string, any>, supportedKeys: string[]): void;