@qoretechnologies/reqraft 0.3.1 → 0.3.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/dist/components/form/fields/Field.js +24 -31
- package/dist/components/form/fields/Field.js.map +1 -1
- package/dist/components/form/fields/boolean/Boolean.js +5 -9
- package/dist/components/form/fields/boolean/Boolean.js.map +1 -1
- package/dist/components/form/fields/color/Color.js +7 -14
- package/dist/components/form/fields/color/Color.js.map +1 -1
- package/dist/components/form/fields/cron/Cron.js +12 -19
- package/dist/components/form/fields/cron/Cron.js.map +1 -1
- package/dist/components/form/fields/long-string/LongString.js +5 -9
- package/dist/components/form/fields/long-string/LongString.js.map +1 -1
- package/dist/components/form/fields/markdown/Markdown.js +13 -20
- package/dist/components/form/fields/markdown/Markdown.js.map +1 -1
- package/dist/components/form/fields/number/Number.js +5 -9
- package/dist/components/form/fields/number/Number.js.map +1 -1
- package/dist/components/form/fields/radio-group/RadioGroup.js +7 -11
- package/dist/components/form/fields/radio-group/RadioGroup.js.map +1 -1
- package/dist/components/form/fields/string/String.js +4 -8
- package/dist/components/form/fields/string/String.js.map +1 -1
- package/dist/components/form/index.js +8 -24
- package/dist/components/form/index.js.map +1 -1
- package/dist/components/menu/Menu.js +23 -31
- package/dist/components/menu/Menu.js.map +1 -1
- package/dist/contexts/FetchContext.js +2 -5
- package/dist/contexts/FetchContext.js.map +1 -1
- package/dist/contexts/ReqraftContext.js +2 -5
- package/dist/contexts/ReqraftContext.js.map +1 -1
- package/dist/contexts/StorageContext.js +2 -5
- package/dist/contexts/StorageContext.js.map +1 -1
- package/dist/hooks/useFetch/useFetch.js +10 -14
- package/dist/hooks/useFetch/useFetch.js.map +1 -1
- package/dist/hooks/useReqraftProperty.js +4 -8
- package/dist/hooks/useReqraftProperty.js.map +1 -1
- package/dist/hooks/useStorage/useStorage.d.ts.map +1 -1
- package/dist/hooks/useStorage/useStorage.js +13 -13
- package/dist/hooks/useStorage/useStorage.js.map +1 -1
- package/dist/hooks/useValidation.js +1 -5
- package/dist/hooks/useValidation.js.map +1 -1
- package/dist/index.js +6 -30
- package/dist/index.js.map +1 -1
- package/dist/providers/FetchProvider.js +11 -15
- package/dist/providers/FetchProvider.js.map +1 -1
- package/dist/providers/ReqraftProvider.js +12 -17
- package/dist/providers/ReqraftProvider.js.map +1 -1
- package/dist/providers/StorageProvider.d.ts +1 -1
- package/dist/providers/StorageProvider.d.ts.map +1 -1
- package/dist/providers/StorageProvider.js +17 -21
- package/dist/providers/StorageProvider.js.map +1 -1
- package/dist/types/Form.js +1 -2
- package/dist/types.js +1 -2
- package/dist/utils/fetch.js +12 -17
- package/dist/utils/fetch.js.map +1 -1
- package/package.json +1 -1
- package/src/components/form/fields/Field.stories.tsx +165 -0
- package/src/components/form/fields/Field.tsx +172 -0
- package/src/components/form/fields/boolean/Boolean.stories.tsx +46 -0
- package/src/components/form/fields/boolean/Boolean.tsx +34 -0
- package/src/components/form/fields/color/Color.stories.tsx +60 -0
- package/src/components/form/fields/color/Color.tsx +43 -0
- package/src/components/form/fields/cron/Cron.stories.tsx +60 -0
- package/src/components/form/fields/cron/Cron.tsx +77 -0
- package/src/components/form/fields/long-string/LongString.stories.tsx +62 -0
- package/src/components/form/fields/long-string/LongString.tsx +35 -0
- package/src/components/form/fields/markdown/Markdown.stories.tsx +47 -0
- package/src/components/form/fields/markdown/Markdown.tsx +106 -0
- package/src/components/form/fields/number/Number.stories.tsx +74 -0
- package/src/components/form/fields/number/Number.tsx +53 -0
- package/src/components/form/fields/radio-group/RadioGroup.stories.tsx +79 -0
- package/src/components/form/fields/radio-group/RadioGroup.tsx +46 -0
- package/src/components/form/fields/radio-group/images/java-96x128.png +0 -0
- package/src/components/form/fields/radio-group/images/python-129x128.png +0 -0
- package/src/components/form/fields/radio-group/images/qore-106x128.png +0 -0
- package/src/components/form/fields/string/String.stories.tsx +70 -0
- package/src/components/form/fields/string/String.tsx +43 -0
- package/src/components/form/index.tsx +8 -0
- package/src/components/menu/Menu.stories.tsx +73 -0
- package/src/components/menu/Menu.tsx +244 -0
- package/src/contexts/FetchContext.tsx +25 -0
- package/src/contexts/ReqraftContext.tsx +9 -0
- package/src/contexts/StorageContext.tsx +33 -0
- package/src/global.d.ts +4 -0
- package/src/hooks/useFetch/useFetch.stories.tsx +123 -0
- package/src/hooks/useFetch/useFetch.tsx +71 -0
- package/src/hooks/useReqraftProperty.ts +16 -0
- package/src/hooks/useStorage/useStorage.stories.tsx +85 -0
- package/src/hooks/useStorage/useStorage.ts +43 -0
- package/src/hooks/useValidation.ts +9 -0
- package/src/index.tsx +17 -0
- package/src/providers/FetchProvider.tsx +40 -0
- package/src/providers/ReqraftProvider.tsx +52 -0
- package/src/providers/StorageProvider.tsx +85 -0
- package/src/types/Form.ts +46 -0
- package/src/types.ts +14 -0
- package/src/utils/fetch.ts +121 -0
|
@@ -1,55 +1,51 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
var
|
|
8
|
-
var useFetch_1 = require("../hooks/useFetch/useFetch");
|
|
9
|
-
var useReqraftProperty_1 = require("../hooks/useReqraftProperty");
|
|
10
|
-
var ReqraftStorageProvider = function (_a) {
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cloneDeep, get, set } from 'lodash';
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
import { ReqraftStorageContext } from '../contexts/StorageContext';
|
|
5
|
+
import { useFetch } from '../hooks/useFetch/useFetch';
|
|
6
|
+
import { useReqraftProperty } from '../hooks/useReqraftProperty';
|
|
7
|
+
export var ReqraftStorageProvider = function (_a) {
|
|
11
8
|
var children = _a.children, waitForStorage = _a.waitForStorage;
|
|
12
|
-
var appName =
|
|
13
|
-
var _b =
|
|
9
|
+
var appName = useReqraftProperty('appName');
|
|
10
|
+
var _b = useFetch({
|
|
14
11
|
url: 'users/_current_/storage',
|
|
15
12
|
cache: false,
|
|
16
13
|
loadOnMount: true,
|
|
17
14
|
}), data = _b.data, loading = _b.loading;
|
|
18
|
-
var load =
|
|
15
|
+
var load = useFetch({
|
|
19
16
|
url: 'users/_current_/',
|
|
20
17
|
method: 'PUT',
|
|
21
18
|
cache: false,
|
|
22
19
|
}).load;
|
|
23
|
-
var _c =
|
|
24
|
-
|
|
20
|
+
var _c = useState(data), storage = _c[0], setStorage = _c[1];
|
|
21
|
+
useEffect(function () {
|
|
25
22
|
if (data) {
|
|
26
23
|
setStorage(data);
|
|
27
24
|
}
|
|
28
|
-
}, [data]);
|
|
25
|
+
}, [JSON.stringify(data)]);
|
|
29
26
|
var getStorage = function (path, defaultValue, includeAppPrefix) {
|
|
30
27
|
var _a;
|
|
31
28
|
if (includeAppPrefix === void 0) { includeAppPrefix = true; }
|
|
32
29
|
var _path = includeAppPrefix ? "".concat(appName, ".").concat(path) : path;
|
|
33
|
-
return (_a =
|
|
30
|
+
return (_a = get(storage, _path)) !== null && _a !== void 0 ? _a : defaultValue;
|
|
34
31
|
};
|
|
35
32
|
var updateStorage = function (path, value, includeAppPrefix) {
|
|
36
33
|
if (includeAppPrefix === void 0) { includeAppPrefix = true; }
|
|
37
34
|
var _path = includeAppPrefix ? "".concat(appName, ".").concat(path) : path;
|
|
38
|
-
var updatedStorage =
|
|
35
|
+
var updatedStorage = set(cloneDeep(storage), _path, value);
|
|
39
36
|
setStorage(updatedStorage);
|
|
40
37
|
load({ body: { storage: updatedStorage } });
|
|
41
38
|
};
|
|
42
39
|
var removeStorageValue = function (path, includeAppPrefix) {
|
|
43
40
|
if (includeAppPrefix === void 0) { includeAppPrefix = true; }
|
|
44
41
|
var _path = includeAppPrefix ? "".concat(appName, ".").concat(path) : path;
|
|
45
|
-
var updatedStorage =
|
|
42
|
+
var updatedStorage = set(cloneDeep(storage), _path, null);
|
|
46
43
|
setStorage(updatedStorage);
|
|
47
44
|
load({ body: { storage_path: _path } });
|
|
48
45
|
};
|
|
49
46
|
if ((loading || !storage) && waitForStorage) {
|
|
50
47
|
return null;
|
|
51
48
|
}
|
|
52
|
-
return ((
|
|
49
|
+
return (_jsx(ReqraftStorageContext.Provider, { value: { storage: storage, getStorage: getStorage, updateStorage: updateStorage, removeStorageValue: removeStorageValue }, children: children }));
|
|
53
50
|
};
|
|
54
|
-
exports.ReqraftStorageProvider = ReqraftStorageProvider;
|
|
55
51
|
//# sourceMappingURL=StorageProvider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StorageProvider.js","sourceRoot":"","sources":["../../src/providers/StorageProvider.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"StorageProvider.js","sourceRoot":"","sources":["../../src/providers/StorageProvider.tsx"],"names":[],"mappings":"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"}
|
package/dist/types/Form.js
CHANGED
package/dist/types.js
CHANGED
package/dist/utils/fetch.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
2
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
3
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -35,39 +34,36 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
35
34
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
35
|
}
|
|
37
36
|
};
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
var ReqraftProvider_1 = require("../providers/ReqraftProvider");
|
|
41
|
-
exports.fetchConfig = {
|
|
37
|
+
import { ReqraftQueryClient } from '../providers/ReqraftProvider';
|
|
38
|
+
export var fetchConfig = {
|
|
42
39
|
instance: window.location.origin + '/',
|
|
43
40
|
instanceToken: '',
|
|
44
41
|
unauthorizedRedirect: function (pathname) { return "/?next=".concat(pathname); },
|
|
45
42
|
};
|
|
46
43
|
var CACHE_EXPIRATION_TIME = 5 * 60 * 1000; // 5 minutes
|
|
47
|
-
var setupFetch = function (_a) {
|
|
44
|
+
export var setupFetch = function (_a) {
|
|
48
45
|
var instance = _a.instance, instanceToken = _a.instanceToken, unauthorizedRedirect = _a.unauthorizedRedirect;
|
|
49
|
-
|
|
50
|
-
|
|
46
|
+
fetchConfig.instance = instance;
|
|
47
|
+
fetchConfig.instanceToken = instanceToken;
|
|
51
48
|
if (unauthorizedRedirect) {
|
|
52
|
-
|
|
49
|
+
fetchConfig.unauthorizedRedirect = unauthorizedRedirect;
|
|
53
50
|
}
|
|
54
51
|
};
|
|
55
|
-
exports.setupFetch = setupFetch;
|
|
56
52
|
function doFetchData(url_1) {
|
|
57
53
|
return __awaiter(this, arguments, void 0, function (url, method, body) {
|
|
58
54
|
if (method === void 0) { method = 'GET'; }
|
|
59
55
|
return __generator(this, function (_a) {
|
|
60
|
-
if (!
|
|
56
|
+
if (!fetchConfig.instanceToken) {
|
|
61
57
|
return [2 /*return*/, new Response(JSON.stringify({}), {
|
|
62
58
|
status: 401,
|
|
63
59
|
statusText: 'Unauthorized',
|
|
64
60
|
})];
|
|
65
61
|
}
|
|
66
|
-
return [2 /*return*/, fetch("".concat(
|
|
62
|
+
return [2 /*return*/, fetch("".concat(fetchConfig.instance, "api/latest/").concat(url), {
|
|
67
63
|
method: method,
|
|
68
64
|
headers: {
|
|
69
65
|
'Content-Type': 'application/json',
|
|
70
|
-
Authorization: "Bearer ".concat(
|
|
66
|
+
Authorization: "Bearer ".concat(fetchConfig.instanceToken),
|
|
71
67
|
},
|
|
72
68
|
body: JSON.stringify(body),
|
|
73
69
|
}).catch(function (error) {
|
|
@@ -79,11 +75,11 @@ function doFetchData(url_1) {
|
|
|
79
75
|
});
|
|
80
76
|
});
|
|
81
77
|
}
|
|
82
|
-
function query(_a) {
|
|
78
|
+
export function query(_a) {
|
|
83
79
|
return __awaiter(this, arguments, void 0, function (_b) {
|
|
84
80
|
var shouldCache, cacheKey, requestData;
|
|
85
81
|
var _this = this;
|
|
86
|
-
var url = _b.url, _c = _b.method, method = _c === void 0 ? 'GET' : _c, body = _b.body, _d = _b.cache, cache = _d === void 0 ? true : _d, _e = _b.queryClient, queryClient = _e === void 0 ?
|
|
82
|
+
var url = _b.url, _c = _b.method, method = _c === void 0 ? 'GET' : _c, body = _b.body, _d = _b.cache, cache = _d === void 0 ? true : _d, _e = _b.queryClient, queryClient = _e === void 0 ? ReqraftQueryClient : _e;
|
|
87
83
|
return __generator(this, function (_f) {
|
|
88
84
|
switch (_f.label) {
|
|
89
85
|
case 0:
|
|
@@ -103,7 +99,7 @@ function query(_a) {
|
|
|
103
99
|
case 2:
|
|
104
100
|
json = _a.sent();
|
|
105
101
|
if (response.status === 401) {
|
|
106
|
-
window.location.href =
|
|
102
|
+
window.location.href = fetchConfig.unauthorizedRedirect(window.location.pathname);
|
|
107
103
|
}
|
|
108
104
|
return [2 /*return*/, {
|
|
109
105
|
data: json,
|
|
@@ -136,5 +132,4 @@ function query(_a) {
|
|
|
136
132
|
});
|
|
137
133
|
});
|
|
138
134
|
}
|
|
139
|
-
exports.query = query;
|
|
140
135
|
//# sourceMappingURL=fetch.js.map
|
package/dist/utils/fetch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qoretechnologies/reqraft",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.3",
|
|
4
4
|
"description": "ReQraft is a collection of React components and hooks that are used across Qore Technologies' products made using the ReQore component library from Qore.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { StoryObj } from '@storybook/react';
|
|
2
|
+
import { expect, fn, within } from '@storybook/test';
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
|
|
5
|
+
import styled from 'styled-components';
|
|
6
|
+
import { longStringText, markdown } from '../../../../mock/fields';
|
|
7
|
+
import { StoryMeta } from '../../../types';
|
|
8
|
+
import { TFormFieldType } from '../../../types/Form';
|
|
9
|
+
import { FormField, IFormFieldProps } from './Field';
|
|
10
|
+
|
|
11
|
+
const meta = {
|
|
12
|
+
component: FormField,
|
|
13
|
+
title: 'Components/Form/Field',
|
|
14
|
+
args: {
|
|
15
|
+
onChange: fn(),
|
|
16
|
+
},
|
|
17
|
+
render(args) {
|
|
18
|
+
const [value, setValue] = useState<any>(args.value);
|
|
19
|
+
return <FormField {...args} value={value} onChange={setValue} />;
|
|
20
|
+
},
|
|
21
|
+
} as StoryMeta<typeof FormField>;
|
|
22
|
+
|
|
23
|
+
export default meta;
|
|
24
|
+
type Story = StoryObj<typeof meta>;
|
|
25
|
+
|
|
26
|
+
const DefaultStoryWrapper = styled.div`
|
|
27
|
+
display: grid;
|
|
28
|
+
gap: 32px;
|
|
29
|
+
width: 100%;
|
|
30
|
+
max-width: 850px;
|
|
31
|
+
margin: 0 auto;
|
|
32
|
+
`;
|
|
33
|
+
export const Default: Story = {
|
|
34
|
+
render() {
|
|
35
|
+
const [values, setValues] = useState({
|
|
36
|
+
name: 'Qore',
|
|
37
|
+
sendNotifications: true,
|
|
38
|
+
amount: 99,
|
|
39
|
+
color: { r: 255, g: 255, b: 255, a: 1 },
|
|
40
|
+
language: 'Java',
|
|
41
|
+
description: longStringText,
|
|
42
|
+
post: markdown,
|
|
43
|
+
cron: '* * * * *',
|
|
44
|
+
} as const);
|
|
45
|
+
|
|
46
|
+
const getFieldProps = <T extends TFormFieldType>(type: T, key: keyof typeof values) =>
|
|
47
|
+
({
|
|
48
|
+
'aria-label': type,
|
|
49
|
+
label: type,
|
|
50
|
+
type: type,
|
|
51
|
+
value: values[key],
|
|
52
|
+
onChange: (value) => {
|
|
53
|
+
setValues((values) => ({ ...values, [key]: value }));
|
|
54
|
+
},
|
|
55
|
+
labelProps: {
|
|
56
|
+
style: { textTransform: 'capitalize' },
|
|
57
|
+
},
|
|
58
|
+
}) as unknown as IFormFieldProps<T>;
|
|
59
|
+
|
|
60
|
+
return (
|
|
61
|
+
<DefaultStoryWrapper>
|
|
62
|
+
<FormField {...getFieldProps('string', 'name')} />
|
|
63
|
+
<FormField {...getFieldProps('boolean', 'sendNotifications')} />
|
|
64
|
+
<FormField {...getFieldProps('number', 'amount')} />
|
|
65
|
+
<FormField {...getFieldProps('color', 'color')} />
|
|
66
|
+
<FormField
|
|
67
|
+
{...getFieldProps('radio', 'language')}
|
|
68
|
+
fieldProps={{
|
|
69
|
+
items: [
|
|
70
|
+
{ label: 'Qore', value: 'Qore', 'aria-label': 'Qore' },
|
|
71
|
+
{ label: 'Java', value: 'Java', 'aria-label': 'Java' },
|
|
72
|
+
{ label: 'Python', value: 'Python', 'aria-label': 'Python' },
|
|
73
|
+
],
|
|
74
|
+
}}
|
|
75
|
+
/>
|
|
76
|
+
<FormField {...getFieldProps('long-string', 'description')} />
|
|
77
|
+
<FormField {...getFieldProps('markdown', 'post')} />
|
|
78
|
+
<FormField
|
|
79
|
+
{...getFieldProps('cron', 'cron')}
|
|
80
|
+
fieldProps={{ wrapperProps: { 'aria-label': 'Cron' } }}
|
|
81
|
+
/>
|
|
82
|
+
</DefaultStoryWrapper>
|
|
83
|
+
);
|
|
84
|
+
},
|
|
85
|
+
async play({ canvasElement }) {
|
|
86
|
+
const canvas = within(canvasElement);
|
|
87
|
+
|
|
88
|
+
await expect(canvas.getByLabelText('string')).toBeInTheDocument();
|
|
89
|
+
await expect(canvas.getByLabelText('boolean')).toBeInTheDocument();
|
|
90
|
+
await expect(canvas.getByLabelText('number')).toBeInTheDocument();
|
|
91
|
+
await expect(canvasElement.querySelector('.sketch-picker')).toBeInTheDocument();
|
|
92
|
+
await expect(canvas.getByLabelText('radio')).toBeInTheDocument();
|
|
93
|
+
await expect(canvas.getByLabelText('long-string')).toBeInTheDocument();
|
|
94
|
+
await expect(canvas.getByLabelText('markdown')).toBeInTheDocument();
|
|
95
|
+
await expect(canvas.getByLabelText('cron')).toBeInTheDocument();
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
export const String: Story = {
|
|
100
|
+
args: {
|
|
101
|
+
type: 'string',
|
|
102
|
+
value: 'Qore',
|
|
103
|
+
label: 'Label',
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
export const Boolean: Story = {
|
|
108
|
+
args: {
|
|
109
|
+
type: 'boolean',
|
|
110
|
+
value: true,
|
|
111
|
+
label: 'Boolean',
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
export const Number: Story = {
|
|
116
|
+
args: {
|
|
117
|
+
type: 'number',
|
|
118
|
+
value: 99,
|
|
119
|
+
label: 'Number',
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
export const Color: Story = {
|
|
124
|
+
args: {
|
|
125
|
+
type: 'color',
|
|
126
|
+
value: { r: 0, g: 0, b: 0, a: 1 },
|
|
127
|
+
label: 'Color',
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
export const Radio: Story = {
|
|
132
|
+
args: {
|
|
133
|
+
type: 'radio',
|
|
134
|
+
value: 'Qore',
|
|
135
|
+
items: [
|
|
136
|
+
{ label: 'Qore', value: 'Qore', 'aria-label': 'Qore' },
|
|
137
|
+
{ label: 'Java', value: 'Java', 'aria-label': 'Java' },
|
|
138
|
+
{ label: 'Python', value: 'Python', 'aria-label': 'Python' },
|
|
139
|
+
],
|
|
140
|
+
label: 'Radio',
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
export const LongString: Story = {
|
|
145
|
+
args: {
|
|
146
|
+
type: 'long-string',
|
|
147
|
+
value: longStringText,
|
|
148
|
+
label: 'Long String',
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
export const Markdown: Story = {
|
|
153
|
+
args: {
|
|
154
|
+
type: 'markdown',
|
|
155
|
+
value: markdown,
|
|
156
|
+
label: 'Markdown',
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
export const Cron: Story = {
|
|
160
|
+
args: {
|
|
161
|
+
type: 'cron',
|
|
162
|
+
value: '* * * * *',
|
|
163
|
+
label: 'Cron',
|
|
164
|
+
},
|
|
165
|
+
};
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { IReqoreLabelProps, ReqoreControlGroup, ReqoreLabel } from '@qoretechnologies/reqore';
|
|
2
|
+
import { useId } from 'react';
|
|
3
|
+
import { TFormFieldType, TFormFieldValueType } from '../../../types/Form';
|
|
4
|
+
import BooleanFormField, { IBooleanFormFieldProps } from './boolean/Boolean';
|
|
5
|
+
import ColorFormField, { IColorFormFieldProps } from './color/Color';
|
|
6
|
+
import CronFormField, { ICronFormFieldProps } from './cron/Cron';
|
|
7
|
+
import LongStringFormField, { ILongStringFormFieldProps } from './long-string/LongString';
|
|
8
|
+
import MarkdownFormField, { IMarkdownFormFieldProps } from './markdown/Markdown';
|
|
9
|
+
import NumberFormField from './number/Number';
|
|
10
|
+
import RadioGroupFormField, { IRadioGroupFormFieldProps } from './radio-group/RadioGroup';
|
|
11
|
+
import { IStringFormFieldProps, StringFormField } from './string/String';
|
|
12
|
+
|
|
13
|
+
export interface IFormFieldProps<T extends TFormFieldType = TFormFieldType> {
|
|
14
|
+
type?: T;
|
|
15
|
+
value: TFormFieldValueType<T>;
|
|
16
|
+
onChange: (value: TFormFieldValueType<T>, event?: unknown) => void;
|
|
17
|
+
|
|
18
|
+
validateSelf?: boolean;
|
|
19
|
+
onValidateChange?: (isValid: boolean) => void;
|
|
20
|
+
|
|
21
|
+
fieldProps?: Omit<
|
|
22
|
+
T extends 'string' ? IStringFormFieldProps
|
|
23
|
+
: T extends 'boolean' ? IBooleanFormFieldProps
|
|
24
|
+
: T extends 'radio' ? IRadioGroupFormFieldProps
|
|
25
|
+
: T extends 'color' ? IColorFormFieldProps
|
|
26
|
+
: T extends 'long-string' ? ILongStringFormFieldProps
|
|
27
|
+
: T extends 'markdown' ? IMarkdownFormFieldProps
|
|
28
|
+
: T extends 'cron' ? ICronFormFieldProps
|
|
29
|
+
: never,
|
|
30
|
+
'value' | 'onChange'
|
|
31
|
+
>;
|
|
32
|
+
|
|
33
|
+
label?: IReqoreLabelProps['label'];
|
|
34
|
+
labelPosition?: 'top' | 'left' | 'right' | 'bottom';
|
|
35
|
+
}
|
|
36
|
+
export const FormField = <T extends TFormFieldType>({
|
|
37
|
+
type,
|
|
38
|
+
onChange,
|
|
39
|
+
value,
|
|
40
|
+
fieldProps,
|
|
41
|
+
label,
|
|
42
|
+
labelPosition = 'top',
|
|
43
|
+
...rest
|
|
44
|
+
}: IFormFieldProps<T>) => {
|
|
45
|
+
const id = useId();
|
|
46
|
+
|
|
47
|
+
const handleChange = (value: TFormFieldValueType<T>, event?: unknown) => {
|
|
48
|
+
onChange(value, event);
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
const renderField = (type: T) => {
|
|
52
|
+
switch (type) {
|
|
53
|
+
case 'string':
|
|
54
|
+
return (
|
|
55
|
+
<StringFormField
|
|
56
|
+
{...rest}
|
|
57
|
+
{...(fieldProps as IFormFieldProps<'string'>['fieldProps'])}
|
|
58
|
+
onChange={(value: string) => handleChange(value as TFormFieldValueType<T>)}
|
|
59
|
+
value={value as TFormFieldValueType<T>}
|
|
60
|
+
id={id}
|
|
61
|
+
/>
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
case 'boolean':
|
|
65
|
+
return (
|
|
66
|
+
<BooleanFormField
|
|
67
|
+
{...rest}
|
|
68
|
+
{...(fieldProps as IFormFieldProps<'boolean'>['fieldProps'])}
|
|
69
|
+
checked={value as boolean}
|
|
70
|
+
onChange={(checked) => {
|
|
71
|
+
handleChange(checked as TFormFieldValueType<T>);
|
|
72
|
+
}}
|
|
73
|
+
id={id}
|
|
74
|
+
/>
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
case 'number':
|
|
78
|
+
return (
|
|
79
|
+
<NumberFormField
|
|
80
|
+
{...rest}
|
|
81
|
+
{...(fieldProps as IFormFieldProps<'number'>['fieldProps'])}
|
|
82
|
+
value={value as number}
|
|
83
|
+
onChange={(value) => {
|
|
84
|
+
handleChange(value as TFormFieldValueType<T>);
|
|
85
|
+
}}
|
|
86
|
+
id={id}
|
|
87
|
+
/>
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
case 'color':
|
|
91
|
+
return (
|
|
92
|
+
<ColorFormField
|
|
93
|
+
{...rest}
|
|
94
|
+
{...(fieldProps as IFormFieldProps<'color'>['fieldProps'])}
|
|
95
|
+
value={value as IColorFormFieldProps['color']}
|
|
96
|
+
onChange={(color) => {
|
|
97
|
+
handleChange(color as TFormFieldValueType<T>);
|
|
98
|
+
}}
|
|
99
|
+
/>
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
case 'radio':
|
|
103
|
+
return (
|
|
104
|
+
<RadioGroupFormField
|
|
105
|
+
{...rest}
|
|
106
|
+
{...(fieldProps as IFormFieldProps<'radio'>['fieldProps'])}
|
|
107
|
+
value={value as TFormFieldValueType<T>}
|
|
108
|
+
onChange={(selected) => {
|
|
109
|
+
handleChange(selected as TFormFieldValueType<T>);
|
|
110
|
+
}}
|
|
111
|
+
id={id}
|
|
112
|
+
/>
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
case 'long-string':
|
|
116
|
+
return (
|
|
117
|
+
<LongStringFormField
|
|
118
|
+
{...rest}
|
|
119
|
+
{...(fieldProps as IFormFieldProps<'long-string'>['fieldProps'])}
|
|
120
|
+
value={value as TFormFieldValueType<T>}
|
|
121
|
+
onChange={(selected) => {
|
|
122
|
+
handleChange(selected as TFormFieldValueType<T>);
|
|
123
|
+
}}
|
|
124
|
+
id={id}
|
|
125
|
+
/>
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
case 'markdown':
|
|
129
|
+
return (
|
|
130
|
+
<MarkdownFormField
|
|
131
|
+
{...rest}
|
|
132
|
+
{...(fieldProps as IFormFieldProps<'markdown'>['fieldProps'])}
|
|
133
|
+
value={value as TFormFieldValueType<T>}
|
|
134
|
+
onChange={(selected) => {
|
|
135
|
+
handleChange(selected as TFormFieldValueType<T>);
|
|
136
|
+
}}
|
|
137
|
+
id={id}
|
|
138
|
+
/>
|
|
139
|
+
);
|
|
140
|
+
|
|
141
|
+
case 'cron':
|
|
142
|
+
return (
|
|
143
|
+
<CronFormField
|
|
144
|
+
{...rest}
|
|
145
|
+
{...(fieldProps as IFormFieldProps<'cron'>['fieldProps'])}
|
|
146
|
+
value={value as TFormFieldValueType<T>}
|
|
147
|
+
onChange={(selected) => {
|
|
148
|
+
handleChange(selected as TFormFieldValueType<T>);
|
|
149
|
+
}}
|
|
150
|
+
// give id to first element to make htmlFor works.
|
|
151
|
+
inputProps={[{ id }]}
|
|
152
|
+
/>
|
|
153
|
+
);
|
|
154
|
+
default:
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
return (
|
|
160
|
+
<ReqoreControlGroup vertical={labelPosition === 'bottom' || labelPosition === 'top'}>
|
|
161
|
+
{(label || label === 0) && (labelPosition === 'top' || labelPosition === 'left') ?
|
|
162
|
+
<ReqoreLabel htmlFor={id} label={label} fluid />
|
|
163
|
+
: null}
|
|
164
|
+
|
|
165
|
+
{renderField(type)}
|
|
166
|
+
|
|
167
|
+
{(label || label === 0) && (labelPosition === 'bottom' || labelPosition === 'right') ?
|
|
168
|
+
<ReqoreLabel htmlFor={id} label={label} fluid />
|
|
169
|
+
: null}
|
|
170
|
+
</ReqoreControlGroup>
|
|
171
|
+
);
|
|
172
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { StoryObj } from '@storybook/react';
|
|
2
|
+
import { expect, fn, userEvent, within } from '@storybook/test';
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
|
|
5
|
+
import { StoryMeta } from '../../../../types';
|
|
6
|
+
import { BooleanFormField } from './Boolean';
|
|
7
|
+
|
|
8
|
+
const meta = {
|
|
9
|
+
component: BooleanFormField,
|
|
10
|
+
title: 'Components/Form/Boolean',
|
|
11
|
+
args: {
|
|
12
|
+
onChange: fn(),
|
|
13
|
+
},
|
|
14
|
+
render(args) {
|
|
15
|
+
const [checked, setChecked] = useState(args.checked);
|
|
16
|
+
return (
|
|
17
|
+
<BooleanFormField
|
|
18
|
+
{...args}
|
|
19
|
+
checked={checked}
|
|
20
|
+
onChange={(checked) => {
|
|
21
|
+
args.onChange?.(checked);
|
|
22
|
+
setChecked(checked);
|
|
23
|
+
}}
|
|
24
|
+
/>
|
|
25
|
+
);
|
|
26
|
+
},
|
|
27
|
+
} as StoryMeta<typeof BooleanFormField>;
|
|
28
|
+
|
|
29
|
+
export default meta;
|
|
30
|
+
type Story = StoryObj<typeof meta>;
|
|
31
|
+
|
|
32
|
+
export const Default: Story = {
|
|
33
|
+
args: {
|
|
34
|
+
checked: true,
|
|
35
|
+
'aria-label': 'Boolean',
|
|
36
|
+
},
|
|
37
|
+
async play({ canvasElement, args }) {
|
|
38
|
+
const canvas = within(canvasElement);
|
|
39
|
+
|
|
40
|
+
await expect(canvas.getByText('Yes')).toBeInTheDocument();
|
|
41
|
+
await expect(canvas.getByText('No')).toBeInTheDocument();
|
|
42
|
+
|
|
43
|
+
await userEvent.click(canvas.getByLabelText('Boolean'));
|
|
44
|
+
await expect(args.onChange).toHaveBeenLastCalledWith(false);
|
|
45
|
+
},
|
|
46
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ReqoreCheckbox } from '@qoretechnologies/reqore';
|
|
2
|
+
import { IReqoreCheckboxProps } from '@qoretechnologies/reqore/dist/components/Checkbox';
|
|
3
|
+
|
|
4
|
+
export interface IBooleanFormFieldProps extends Omit<IReqoreCheckboxProps, 'onChange'> {
|
|
5
|
+
onChange?(checked: boolean): void;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const BooleanFormField = ({
|
|
9
|
+
checked,
|
|
10
|
+
onChange,
|
|
11
|
+
onClick,
|
|
12
|
+
...rest
|
|
13
|
+
}: IBooleanFormFieldProps) => {
|
|
14
|
+
const toggle: IReqoreCheckboxProps['onClick'] = (event) => {
|
|
15
|
+
onChange(!checked);
|
|
16
|
+
onClick?.(event);
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<ReqoreCheckbox
|
|
21
|
+
checked={checked ?? false}
|
|
22
|
+
onClick={toggle}
|
|
23
|
+
asSwitch
|
|
24
|
+
onText='Yes'
|
|
25
|
+
offText='No'
|
|
26
|
+
checkedIcon='CheckLine'
|
|
27
|
+
uncheckedIcon='CloseLine'
|
|
28
|
+
margin='none'
|
|
29
|
+
{...rest}
|
|
30
|
+
/>
|
|
31
|
+
);
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export default BooleanFormField;
|