@qoretechnologies/reqraft 0.5.1 → 0.6.0
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/long-string/LongString.d.ts.map +1 -1
- package/dist/components/form/fields/long-string/LongString.js +1 -3
- package/dist/components/form/fields/long-string/LongString.js.map +1 -1
- package/dist/components/form/fields/object/Object.d.ts +17 -0
- package/dist/components/form/fields/object/Object.d.ts.map +1 -0
- package/dist/components/form/fields/object/Object.js +139 -0
- package/dist/components/form/fields/object/Object.js.map +1 -0
- package/package.json +4 -2
- package/src/components/form/fields/long-string/LongString.tsx +0 -3
- package/src/components/form/fields/object/Object.stories.tsx +267 -0
- package/src/components/form/fields/object/Object.tsx +234 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LongString.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/fields/long-string/LongString.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mDAAmD,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,WAAW,yBAA0B,SAAQ,IAAI,CAAC,oBAAoB,EAAE,UAAU,CAAC;IACvF,QAAQ,CAAC,EAAE,CACT,KAAK,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,EACrC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,mBAAmB,CAAC,KACzC,IAAI,CAAC;CACX;AAED,eAAO,MAAM,mBAAmB,wCAI7B,yBAAyB,
|
|
1
|
+
{"version":3,"file":"LongString.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/fields/long-string/LongString.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mDAAmD,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,WAAW,yBAA0B,SAAQ,IAAI,CAAC,oBAAoB,EAAE,UAAU,CAAC;IACvF,QAAQ,CAAC,EAAE,CACT,KAAK,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,EACrC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,mBAAmB,CAAC,KACzC,IAAI,CAAC;CACX;AAED,eAAO,MAAM,mBAAmB,wCAI7B,yBAAyB,4CAc3B,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
|
|
@@ -27,9 +27,7 @@ var jsx_runtime_1 = require("react/jsx-runtime");
|
|
|
27
27
|
var reqore_1 = require("@qoretechnologies/reqore");
|
|
28
28
|
var LongStringFormField = function (_a) {
|
|
29
29
|
var onChange = _a.onChange, onClearClick = _a.onClearClick, rest = __rest(_a, ["onChange", "onClearClick"]);
|
|
30
|
-
return ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreTextarea, __assign({ scaleWithContent: true, fluid: true,
|
|
31
|
-
width: '100%',
|
|
32
|
-
}, onClearClick: function () {
|
|
30
|
+
return ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreTextarea, __assign({ scaleWithContent: true, fluid: true, onClearClick: function () {
|
|
33
31
|
onClearClick === null || onClearClick === void 0 ? void 0 : onClearClick();
|
|
34
32
|
onChange === null || onChange === void 0 ? void 0 : onChange('');
|
|
35
33
|
}, onChange: function (event) { return onChange(event.currentTarget.value, event); }, rows: 4 }, rest)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LongString.js","sourceRoot":"","sources":["../../../../../src/components/form/fields/long-string/LongString.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mDAA0D;AAWnD,IAAM,mBAAmB,GAAG,UAAC,EAIR;IAH1B,IAAA,QAAQ,cAAA,EACR,YAAY,kBAAA,EACT,IAAI,cAH2B,4BAInC,CADQ;IAEP,OAAO,CACL,uBAAC,uBAAc,aACb,gBAAgB,QAChB,KAAK,QACL,YAAY,EAAE;YACZ,
|
|
1
|
+
{"version":3,"file":"LongString.js","sourceRoot":"","sources":["../../../../../src/components/form/fields/long-string/LongString.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mDAA0D;AAWnD,IAAM,mBAAmB,GAAG,UAAC,EAIR;IAH1B,IAAA,QAAQ,cAAA,EACR,YAAY,kBAAA,EACT,IAAI,cAH2B,4BAInC,CADQ;IAEP,OAAO,CACL,uBAAC,uBAAc,aACb,gBAAgB,QAChB,KAAK,QACL,YAAY,EAAE;YACZ,YAAY,aAAZ,YAAY,uBAAZ,YAAY,EAAI,CAAC;YACjB,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAG,EAAE,CAAC,CAAC;QACjB,CAAC,EACD,QAAQ,EAAE,UAAC,KAAK,IAAK,OAAA,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,EAA1C,CAA0C,EAC/D,IAAI,EAAE,CAAC,IACH,IAAI,EACR,CACH,CAAC;AACJ,CAAC,CAAC;AAlBW,QAAA,mBAAmB,uBAkB9B;AAEF,kBAAe,2BAAmB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { IReqoreTabsProps } from '@qoretechnologies/reqore/dist/components/Tabs';
|
|
2
|
+
import { IReqoreTreeProps } from '@qoretechnologies/reqore/dist/components/Tree';
|
|
3
|
+
import { ILongStringFormFieldProps } from '../long-string/LongString';
|
|
4
|
+
export interface IReqraftObjectFormFieldProps extends Omit<IReqoreTabsProps, 'onChange'> {
|
|
5
|
+
onChange: (value: string | IReqoreTreeProps['data']) => void;
|
|
6
|
+
value: string | IReqoreTreeProps['data'];
|
|
7
|
+
type: 'object' | 'array';
|
|
8
|
+
resultDataType?: 'native' | 'json' | 'yaml';
|
|
9
|
+
dataType?: 'native' | 'json' | 'yaml';
|
|
10
|
+
editorProps?: Omit<IReqoreTreeProps, 'data' | 'onDataChange'>;
|
|
11
|
+
textareaProps?: ILongStringFormFieldProps;
|
|
12
|
+
}
|
|
13
|
+
export declare const ReqraftObjectFormFieldTextarea: ({ value, onChange, dataType, resultDataType, ...rest }: Partial<ILongStringFormFieldProps> & Pick<IReqraftObjectFormFieldProps, 'dataType'> & {
|
|
14
|
+
resultDataType: 'json' | 'yaml';
|
|
15
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export declare const ReqraftObjectFormField: ({ onChange, value, type, dataType, resultDataType, editorProps, textareaProps, ...rest }: IReqraftObjectFormFieldProps) => import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
//# sourceMappingURL=Object.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Object.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/fields/object/Object.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+CAA+C,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAAc,MAAM,+CAA+C,CAAC;AAG7F,OAA4B,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAE3F,MAAM,WAAW,4BAA6B,SAAQ,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC;IACtF,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IAC7D,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEzC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;IAC5C,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;IAEtC,WAAW,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,cAAc,CAAC,CAAC;IAC9D,aAAa,CAAC,EAAE,yBAAyB,CAAC;CAC3C;AAED,eAAO,MAAM,8BAA8B,2DAMxC,QAAQ,yBAAyB,CAAC,GACnC,KAAK,4BAA4B,EAAE,UAAU,CAAC,GAAG;IAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,4CAoFrF,CAAC;AAEF,eAAO,MAAM,sBAAsB,6FAShC,4BAA4B,4CA0G9B,CAAC"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
14
|
+
var t = {};
|
|
15
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
16
|
+
t[p] = s[p];
|
|
17
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
18
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
19
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
20
|
+
t[p[i]] = s[p[i]];
|
|
21
|
+
}
|
|
22
|
+
return t;
|
|
23
|
+
};
|
|
24
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
25
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
26
|
+
};
|
|
27
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
+
exports.ReqraftObjectFormField = exports.ReqraftObjectFormFieldTextarea = void 0;
|
|
29
|
+
var jsx_runtime_1 = require("react/jsx-runtime");
|
|
30
|
+
var reqore_1 = require("@qoretechnologies/reqore");
|
|
31
|
+
var Tree_1 = require("@qoretechnologies/reqore/dist/components/Tree");
|
|
32
|
+
var js_yaml_1 = __importDefault(require("js-yaml"));
|
|
33
|
+
var react_1 = require("react");
|
|
34
|
+
var LongString_1 = __importDefault(require("../long-string/LongString"));
|
|
35
|
+
var ReqraftObjectFormFieldTextarea = function (_a) {
|
|
36
|
+
var value = _a.value, onChange = _a.onChange, dataType = _a.dataType, resultDataType = _a.resultDataType, rest = __rest(_a, ["value", "onChange", "dataType", "resultDataType"]);
|
|
37
|
+
var _b = (0, react_1.useState)(value), localValue = _b[0], setValue = _b[1];
|
|
38
|
+
var handleChange = (0, react_1.useCallback)(function (newValue) {
|
|
39
|
+
setValue(newValue);
|
|
40
|
+
}, []);
|
|
41
|
+
var parseValue = (0, react_1.useCallback)(function (type) {
|
|
42
|
+
switch (type) {
|
|
43
|
+
case 'json':
|
|
44
|
+
return JSON.parse(localValue);
|
|
45
|
+
case 'yaml':
|
|
46
|
+
return js_yaml_1.default.load(localValue);
|
|
47
|
+
default:
|
|
48
|
+
return parseValue(resultDataType);
|
|
49
|
+
}
|
|
50
|
+
}, [dataType, localValue, resultDataType]);
|
|
51
|
+
var isValid = (0, react_1.useMemo)(function () {
|
|
52
|
+
if (localValue === '' || localValue === undefined) {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
!!parseValue(dataType);
|
|
57
|
+
}
|
|
58
|
+
catch (e) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
}, [dataType, resultDataType, localValue]);
|
|
63
|
+
return ((0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { vertical: true, children: [(0, jsx_runtime_1.jsx)(LongString_1.default, __assign({ value: localValue, onChange: handleChange, scaleWithContent: true }, rest, { intent: isValid ? rest.intent : 'danger' })), (0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { stack: true, children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { label: 'Save', icon: 'CheckLine', compact: true, fluid: true, intent: 'success', disabled: !isValid, onClick: function () {
|
|
64
|
+
if (localValue === '' || localValue === undefined) {
|
|
65
|
+
onChange(undefined);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
var parsedValue = parseValue(dataType);
|
|
69
|
+
if (resultDataType === 'json') {
|
|
70
|
+
parsedValue = JSON.stringify(parsedValue, null, 2);
|
|
71
|
+
}
|
|
72
|
+
else if (resultDataType === 'yaml') {
|
|
73
|
+
parsedValue = js_yaml_1.default.dump(parsedValue);
|
|
74
|
+
}
|
|
75
|
+
onChange(parsedValue);
|
|
76
|
+
} }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { label: 'Discard', icon: 'HistoryLine', compact: true, fixed: true, disabled: localValue === value, onClick: function () { return setValue(value); } })] }), !isValid && ((0, jsx_runtime_1.jsxs)(reqore_1.ReqoreSpan, { intent: 'danger', size: 'small', children: ["Not a valid ", resultDataType.toUpperCase()] }))] }));
|
|
77
|
+
};
|
|
78
|
+
exports.ReqraftObjectFormFieldTextarea = ReqraftObjectFormFieldTextarea;
|
|
79
|
+
var ReqraftObjectFormField = function (_a) {
|
|
80
|
+
var onChange = _a.onChange, value = _a.value, type = _a.type, dataType = _a.dataType, _b = _a.resultDataType, resultDataType = _b === void 0 ? dataType : _b, editorProps = _a.editorProps, textareaProps = _a.textareaProps, rest = __rest(_a, ["onChange", "value", "type", "dataType", "resultDataType", "editorProps", "textareaProps"]);
|
|
81
|
+
var handleTreeDataChange = (0, react_1.useCallback)(function (data) {
|
|
82
|
+
switch (resultDataType) {
|
|
83
|
+
case 'json':
|
|
84
|
+
onChange(JSON.stringify(data, null, 2));
|
|
85
|
+
break;
|
|
86
|
+
case 'yaml':
|
|
87
|
+
onChange(js_yaml_1.default.dump(data));
|
|
88
|
+
break;
|
|
89
|
+
default:
|
|
90
|
+
onChange(data);
|
|
91
|
+
}
|
|
92
|
+
}, [resultDataType, onChange]);
|
|
93
|
+
var treeData = (0, react_1.useMemo)(function () {
|
|
94
|
+
if (!value) {
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
switch (dataType) {
|
|
98
|
+
case 'json':
|
|
99
|
+
return JSON.parse(value);
|
|
100
|
+
case 'yaml':
|
|
101
|
+
return js_yaml_1.default.load(value);
|
|
102
|
+
default:
|
|
103
|
+
return value;
|
|
104
|
+
}
|
|
105
|
+
}, [value]);
|
|
106
|
+
var textData = (0, react_1.useMemo)(function () {
|
|
107
|
+
if (!value) {
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
switch (dataType) {
|
|
111
|
+
case 'json':
|
|
112
|
+
return value;
|
|
113
|
+
case 'yaml':
|
|
114
|
+
return value;
|
|
115
|
+
default:
|
|
116
|
+
switch (resultDataType) {
|
|
117
|
+
case 'json':
|
|
118
|
+
return JSON.stringify(value, null, 2);
|
|
119
|
+
default:
|
|
120
|
+
return js_yaml_1.default.dump(value);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}, [value]);
|
|
124
|
+
return ((0, jsx_runtime_1.jsxs)(reqore_1.ReqoreTabs, __assign({ tabsPadding: 'vertical' }, rest, { tabs: [
|
|
125
|
+
{
|
|
126
|
+
label: 'Editor',
|
|
127
|
+
icon: 'NodeTree',
|
|
128
|
+
id: 'editor',
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
label: 'Text',
|
|
132
|
+
icon: 'Text',
|
|
133
|
+
id: 'text',
|
|
134
|
+
show: resultDataType !== 'native',
|
|
135
|
+
},
|
|
136
|
+
], children: [(0, jsx_runtime_1.jsxs)(reqore_1.ReqoreTabsContent, { tabId: 'editor', children: [!treeData && ((0, jsx_runtime_1.jsxs)(reqore_1.ReqoreButton, { onClick: function () { return handleTreeDataChange(type === 'array' ? [] : {}); }, fixed: true, icon: 'AddLine', children: ["New ", type === 'array' ? 'List' : 'Object'] })), treeData && ((0, jsx_runtime_1.jsx)(Tree_1.ReqoreTree, __assign({ data: treeData, onDataChange: handleTreeDataChange, editable: true, showControls: false }, editorProps))), treeData && ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { onClick: function () { return handleTreeDataChange(undefined); }, fixed: true, icon: 'CloseLine', children: "Remove" }))] }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreTabsContent, { tabId: 'text', children: (0, jsx_runtime_1.jsx)(exports.ReqraftObjectFormFieldTextarea, __assign({}, textareaProps, { value: textData, onChange: onChange, dataType: dataType, resultDataType: resultDataType })) })] })));
|
|
137
|
+
};
|
|
138
|
+
exports.ReqraftObjectFormField = ReqraftObjectFormField;
|
|
139
|
+
//# sourceMappingURL=Object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Object.js","sourceRoot":"","sources":["../../../../../src/components/form/fields/object/Object.tsx"],"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
|
+
"version": "0.6.0",
|
|
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",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"@babel/preset-typescript": "^7.12.7",
|
|
54
54
|
"@chromatic-com/storybook": "^1.5.0",
|
|
55
55
|
"@netsells/storybook-mockdate": "^0.3.3",
|
|
56
|
-
"@qoretechnologies/reqore": "^0.
|
|
56
|
+
"@qoretechnologies/reqore": "^0.47.1",
|
|
57
57
|
"@storybook/addon-actions": "^8.1.7",
|
|
58
58
|
"@storybook/addon-essentials": "^8.1.7",
|
|
59
59
|
"@storybook/addon-interactions": "^8.1.7",
|
|
@@ -69,6 +69,7 @@
|
|
|
69
69
|
"@testing-library/jest-dom": "^5.16.5",
|
|
70
70
|
"@testing-library/react": "^13.4.0",
|
|
71
71
|
"@types/jest": "^26.0.19",
|
|
72
|
+
"@types/js-yaml": "^4.0.9",
|
|
72
73
|
"@types/lodash": "^4.14.166",
|
|
73
74
|
"@types/node": "^14.14.14",
|
|
74
75
|
"@types/react": "^18.3.1",
|
|
@@ -110,6 +111,7 @@
|
|
|
110
111
|
"classnames": "^2.2.6",
|
|
111
112
|
"cronstrue": "^2.50.0",
|
|
112
113
|
"epoch-timeago": "^1.1.9",
|
|
114
|
+
"js-yaml": "^4.1.0",
|
|
113
115
|
"lodash": "^4.17.21",
|
|
114
116
|
"polished": "^4.2.2",
|
|
115
117
|
"react-color": "^2.19.3",
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { StoryObj } from '@storybook/react';
|
|
2
|
+
import { expect, fireEvent, fn } from '@storybook/test';
|
|
3
|
+
import { useMemo, useState } from 'react';
|
|
4
|
+
|
|
5
|
+
import jsyaml from 'js-yaml';
|
|
6
|
+
import { sleep, testsClickButton, testsWaitForText } from '../../../../../__tests__/utils';
|
|
7
|
+
import { StoryMeta } from '../../../../types';
|
|
8
|
+
import { ReqraftObjectFormField } from './Object';
|
|
9
|
+
|
|
10
|
+
const meta = {
|
|
11
|
+
component: ReqraftObjectFormField,
|
|
12
|
+
title: 'Components/Form/Object',
|
|
13
|
+
args: {
|
|
14
|
+
onChange: fn(),
|
|
15
|
+
},
|
|
16
|
+
render(args) {
|
|
17
|
+
const [value, setValue] = useState(args.value);
|
|
18
|
+
|
|
19
|
+
const val = useMemo(() => {
|
|
20
|
+
if (args.dataType === 'native' && typeof value === 'string') {
|
|
21
|
+
if (args.resultDataType === 'yaml') {
|
|
22
|
+
return jsyaml.load(value as string);
|
|
23
|
+
} else if (args.resultDataType === 'json') {
|
|
24
|
+
return JSON.parse(value as string);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return value;
|
|
29
|
+
}, [value, args.dataType, args.resultDataType]);
|
|
30
|
+
|
|
31
|
+
return (
|
|
32
|
+
<ReqraftObjectFormField
|
|
33
|
+
{...args}
|
|
34
|
+
value={val}
|
|
35
|
+
onChange={(value) => {
|
|
36
|
+
args.onChange?.(value);
|
|
37
|
+
setValue(value);
|
|
38
|
+
}}
|
|
39
|
+
/>
|
|
40
|
+
);
|
|
41
|
+
},
|
|
42
|
+
} as StoryMeta<typeof ReqraftObjectFormField>;
|
|
43
|
+
|
|
44
|
+
export default meta;
|
|
45
|
+
type Story = StoryObj<typeof meta>;
|
|
46
|
+
|
|
47
|
+
export const Object: Story = {
|
|
48
|
+
args: {
|
|
49
|
+
type: 'object',
|
|
50
|
+
dataType: 'json',
|
|
51
|
+
resultDataType: 'json',
|
|
52
|
+
},
|
|
53
|
+
async play() {
|
|
54
|
+
await testsWaitForText('New Object');
|
|
55
|
+
await testsClickButton({ label: 'New Object' });
|
|
56
|
+
await testsWaitForText('{');
|
|
57
|
+
await testsWaitForText('}');
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export const List: Story = {
|
|
62
|
+
args: {
|
|
63
|
+
type: 'array',
|
|
64
|
+
dataType: 'yaml',
|
|
65
|
+
resultDataType: 'yaml',
|
|
66
|
+
},
|
|
67
|
+
async play() {
|
|
68
|
+
await testsWaitForText('New List');
|
|
69
|
+
await testsClickButton({ label: 'New List' });
|
|
70
|
+
await testsWaitForText('[');
|
|
71
|
+
await testsWaitForText(']');
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export const NativeOnly: Story = {
|
|
76
|
+
args: {
|
|
77
|
+
type: 'array',
|
|
78
|
+
dataType: 'native',
|
|
79
|
+
resultDataType: 'native',
|
|
80
|
+
value: [
|
|
81
|
+
{
|
|
82
|
+
key: 'value',
|
|
83
|
+
},
|
|
84
|
+
'Test',
|
|
85
|
+
12,
|
|
86
|
+
false,
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
async play() {
|
|
90
|
+
await testsWaitForText('"value"');
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
export const ValueCanBeRemoved: Story = {
|
|
95
|
+
args: {
|
|
96
|
+
type: 'array',
|
|
97
|
+
dataType: 'native',
|
|
98
|
+
resultDataType: 'native',
|
|
99
|
+
value: [
|
|
100
|
+
{
|
|
101
|
+
key: 'value',
|
|
102
|
+
},
|
|
103
|
+
'Test',
|
|
104
|
+
12,
|
|
105
|
+
false,
|
|
106
|
+
],
|
|
107
|
+
},
|
|
108
|
+
async play() {
|
|
109
|
+
await testsWaitForText('"value"');
|
|
110
|
+
await testsClickButton({ label: 'Remove' });
|
|
111
|
+
await testsWaitForText('New List');
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
export const json: Story = {
|
|
116
|
+
args: {
|
|
117
|
+
type: 'object',
|
|
118
|
+
dataType: 'json',
|
|
119
|
+
value: JSON.stringify({
|
|
120
|
+
key: 'value',
|
|
121
|
+
bool: false,
|
|
122
|
+
num: 23,
|
|
123
|
+
}),
|
|
124
|
+
resultDataType: 'json',
|
|
125
|
+
},
|
|
126
|
+
async play({ args }) {
|
|
127
|
+
await testsWaitForText('"value"');
|
|
128
|
+
await testsClickButton({ label: 'Text' });
|
|
129
|
+
await sleep(300);
|
|
130
|
+
await fireEvent.change(document.querySelector('textarea'), {
|
|
131
|
+
target: {
|
|
132
|
+
value: JSON.stringify(
|
|
133
|
+
{
|
|
134
|
+
key: 'value',
|
|
135
|
+
key2: 'value2',
|
|
136
|
+
bool: false,
|
|
137
|
+
num: 23,
|
|
138
|
+
},
|
|
139
|
+
null,
|
|
140
|
+
2
|
|
141
|
+
),
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
await testsClickButton({ label: 'Save' });
|
|
145
|
+
await expect(args.onChange).toHaveBeenLastCalledWith(
|
|
146
|
+
JSON.stringify(
|
|
147
|
+
{
|
|
148
|
+
key: 'value',
|
|
149
|
+
key2: 'value2',
|
|
150
|
+
bool: false,
|
|
151
|
+
num: 23,
|
|
152
|
+
},
|
|
153
|
+
null,
|
|
154
|
+
2
|
|
155
|
+
)
|
|
156
|
+
);
|
|
157
|
+
await testsClickButton({ label: 'Editor' });
|
|
158
|
+
await testsWaitForText('"value2"');
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
export const yaml: Story = {
|
|
163
|
+
args: {
|
|
164
|
+
type: 'object',
|
|
165
|
+
dataType: 'yaml',
|
|
166
|
+
value: jsyaml.dump({
|
|
167
|
+
key: 'value',
|
|
168
|
+
bool: false,
|
|
169
|
+
num: 23,
|
|
170
|
+
}),
|
|
171
|
+
resultDataType: 'yaml',
|
|
172
|
+
},
|
|
173
|
+
async play({ args }) {
|
|
174
|
+
await testsWaitForText('"value"');
|
|
175
|
+
await testsClickButton({ label: 'Text' });
|
|
176
|
+
await sleep(300);
|
|
177
|
+
await fireEvent.change(document.querySelector('textarea'), {
|
|
178
|
+
target: {
|
|
179
|
+
value: jsyaml.dump({
|
|
180
|
+
key: 'value',
|
|
181
|
+
key2: 'value2',
|
|
182
|
+
bool: false,
|
|
183
|
+
num: 23,
|
|
184
|
+
}),
|
|
185
|
+
},
|
|
186
|
+
});
|
|
187
|
+
await testsClickButton({ label: 'Save' });
|
|
188
|
+
await expect(args.onChange).toHaveBeenLastCalledWith(
|
|
189
|
+
'key: value\nkey2: value2\nbool: false\nnum: 23\n'
|
|
190
|
+
);
|
|
191
|
+
await testsClickButton({ label: 'Editor' });
|
|
192
|
+
await testsWaitForText('"value2"');
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
export const YamlToJson: Story = {
|
|
197
|
+
args: {
|
|
198
|
+
type: 'object',
|
|
199
|
+
dataType: 'yaml',
|
|
200
|
+
value: jsyaml.dump({
|
|
201
|
+
key: 'value',
|
|
202
|
+
bool: false,
|
|
203
|
+
num: 23,
|
|
204
|
+
}),
|
|
205
|
+
resultDataType: 'json',
|
|
206
|
+
},
|
|
207
|
+
async play({ args }) {
|
|
208
|
+
await testsWaitForText('"value"');
|
|
209
|
+
await testsClickButton({ label: 'Text' });
|
|
210
|
+
await sleep(300);
|
|
211
|
+
await fireEvent.change(document.querySelector('textarea'), {
|
|
212
|
+
target: {
|
|
213
|
+
value: jsyaml.dump({
|
|
214
|
+
key: 'value',
|
|
215
|
+
key2: 'value2',
|
|
216
|
+
bool: false,
|
|
217
|
+
num: 23,
|
|
218
|
+
}),
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
await testsClickButton({ label: 'Save' });
|
|
222
|
+
await expect(args.onChange).toHaveBeenLastCalledWith(
|
|
223
|
+
'{\n "key": "value",\n "key2": "value2",\n "bool": false,\n "num": 23\n}'
|
|
224
|
+
);
|
|
225
|
+
await testsClickButton({ label: 'Editor' });
|
|
226
|
+
await testsWaitForText('"value2"');
|
|
227
|
+
},
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
export const NativeToYaml: Story = {
|
|
231
|
+
args: {
|
|
232
|
+
type: 'object',
|
|
233
|
+
dataType: 'native',
|
|
234
|
+
value: {
|
|
235
|
+
key: 'value',
|
|
236
|
+
bool: false,
|
|
237
|
+
num: 23,
|
|
238
|
+
},
|
|
239
|
+
resultDataType: 'yaml',
|
|
240
|
+
},
|
|
241
|
+
async play({ args }) {
|
|
242
|
+
await testsWaitForText('"value"');
|
|
243
|
+
await testsClickButton({ label: 'Text' });
|
|
244
|
+
await sleep(300);
|
|
245
|
+
await fireEvent.change(document.querySelector('textarea'), {
|
|
246
|
+
target: {
|
|
247
|
+
value: jsyaml.dump({
|
|
248
|
+
key: 'value',
|
|
249
|
+
key2: 'value2',
|
|
250
|
+
bool: false,
|
|
251
|
+
num: 23,
|
|
252
|
+
}),
|
|
253
|
+
},
|
|
254
|
+
});
|
|
255
|
+
await testsClickButton({ label: 'Save' });
|
|
256
|
+
await expect(args.onChange).toHaveBeenLastCalledWith(
|
|
257
|
+
jsyaml.dump({
|
|
258
|
+
key: 'value',
|
|
259
|
+
key2: 'value2',
|
|
260
|
+
bool: false,
|
|
261
|
+
num: 23,
|
|
262
|
+
})
|
|
263
|
+
);
|
|
264
|
+
await testsClickButton({ label: 'Editor' });
|
|
265
|
+
await testsWaitForText('"value2"');
|
|
266
|
+
},
|
|
267
|
+
};
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ReqoreButton,
|
|
3
|
+
ReqoreControlGroup,
|
|
4
|
+
ReqoreSpan,
|
|
5
|
+
ReqoreTabs,
|
|
6
|
+
ReqoreTabsContent,
|
|
7
|
+
} from '@qoretechnologies/reqore';
|
|
8
|
+
import { IReqoreTabsProps } from '@qoretechnologies/reqore/dist/components/Tabs';
|
|
9
|
+
import { IReqoreTreeProps, ReqoreTree } from '@qoretechnologies/reqore/dist/components/Tree';
|
|
10
|
+
import jsyaml from 'js-yaml';
|
|
11
|
+
import { useCallback, useMemo, useState } from 'react';
|
|
12
|
+
import LongStringFormField, { ILongStringFormFieldProps } from '../long-string/LongString';
|
|
13
|
+
|
|
14
|
+
export interface IReqraftObjectFormFieldProps extends Omit<IReqoreTabsProps, 'onChange'> {
|
|
15
|
+
onChange: (value: string | IReqoreTreeProps['data']) => void;
|
|
16
|
+
value: string | IReqoreTreeProps['data'];
|
|
17
|
+
|
|
18
|
+
type: 'object' | 'array';
|
|
19
|
+
resultDataType?: 'native' | 'json' | 'yaml';
|
|
20
|
+
dataType?: 'native' | 'json' | 'yaml';
|
|
21
|
+
|
|
22
|
+
editorProps?: Omit<IReqoreTreeProps, 'data' | 'onDataChange'>;
|
|
23
|
+
textareaProps?: ILongStringFormFieldProps;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export const ReqraftObjectFormFieldTextarea = ({
|
|
27
|
+
value,
|
|
28
|
+
onChange,
|
|
29
|
+
dataType,
|
|
30
|
+
resultDataType,
|
|
31
|
+
...rest
|
|
32
|
+
}: Partial<ILongStringFormFieldProps> &
|
|
33
|
+
Pick<IReqraftObjectFormFieldProps, 'dataType'> & { resultDataType: 'json' | 'yaml' }) => {
|
|
34
|
+
const [localValue, setValue] = useState(value);
|
|
35
|
+
|
|
36
|
+
const handleChange = useCallback((newValue: string) => {
|
|
37
|
+
setValue(newValue);
|
|
38
|
+
}, []);
|
|
39
|
+
|
|
40
|
+
const parseValue = useCallback(
|
|
41
|
+
(type: 'json' | 'yaml' | 'native') => {
|
|
42
|
+
switch (type) {
|
|
43
|
+
case 'json':
|
|
44
|
+
return JSON.parse(localValue);
|
|
45
|
+
case 'yaml':
|
|
46
|
+
return jsyaml.load(localValue);
|
|
47
|
+
default:
|
|
48
|
+
return parseValue(resultDataType);
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
[dataType, localValue, resultDataType]
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
const isValid = useMemo(() => {
|
|
55
|
+
if (localValue === '' || localValue === undefined) {
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
try {
|
|
60
|
+
!!parseValue(dataType);
|
|
61
|
+
} catch (e) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return true;
|
|
66
|
+
}, [dataType, resultDataType, localValue]);
|
|
67
|
+
|
|
68
|
+
return (
|
|
69
|
+
<ReqoreControlGroup vertical>
|
|
70
|
+
<LongStringFormField
|
|
71
|
+
value={localValue}
|
|
72
|
+
onChange={handleChange}
|
|
73
|
+
scaleWithContent
|
|
74
|
+
{...rest}
|
|
75
|
+
intent={isValid ? rest.intent : 'danger'}
|
|
76
|
+
/>
|
|
77
|
+
<ReqoreControlGroup stack>
|
|
78
|
+
<ReqoreButton
|
|
79
|
+
label='Save'
|
|
80
|
+
icon='CheckLine'
|
|
81
|
+
compact
|
|
82
|
+
fluid
|
|
83
|
+
intent='success'
|
|
84
|
+
disabled={!isValid}
|
|
85
|
+
onClick={() => {
|
|
86
|
+
if (localValue === '' || localValue === undefined) {
|
|
87
|
+
onChange(undefined);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
let parsedValue = parseValue(dataType);
|
|
92
|
+
|
|
93
|
+
if (resultDataType === 'json') {
|
|
94
|
+
parsedValue = JSON.stringify(parsedValue, null, 2);
|
|
95
|
+
} else if (resultDataType === 'yaml') {
|
|
96
|
+
parsedValue = jsyaml.dump(parsedValue);
|
|
97
|
+
}
|
|
98
|
+
onChange(parsedValue);
|
|
99
|
+
}}
|
|
100
|
+
/>
|
|
101
|
+
<ReqoreButton
|
|
102
|
+
label='Discard'
|
|
103
|
+
icon='HistoryLine'
|
|
104
|
+
compact
|
|
105
|
+
fixed
|
|
106
|
+
disabled={localValue === value}
|
|
107
|
+
onClick={() => setValue(value)}
|
|
108
|
+
/>
|
|
109
|
+
</ReqoreControlGroup>
|
|
110
|
+
{!isValid && (
|
|
111
|
+
<ReqoreSpan intent='danger' size='small'>
|
|
112
|
+
Not a valid {resultDataType.toUpperCase()}
|
|
113
|
+
</ReqoreSpan>
|
|
114
|
+
)}
|
|
115
|
+
</ReqoreControlGroup>
|
|
116
|
+
);
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
export const ReqraftObjectFormField = ({
|
|
120
|
+
onChange,
|
|
121
|
+
value,
|
|
122
|
+
type,
|
|
123
|
+
dataType,
|
|
124
|
+
resultDataType = dataType,
|
|
125
|
+
editorProps,
|
|
126
|
+
textareaProps,
|
|
127
|
+
...rest
|
|
128
|
+
}: IReqraftObjectFormFieldProps) => {
|
|
129
|
+
const handleTreeDataChange = useCallback(
|
|
130
|
+
(data: IReqoreTreeProps['data']) => {
|
|
131
|
+
switch (resultDataType) {
|
|
132
|
+
case 'json':
|
|
133
|
+
onChange(JSON.stringify(data, null, 2));
|
|
134
|
+
break;
|
|
135
|
+
case 'yaml':
|
|
136
|
+
onChange(jsyaml.dump(data));
|
|
137
|
+
break;
|
|
138
|
+
default:
|
|
139
|
+
onChange(data);
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
[resultDataType, onChange]
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
const treeData = useMemo(() => {
|
|
146
|
+
if (!value) {
|
|
147
|
+
return undefined;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
switch (dataType) {
|
|
151
|
+
case 'json':
|
|
152
|
+
return JSON.parse(value as string);
|
|
153
|
+
case 'yaml':
|
|
154
|
+
return jsyaml.load(value as string);
|
|
155
|
+
default:
|
|
156
|
+
return value;
|
|
157
|
+
}
|
|
158
|
+
}, [value]);
|
|
159
|
+
|
|
160
|
+
const textData: string = useMemo(() => {
|
|
161
|
+
if (!value) {
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
switch (dataType) {
|
|
166
|
+
case 'json':
|
|
167
|
+
return value as string;
|
|
168
|
+
case 'yaml':
|
|
169
|
+
return value as string;
|
|
170
|
+
default:
|
|
171
|
+
switch (resultDataType) {
|
|
172
|
+
case 'json':
|
|
173
|
+
return JSON.stringify(value, null, 2);
|
|
174
|
+
default:
|
|
175
|
+
return jsyaml.dump(value);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}, [value]);
|
|
179
|
+
|
|
180
|
+
return (
|
|
181
|
+
<ReqoreTabs
|
|
182
|
+
tabsPadding='vertical'
|
|
183
|
+
{...rest}
|
|
184
|
+
tabs={[
|
|
185
|
+
{
|
|
186
|
+
label: 'Editor',
|
|
187
|
+
icon: 'NodeTree',
|
|
188
|
+
id: 'editor',
|
|
189
|
+
},
|
|
190
|
+
{
|
|
191
|
+
label: 'Text',
|
|
192
|
+
icon: 'Text',
|
|
193
|
+
id: 'text',
|
|
194
|
+
show: resultDataType !== 'native',
|
|
195
|
+
},
|
|
196
|
+
]}
|
|
197
|
+
>
|
|
198
|
+
<ReqoreTabsContent tabId='editor'>
|
|
199
|
+
{!treeData && (
|
|
200
|
+
<ReqoreButton
|
|
201
|
+
onClick={() => handleTreeDataChange(type === 'array' ? [] : {})}
|
|
202
|
+
fixed
|
|
203
|
+
icon='AddLine'
|
|
204
|
+
>
|
|
205
|
+
New {type === 'array' ? 'List' : 'Object'}
|
|
206
|
+
</ReqoreButton>
|
|
207
|
+
)}
|
|
208
|
+
{treeData && (
|
|
209
|
+
<ReqoreTree
|
|
210
|
+
data={treeData}
|
|
211
|
+
onDataChange={handleTreeDataChange}
|
|
212
|
+
editable
|
|
213
|
+
showControls={false}
|
|
214
|
+
{...editorProps}
|
|
215
|
+
/>
|
|
216
|
+
)}
|
|
217
|
+
{treeData && (
|
|
218
|
+
<ReqoreButton onClick={() => handleTreeDataChange(undefined)} fixed icon='CloseLine'>
|
|
219
|
+
Remove
|
|
220
|
+
</ReqoreButton>
|
|
221
|
+
)}
|
|
222
|
+
</ReqoreTabsContent>
|
|
223
|
+
<ReqoreTabsContent tabId='text'>
|
|
224
|
+
<ReqraftObjectFormFieldTextarea
|
|
225
|
+
{...textareaProps}
|
|
226
|
+
value={textData}
|
|
227
|
+
onChange={onChange}
|
|
228
|
+
dataType={dataType}
|
|
229
|
+
resultDataType={resultDataType as 'json' | 'yaml'}
|
|
230
|
+
/>
|
|
231
|
+
</ReqoreTabsContent>
|
|
232
|
+
</ReqoreTabs>
|
|
233
|
+
);
|
|
234
|
+
};
|