@phsa.tec/design-system-react 0.1.6 → 0.1.9

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 (217) hide show
  1. package/README.md +390 -209
  2. package/dist/index.d.mts +485 -0
  3. package/dist/index.d.ts +485 -0
  4. package/dist/index.js +4259 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/index.mjs +4186 -0
  7. package/dist/index.mjs.map +1 -0
  8. package/dist/styles.css +2534 -0
  9. package/dist/styles.css.map +1 -0
  10. package/dist/styles.d.mts +2 -0
  11. package/dist/styles.d.ts +2 -0
  12. package/package.json +46 -6
  13. package/.eslintrc.json +0 -7
  14. package/.github/workflows/deploy-storybook.yml +0 -75
  15. package/.storybook/main.ts +0 -16
  16. package/.storybook/preview.ts +0 -15
  17. package/components.json +0 -21
  18. package/jest.config.ts +0 -25
  19. package/next.config.ts +0 -7
  20. package/postcss.config.mjs +0 -8
  21. package/public/file.svg +0 -1
  22. package/public/globe.svg +0 -1
  23. package/public/next.svg +0 -1
  24. package/public/vercel.svg +0 -1
  25. package/public/window.svg +0 -1
  26. package/src/app/columns.tsx +0 -178
  27. package/src/app/favicon.ico +0 -0
  28. package/src/app/fonts/GeistMonoVF.woff +0 -0
  29. package/src/app/fonts/GeistVF.woff +0 -0
  30. package/src/app/globals.css +0 -94
  31. package/src/app/layout.tsx +0 -35
  32. package/src/app/page.tsx +0 -7
  33. package/src/components/actions/AlertDialog/AlertDialog.tsx +0 -45
  34. package/src/components/actions/AlertDialog/alert-dialog.stories.tsx +0 -21
  35. package/src/components/actions/AlertDialog/index.ts +0 -1
  36. package/src/components/actions/Button/Button.stories.ts +0 -38
  37. package/src/components/actions/Button/Button.tsx +0 -23
  38. package/src/components/actions/Button/index.ts +0 -1
  39. package/src/components/actions/Collapsible/index.ts +0 -1
  40. package/src/components/actions/Dialog/Dialog.stories.tsx +0 -70
  41. package/src/components/actions/Dialog/Dialog.tsx +0 -87
  42. package/src/components/actions/Dialog/components/DialogWithActions/index.tsx +0 -40
  43. package/src/components/actions/Dialog/index.ts +0 -1
  44. package/src/components/actions/Steps/Steps.stories.tsx +0 -25
  45. package/src/components/actions/Steps/Steps.tsx +0 -51
  46. package/src/components/actions/Steps/index.ts +0 -1
  47. package/src/components/actions/index.ts +0 -5
  48. package/src/components/dataDisplay/Avatar/Avatar.stories.tsx +0 -22
  49. package/src/components/dataDisplay/Avatar/Avatar.tsx +0 -21
  50. package/src/components/dataDisplay/Avatar/index.ts +0 -2
  51. package/src/components/dataDisplay/Badge/Badge.stories.tsx +0 -36
  52. package/src/components/dataDisplay/Badge/index.ts +0 -1
  53. package/src/components/dataDisplay/Card/Card.stories.tsx +0 -24
  54. package/src/components/dataDisplay/Card/Card.tsx +0 -34
  55. package/src/components/dataDisplay/Card/index.ts +0 -1
  56. package/src/components/dataDisplay/DataPairList/DataPairList.tsx +0 -56
  57. package/src/components/dataDisplay/DataPairList/data-pair-list.stories.tsx +0 -87
  58. package/src/components/dataDisplay/DataPairList/index.ts +0 -2
  59. package/src/components/dataDisplay/DataPairList/types.ts +0 -10
  60. package/src/components/dataDisplay/DropDownMenu/index.ts +0 -1
  61. package/src/components/dataDisplay/ErrorMessage/ErrorMessage.tsx +0 -6
  62. package/src/components/dataDisplay/ErrorMessage/index.ts +0 -1
  63. package/src/components/dataDisplay/Icon/Icon.stories.tsx +0 -21
  64. package/src/components/dataDisplay/Icon/Icon.tsx +0 -47
  65. package/src/components/dataDisplay/Icon/index.ts +0 -1
  66. package/src/components/dataDisplay/Icon/types.ts +0 -6
  67. package/src/components/dataDisplay/Label/Label.stories.tsx +0 -21
  68. package/src/components/dataDisplay/Label/Label.tsx +0 -10
  69. package/src/components/dataDisplay/Label/index.ts +0 -1
  70. package/src/components/dataDisplay/Table/Table.tsx +0 -173
  71. package/src/components/dataDisplay/Table/columns.tsx +0 -223
  72. package/src/components/dataDisplay/Table/components/DynamicTable/data-table-column-header.tsx +0 -72
  73. package/src/components/dataDisplay/Table/components/DynamicTable/data-table-pagination.tsx +0 -91
  74. package/src/components/dataDisplay/Table/components/DynamicTable/data-table-toolbar.tsx +0 -17
  75. package/src/components/dataDisplay/Table/components/DynamicTable/data-table-view-options.tsx +0 -58
  76. package/src/components/dataDisplay/Table/components/DynamicTable/data-table.stories.tsx +0 -118
  77. package/src/components/dataDisplay/Table/components/DynamicTable/index.tsx +0 -136
  78. package/src/components/dataDisplay/Table/components/DynamicTable/types.ts +0 -43
  79. package/src/components/dataDisplay/Table/custom/CustomTable/data-table-column-header.tsx +0 -71
  80. package/src/components/dataDisplay/Table/custom/CustomTable/data-table-faceted-filter.tsx +0 -147
  81. package/src/components/dataDisplay/Table/custom/CustomTable/data-table-pagination.tsx +0 -97
  82. package/src/components/dataDisplay/Table/custom/CustomTable/data-table-row-actions.tsx +0 -78
  83. package/src/components/dataDisplay/Table/custom/CustomTable/data-table-toolbar.tsx +0 -60
  84. package/src/components/dataDisplay/Table/custom/CustomTable/data-table-view-options.tsx +0 -59
  85. package/src/components/dataDisplay/Table/custom/CustomTable/data-table.tsx +0 -145
  86. package/src/components/dataDisplay/Table/custom/CustomTable/data.ts +0 -71
  87. package/src/components/dataDisplay/Table/custom/CustomTable/index.tsx +0 -34
  88. package/src/components/dataDisplay/Table/custom/CustomTable/schema.ts +0 -11
  89. package/src/components/dataDisplay/Table/index.ts +0 -2
  90. package/src/components/dataDisplay/Table/table.stories.tsx +0 -147
  91. package/src/components/dataDisplay/Table/types.ts +0 -15
  92. package/src/components/dataDisplay/Tabs/Tabs.stories.tsx +0 -34
  93. package/src/components/dataDisplay/Tabs/Tabs.tsx +0 -53
  94. package/src/components/dataDisplay/Tabs/index.ts +0 -1
  95. package/src/components/dataDisplay/Text/Text.stories.tsx +0 -66
  96. package/src/components/dataDisplay/Text/Text.tsx +0 -56
  97. package/src/components/dataDisplay/Text/index.ts +0 -1
  98. package/src/components/dataDisplay/index.ts +0 -8
  99. package/src/components/dataInput/Input/components/Input/Input.stories.tsx +0 -99
  100. package/src/components/dataInput/Input/components/Input/InputBase.tsx +0 -50
  101. package/src/components/dataInput/Input/components/Input/__tests__/input.test.tsx +0 -38
  102. package/src/components/dataInput/Input/components/Input/index.tsx +0 -48
  103. package/src/components/dataInput/Input/components/Input/types.ts +0 -15
  104. package/src/components/dataInput/Input/components/InputBase/index.tsx +0 -31
  105. package/src/components/dataInput/Input/components/MaskInput/__tests__/mask-input.test.tsx +0 -77
  106. package/src/components/dataInput/Input/components/MaskInput/index.ts +0 -1
  107. package/src/components/dataInput/Input/components/MaskInput/mask-input.stories.tsx +0 -85
  108. package/src/components/dataInput/Input/components/MaskInput/mask-input.tsx +0 -73
  109. package/src/components/dataInput/Input/components/MultipleInput/MultipleInput.tsx +0 -105
  110. package/src/components/dataInput/Input/components/MultipleInput/MultipleInputBase.tsx +0 -100
  111. package/src/components/dataInput/Input/components/MultipleInput/MultipleMaskInput.tsx +0 -35
  112. package/src/components/dataInput/Input/components/MultipleInput/MultipleNumberInput.tsx +0 -35
  113. package/src/components/dataInput/Input/components/MultipleInput/__tests__/multiple-input.test.tsx +0 -152
  114. package/src/components/dataInput/Input/components/MultipleInput/index.ts +0 -2
  115. package/src/components/dataInput/Input/components/MultipleInput/multiple-input.stories.tsx +0 -96
  116. package/src/components/dataInput/Input/components/NumberInput/__tests__/number-input.test.tsx +0 -175
  117. package/src/components/dataInput/Input/components/NumberInput/index.ts +0 -1
  118. package/src/components/dataInput/Input/components/NumberInput/number-input.stories.tsx +0 -76
  119. package/src/components/dataInput/Input/components/NumberInput/number-input.tsx +0 -70
  120. package/src/components/dataInput/Input/index.ts +0 -4
  121. package/src/components/dataInput/Select/MultiSelect/MultiSelect.stories.tsx +0 -119
  122. package/src/components/dataInput/Select/MultiSelect/MultiSelectBase.tsx +0 -135
  123. package/src/components/dataInput/Select/MultiSelect/index.tsx +0 -75
  124. package/src/components/dataInput/Select/Select.stories.tsx +0 -61
  125. package/src/components/dataInput/Select/Select.tsx +0 -73
  126. package/src/components/dataInput/Select/SelectBase.tsx +0 -58
  127. package/src/components/dataInput/Select/index.ts +0 -2
  128. package/src/components/dataInput/Switch/Switch.stories.tsx +0 -75
  129. package/src/components/dataInput/Switch/Switch.tsx +0 -52
  130. package/src/components/dataInput/Switch/index.ts +0 -1
  131. package/src/components/dataInput/checkbox/Checkbox.tsx +0 -57
  132. package/src/components/dataInput/checkbox/Checkbox_old.tsx +0 -58
  133. package/src/components/dataInput/checkbox/Checkout.stories.tsx +0 -62
  134. package/src/components/dataInput/checkbox/index.ts +0 -1
  135. package/src/components/dataInput/form/Form.tsx +0 -47
  136. package/src/components/dataInput/form/index.ts +0 -3
  137. package/src/components/dataInput/index.ts +0 -5
  138. package/src/components/feedback/ErrorLabel/index.tsx +0 -24
  139. package/src/components/feedback/Spinner/index.ts +0 -1
  140. package/src/components/feedback/Toast/Toast.stories.tsx +0 -45
  141. package/src/components/feedback/Toast/index.ts +0 -2
  142. package/src/components/feedback/index.ts +0 -2
  143. package/src/components/index.ts +0 -6
  144. package/src/components/layout/Crud/components/Table/index.tsx +0 -183
  145. package/src/components/layout/Crud/components/Table/types.ts +0 -15
  146. package/src/components/layout/Crud/crud.stories.tsx +0 -317
  147. package/src/components/layout/Crud/hook/useCrudLayout/index.tsx +0 -94
  148. package/src/components/layout/Crud/hook/useRequest/index.tsx +0 -156
  149. package/src/components/layout/Crud/index.tsx +0 -295
  150. package/src/components/layout/Crud/store/CrudLayoutStore.ts +0 -75
  151. package/src/components/layout/Crud/types.ts +0 -14
  152. package/src/components/layout/Drawer/CustomDrawer/index.tsx +0 -33
  153. package/src/components/layout/Drawer/Drawer.stories.tsx +0 -80
  154. package/src/components/layout/Drawer/index.ts +0 -2
  155. package/src/components/layout/PageLayout/PageLayout.stories.tsx +0 -42
  156. package/src/components/layout/PageLayout/index.tsx +0 -28
  157. package/src/components/layout/Separator/index.ts +0 -1
  158. package/src/components/layout/Sheet/Sheet.stories.tsx +0 -28
  159. package/src/components/layout/Sheet/Sheet.tsx +0 -22
  160. package/src/components/layout/Sheet/index.ts +0 -1
  161. package/src/components/layout/Sidebar/Sidebar.stories.tsx +0 -116
  162. package/src/components/layout/Sidebar/Sidebar.tsx +0 -50
  163. package/src/components/layout/Sidebar/components/app-sidebar.tsx +0 -203
  164. package/src/components/layout/Sidebar/components/footer-sidebar.tsx +0 -17
  165. package/src/components/layout/Sidebar/components/header-sidebar.tsx +0 -90
  166. package/src/components/layout/Sidebar/components/menus.tsx +0 -55
  167. package/src/components/layout/Sidebar/components/nav-projects.tsx +0 -88
  168. package/src/components/layout/Sidebar/components/nav-user.tsx +0 -114
  169. package/src/components/layout/Sidebar/components/team-switcher.tsx +0 -85
  170. package/src/components/layout/Sidebar/index.ts +0 -2
  171. package/src/components/layout/Sidebar/provider/index.tsx +0 -51
  172. package/src/components/layout/Tabs/Tabs.tsx +0 -51
  173. package/src/components/layout/Tabs/index.ts +0 -1
  174. package/src/components/layout/Tabs/tabs.stories.tsx +0 -57
  175. package/src/components/layout/index.ts +0 -6
  176. package/src/components/navigation/Breadcrumbs/Breadcrumbs.tsx +0 -66
  177. package/src/components/navigation/Breadcrumbs/index.ts +0 -2
  178. package/src/components/navigation/index.ts +0 -1
  179. package/src/components/ui/alert-dialog.tsx +0 -141
  180. package/src/components/ui/alert.tsx +0 -59
  181. package/src/components/ui/avatar.tsx +0 -50
  182. package/src/components/ui/badge.tsx +0 -40
  183. package/src/components/ui/breadcrumb.tsx +0 -115
  184. package/src/components/ui/button.tsx +0 -57
  185. package/src/components/ui/card.tsx +0 -83
  186. package/src/components/ui/checkbox.tsx +0 -34
  187. package/src/components/ui/collapsible.tsx +0 -11
  188. package/src/components/ui/command.tsx +0 -153
  189. package/src/components/ui/dialog.tsx +0 -124
  190. package/src/components/ui/drawer.tsx +0 -117
  191. package/src/components/ui/dropdown-menu.tsx +0 -201
  192. package/src/components/ui/form.tsx +0 -179
  193. package/src/components/ui/input.tsx +0 -24
  194. package/src/components/ui/label.tsx +0 -30
  195. package/src/components/ui/popover.tsx +0 -33
  196. package/src/components/ui/select.tsx +0 -161
  197. package/src/components/ui/separator.tsx +0 -31
  198. package/src/components/ui/sheet.tsx +0 -140
  199. package/src/components/ui/sidebar.tsx +0 -763
  200. package/src/components/ui/skeleton.tsx +0 -15
  201. package/src/components/ui/sonner.tsx +0 -31
  202. package/src/components/ui/spinner.tsx +0 -54
  203. package/src/components/ui/switch.tsx +0 -33
  204. package/src/components/ui/table.tsx +0 -120
  205. package/src/components/ui/tabs.tsx +0 -55
  206. package/src/components/ui/toast.tsx +0 -130
  207. package/src/components/ui/toaster.tsx +0 -35
  208. package/src/components/ui/tooltip.tsx +0 -32
  209. package/src/hooks/use-conditional-controller.tsx +0 -35
  210. package/src/hooks/use-mask.tsx +0 -116
  211. package/src/hooks/use-mobile.tsx +0 -19
  212. package/src/hooks/use-toast.ts +0 -191
  213. package/src/index.ts +0 -1
  214. package/src/introduction.mdx +0 -132
  215. package/src/lib/utils.ts +0 -6
  216. package/tailwind.config.ts +0 -83
  217. package/tsconfig.json +0 -27
@@ -1,100 +0,0 @@
1
- import { Button } from "../../../../../components/actions";
2
- import { Icon } from "../../../../../components/dataDisplay";
3
- import { useCallback, useMemo, useState } from "react";
4
- import { useFormContext } from "react-hook-form";
5
- import _ from "lodash";
6
-
7
- export type MultipleInputBaseProps = {
8
- children: (params: {
9
- onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
10
- addItem: () => void;
11
- value: string;
12
- error?: string;
13
- }) => React.ReactNode;
14
- data: string[];
15
- name?: string;
16
- onChangeData?: (data: string[]) => void;
17
- error?: string;
18
- };
19
-
20
- export const MultipleInputBase = ({
21
- children,
22
- data = [],
23
- name,
24
- onChangeData = () => {},
25
- error,
26
- }: MultipleInputBaseProps) => {
27
- const form = useFormContext();
28
- const withForm = !!form && !!name;
29
- const [inputValue, setInputValue] = useState("");
30
-
31
- const inputData = useMemo(() => {
32
- if (withForm) {
33
- return _.get(form.watch(), name) || [];
34
- }
35
- return data;
36
- }, [withForm, form, name, data]);
37
-
38
- const errorMessage = useMemo(() => {
39
- if (withForm) {
40
- return _.get(form.formState.errors, name)?.message as string;
41
- }
42
- return error;
43
- }, [error, form, name, withForm]);
44
-
45
- const updateData = useCallback(() => {
46
- if (!inputValue.length) return;
47
- if (withForm) {
48
- form.setValue(name, [...inputData, inputValue]);
49
- } else {
50
- onChangeData?.(inputData.concat(inputValue));
51
- }
52
- setInputValue("");
53
- }, [inputData, inputValue, withForm, form, name, onChangeData]);
54
-
55
- const removeItem = useCallback(
56
- (index: number) => {
57
- if (withForm) {
58
- form.setValue(
59
- name,
60
- inputData.filter((_: string, i: number) => i !== index)
61
- );
62
- } else {
63
- onChangeData?.(inputData.filter((_: string, i: number) => i !== index));
64
- }
65
- },
66
- [withForm, form, name, inputData, onChangeData]
67
- );
68
-
69
- const renderOptions = useCallback(() => {
70
- return inputData?.map((item: string, index: number) => {
71
- return (
72
- <div key={index} className="flex justify-between mt-2">
73
- <div>{item}</div>
74
- <Button
75
- onClick={() => removeItem(index)}
76
- variant={"ghost"}
77
- size={"icon"}
78
- type="button"
79
- >
80
- <Icon name="MdDelete" className="fill-destructive" />
81
- </Button>
82
- </div>
83
- );
84
- });
85
- }, [inputData, removeItem]);
86
-
87
- return (
88
- <div>
89
- {children({
90
- onChange: ({ target: { value } }) => {
91
- setInputValue(value);
92
- },
93
- addItem: updateData,
94
- value: inputValue,
95
- error: errorMessage,
96
- })}
97
- {renderOptions()}
98
- </div>
99
- );
100
- };
@@ -1,35 +0,0 @@
1
- import { Button } from "../../../../../components/actions";
2
- import { MaskInput, MaskInputProps } from "../MaskInput";
3
- import { MultipleInputBase } from "./MultipleInputBase";
4
- import { Icon } from "../../../../../components/dataDisplay";
5
-
6
- export type MultipleMaskInputProps = MaskInputProps & {
7
- data?: string[];
8
- onChangeData?: (data: string[]) => void;
9
- name: string;
10
- };
11
-
12
- export const MultipleMaskInput = ({
13
- data = [],
14
- ...props
15
- }: MultipleMaskInputProps) => {
16
- return (
17
- <MultipleInputBase data={data} {...props}>
18
- {({ onChange, addItem, value }) => {
19
- return (
20
- <MaskInput
21
- {...props}
22
- value={value}
23
- onChange={onChange}
24
- withoutForm
25
- component={
26
- <Button type="button" onClick={() => addItem()}>
27
- <Icon name="MdAdd" />
28
- </Button>
29
- }
30
- />
31
- );
32
- }}
33
- </MultipleInputBase>
34
- );
35
- };
@@ -1,35 +0,0 @@
1
- import { Button } from "../../../../actions/Button";
2
- import { Input, InputProps } from "../Input";
3
- import { MultipleInputBase } from "./MultipleInputBase";
4
- import { Icon } from "../../../../dataDisplay/Icon";
5
-
6
- export type MultipleNumberInputProps = InputProps & {
7
- data: string[];
8
- onChangeData: (data: string[]) => void;
9
- name: string;
10
- };
11
-
12
- export const MultipleNumberInput = ({
13
- data,
14
- ...props
15
- }: MultipleNumberInputProps) => {
16
- return (
17
- <MultipleInputBase data={data} {...props}>
18
- {({ onChange, addItem, value }) => (
19
- <Input
20
- {...props}
21
- value={value}
22
- onChange={(e) => {
23
- onChange(e.target.value);
24
- }}
25
- withoutForm
26
- component={
27
- <Button onClick={() => addItem()}>
28
- <Icon name="MdAdd" />
29
- </Button>
30
- }
31
- />
32
- )}
33
- </MultipleInputBase>
34
- );
35
- };
@@ -1,152 +0,0 @@
1
- import "@testing-library/jest-dom";
2
- import { fireEvent, render, screen } from "@testing-library/react";
3
- import { MultipleInput } from "../MultipleInput";
4
-
5
- describe("MultipleInput", () => {
6
- it("should render label", () => {
7
- render(
8
- <MultipleInput
9
- label="test"
10
- name="test-input"
11
- data-testid="multiple-input"
12
- />
13
- );
14
- const label = screen.getByTestId("multiple-input-label");
15
- expect(label).toBeInTheDocument();
16
- expect(label).toHaveTextContent("test");
17
- });
18
-
19
- it("should render error", () => {
20
- render(
21
- <MultipleInput
22
- error="test"
23
- name="test-input"
24
- data-testid="multiple-input"
25
- />
26
- );
27
- const error = screen.getByTestId("multiple-input-error-label");
28
- expect(error).toBeInTheDocument();
29
- expect(error).toHaveTextContent("test");
30
- });
31
-
32
- it("should be disabled", () => {
33
- render(
34
- <MultipleInput disabled name="test-input" data-testid="multiple-input" />
35
- );
36
- const input = screen.getByTestId("multiple-input");
37
- expect(input).toBeDisabled();
38
- });
39
-
40
- it("should be required", () => {
41
- render(
42
- <MultipleInput
43
- required
44
- name="test-input"
45
- label="test"
46
- data-testid="multiple-input"
47
- />
48
- );
49
- const label = screen.getByTestId("multiple-input-label");
50
- expect(label).toHaveTextContent("test *");
51
- });
52
-
53
- it("should change value", () => {
54
- render(<MultipleInput name="test-input" data-testid="multiple-input" />);
55
- const input = screen.getByTestId("multiple-input");
56
- fireEvent.change(input, { target: { value: "test" } });
57
- expect(input).toHaveValue("test");
58
- });
59
-
60
- it("should render add button", () => {
61
- render(<MultipleInput name="test-input" data-testid="multiple-input" />);
62
- const addButton = screen.getByRole("button");
63
- expect(addButton).toBeInTheDocument();
64
- });
65
-
66
- it("should add item when add button is clicked", () => {
67
- const mockOnAdd = jest.fn();
68
- render(
69
- <MultipleInput
70
- name="test-input"
71
- data-testid="multiple-input"
72
- onAdd={mockOnAdd}
73
- withoutForm
74
- />
75
- );
76
-
77
- const input = screen.getByTestId("multiple-input");
78
- const addButton = screen.getByRole("button");
79
-
80
- fireEvent.change(input, { target: { value: "test item" } });
81
- fireEvent.click(addButton);
82
-
83
- expect(mockOnAdd).toHaveBeenCalledWith("test item");
84
- });
85
-
86
- it("should render with initial data", () => {
87
- const initialData = ["item 1", "item 2"];
88
-
89
- render(
90
- <MultipleInput
91
- name="test-input"
92
- data={initialData}
93
- data-testid="multiple-input"
94
- withoutForm
95
- />
96
- );
97
-
98
- expect(screen.getByText("item 1")).toBeInTheDocument();
99
- expect(screen.getByText("item 2")).toBeInTheDocument();
100
- });
101
-
102
- it("should handle mask prop", () => {
103
- render(
104
- <MultipleInput
105
- name="test-input"
106
- mask="(99) 99999-9999"
107
- data-testid="multiple-input"
108
- />
109
- );
110
-
111
- const input = screen.getByTestId("multiple-input");
112
- expect(input).toBeInTheDocument();
113
- });
114
-
115
- it("should remove item when remove button is clicked", () => {
116
- const mockOnRemove = jest.fn();
117
- const initialData = ["item 1", "item 2"];
118
-
119
- render(
120
- <MultipleInput
121
- name="test-input"
122
- data={initialData}
123
- onRemove={mockOnRemove}
124
- data-testid="multiple-input"
125
- withoutForm
126
- />
127
- );
128
-
129
- const removeButtons = screen.getAllByRole("button");
130
- const removeButton = removeButtons.find((button) =>
131
- button.querySelector('[data-icon="MdDelete"]')
132
- );
133
-
134
- if (removeButton) {
135
- fireEvent.click(removeButton);
136
- expect(mockOnRemove).toHaveBeenCalledWith(0);
137
- }
138
- });
139
-
140
- it("should disable add button when input is empty", () => {
141
- render(
142
- <MultipleInput
143
- name="test-input"
144
- data-testid="multiple-input"
145
- withoutForm
146
- />
147
- );
148
-
149
- const addButton = screen.getByRole("button");
150
- expect(addButton).toBeDisabled();
151
- });
152
- });
@@ -1,2 +0,0 @@
1
- export * from "./MultipleInput";
2
- export * from "./MultipleMaskInput";
@@ -1,96 +0,0 @@
1
- import type { Meta, StoryObj } from "@storybook/nextjs";
2
- import { MultipleInput } from "./MultipleInput";
3
- import { Form } from "@/components/ui/form";
4
- import { useForm } from "react-hook-form";
5
-
6
- const meta: Meta<typeof MultipleInput> = {
7
- title: "Data Input/Input/Multiple Input",
8
- component: MultipleInput,
9
- tags: ["autodocs"],
10
- parameters: {
11
- layout: "centered",
12
- },
13
- };
14
-
15
- export default meta;
16
- type Story = StoryObj<typeof MultipleInput>;
17
-
18
- export const Default: Story = {
19
- args: {
20
- label: "Multiple Input",
21
- name: "multipleInput",
22
- data: ["Item 1", "Item 2", "Item 3"],
23
- placeholder: "Multiple Input",
24
- withoutForm: true,
25
- onAdd: (data: string) => {
26
- console.log("Added:", data);
27
- },
28
- onRemove: (index: number) => {
29
- console.log("Removed index:", index);
30
- },
31
- },
32
- };
33
-
34
- export const WithError: Story = {
35
- args: {
36
- label: "Multiple Input",
37
- name: "multipleInput",
38
- error: "This is an error",
39
- data: ["Item 1", "Item 2", "Item 3"],
40
- placeholder: "Multiple Input",
41
- withoutForm: true,
42
- onAdd: (data: string) => {
43
- console.log("Added:", data);
44
- },
45
- onRemove: (index: number) => {
46
- console.log("Removed index:", index);
47
- },
48
- },
49
- };
50
-
51
- export const WithForm: Story = {
52
- args: {
53
- label: "Multiple Input",
54
- name: "client",
55
- placeholder: "Multiple Input",
56
- },
57
- decorators: [
58
- (Story: React.ComponentType) => {
59
- const form = useForm({
60
- defaultValues: {
61
- client: ["Item 1", "Item 2", "Item 3"],
62
- },
63
- });
64
-
65
- return (
66
- <Form {...form}>
67
- <Story />
68
- </Form>
69
- );
70
- },
71
- ],
72
- };
73
-
74
- export const WithMaskAndForm: Story = {
75
- args: {
76
- label: "Phone Numbers",
77
- name: "phoneNumbers",
78
- placeholder: "Enter phone number",
79
- mask: "(99) 99999-9999",
80
- },
81
- decorators: [
82
- (Story: React.ComponentType) => {
83
- const form = useForm({
84
- defaultValues: {
85
- phoneNumbers: ["(11) 99999-9999", "(21) 88888-8888"],
86
- },
87
- });
88
-
89
- return (
90
- <Form {...form}>
91
- <Story />
92
- </Form>
93
- );
94
- },
95
- ],
96
- };
@@ -1,175 +0,0 @@
1
- import "@testing-library/jest-dom";
2
- import { render, screen } from "@testing-library/react";
3
- import userEvent from "@testing-library/user-event";
4
- import { NumberInput } from "../number-input";
5
-
6
- describe("NumberInput", () => {
7
- it("should render label", () => {
8
- render(<NumberInput label="test" data-testid="number-input" />);
9
- const label = screen.getByTestId("number-input-label");
10
- expect(label).toBeInTheDocument();
11
- expect(label).toHaveTextContent("test");
12
- });
13
-
14
- it("should render error", () => {
15
- render(<NumberInput error="test" data-testid="number-input" />);
16
- const error = screen.getByTestId("number-input-error-label");
17
- expect(error).toBeInTheDocument();
18
- expect(error).toHaveTextContent("test");
19
- });
20
-
21
- it("should be disabled", () => {
22
- render(<NumberInput disabled data-testid="number-input" />);
23
- const input = screen.getByTestId("number-input");
24
- expect(input).toBeDisabled();
25
- });
26
-
27
- it("should be required", () => {
28
- render(<NumberInput required data-testid="number-input" label="test" />);
29
- const label = screen.getByTestId("number-input-label");
30
- expect(label).toHaveTextContent("test *");
31
- });
32
-
33
- it("should handle placeholder", () => {
34
- render(
35
- <NumberInput data-testid="number-input" placeholder="Digite um número" />
36
- );
37
- const input = screen.getByTestId("number-input");
38
-
39
- expect(input).toHaveAttribute("placeholder", "Digite um número");
40
- });
41
-
42
- it("should handle name attribute", () => {
43
- render(<NumberInput data-testid="number-input" name="amount" />);
44
- const input = screen.getByTestId("number-input");
45
-
46
- expect(input).toHaveAttribute("name", "amount");
47
- });
48
-
49
- it("should format numbers with thousands separator", async () => {
50
- const user = userEvent.setup();
51
- render(<NumberInput data-testid="number-input" thousandSeparator={true} />);
52
- const input = screen.getByTestId("number-input");
53
-
54
- await user.type(input, "1234567");
55
-
56
- expect(input).toHaveValue("1,234,567");
57
- });
58
-
59
- it("should format currency values", async () => {
60
- const user = userEvent.setup();
61
- render(
62
- <NumberInput
63
- data-testid="number-input"
64
- thousandSeparator={true}
65
- prefix="R$ "
66
- decimalScale={2}
67
- fixedDecimalScale={true}
68
- />
69
- );
70
- const input = screen.getByTestId("number-input");
71
-
72
- await user.type(input, "1234.56");
73
-
74
- expect(input).toHaveValue("R$ 1,234.56");
75
- });
76
-
77
- it("should limit decimal places", async () => {
78
- const user = userEvent.setup();
79
- render(<NumberInput data-testid="number-input" decimalScale={2} />);
80
- const input = screen.getByTestId("number-input");
81
-
82
- await user.type(input, "123.456789");
83
-
84
- expect(input).toHaveValue("123.45");
85
- });
86
-
87
- it("should handle percentage format", async () => {
88
- const user = userEvent.setup();
89
- render(
90
- <NumberInput data-testid="number-input" suffix="%" decimalScale={2} />
91
- );
92
- const input = screen.getByTestId("number-input");
93
-
94
- await user.type(input, "15.75");
95
-
96
- expect(input).toHaveValue("15.75%");
97
- });
98
-
99
- it("should call onChange with synthetic event", async () => {
100
- const user = userEvent.setup();
101
- const mockOnChange = jest.fn();
102
- render(
103
- <NumberInput
104
- data-testid="number-input"
105
- onChange={mockOnChange}
106
- name="testInput"
107
- />
108
- );
109
- const input = screen.getByTestId("number-input");
110
-
111
- await user.type(input, "123");
112
-
113
- expect(mockOnChange).toHaveBeenCalled();
114
- const lastCall =
115
- mockOnChange.mock.calls[mockOnChange.mock.calls.length - 1][0];
116
- expect(lastCall.target.name).toBe("testInput");
117
- expect(lastCall.target.value).toBe("123");
118
- });
119
-
120
- it("should call onValueChange with formatted data", async () => {
121
- const user = userEvent.setup();
122
- const mockOnValueChange = jest.fn();
123
- render(
124
- <NumberInput
125
- data-testid="number-input"
126
- onValueChange={mockOnValueChange}
127
- thousandSeparator={true}
128
- />
129
- );
130
- const input = screen.getByTestId("number-input");
131
-
132
- await user.type(input, "1234");
133
-
134
- expect(mockOnValueChange).toHaveBeenCalled();
135
- const lastCall =
136
- mockOnValueChange.mock.calls[mockOnValueChange.mock.calls.length - 1][0];
137
- expect(lastCall.value).toBe("1234");
138
- expect(lastCall.floatValue).toBe(1234);
139
- expect(lastCall.formattedValue).toBe("1,234");
140
- });
141
-
142
- it("should handle negative numbers", async () => {
143
- const user = userEvent.setup();
144
- render(<NumberInput data-testid="number-input" allowNegative={true} />);
145
- const input = screen.getByTestId("number-input");
146
-
147
- await user.type(input, "-123");
148
-
149
- expect(input).toHaveValue("-123");
150
- });
151
-
152
- it("should prevent negative numbers when allowNegative is false", async () => {
153
- const user = userEvent.setup();
154
- render(<NumberInput data-testid="number-input" allowNegative={false} />);
155
- const input = screen.getByTestId("number-input");
156
-
157
- await user.type(input, "-123");
158
-
159
- expect(input).toHaveValue("123");
160
- });
161
-
162
- it("should handle controlled value", () => {
163
- render(<NumberInput data-testid="number-input" value="1000" />);
164
- const input = screen.getByTestId("number-input");
165
-
166
- expect(input).toHaveValue("1000");
167
- });
168
-
169
- it("should handle empty value", () => {
170
- render(<NumberInput data-testid="number-input" value="" />);
171
- const input = screen.getByTestId("number-input");
172
-
173
- expect(input).toHaveValue("");
174
- });
175
- });
@@ -1 +0,0 @@
1
- export * from "./number-input";
@@ -1,76 +0,0 @@
1
- import type { Meta, StoryObj } from "@storybook/nextjs";
2
- import { NumberInput } from "./number-input";
3
- import { useForm } from "react-hook-form";
4
- import { Form } from "../../../../../components/ui/form";
5
-
6
- const meta = {
7
- title: "Data Input/Input/NumberInput",
8
- component: NumberInput,
9
- parameters: {
10
- layout: "centered",
11
- },
12
- tags: ["autodocs"],
13
- } satisfies Meta<typeof NumberInput>;
14
-
15
- export default meta;
16
- type Story = StoryObj<typeof meta>;
17
-
18
- export const Default: Story = {
19
- args: {
20
- placeholder: "0,00",
21
- label: "Valor",
22
- },
23
- };
24
-
25
- export const Currency: Story = {
26
- args: {
27
- placeholder: "0,00",
28
- label: "Preço",
29
- prefix: "R$ ",
30
- decimalScale: 2,
31
- fixedDecimalScale: false,
32
- value: 1234.56,
33
- },
34
- };
35
-
36
- export const Percentage: Story = {
37
- args: {
38
- placeholder: "0,00",
39
- label: "Porcentagem",
40
- suffix: "%",
41
- decimalScale: 1,
42
- fixedDecimalScale: true,
43
- value: 85.5,
44
- },
45
- };
46
-
47
- export const CustomFormat: Story = {
48
- args: {
49
- placeholder: "0",
50
- label: "Número",
51
- thousandSeparator: ",",
52
- decimalSeparator: ".",
53
- value: 1234567.89,
54
- },
55
- };
56
-
57
- export const WithForm = () => {
58
- const form = useForm({
59
- defaultValues: {
60
- price: 99.99,
61
- },
62
- });
63
-
64
- return (
65
- <Form {...form}>
66
- <form className="space-y-6">
67
- <NumberInput
68
- name="price"
69
- label="Preço"
70
- prefix="R$ "
71
- placeholder="Digite o preço do produto"
72
- />
73
- </form>
74
- </Form>
75
- );
76
- };