@qoretechnologies/reqraft 0.0.1

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 (45) hide show
  1. package/.eslintrc.js +40 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  4. package/.github/ISSUE_TEMPLATE/new-component.md +20 -0
  5. package/.github/ISSUE_TEMPLATE/visual-bug-report.md +38 -0
  6. package/.github/workflows/beta_release.yml +108 -0
  7. package/.github/workflows/tests.yml +120 -0
  8. package/.prettierrc +7 -0
  9. package/CODE_OF_CONDUCT.md +105 -0
  10. package/CONTRIBUTING.MD +78 -0
  11. package/LICENSE +21 -0
  12. package/README.md +43 -0
  13. package/SECURITY.md +3 -0
  14. package/__tests__/setup.js +8 -0
  15. package/build-storybook.log +28 -0
  16. package/dist/components/form/string/String.d.ts +15 -0
  17. package/dist/components/form/string/String.d.ts.map +1 -0
  18. package/dist/components/form/string/String.js +52 -0
  19. package/dist/components/form/string/String.js.map +1 -0
  20. package/dist/components/form/string/String.stories.d.ts +10 -0
  21. package/dist/components/form/string/String.stories.d.ts.map +1 -0
  22. package/dist/components/form/string/String.stories.js +21 -0
  23. package/dist/components/form/string/String.stories.js.map +1 -0
  24. package/dist/index.d.ts +2 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +6 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/types.d.ts +7 -0
  29. package/dist/types.d.ts.map +1 -0
  30. package/dist/types.js +3 -0
  31. package/dist/types.js.map +1 -0
  32. package/package.json +116 -0
  33. package/public/logo-dark.png +0 -0
  34. package/public/logo.png +0 -0
  35. package/public/q-symbol-small.png +0 -0
  36. package/public/q-symbol.png +0 -0
  37. package/public/qoreLogo-dark.png +0 -0
  38. package/public/qoreLogo.png +0 -0
  39. package/src/components/form/string/String.stories.tsx +23 -0
  40. package/src/components/form/string/String.tsx +67 -0
  41. package/src/icons.json +2295 -0
  42. package/src/index.tsx +1 -0
  43. package/src/types.ts +12 -0
  44. package/tests.json +1 -0
  45. package/tsconfig.prod.json +26 -0
@@ -0,0 +1,8 @@
1
+ global.console = {
2
+ ...console,
3
+ // uncomment to ignore a specific log level
4
+ debug: jest.fn(),
5
+ info: jest.fn(),
6
+ // warn: jest.fn(),
7
+ error: jest.fn(),
8
+ };
@@ -0,0 +1,28 @@
1
+ yarn run v1.22.21
2
+ $ storybook build --output-dir /var/folders/xj/ffsl9ps93hl3d6bm37h33dkw0000gn/T/chromatic--83502-xKwU3laktthx
3
+ @storybook/cli v8.0.9
4
+
5
+ info => Cleaning outputDir: ../../../../var/folders/xj/ffsl9ps93hl3d6bm37h33dkw0000gn/T/chromatic--83502-xKwU3laktthx
6
+ info => Loading presets
7
+ info => Building manager..
8
+ info => Manager built (1.84 s)
9
+ info => Building preview..
10
+ info Addon-docs: using MDX3
11
+ info => Using implicit CSS loaders
12
+ info => Using default Webpack5 setup
13
+ info Using tsconfig paths for react-docgen
14
+ WARN asset size limit: The following asset(s) exceed the recommended size limit (244 KiB).
15
+ WARN This can impact web performance.
16
+ WARN Assets:
17
+ WARN 407.cab165a6.iframe.bundle.js (4.33 MiB)
18
+ WARN 487.5427d68c.iframe.bundle.js (603 KiB)
19
+ WARN entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance.
20
+ WARN Entrypoints:
21
+ WARN main (4.34 MiB)
22
+ WARN runtime~main.a1ebc5b5.iframe.bundle.js
23
+ WARN 407.cab165a6.iframe.bundle.js
24
+ WARN main.95e9d9d8.iframe.bundle.js
25
+ WARN
26
+ info => Preview built (10 s)
27
+ info => Output directory: /var/folders/xj/ffsl9ps93hl3d6bm37h33dkw0000gn/T/chromatic--83502-xKwU3laktthx
28
+ Done in 14.89s.
@@ -0,0 +1,15 @@
1
+ import { IReqoreControlGroupProps } from '@qoretechnologies/reqore/dist/components/ControlGroup';
2
+ import { IReqoreInputProps } from '@qoretechnologies/reqore/dist/components/Input';
3
+ import { IReqoreTagProps } from '@qoretechnologies/reqore/dist/components/Tag';
4
+ import { ChangeEvent } from 'react';
5
+ export interface IStringFormFieldProps extends Omit<IReqoreInputProps, 'onChange' | 'value'> {
6
+ sensitive?: boolean;
7
+ value?: string;
8
+ label?: IReqoreTagProps['label'];
9
+ labelPosition?: 'top' | 'left' | 'right' | 'bottom';
10
+ labelProps?: IReqoreTagProps;
11
+ wrapperProps?: IReqoreControlGroupProps;
12
+ onChange?: (value?: string, event?: ChangeEvent<HTMLInputElement>) => void;
13
+ }
14
+ export declare const FormStringField: ({ onChange, wrapperProps, labelProps, label, labelPosition, sensitive, ...rest }: IStringFormFieldProps) => import("react/jsx-runtime").JSX.Element;
15
+ //# sourceMappingURL=String.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"String.d.ts","sourceRoot":"","sources":["../../../../src/components/form/string/String.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,uDAAuD,CAAC;AACjG,OAAO,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAe,MAAM,OAAO,CAAC;AAEjD,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,iBAAiB,EAAE,UAAU,GAAG,OAAO,CAAC;IAC1F,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IACjC,aAAa,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpD,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,YAAY,CAAC,EAAE,wBAAwB,CAAC;IACxC,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;CAC5E;AAED,eAAO,MAAM,eAAe,qFAQzB,qBAAqB,4CA0CvB,CAAC"}
@@ -0,0 +1,52 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.FormStringField = void 0;
26
+ var jsx_runtime_1 = require("react/jsx-runtime");
27
+ var reqore_1 = require("@qoretechnologies/reqore");
28
+ var react_1 = require("react");
29
+ var FormStringField = function (_a) {
30
+ var onChange = _a.onChange, wrapperProps = _a.wrapperProps, labelProps = _a.labelProps, label = _a.label, _b = _a.labelPosition, labelPosition = _b === void 0 ? 'top' : _b, sensitive = _a.sensitive, rest = __rest(_a, ["onChange", "wrapperProps", "labelProps", "label", "labelPosition", "sensitive"]);
31
+ // When input value changes
32
+ var handleChange = (0, react_1.useCallback)(function (event) {
33
+ var _a;
34
+ event.persist();
35
+ onChange((_a = event.target.value) === null || _a === void 0 ? void 0 : _a.toString(), event);
36
+ }, []);
37
+ // Clear the input on reset click
38
+ var handleClearClick = (0, react_1.useCallback)(function () {
39
+ onChange('');
40
+ }, []);
41
+ return ((0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, __assign({ stack: true }, wrapperProps, { vertical: labelPosition === 'bottom' || labelPosition === 'top', children: [(label || label === 0) && (labelPosition === 'top' || labelPosition === 'left') ? ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreTag, __assign({ label: label, fluid: true }, labelProps))) : null, (0, jsx_runtime_1.jsx)(reqore_1.ReqoreInput, __assign({ fluid: true, onFocus: function (event) {
42
+ var _a;
43
+ event.stopPropagation();
44
+ (_a = rest === null || rest === void 0 ? void 0 : rest.onFocus) === null || _a === void 0 ? void 0 : _a.call(rest, event);
45
+ }, onClick: function (event) {
46
+ var _a;
47
+ event.stopPropagation();
48
+ (_a = rest === null || rest === void 0 ? void 0 : rest.onClick) === null || _a === void 0 ? void 0 : _a.call(rest, event);
49
+ }, onChange: handleChange, type: sensitive ? 'password' : 'text', onClearClick: handleClearClick }, rest)), (label || label === 0) && (labelPosition === 'bottom' || labelPosition === 'right') ? ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreTag, __assign({ label: label, fluid: true }, labelProps))) : null] })));
50
+ };
51
+ exports.FormStringField = FormStringField;
52
+ //# sourceMappingURL=String.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"String.js","sourceRoot":"","sources":["../../../../src/components/form/string/String.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mDAAsF;AAItF,+BAAiD;AAY1C,IAAM,eAAe,GAAG,UAAC,EAQR;IAPtB,IAAA,QAAQ,cAAA,EACR,YAAY,kBAAA,EACZ,UAAU,gBAAA,EACV,KAAK,WAAA,EACL,qBAAqB,EAArB,aAAa,mBAAG,KAAK,KAAA,EACrB,SAAS,eAAA,EACN,IAAI,cAPuB,iFAQ/B,CADQ;IAEP,2BAA2B;IAC3B,IAAM,YAAY,GAAG,IAAA,mBAAW,EAAC,UAAC,KAAoC;;QACpE,KAAK,CAAC,OAAO,EAAE,CAAC;QAEhB,QAAQ,CAAC,MAAA,KAAK,CAAC,MAAM,CAAC,KAAK,0CAAE,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,iCAAiC;IACjC,IAAM,gBAAgB,GAAG,IAAA,mBAAW,EAAC;QACnC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACf,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,CACL,wBAAC,2BAAkB,aACjB,KAAK,UACD,YAAY,IAChB,QAAQ,EAAE,aAAa,KAAK,QAAQ,IAAI,aAAa,KAAK,KAAK,aAE9D,CAAC,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,KAAK,KAAK,IAAI,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CACjF,uBAAC,kBAAS,aAAC,KAAK,EAAE,KAAK,EAAE,KAAK,UAAK,UAAU,EAAI,CAClD,CAAC,CAAC,CAAC,IAAI,EACR,uBAAC,oBAAW,aACV,KAAK,QACL,OAAO,EAAE,UAAC,KAAK;;oBACb,KAAK,CAAC,eAAe,EAAE,CAAC;oBACxB,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,qDAAG,KAAK,CAAC,CAAC;gBACzB,CAAC,EACD,OAAO,EAAE,UAAC,KAAK;;oBACb,KAAK,CAAC,eAAe,EAAE,CAAC;oBACxB,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAAO,qDAAG,KAAK,CAAC,CAAC;gBACzB,CAAC,EACD,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,EACrC,YAAY,EAAE,gBAAgB,IAC1B,IAAI,EACR,EACD,CAAC,KAAK,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CACrF,uBAAC,kBAAS,aAAC,KAAK,EAAE,KAAK,EAAE,KAAK,UAAK,UAAU,EAAI,CAClD,CAAC,CAAC,CAAC,IAAI,KACW,CACtB,CAAC;AACJ,CAAC,CAAC;AAlDW,QAAA,eAAe,mBAkD1B"}
@@ -0,0 +1,10 @@
1
+ import { StoryObj } from '@storybook/react';
2
+ declare const meta: import("@storybook/types").ComponentAnnotations<import("@storybook/react").ReactRenderer, import("./String").IStringFormFieldProps & Record<string, any> & {
3
+ reqoreOptions: import("@qoretechnologies/reqore/dist/containers/UIProvider").IReqoreOptions;
4
+ }>;
5
+ export default meta;
6
+ type Story = StoryObj<typeof meta>;
7
+ export declare const Default: Story;
8
+ export declare const Value: Story;
9
+ export declare const WithLabel: Story;
10
+ //# sourceMappingURL=String.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"String.stories.d.ts","sourceRoot":"","sources":["../../../../src/components/form/string/String.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI5C,QAAA,MAAM,IAAI;;EAG4B,CAAC;AAEvC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC;AACjC,eAAO,MAAM,KAAK,EAAE,KAInB,CAAC;AACF,eAAO,MAAM,SAAS,EAAE,KAIvB,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WithLabel = exports.Value = exports.Default = void 0;
4
+ var String_1 = require("./String");
5
+ var meta = {
6
+ component: String_1.FormStringField,
7
+ title: 'Components/Form/String',
8
+ };
9
+ exports.default = meta;
10
+ exports.Default = {};
11
+ exports.Value = {
12
+ args: {
13
+ value: 'Hello, World!',
14
+ },
15
+ };
16
+ exports.WithLabel = {
17
+ args: {
18
+ label: 'Label',
19
+ },
20
+ };
21
+ //# sourceMappingURL=String.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"String.stories.js","sourceRoot":"","sources":["../../../../src/components/form/string/String.stories.tsx"],"names":[],"mappings":";;;AAEA,mCAA2C;AAE3C,IAAM,IAAI,GAAG;IACX,SAAS,EAAE,wBAAe;IAC1B,KAAK,EAAE,wBAAwB;CACK,CAAC;AAEvC,kBAAe,IAAI,CAAC;AAGP,QAAA,OAAO,GAAU,EAAE,CAAC;AACpB,QAAA,KAAK,GAAU;IAC1B,IAAI,EAAE;QACJ,KAAK,EAAE,eAAe;KACvB;CACF,CAAC;AACW,QAAA,SAAS,GAAU;IAC9B,IAAI,EAAE;QACJ,KAAK,EAAE,OAAO;KACf;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { FormStringField, IStringFormFieldProps } from './components/form/string/String';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FormStringField = void 0;
4
+ var String_1 = require("./components/form/string/String");
5
+ Object.defineProperty(exports, "FormStringField", { enumerable: true, get: function () { return String_1.FormStringField; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":";;;AAAA,0DAAyF;AAAhF,yGAAA,eAAe,OAAA"}
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ import { IReqoreUIProviderProps } from '@qoretechnologies/reqore/dist/containers/UIProvider';
3
+ import { Meta } from '@storybook/react';
4
+ export type StoryMeta<Component extends keyof JSX.IntrinsicElements | React.JSXElementConstructor<any>, AdditionalArgs = Record<string, any>> = Meta<React.ComponentProps<Component> & AdditionalArgs & {
5
+ reqoreOptions: IReqoreUIProviderProps['options'];
6
+ }>;
7
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,qDAAqD,CAAC;AAC7F,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExC,MAAM,MAAM,SAAS,CACnB,SAAS,SAAS,MAAM,GAAG,CAAC,iBAAiB,GAAG,KAAK,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAChF,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAClC,IAAI,CACN,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,GAC7B,cAAc,GAAG;IACf,aAAa,EAAE,sBAAsB,CAAC,SAAS,CAAC,CAAC;CAClD,CACJ,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,116 @@
1
+ {
2
+ "name": "@qoretechnologies/reqraft",
3
+ "version": "0.0.1",
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
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "source": "source ~/.profile",
9
+ "test": "./node_modules/.bin/jest --passWithNoTests",
10
+ "test:watch": "./node_modules/.bin/jest --watch --passWithNoTests",
11
+ "test:ci": "./node_modules/.bin/jest --silent --json --outputFile=tests.json --passWithNoTests",
12
+ "build": "./node_modules/typescript/bin/tsc --project tsconfig.prod.json",
13
+ "build:test": "./node_modules/typescript/bin/tsc --noEmit",
14
+ "build:test:prod": "./node_modules/typescript/bin/tsc --project tsconfig.prod.json --noEmit",
15
+ "lint": "yarn run eslint ./src/",
16
+ "storybook": "storybook dev -p 6008",
17
+ "test-storybook": "DEBUG_PRINT_LIMIT=0 test-storybook --url http://localhost:6008",
18
+ "install-playwright": "npx playwright install --with-deps",
19
+ "build-storybook": "storybook build",
20
+ "chromatic": "npx chromatic"
21
+ },
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+https://github.com/qoretechnologies/toolkit-react.git"
25
+ },
26
+ "keywords": [
27
+ "library",
28
+ "ui",
29
+ "react",
30
+ "toolkit",
31
+ "qore",
32
+ "qorus"
33
+ ],
34
+ "pre-push": [
35
+ "source",
36
+ "build:test:prod",
37
+ "lint",
38
+ "test"
39
+ ],
40
+ "author": {
41
+ "name": "Qore Technologies"
42
+ },
43
+ "license": "ISC",
44
+ "bugs": {
45
+ "url": "https://github.com/qoretechnologies/toolkit-react/issues"
46
+ },
47
+ "homepage": "https://github.com/qoretechnologies/toolkit-react#readme",
48
+ "devDependencies": {
49
+ "@babel/core": "^7.12.10",
50
+ "@babel/preset-env": "^7.12.11",
51
+ "@babel/preset-react": "^7.12.10",
52
+ "@babel/preset-typescript": "^7.12.7",
53
+ "@chromatic-com/storybook": "^1",
54
+ "@qoretechnologies/reqore": "^0.41.0",
55
+ "@storybook/addon-actions": "^8.0.9",
56
+ "@storybook/addon-essentials": "^8.0.9",
57
+ "@storybook/addon-interactions": "^8.0.9",
58
+ "@storybook/addon-links": "^8.0.9",
59
+ "@storybook/addon-webpack5-compiler-babel": "^3.0.3",
60
+ "@storybook/manager-api": "^8.0.9",
61
+ "@storybook/react": "^8.0.9",
62
+ "@storybook/react-webpack5": "^8.0.9",
63
+ "@storybook/test": "^8.0.9",
64
+ "@storybook/test-runner": "^0.17.0",
65
+ "@storybook/theming": "^8.0.9",
66
+ "@storybook/types": "^8.0.9",
67
+ "@testing-library/jest-dom": "^5.16.5",
68
+ "@testing-library/react": "^13.4.0",
69
+ "@types/jest": "^26.0.19",
70
+ "@types/lodash": "^4.14.166",
71
+ "@types/node": "^14.14.14",
72
+ "@types/react": "^18.3.1",
73
+ "@types/react-dom": "^18.3.0",
74
+ "@typescript-eslint/eslint-plugin": "^7.8.0",
75
+ "@typescript-eslint/parser": "^7.8.0",
76
+ "babel-jest": "^29.7.0",
77
+ "babel-loader": "^9.1.3",
78
+ "chromatic": "^11.3.0",
79
+ "eslint": "^8.46.0",
80
+ "eslint-plugin-react": "^7.33.1",
81
+ "jest": "^29.4.3",
82
+ "jest-environment-jsdom": "^29.4.3",
83
+ "jest-github-actions-reporter": "^1.0.2",
84
+ "npm-cli-login": "^0.1.1",
85
+ "playwright": "^1.16.3",
86
+ "pre-push": "^0.1.4",
87
+ "react": "^18.3.1",
88
+ "react-dom": "^18.3.1",
89
+ "react-intersection-observer": "^9.4.2",
90
+ "react-test-renderer": "^18.2.0",
91
+ "storybook": "^8.0.9",
92
+ "ts-jest": "^29.1.2",
93
+ "ts-node": "^9.1.1",
94
+ "typescript": "^5.4.5"
95
+ },
96
+ "peerDependencies": {
97
+ "@qoretechnologies/reqore": "^0.41.0",
98
+ "react": "^18.3.1",
99
+ "react-dom": "^18.3.1"
100
+ },
101
+ "dependencies": {
102
+ "classnames": "^2.2.6",
103
+ "epoch-timeago": "^1.1.9",
104
+ "lodash": "^4.17.21",
105
+ "polished": "^4.2.2",
106
+ "react-use": "^17.4.0",
107
+ "scheduler": "^0.23.0",
108
+ "shortid": "^2.2.16",
109
+ "styled-components": "^5.3.6",
110
+ "thenby": "^1.3.4",
111
+ "use-context-selector": "^1.4.1"
112
+ },
113
+ "resolutions": {
114
+ "jackspeak": "2.1.1"
115
+ }
116
+ }
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,23 @@
1
+ import { StoryObj } from '@storybook/react';
2
+ import { StoryMeta } from '../../../types';
3
+ import { FormStringField } from './String';
4
+
5
+ const meta = {
6
+ component: FormStringField,
7
+ title: 'Components/Form/String',
8
+ } as StoryMeta<typeof FormStringField>;
9
+
10
+ export default meta;
11
+ type Story = StoryObj<typeof meta>;
12
+
13
+ export const Default: Story = {};
14
+ export const Value: Story = {
15
+ args: {
16
+ value: 'Hello, World!',
17
+ },
18
+ };
19
+ export const WithLabel: Story = {
20
+ args: {
21
+ label: 'Label',
22
+ },
23
+ };
@@ -0,0 +1,67 @@
1
+ import { ReqoreControlGroup, ReqoreInput, ReqoreTag } from '@qoretechnologies/reqore';
2
+ import { IReqoreControlGroupProps } from '@qoretechnologies/reqore/dist/components/ControlGroup';
3
+ import { IReqoreInputProps } from '@qoretechnologies/reqore/dist/components/Input';
4
+ import { IReqoreTagProps } from '@qoretechnologies/reqore/dist/components/Tag';
5
+ import { ChangeEvent, useCallback } from 'react';
6
+
7
+ export interface IStringFormFieldProps extends Omit<IReqoreInputProps, 'onChange' | 'value'> {
8
+ sensitive?: boolean;
9
+ value?: string;
10
+ label?: IReqoreTagProps['label'];
11
+ labelPosition?: 'top' | 'left' | 'right' | 'bottom';
12
+ labelProps?: IReqoreTagProps;
13
+ wrapperProps?: IReqoreControlGroupProps;
14
+ onChange?: (value?: string, event?: ChangeEvent<HTMLInputElement>) => void;
15
+ }
16
+
17
+ export const FormStringField = ({
18
+ onChange,
19
+ wrapperProps,
20
+ labelProps,
21
+ label,
22
+ labelPosition = 'top',
23
+ sensitive,
24
+ ...rest
25
+ }: IStringFormFieldProps) => {
26
+ // When input value changes
27
+ const handleChange = useCallback((event: ChangeEvent<HTMLInputElement>): void => {
28
+ event.persist();
29
+
30
+ onChange(event.target.value?.toString(), event);
31
+ }, []);
32
+
33
+ // Clear the input on reset click
34
+ const handleClearClick = useCallback((): void => {
35
+ onChange('');
36
+ }, []);
37
+
38
+ return (
39
+ <ReqoreControlGroup
40
+ stack
41
+ {...wrapperProps}
42
+ vertical={labelPosition === 'bottom' || labelPosition === 'top'}
43
+ >
44
+ {(label || label === 0) && (labelPosition === 'top' || labelPosition === 'left') ? (
45
+ <ReqoreTag label={label} fluid {...labelProps} />
46
+ ) : null}
47
+ <ReqoreInput
48
+ fluid
49
+ onFocus={(event) => {
50
+ event.stopPropagation();
51
+ rest?.onFocus?.(event);
52
+ }}
53
+ onClick={(event) => {
54
+ event.stopPropagation();
55
+ rest?.onClick?.(event);
56
+ }}
57
+ onChange={handleChange}
58
+ type={sensitive ? 'password' : 'text'}
59
+ onClearClick={handleClearClick}
60
+ {...rest}
61
+ />
62
+ {(label || label === 0) && (labelPosition === 'bottom' || labelPosition === 'right') ? (
63
+ <ReqoreTag label={label} fluid {...labelProps} />
64
+ ) : null}
65
+ </ReqoreControlGroup>
66
+ );
67
+ };