@popsure/dirty-swan 0.41.4 → 0.41.6

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 (31) hide show
  1. package/dist/cjs/index.js +6 -4
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/lib/components/input/currency/index.d.ts +7 -6
  4. package/dist/cjs/lib/components/input/currency/input.stories.d.ts +83 -0
  5. package/dist/cjs/lib/index.d.ts +1 -1
  6. package/dist/esm/components/input/currency/index.js +5 -2
  7. package/dist/esm/components/input/currency/index.js.map +1 -1
  8. package/dist/esm/components/input/currency/index.test.js +1 -1
  9. package/dist/esm/components/input/currency/index.test.js.map +1 -1
  10. package/dist/esm/components/input/currency/input.stories.js +32 -0
  11. package/dist/esm/components/input/currency/input.stories.js.map +1 -0
  12. package/dist/esm/components/input/input.stories.js +1 -55
  13. package/dist/esm/components/input/input.stories.js.map +1 -1
  14. package/dist/esm/components/multiDropzone/index.js +2 -3
  15. package/dist/esm/components/multiDropzone/index.js.map +1 -1
  16. package/dist/esm/components/multiDropzone/index.test.js +0 -5
  17. package/dist/esm/components/multiDropzone/index.test.js.map +1 -1
  18. package/dist/esm/config-56f12c98.js +57 -0
  19. package/dist/esm/config-56f12c98.js.map +1 -0
  20. package/dist/esm/index.js +1 -1
  21. package/dist/esm/lib/components/input/currency/index.d.ts +7 -6
  22. package/dist/esm/lib/components/input/currency/input.stories.d.ts +83 -0
  23. package/dist/esm/lib/index.d.ts +1 -1
  24. package/package.json +1 -1
  25. package/src/lib/components/input/currency/index.test.tsx +1 -1
  26. package/src/lib/components/input/currency/index.tsx +11 -7
  27. package/src/lib/components/input/currency/input.stories.tsx +48 -0
  28. package/src/lib/components/multiDropzone/index.test.tsx +0 -7
  29. package/src/lib/components/multiDropzone/index.tsx +3 -7
  30. package/src/lib/index.tsx +1 -1
  31. package/src/lib/components/input/currency/index.stories.mdx +0 -33
@@ -163,11 +163,6 @@ describe('MultiDropzone component', function () {
163
163
  var screen = setup({ uploading: true });
164
164
  expect(screen.getByText('Please wait while uploading file...')).toBeInTheDocument();
165
165
  });
166
- it('should associate input with its label', function () {
167
- var getByLabelText = setup({}).getByLabelText;
168
- var input = getByLabelText('Choose file or drag & drop');
169
- expect(input).toBeInTheDocument();
170
- });
171
166
  });
172
167
  describe('Uploaded files', function () {
173
168
  it('should show uploaded files', function () {
@@ -1 +1 @@
1
- {"version":3,"file":"index.test.js","sources":["../../../../../src/lib/components/multiDropzone/index.test.tsx"],"sourcesContent":["import { act, fireEvent, render } from '../../util/testUtils';\nimport '@testing-library/jest-dom';\n\nimport { MultiDropzone, MultiDropzoneProps } from '.';\n\nconst mockOnFileSelect = jest.fn();\nconst mockOnRemoveFile = jest.fn();\nconst file = new File(['DummyFile'], 'dummy.png', { type: 'image/png' });\n\nconst inputTestId = 'ds-drop-input';\nconst spinnerTestId = 'ds-filecell-spinner';\nconst progressbarTestId = 'ds-filecell-progressbar';\nconst uploadedFilesMock = {\n id: '123',\n name: 'File name',\n progress: 100,\n type: 'jpg',\n};\n\nconst setup = ({\n uploadedFiles = [],\n uploading = false,\n ...rest\n}: Partial<MultiDropzoneProps>) => {\n return render(\n <MultiDropzone\n {...rest}\n uploadedFiles={uploadedFiles}\n uploading={uploading}\n onFileSelect={mockOnFileSelect}\n onRemoveFile={mockOnRemoveFile}\n />\n );\n};\n\ndescribe('MultiDropzone component', () => {\n it('should call onFileSelect on files change', async () => {\n const { getByTestId, user } = setup({});\n const files = [file, file];\n\n await user.upload(getByTestId(inputTestId), files);\n\n expect(mockOnFileSelect).toHaveBeenCalledWith(files);\n });\n\n describe('Error states', () => {\n it('should show max files error message', () => {\n const screen = setup({\n maxFiles: 1,\n uploadedFiles: [\n uploadedFilesMock,\n {\n ...uploadedFilesMock,\n id: '222',\n },\n ],\n });\n\n expect(screen.getByText('Too many files.')).toBeVisible();\n });\n\n it('should show max file size error message', async () => {\n const { getByTestId, getByText, user } = setup({ maxSize: 10 });\n const bigFile = file;\n Object.defineProperty(bigFile, 'size', { value: 1024 });\n\n await user.upload(getByTestId(inputTestId), [bigFile]);\n\n expect(\n getByText('File is too large. It must be less than 10 Bytes.')\n ).toBeInTheDocument();\n });\n\n it('should show wrong filetype error message', async () => {\n const { getByTestId, getByText } = setup({ accept: 'document' });\n const input = getByTestId(inputTestId);\n\n await act(async () => {\n // Keeping fireevent to emulate file change like drop\n // Using userevent.upload doesn't work since input has an accept/html validation\n fireEvent.change(input, { target: { files: [file] } });\n });\n\n expect(\n getByText('File type must be one of DOC, DOCX, PDF')\n ).toBeInTheDocument();\n });\n\n it('should remove wrong filetype error message', async () => {\n const { getByAltText, getByTestId, queryByText, user } = setup({\n accept: 'document',\n });\n const input = getByTestId(inputTestId);\n\n await act(async () => {\n // Keeping fireevent to emulate file change like drop\n // Using userevent.upload doesn't work since input has an accept/html validation\n fireEvent.change(input, { target: { files: [file] } });\n });\n\n await user.click(getByTestId('remove-button'));\n\n expect(\n queryByText('File type must be one of DOC, DOCX, PDF')\n ).not.toBeInTheDocument();\n });\n });\n\n describe('Copy text', () => {\n it('should show uploader text', () => {\n const screen = setup({});\n\n expect(\n screen.getByText('Choose file or drag & drop')\n ).toBeInTheDocument();\n });\n\n it('should show uploader text translated', () => {\n const instructionsText = 'Drag drop file';\n const screen = setup({\n textOverrides: { instructionsText },\n });\n\n expect(screen.getByText(instructionsText)).toBeInTheDocument();\n });\n\n it('should show image accept file type label', () => {\n const screen = setup({ accept: 'image' });\n\n expect(\n screen.getByText('Supports HEIC, BMP, JPEG, JPG, PNG')\n ).toBeInTheDocument();\n });\n\n it('should show document accept file type label', () => {\n const screen = setup({ accept: 'document' });\n\n expect(screen.getByText('Supports DOC, DOCX, PDF')).toBeInTheDocument();\n });\n\n it('should custom document accept file type label', () => {\n const screen = setup({\n accept: {\n 'application/pdf': ['.pdf'],\n 'image/jpg': ['.jpg'],\n },\n });\n\n expect(screen.getByText('Supports PDF, JPG')).toBeInTheDocument();\n });\n\n it('should show disabled text if is uploading', () => {\n const screen = setup({ uploading: true });\n\n expect(\n screen.getByText('Please wait while uploading file...')\n ).toBeInTheDocument();\n });\n\n it('should associate input with its label', () => {\n const { getByLabelText } = setup({});\n const input = getByLabelText('Choose file or drag & drop');\n\n expect(input).toBeInTheDocument();\n });\n });\n\n describe('Uploaded files', () => {\n it('should show uploaded files', () => {\n const screen = setup({\n uploadedFiles: [uploadedFilesMock],\n });\n\n expect(screen.getByText(uploadedFilesMock.name)).toBeInTheDocument();\n });\n\n it('should call onRemoveFile with uploaded file id', () => {\n const screen = setup({\n uploadedFiles: [uploadedFilesMock],\n });\n\n screen.getByTestId('remove-button').click();\n\n expect(mockOnRemoveFile).toBeCalledWith(uploadedFilesMock.id);\n });\n\n it('should show uploaded file with uploading label', () => {\n const screen = setup({\n uploadedFiles: [{ ...uploadedFilesMock, progress: 50 }],\n });\n\n expect(screen.getByText('Uploading...')).toBeInTheDocument();\n });\n\n it('should show uploaded file with progress bar', () => {\n const screen = setup({\n uploadedFiles: [\n {\n ...uploadedFilesMock,\n progress: 50,\n },\n ],\n });\n\n expect(screen.getByTestId(progressbarTestId)).toBeInTheDocument();\n });\n\n it('should show uploaded file with no progress bar', () => {\n const screen = setup({\n uploadedFiles: [\n {\n ...uploadedFilesMock,\n progress: 50,\n showProgressBar: false,\n },\n ],\n });\n\n expect(screen.queryByTestId(progressbarTestId)).not.toBeInTheDocument();\n });\n\n it('should show uploaded file with loading spinner', () => {\n const screen = setup({\n uploadedFiles: [\n {\n ...uploadedFilesMock,\n progress: 50,\n showLoadingSpinner: true,\n },\n ],\n });\n\n expect(screen.getByTestId(spinnerTestId)).toBeInTheDocument();\n });\n\n it('should show uploaded file with no loading spinner', () => {\n const screen = setup({\n uploadedFiles: [\n {\n ...uploadedFilesMock,\n progress: 50,\n showLoadingSpinner: false,\n },\n ],\n });\n\n expect(screen.queryByTestId(spinnerTestId)).not.toBeInTheDocument();\n });\n });\n});\n"],"names":["render","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"index.test.js","sources":["../../../../../src/lib/components/multiDropzone/index.test.tsx"],"sourcesContent":["import { act, fireEvent, render } from '../../util/testUtils';\nimport '@testing-library/jest-dom';\n\nimport { MultiDropzone, MultiDropzoneProps } from '.';\n\nconst mockOnFileSelect = jest.fn();\nconst mockOnRemoveFile = jest.fn();\nconst file = new File(['DummyFile'], 'dummy.png', { type: 'image/png' });\n\nconst inputTestId = 'ds-drop-input';\nconst spinnerTestId = 'ds-filecell-spinner';\nconst progressbarTestId = 'ds-filecell-progressbar';\nconst uploadedFilesMock = {\n id: '123',\n name: 'File name',\n progress: 100,\n type: 'jpg',\n};\n\nconst setup = ({\n uploadedFiles = [],\n uploading = false,\n ...rest\n}: Partial<MultiDropzoneProps>) => {\n return render(\n <MultiDropzone\n {...rest}\n uploadedFiles={uploadedFiles}\n uploading={uploading}\n onFileSelect={mockOnFileSelect}\n onRemoveFile={mockOnRemoveFile}\n />\n );\n};\n\ndescribe('MultiDropzone component', () => {\n it('should call onFileSelect on files change', async () => {\n const { getByTestId, user } = setup({});\n const files = [file, file];\n\n await user.upload(getByTestId(inputTestId), files);\n\n expect(mockOnFileSelect).toHaveBeenCalledWith(files);\n });\n\n describe('Error states', () => {\n it('should show max files error message', () => {\n const screen = setup({\n maxFiles: 1,\n uploadedFiles: [\n uploadedFilesMock,\n {\n ...uploadedFilesMock,\n id: '222',\n },\n ],\n });\n\n expect(screen.getByText('Too many files.')).toBeVisible();\n });\n\n it('should show max file size error message', async () => {\n const { getByTestId, getByText, user } = setup({ maxSize: 10 });\n const bigFile = file;\n Object.defineProperty(bigFile, 'size', { value: 1024 });\n\n await user.upload(getByTestId(inputTestId), [bigFile]);\n\n expect(\n getByText('File is too large. It must be less than 10 Bytes.')\n ).toBeInTheDocument();\n });\n\n it('should show wrong filetype error message', async () => {\n const { getByTestId, getByText } = setup({ accept: 'document' });\n const input = getByTestId(inputTestId);\n\n await act(async () => {\n // Keeping fireevent to emulate file change like drop\n // Using userevent.upload doesn't work since input has an accept/html validation\n fireEvent.change(input, { target: { files: [file] } });\n });\n\n expect(\n getByText('File type must be one of DOC, DOCX, PDF')\n ).toBeInTheDocument();\n });\n\n it('should remove wrong filetype error message', async () => {\n const { getByAltText, getByTestId, queryByText, user } = setup({\n accept: 'document',\n });\n const input = getByTestId(inputTestId);\n\n await act(async () => {\n // Keeping fireevent to emulate file change like drop\n // Using userevent.upload doesn't work since input has an accept/html validation\n fireEvent.change(input, { target: { files: [file] } });\n });\n\n await user.click(getByTestId('remove-button'));\n\n expect(\n queryByText('File type must be one of DOC, DOCX, PDF')\n ).not.toBeInTheDocument();\n });\n });\n\n describe('Copy text', () => {\n it('should show uploader text', () => {\n const screen = setup({});\n\n expect(\n screen.getByText('Choose file or drag & drop')\n ).toBeInTheDocument();\n });\n\n it('should show uploader text translated', () => {\n const instructionsText = 'Drag drop file';\n const screen = setup({\n textOverrides: { instructionsText },\n });\n\n expect(screen.getByText(instructionsText)).toBeInTheDocument();\n });\n\n it('should show image accept file type label', () => {\n const screen = setup({ accept: 'image' });\n\n expect(\n screen.getByText('Supports HEIC, BMP, JPEG, JPG, PNG')\n ).toBeInTheDocument();\n });\n\n it('should show document accept file type label', () => {\n const screen = setup({ accept: 'document' });\n\n expect(screen.getByText('Supports DOC, DOCX, PDF')).toBeInTheDocument();\n });\n\n it('should custom document accept file type label', () => {\n const screen = setup({\n accept: {\n 'application/pdf': ['.pdf'],\n 'image/jpg': ['.jpg'],\n },\n });\n\n expect(screen.getByText('Supports PDF, JPG')).toBeInTheDocument();\n });\n\n it('should show disabled text if is uploading', () => {\n const screen = setup({ uploading: true });\n\n expect(\n screen.getByText('Please wait while uploading file...')\n ).toBeInTheDocument();\n });\n });\n\n describe('Uploaded files', () => {\n it('should show uploaded files', () => {\n const screen = setup({\n uploadedFiles: [uploadedFilesMock],\n });\n\n expect(screen.getByText(uploadedFilesMock.name)).toBeInTheDocument();\n });\n\n it('should call onRemoveFile with uploaded file id', () => {\n const screen = setup({\n uploadedFiles: [uploadedFilesMock],\n });\n\n screen.getByTestId('remove-button').click();\n\n expect(mockOnRemoveFile).toBeCalledWith(uploadedFilesMock.id);\n });\n\n it('should show uploaded file with uploading label', () => {\n const screen = setup({\n uploadedFiles: [{ ...uploadedFilesMock, progress: 50 }],\n });\n\n expect(screen.getByText('Uploading...')).toBeInTheDocument();\n });\n\n it('should show uploaded file with progress bar', () => {\n const screen = setup({\n uploadedFiles: [\n {\n ...uploadedFilesMock,\n progress: 50,\n },\n ],\n });\n\n expect(screen.getByTestId(progressbarTestId)).toBeInTheDocument();\n });\n\n it('should show uploaded file with no progress bar', () => {\n const screen = setup({\n uploadedFiles: [\n {\n ...uploadedFilesMock,\n progress: 50,\n showProgressBar: false,\n },\n ],\n });\n\n expect(screen.queryByTestId(progressbarTestId)).not.toBeInTheDocument();\n });\n\n it('should show uploaded file with loading spinner', () => {\n const screen = setup({\n uploadedFiles: [\n {\n ...uploadedFilesMock,\n progress: 50,\n showLoadingSpinner: true,\n },\n ],\n });\n\n expect(screen.getByTestId(spinnerTestId)).toBeInTheDocument();\n });\n\n it('should show uploaded file with no loading spinner', () => {\n const screen = setup({\n uploadedFiles: [\n {\n ...uploadedFilesMock,\n progress: 50,\n showLoadingSpinner: false,\n },\n ],\n });\n\n expect(screen.queryByTestId(spinnerTestId)).not.toBeInTheDocument();\n });\n });\n});\n"],"names":["render","_jsx"],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ var sharedConfig = {
2
+ value: {
3
+ defaultValue: '',
4
+ description: 'Current input value.',
5
+ control: { type: 'text' }
6
+ },
7
+ className: {
8
+ description: 'Wrapper classNames for custom styling',
9
+ defaultValue: '',
10
+ control: { type: 'text' }
11
+ },
12
+ placeholder: {
13
+ description: 'Placeholder for DirtySwan Input component',
14
+ defaultValue: 'Placeholder',
15
+ control: { type: 'text' }
16
+ },
17
+ label: {
18
+ description: 'Label of the Input component',
19
+ defaultValue: 'Input Label',
20
+ control: { type: 'text' }
21
+ },
22
+ hideLabel: {
23
+ description: 'Whether or not a label should be hidden.. This is needed for accessibility purposes and a label should always be provided',
24
+ defaultValue: false,
25
+ control: { type: 'boolean' }
26
+ },
27
+ prefix: {
28
+ description: 'A prefix that can be displayed on the left of the input. Specially useful for currencies.',
29
+ defaultValue: '£',
30
+ control: { type: 'text' }
31
+ },
32
+ id: {
33
+ description: 'Unique ID identifier of the input. Relevant for accessibility.',
34
+ defaultValue: '1234567890',
35
+ control: { type: 'text' }
36
+ },
37
+ error: {
38
+ description: 'Error message that will also make input show on error state.',
39
+ defaultValue: '',
40
+ control: { type: 'text' },
41
+ table: {
42
+ type: {
43
+ summary: 'string | boolean'
44
+ },
45
+ },
46
+ },
47
+ onChange: {
48
+ description: 'Function that is called when value of current input changes',
49
+ action: true,
50
+ table: {
51
+ category: "Callbacks",
52
+ },
53
+ },
54
+ };
55
+
56
+ export { sharedConfig as s };
57
+ //# sourceMappingURL=config-56f12c98.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-56f12c98.js","sources":["../../../src/lib/components/input/stories/config.ts"],"sourcesContent":["const sharedConfig = {\n value: {\n defaultValue: '',\n description: 'Current input value.',\n control: { type: 'text' }\n },\n className: {\n description: 'Wrapper classNames for custom styling',\n defaultValue: '',\n control: { type: 'text' }\n },\n placeholder: {\n description: 'Placeholder for DirtySwan Input component',\n defaultValue: 'Placeholder',\n control: { type: 'text' }\n },\n label: {\n description: 'Label of the Input component',\n defaultValue: 'Input Label',\n control: { type: 'text' }\n },\n hideLabel: {\n description: 'Whether or not a label should be hidden.. This is needed for accessibility purposes and a label should always be provided',\n defaultValue: false,\n control: { type: 'boolean' }\n },\n prefix: {\n description: 'A prefix that can be displayed on the left of the input. Specially useful for currencies.',\n defaultValue: '£',\n control: { type: 'text' }\n },\n id: {\n description: 'Unique ID identifier of the input. Relevant for accessibility.',\n defaultValue: '1234567890',\n control: { type: 'text' }\n },\n error: {\n description: 'Error message that will also make input show on error state.',\n defaultValue: '',\n control: { type: 'text' },\n table: {\n type: { \n summary: 'string | boolean'\n },\n },\n },\n onChange: {\n description: 'Function that is called when value of current input changes',\n action: true,\n table: {\n category: \"Callbacks\",\n },\n },\n} \n\nexport default sharedConfig;"],"names":[],"mappings":"IAAM,YAAY,GAAG;IACnB,KAAK,EAAE;QACL,YAAY,EAAE,EAAE;QAChB,WAAW,EAAE,sBAAsB;QACnC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;KAC1B;IACD,SAAS,EAAE;QACT,WAAW,EAAE,uCAAuC;QACpD,YAAY,EAAE,EAAE;QAChB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;KAC1B;IACD,WAAW,EAAE;QACX,WAAW,EAAE,2CAA2C;QACxD,YAAY,EAAE,aAAa;QAC3B,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;KAC1B;IACD,KAAK,EAAE;QACL,WAAW,EAAE,8BAA8B;QAC3C,YAAY,EAAE,aAAa;QAC3B,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;KAC1B;IACD,SAAS,EAAE;QACT,WAAW,EAAE,2HAA2H;QACxI,YAAY,EAAE,KAAK;QACnB,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;KAC7B;IACD,MAAM,EAAE;QACN,WAAW,EAAE,2FAA2F;QACxG,YAAY,EAAE,GAAG;QACjB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;KAC1B;IACD,EAAE,EAAE;QACF,WAAW,EAAE,gEAAgE;QAC7E,YAAY,EAAE,YAAY;QAC1B,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;KAC1B;IACD,KAAK,EAAE;QACL,WAAW,EAAE,8DAA8D;QAC3E,YAAY,EAAE,EAAE;QAChB,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;QACzB,KAAK,EAAE;YACL,IAAI,EAAE;gBACJ,OAAO,EAAE,kBAAkB;aAC5B;SACF;KACF;IACD,QAAQ,EAAE;QACR,WAAW,EAAE,6DAA6D;QAC1E,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE;YACL,QAAQ,EAAE,WAAW;SACtB;KACF;;;;;"}
package/dist/esm/index.js CHANGED
@@ -6,7 +6,7 @@ export { MultiDropzone } from './components/multiDropzone/index.js';
6
6
  export { DownloadButton } from './components/downloadButton/index.js';
7
7
  export { InformationBox } from './components/informationBox/index.js';
8
8
  export { default as IbanInput } from './components/input/iban/index.js';
9
- export { default as CurrencyInput } from './components/input/currency/index.js';
9
+ export { CurrencyInput } from './components/input/currency/index.js';
10
10
  export { Badge } from './components/badge/index.js';
11
11
  export { Checkbox } from './components/input/checkbox/index.js';
12
12
  export { Radio } from './components/input/radio/index.js';
@@ -1,7 +1,8 @@
1
1
  import { InputProps } from '..';
2
- declare const CurrencyInput: ({ value, onChange, type, ...props }: {
3
- value?: number | undefined;
4
- placeholder?: string | undefined;
5
- onChange?: ((value: number) => void) | undefined;
6
- } & Omit<InputProps, "ref" | "value" | "onChange">) => JSX.Element;
7
- export default CurrencyInput;
2
+ export declare type CurrencyInputProps = {
3
+ value?: number | null | undefined;
4
+ placeholder?: string;
5
+ onChange?: (value: number | null) => void;
6
+ } & Omit<InputProps, 'onChange' | 'value' | 'ref'>;
7
+ declare const CurrencyInput: ({ value, onChange, type, ...props }: CurrencyInputProps) => JSX.Element;
8
+ export { CurrencyInput };
@@ -0,0 +1,83 @@
1
+ import { CurrencyInputProps } from '.';
2
+ declare const story: {
3
+ title: string;
4
+ component: ({ value, onChange, type, ...props }: CurrencyInputProps) => JSX.Element;
5
+ argTypes: {
6
+ value: {
7
+ defaultValue: string;
8
+ description: string;
9
+ control: {
10
+ type: string;
11
+ };
12
+ };
13
+ className: {
14
+ description: string;
15
+ defaultValue: string;
16
+ control: {
17
+ type: string;
18
+ };
19
+ };
20
+ placeholder: {
21
+ description: string;
22
+ defaultValue: string;
23
+ control: {
24
+ type: string;
25
+ };
26
+ };
27
+ label: {
28
+ description: string;
29
+ defaultValue: string;
30
+ control: {
31
+ type: string;
32
+ };
33
+ };
34
+ hideLabel: {
35
+ description: string;
36
+ defaultValue: boolean;
37
+ control: {
38
+ type: string;
39
+ };
40
+ };
41
+ prefix: {
42
+ description: string;
43
+ defaultValue: string;
44
+ control: {
45
+ type: string;
46
+ };
47
+ };
48
+ id: {
49
+ description: string;
50
+ defaultValue: string;
51
+ control: {
52
+ type: string;
53
+ };
54
+ };
55
+ error: {
56
+ description: string;
57
+ defaultValue: string;
58
+ control: {
59
+ type: string;
60
+ };
61
+ table: {
62
+ type: {
63
+ summary: string;
64
+ };
65
+ };
66
+ };
67
+ onChange: {
68
+ description: string;
69
+ action: boolean;
70
+ table: {
71
+ category: string;
72
+ };
73
+ };
74
+ };
75
+ parameters: {
76
+ componentSubtitle: string;
77
+ };
78
+ };
79
+ export declare const CurrencyInputStory: {
80
+ ({ onChange, className, placeholder, value, label, hideLabel, prefix, error }: CurrencyInputProps): JSX.Element;
81
+ storyName: string;
82
+ };
83
+ export default story;
@@ -6,7 +6,7 @@ import { MultiDropzone, FileType, MultiDropzoneProps, UploadedFile, UploadStatus
6
6
  import { DownloadButton } from './components/downloadButton';
7
7
  import { InformationBox } from './components/informationBox';
8
8
  import IbanInput from './components/input/iban';
9
- import CurrencyInput from './components/input/currency';
9
+ import { CurrencyInput } from './components/input/currency';
10
10
  import { Badge } from './components/badge';
11
11
  import { Checkbox } from './components/input/checkbox';
12
12
  import { Radio } from './components/input/radio';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@popsure/dirty-swan",
3
- "version": "0.41.4",
3
+ "version": "0.41.6",
4
4
  "author": "Vincent Audoire <vincent@getpopsure.com>",
5
5
  "license": "MIT",
6
6
  "private": false,
@@ -1,6 +1,6 @@
1
1
  import { render } from '../../../util/testUtils';
2
2
 
3
- import CurrencyInput from '.';
3
+ import { CurrencyInput } from '.';
4
4
 
5
5
  const setup = () => {
6
6
  const utils = render(<CurrencyInput />);
@@ -3,16 +3,18 @@ import { useEffect, useRef, useState } from 'react';
3
3
  import { formatInput, reverseFormatInput } from './format';
4
4
  import { Input, InputProps } from '..';
5
5
 
6
+ export type CurrencyInputProps = {
7
+ value?: number | null | undefined;
8
+ placeholder?: string;
9
+ onChange?: (value: number | null) => void;
10
+ } & Omit<InputProps, 'onChange' | 'value' | 'ref'>
11
+
6
12
  const CurrencyInput = ({
7
13
  value,
8
14
  onChange,
9
15
  type,
10
16
  ...props
11
- }: {
12
- value?: number;
13
- placeholder?: string;
14
- onChange?: (value: number) => void;
15
- } & Omit<InputProps, 'onChange' | 'value' | 'ref'>) => {
17
+ }: CurrencyInputProps) => {
16
18
  const inputRef = useRef<HTMLInputElement | null>(null);
17
19
  const [cursor, setCursor] = useState<number | null>(null);
18
20
  const [shadowValue, setShadowValue] = useState('');
@@ -35,7 +37,9 @@ const CurrencyInput = ({
35
37
  }, [value]);
36
38
 
37
39
  useEffect(() => {
38
- if (shadowValue) {
40
+ if (shadowValue === '' && value) {
41
+ onChange?.(null)
42
+ } else if (shadowValue) {
39
43
  onChange?.(reverseFormatInput(shadowValue));
40
44
  }
41
45
  // eslint-disable-next-line
@@ -69,4 +73,4 @@ const CurrencyInput = ({
69
73
  );
70
74
  };
71
75
 
72
- export default CurrencyInput;
76
+ export { CurrencyInput };
@@ -0,0 +1,48 @@
1
+
2
+ import { useState } from 'react';
3
+ import { CurrencyInput, CurrencyInputProps } from '.';
4
+ import sharedConfig from '../stories/config';
5
+
6
+ const story = {
7
+ title: 'JSX/Inputs',
8
+ component: CurrencyInput,
9
+ argTypes: sharedConfig,
10
+ parameters: {
11
+ componentSubtitle: 'The default input component is used to gather informations from the user.'
12
+ }
13
+ };
14
+
15
+ export const CurrencyInputStory = ({
16
+ onChange,
17
+ className,
18
+ placeholder,
19
+ value,
20
+ label,
21
+ hideLabel,
22
+ prefix,
23
+ error
24
+ }: CurrencyInputProps) => {
25
+ const [newValue, setValue] = useState<number | null>(Number);
26
+
27
+ const handleOnChange = (value: number | null) => {
28
+ setValue(value)
29
+ onChange?.(value);
30
+ }
31
+
32
+ return (
33
+ <CurrencyInput
34
+ onChange={handleOnChange}
35
+ value={newValue}
36
+ className={className}
37
+ placeholder={placeholder}
38
+ label={label}
39
+ hideLabel={hideLabel}
40
+ prefix={prefix}
41
+ error={error}
42
+ />
43
+ );
44
+ };
45
+
46
+ CurrencyInputStory.storyName = 'CurrencyInput';
47
+
48
+ export default story;
@@ -156,13 +156,6 @@ describe('MultiDropzone component', () => {
156
156
  screen.getByText('Please wait while uploading file...')
157
157
  ).toBeInTheDocument();
158
158
  });
159
-
160
- it('should associate input with its label', () => {
161
- const { getByLabelText } = setup({});
162
- const input = getByLabelText('Choose file or drag & drop');
163
-
164
- expect(input).toBeInTheDocument();
165
- });
166
159
  });
167
160
 
168
161
  describe('Uploaded files', () => {
@@ -1,4 +1,4 @@
1
- import { useCallback, useState, useRef } from 'react';
1
+ import { useCallback, useState } from 'react';
2
2
  import classnames from 'classnames';
3
3
  import { useDropzone, FileRejection } from 'react-dropzone';
4
4
  import AnimateHeight from 'react-animate-height';
@@ -88,8 +88,6 @@ const MultiDropzone = ({
88
88
  onDrop,
89
89
  });
90
90
 
91
- const uniqueId = useRef(generateId());
92
-
93
91
  return (
94
92
  <div className={styles.container}>
95
93
  <div
@@ -103,7 +101,6 @@ const MultiDropzone = ({
103
101
  >
104
102
  <input
105
103
  data-testid="ds-drop-input"
106
- id={uniqueId.current}
107
104
  {...getInputProps()}
108
105
  />
109
106
  <UploadCloudIcon
@@ -111,8 +108,7 @@ const MultiDropzone = ({
111
108
  size={isCondensed ? 24 : 64}
112
109
  color={'purple-500'}
113
110
  />
114
- <label
115
- htmlFor={uniqueId.current}
111
+ <div
116
112
  className={`p-h4 mt8 d-block c-pointer ${
117
113
  isCondensed ? styles.textInline : ''
118
114
  }`}
@@ -121,7 +117,7 @@ const MultiDropzone = ({
121
117
  ? textOverrides?.currentlyUploadingText ||
122
118
  'Please wait while uploading file...'
123
119
  : textOverrides?.instructionsText || 'Choose file or drag & drop'}
124
- </label>
120
+ </div>
125
121
  <div className="p-p--small tc-grey-500">
126
122
  {textOverrides?.supportsText || placeholder}
127
123
  </div>
package/src/lib/index.tsx CHANGED
@@ -12,7 +12,7 @@ import {
12
12
  import { DownloadButton } from './components/downloadButton';
13
13
  import { InformationBox } from './components/informationBox';
14
14
  import IbanInput from './components/input/iban';
15
- import CurrencyInput from './components/input/currency';
15
+ import { CurrencyInput } from './components/input/currency';
16
16
  import { Badge } from './components/badge';
17
17
  import { Checkbox } from './components/input/checkbox';
18
18
  import { Radio } from './components/input/radio';
@@ -1,33 +0,0 @@
1
- import { Meta, Preview } from '@storybook/addon-docs/blocks';
2
-
3
- import CurrencyInput from '.';
4
-
5
- <Meta title="JSX/Inputs/Currency Input" />
6
-
7
- # Currency Input
8
-
9
- Currency input is a component built on top of the [Input](?path=/story/jsx-inputs-intro--page) component that give you a better formatting when numerical currency values.
10
-
11
- The following will be done:
12
-
13
- - Adding a Euro sign (€) prefix.
14
- - Formatting thousand separators with a space as user type in.
15
- - Setting decimal reparator as a dot (.)
16
-
17
- <Preview>
18
- <>
19
- <h1 className="p-h1">Currency Input</h1>
20
- <h4 className="p-h4 mt24">Empty</h4>
21
- <CurrencyInput className="wmx5 mt8" />
22
- <h4 className="p-h4 mt24">Filled</h4>
23
- <CurrencyInput className="wmx5 mt8" value={1234567.32} />
24
- <h4 className="p-h4 mt24">With placeholder</h4>
25
- <CurrencyInput className="wmx5 mt8" placeholder="Amount" />
26
- <h4 className="p-h4 mt24">With label</h4>
27
- <CurrencyInput className="wmx5 mt8" label="Amount" placeholder="100" />
28
- <h4 className="p-h4 mt24">With label and no placeholder</h4>
29
- <CurrencyInput className="wmx5 mt8" label="Amount" />
30
- <h4 className="p-h4 mt24">With placeholder and no label</h4>
31
- <CurrencyInput className="wmx5 mt8" hideLabel label="Amount" placeholder="0" />
32
- </>
33
- </Preview>