@darajs/ui-components 0.4.8
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/LICENSE +201 -0
- package/dist/accordion/accordion-item.d.ts +24 -0
- package/dist/accordion/accordion-item.d.ts.map +1 -0
- package/dist/accordion/accordion-item.js +92 -0
- package/dist/accordion/accordion-item.js.map +1 -0
- package/dist/accordion/accordion.d.ts +32 -0
- package/dist/accordion/accordion.d.ts.map +1 -0
- package/dist/accordion/accordion.js +87 -0
- package/dist/accordion/accordion.js.map +1 -0
- package/dist/badge/badge.d.ts +20 -0
- package/dist/badge/badge.d.ts.map +1 -0
- package/dist/badge/badge.js +42 -0
- package/dist/badge/badge.js.map +1 -0
- package/dist/button/button.d.ts +35 -0
- package/dist/button/button.d.ts.map +1 -0
- package/dist/button/button.js +169 -0
- package/dist/button/button.js.map +1 -0
- package/dist/button-bar/button-bar.d.ts +19 -0
- package/dist/button-bar/button-bar.d.ts.map +1 -0
- package/dist/button-bar/button-bar.js +124 -0
- package/dist/button-bar/button-bar.js.map +1 -0
- package/dist/carousel/carousel.d.ts +23 -0
- package/dist/carousel/carousel.d.ts.map +1 -0
- package/dist/carousel/carousel.js +178 -0
- package/dist/carousel/carousel.js.map +1 -0
- package/dist/chat/chat.d.ts +28 -0
- package/dist/chat/chat.d.ts.map +1 -0
- package/dist/chat/chat.js +182 -0
- package/dist/chat/chat.js.map +1 -0
- package/dist/chat/message.d.ts +28 -0
- package/dist/chat/message.d.ts.map +1 -0
- package/dist/chat/message.js +220 -0
- package/dist/chat/message.js.map +1 -0
- package/dist/checkbox/checkbox-group.d.ts +35 -0
- package/dist/checkbox/checkbox-group.d.ts.map +1 -0
- package/dist/checkbox/checkbox-group.js +116 -0
- package/dist/checkbox/checkbox-group.js.map +1 -0
- package/dist/checkbox/checkbox.d.ts +27 -0
- package/dist/checkbox/checkbox.d.ts.map +1 -0
- package/dist/checkbox/checkbox.js +164 -0
- package/dist/checkbox/checkbox.js.map +1 -0
- package/dist/checkbox/tri-state-checkbox.d.ts +22 -0
- package/dist/checkbox/tri-state-checkbox.d.ts.map +1 -0
- package/dist/checkbox/tri-state-checkbox.js +87 -0
- package/dist/checkbox/tri-state-checkbox.js.map +1 -0
- package/dist/code-viewer/code-viewer.d.ts +31 -0
- package/dist/code-viewer/code-viewer.d.ts.map +1 -0
- package/dist/code-viewer/code-viewer.js +115 -0
- package/dist/code-viewer/code-viewer.js.map +1 -0
- package/dist/combo-box/combo-box.d.ts +39 -0
- package/dist/combo-box/combo-box.d.ts.map +1 -0
- package/dist/combo-box/combo-box.js +176 -0
- package/dist/combo-box/combo-box.js.map +1 -0
- package/dist/component-select-list/component-select-list.d.ts +27 -0
- package/dist/component-select-list/component-select-list.d.ts.map +1 -0
- package/dist/component-select-list/component-select-list.js +131 -0
- package/dist/component-select-list/component-select-list.js.map +1 -0
- package/dist/constants.d.ts +33 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +47 -0
- package/dist/constants.js.map +1 -0
- package/dist/context-menu/context-menu.d.ts +24 -0
- package/dist/context-menu/context-menu.d.ts.map +1 -0
- package/dist/context-menu/context-menu.js +116 -0
- package/dist/context-menu/context-menu.js.map +1 -0
- package/dist/datepicker/datepicker-select.d.ts +48 -0
- package/dist/datepicker/datepicker-select.d.ts.map +1 -0
- package/dist/datepicker/datepicker-select.js +219 -0
- package/dist/datepicker/datepicker-select.js.map +1 -0
- package/dist/datepicker/datepicker.d.ts +56 -0
- package/dist/datepicker/datepicker.d.ts.map +1 -0
- package/dist/datepicker/datepicker.js +669 -0
- package/dist/datepicker/datepicker.js.map +1 -0
- package/dist/dropzone/dropzone.d.ts +21 -0
- package/dist/dropzone/dropzone.d.ts.map +1 -0
- package/dist/dropzone/dropzone.js +80 -0
- package/dist/dropzone/dropzone.js.map +1 -0
- package/dist/error-boundary/error-boundary.d.ts +33 -0
- package/dist/error-boundary/error-boundary.d.ts.map +1 -0
- package/dist/error-boundary/error-boundary.js +72 -0
- package/dist/error-boundary/error-boundary.js.map +1 -0
- package/dist/filter/categorical-filter.d.ts +26 -0
- package/dist/filter/categorical-filter.d.ts.map +1 -0
- package/dist/filter/categorical-filter.js +153 -0
- package/dist/filter/categorical-filter.js.map +1 -0
- package/dist/filter/datetime-filter.d.ts +28 -0
- package/dist/filter/datetime-filter.d.ts.map +1 -0
- package/dist/filter/datetime-filter.js +174 -0
- package/dist/filter/datetime-filter.js.map +1 -0
- package/dist/filter/numeric-filter.d.ts +24 -0
- package/dist/filter/numeric-filter.d.ts.map +1 -0
- package/dist/filter/numeric-filter.js +148 -0
- package/dist/filter/numeric-filter.js.map +1 -0
- package/dist/hierarchy-selector/hierarchy-selector.d.ts +31 -0
- package/dist/hierarchy-selector/hierarchy-selector.d.ts.map +1 -0
- package/dist/hierarchy-selector/hierarchy-selector.js +65 -0
- package/dist/hierarchy-selector/hierarchy-selector.js.map +1 -0
- package/dist/hierarchy-selector/node/branch.d.ts +47 -0
- package/dist/hierarchy-selector/node/branch.d.ts.map +1 -0
- package/dist/hierarchy-selector/node/branch.js +132 -0
- package/dist/hierarchy-selector/node/branch.js.map +1 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +55 -0
- package/dist/index.js.map +1 -0
- package/dist/input/input.d.ts +44 -0
- package/dist/input/input.d.ts.map +1 -0
- package/dist/input/input.js +91 -0
- package/dist/input/input.js.map +1 -0
- package/dist/jest-setup.d.ts +18 -0
- package/dist/jest-setup.d.ts.map +1 -0
- package/dist/jest-setup.js +18 -0
- package/dist/jest-setup.js.map +1 -0
- package/dist/markdown/markdown.d.ts +18 -0
- package/dist/markdown/markdown.d.ts.map +1 -0
- package/dist/markdown/markdown.js +356 -0
- package/dist/markdown/markdown.js.map +1 -0
- package/dist/modal/modal.d.ts +37 -0
- package/dist/modal/modal.d.ts.map +1 -0
- package/dist/modal/modal.js +121 -0
- package/dist/modal/modal.js.map +1 -0
- package/dist/multiselect/multiselect.d.ts +31 -0
- package/dist/multiselect/multiselect.d.ts.map +1 -0
- package/dist/multiselect/multiselect.js +231 -0
- package/dist/multiselect/multiselect.js.map +1 -0
- package/dist/numeric-input/input-stepper.d.ts +33 -0
- package/dist/numeric-input/input-stepper.d.ts.map +1 -0
- package/dist/numeric-input/input-stepper.js +54 -0
- package/dist/numeric-input/input-stepper.js.map +1 -0
- package/dist/numeric-input/numeric-input.d.ts +42 -0
- package/dist/numeric-input/numeric-input.d.ts.map +1 -0
- package/dist/numeric-input/numeric-input.js +234 -0
- package/dist/numeric-input/numeric-input.js.map +1 -0
- package/dist/progress-bar/progress-bar.d.ts +23 -0
- package/dist/progress-bar/progress-bar.d.ts.map +1 -0
- package/dist/progress-bar/progress-bar.js +90 -0
- package/dist/progress-bar/progress-bar.js.map +1 -0
- package/dist/radio/radio-group.d.ts +19 -0
- package/dist/radio/radio-group.d.ts.map +1 -0
- package/dist/radio/radio-group.js +160 -0
- package/dist/radio/radio-group.js.map +1 -0
- package/dist/search-bar/search-bar.d.ts +34 -0
- package/dist/search-bar/search-bar.d.ts.map +1 -0
- package/dist/search-bar/search-bar.js +39 -0
- package/dist/search-bar/search-bar.js.map +1 -0
- package/dist/sectioned-list/sectioned-list.d.ts +29 -0
- package/dist/sectioned-list/sectioned-list.d.ts.map +1 -0
- package/dist/sectioned-list/sectioned-list.js +205 -0
- package/dist/sectioned-list/sectioned-list.js.map +1 -0
- package/dist/select/select.d.ts +54 -0
- package/dist/select/select.d.ts.map +1 -0
- package/dist/select/select.js +143 -0
- package/dist/select/select.js.map +1 -0
- package/dist/shared/chevron-button.d.ts +13 -0
- package/dist/shared/chevron-button.d.ts.map +1 -0
- package/dist/shared/chevron-button.js +35 -0
- package/dist/shared/chevron-button.js.map +1 -0
- package/dist/shared/dropdown-list.d.ts +34 -0
- package/dist/shared/dropdown-list.d.ts.map +1 -0
- package/dist/shared/dropdown-list.js +33 -0
- package/dist/shared/dropdown-list.js.map +1 -0
- package/dist/shared/list-item.d.ts +35 -0
- package/dist/shared/list-item.d.ts.map +1 -0
- package/dist/shared/list-item.js +69 -0
- package/dist/shared/list-item.js.map +1 -0
- package/dist/slider/slider-inputs.d.ts +36 -0
- package/dist/slider/slider-inputs.d.ts.map +1 -0
- package/dist/slider/slider-inputs.js +88 -0
- package/dist/slider/slider-inputs.js.map +1 -0
- package/dist/slider/slider.d.ts +53 -0
- package/dist/slider/slider.d.ts.map +1 -0
- package/dist/slider/slider.js +273 -0
- package/dist/slider/slider.js.map +1 -0
- package/dist/spinner/spinner.d.ts +19 -0
- package/dist/spinner/spinner.d.ts.map +1 -0
- package/dist/spinner/spinner.js +144 -0
- package/dist/spinner/spinner.js.map +1 -0
- package/dist/switch/sun-icon.d.ts +3 -0
- package/dist/switch/sun-icon.d.ts.map +1 -0
- package/dist/switch/sun-icon.js +24 -0
- package/dist/switch/sun-icon.js.map +1 -0
- package/dist/switch/switch.d.ts +16 -0
- package/dist/switch/switch.d.ts.map +1 -0
- package/dist/switch/switch.js +92 -0
- package/dist/switch/switch.js.map +1 -0
- package/dist/table/cells/action-cell.d.ts +34 -0
- package/dist/table/cells/action-cell.d.ts.map +1 -0
- package/dist/table/cells/action-cell.js +68 -0
- package/dist/table/cells/action-cell.js.map +1 -0
- package/dist/table/cells/datetime-cell.d.ts +12 -0
- package/dist/table/cells/datetime-cell.d.ts.map +1 -0
- package/dist/table/cells/datetime-cell.js +36 -0
- package/dist/table/cells/datetime-cell.js.map +1 -0
- package/dist/table/cells/edit-cell-utils.d.ts +32 -0
- package/dist/table/cells/edit-cell-utils.d.ts.map +1 -0
- package/dist/table/cells/edit-cell-utils.js +2 -0
- package/dist/table/cells/edit-cell-utils.js.map +1 -0
- package/dist/table/cells/edit-input-cell.d.ts +10 -0
- package/dist/table/cells/edit-input-cell.d.ts.map +1 -0
- package/dist/table/cells/edit-input-cell.js +61 -0
- package/dist/table/cells/edit-input-cell.js.map +1 -0
- package/dist/table/cells/edit-select-cell.d.ts +12 -0
- package/dist/table/cells/edit-select-cell.d.ts.map +1 -0
- package/dist/table/cells/edit-select-cell.js +55 -0
- package/dist/table/cells/edit-select-cell.js.map +1 -0
- package/dist/table/filters.d.ts +46 -0
- package/dist/table/filters.d.ts.map +1 -0
- package/dist/table/filters.js +226 -0
- package/dist/table/filters.js.map +1 -0
- package/dist/table/headers/select-header.d.ts +14 -0
- package/dist/table/headers/select-header.d.ts.map +1 -0
- package/dist/table/headers/select-header.js +41 -0
- package/dist/table/headers/select-header.js.map +1 -0
- package/dist/table/options-menu.d.ts +25 -0
- package/dist/table/options-menu.d.ts.map +1 -0
- package/dist/table/options-menu.js +123 -0
- package/dist/table/options-menu.js.map +1 -0
- package/dist/table/render-row.d.ts +25 -0
- package/dist/table/render-row.d.ts.map +1 -0
- package/dist/table/render-row.js +163 -0
- package/dist/table/render-row.js.map +1 -0
- package/dist/table/table.d.ts +95 -0
- package/dist/table/table.d.ts.map +1 -0
- package/dist/table/table.js +422 -0
- package/dist/table/table.js.map +1 -0
- package/dist/table/types.d.ts +30 -0
- package/dist/table/types.d.ts.map +1 -0
- package/dist/table/types.js +2 -0
- package/dist/table/types.js.map +1 -0
- package/dist/tabs/tabs.d.ts +22 -0
- package/dist/tabs/tabs.d.ts.map +1 -0
- package/dist/tabs/tabs.js +91 -0
- package/dist/tabs/tabs.js.map +1 -0
- package/dist/textarea/textarea.d.ts +47 -0
- package/dist/textarea/textarea.d.ts.map +1 -0
- package/dist/textarea/textarea.js +121 -0
- package/dist/textarea/textarea.js.map +1 -0
- package/dist/tooltip/tooltip.d.ts +48 -0
- package/dist/tooltip/tooltip.d.ts.map +1 -0
- package/dist/tooltip/tooltip.js +116 -0
- package/dist/tooltip/tooltip.js.map +1 -0
- package/dist/types.d.ts +94 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/chevron.d.ts +34 -0
- package/dist/utils/chevron.d.ts.map +1 -0
- package/dist/utils/chevron.js +38 -0
- package/dist/utils/chevron.js.map +1 -0
- package/dist/utils/index.d.ts +22 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +22 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/label.d.ts +3 -0
- package/dist/utils/label.d.ts.map +1 -0
- package/dist/utils/label.js +24 -0
- package/dist/utils/label.js.map +1 -0
- package/dist/utils/list-styles.d.ts +8 -0
- package/dist/utils/list-styles.d.ts.map +1 -0
- package/dist/utils/list-styles.js +43 -0
- package/dist/utils/list-styles.js.map +1 -0
- package/dist/utils/match-width-to-reference.d.ts +24 -0
- package/dist/utils/match-width-to-reference.d.ts.map +1 -0
- package/dist/utils/match-width-to-reference.js +30 -0
- package/dist/utils/match-width-to-reference.js.map +1 -0
- package/dist/utils/syncKbdHighlightIdx.d.ts +23 -0
- package/dist/utils/syncKbdHighlightIdx.d.ts.map +1 -0
- package/dist/utils/syncKbdHighlightIdx.js +41 -0
- package/dist/utils/syncKbdHighlightIdx.js.map +1 -0
- package/dist/utils/use-infinite-loader.d.ts +32 -0
- package/dist/utils/use-infinite-loader.d.ts.map +1 -0
- package/dist/utils/use-infinite-loader.js +119 -0
- package/dist/utils/use-infinite-loader.js.map +1 -0
- package/dist/utils/use-on-click-outside.d.ts +3 -0
- package/dist/utils/use-on-click-outside.d.ts.map +1 -0
- package/dist/utils/use-on-click-outside.js +36 -0
- package/dist/utils/use-on-click-outside.js.map +1 -0
- package/package.json +106 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
+
var t = {};
|
|
3
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
+
t[p] = s[p];
|
|
5
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
+
t[p[i]] = s[p[i]];
|
|
9
|
+
}
|
|
10
|
+
return t;
|
|
11
|
+
};
|
|
12
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
13
|
+
/**
|
|
14
|
+
* Copyright 2023 Impulse Innovations Limited
|
|
15
|
+
*
|
|
16
|
+
*
|
|
17
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
18
|
+
* you may not use this file except in compliance with the License.
|
|
19
|
+
* You may obtain a copy of the License at
|
|
20
|
+
*
|
|
21
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
22
|
+
*
|
|
23
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
24
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
25
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
26
|
+
* See the License for the specific language governing permissions and
|
|
27
|
+
* limitations under the License.
|
|
28
|
+
*/
|
|
29
|
+
import { autoUpdate, flip, shift, useFloating, useInteractions, useRole } from '@floating-ui/react';
|
|
30
|
+
import { useCombobox, useMultipleSelection } from 'downshift';
|
|
31
|
+
import { useCallback, useMemo, useState } from 'react';
|
|
32
|
+
import ReactDOM from 'react-dom';
|
|
33
|
+
import styled from '@darajs/styled-components';
|
|
34
|
+
import { Cross } from '@darajs/ui-icons';
|
|
35
|
+
import ChevronButton from '../shared/chevron-button';
|
|
36
|
+
import DropdownList from '../shared/dropdown-list';
|
|
37
|
+
import Tooltip from '../tooltip/tooltip';
|
|
38
|
+
import { matchWidthToReference } from '../utils';
|
|
39
|
+
import { syncKbdHighlightIdx } from '../utils/syncKbdHighlightIdx';
|
|
40
|
+
const { stateChangeTypes } = useCombobox;
|
|
41
|
+
const tagHeight = 2;
|
|
42
|
+
const tagTopMargin = 0.5;
|
|
43
|
+
const Wrapper = styled.div `
|
|
44
|
+
display: inline-flex;
|
|
45
|
+
${(props) => {
|
|
46
|
+
if (props.isDisabled) {
|
|
47
|
+
return `
|
|
48
|
+
cursor: not-allowed;
|
|
49
|
+
`;
|
|
50
|
+
}
|
|
51
|
+
}}
|
|
52
|
+
|
|
53
|
+
width: 100%;
|
|
54
|
+
max-width: ${(props) => props.maxWidth};
|
|
55
|
+
max-height: ${(props) => props.maxRows * (tagHeight + tagTopMargin)}rem;
|
|
56
|
+
|
|
57
|
+
border-radius: ${(props) => (props.isOpen ? '0.25rem 0.25rem 0rem 0rem' : '0.25rem')};
|
|
58
|
+
`;
|
|
59
|
+
const InputWrapper = styled.div `
|
|
60
|
+
display: flex;
|
|
61
|
+
flex: 1 1 auto;
|
|
62
|
+
align-items: center;
|
|
63
|
+
justify-content: space-between;
|
|
64
|
+
|
|
65
|
+
width: 100%;
|
|
66
|
+
min-width: 10rem;
|
|
67
|
+
min-height: 2.5rem;
|
|
68
|
+
margin-right: 0.25rem;
|
|
69
|
+
padding: 0.25rem 0.5rem 0.25rem 1rem;
|
|
70
|
+
|
|
71
|
+
color: ${(props) => (props.isDisabled ? props.theme.colors.grey2 : props.theme.colors.text)};
|
|
72
|
+
|
|
73
|
+
background-color: ${(props) => props.theme.colors.grey1};
|
|
74
|
+
border: none;
|
|
75
|
+
border-radius: ${(props) => (props.isOpen ? '0.25rem 0.25rem 0rem 0rem' : '0.25rem')};
|
|
76
|
+
|
|
77
|
+
:hover {
|
|
78
|
+
background-color: ${(props) => (props.isDisabled ? props.theme.colors.grey1 : props.theme.colors.grey2)};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
svg {
|
|
82
|
+
height: 0.8rem;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
${(props) => {
|
|
86
|
+
if (props.isDisabled) {
|
|
87
|
+
return `
|
|
88
|
+
border: 1px solid ${props.theme.colors.grey1};
|
|
89
|
+
|
|
90
|
+
svg {
|
|
91
|
+
color: ${props.theme.colors.grey2};
|
|
92
|
+
cursor: not-allowed;
|
|
93
|
+
}
|
|
94
|
+
`;
|
|
95
|
+
}
|
|
96
|
+
if (props.isErrored) {
|
|
97
|
+
return `border: 1px solid ${props.theme.colors.error};`;
|
|
98
|
+
}
|
|
99
|
+
return `
|
|
100
|
+
border: 1px solid ${props.isOpen ? props.theme.colors.grey3 : props.theme.colors.grey1};
|
|
101
|
+
:hover {
|
|
102
|
+
border: 1px solid ${props.theme.colors.grey3};
|
|
103
|
+
|
|
104
|
+
}
|
|
105
|
+
`;
|
|
106
|
+
}}
|
|
107
|
+
`;
|
|
108
|
+
const Input = styled.input `
|
|
109
|
+
overflow: hidden;
|
|
110
|
+
flex: 1 1 auto;
|
|
111
|
+
|
|
112
|
+
margin-right: 0.5rem;
|
|
113
|
+
padding: 0;
|
|
114
|
+
|
|
115
|
+
font-size: ${(props) => (props.size ? `${props.size}rem` : props.theme.font.size)};
|
|
116
|
+
font-weight: 300;
|
|
117
|
+
color: ${(props) => props.theme.colors.grey6};
|
|
118
|
+
text-align: left;
|
|
119
|
+
text-overflow: ellipsis;
|
|
120
|
+
white-space: nowrap;
|
|
121
|
+
|
|
122
|
+
background-color: transparent;
|
|
123
|
+
border: none;
|
|
124
|
+
outline: 0;
|
|
125
|
+
|
|
126
|
+
:disabled {
|
|
127
|
+
cursor: not-allowed;
|
|
128
|
+
}
|
|
129
|
+
`;
|
|
130
|
+
const TagWrapper = styled.div `
|
|
131
|
+
overflow: auto;
|
|
132
|
+
display: flex;
|
|
133
|
+
flex-wrap: wrap;
|
|
134
|
+
gap: 0.5rem;
|
|
135
|
+
align-items: center;
|
|
136
|
+
|
|
137
|
+
width: 100%;
|
|
138
|
+
height: 100%;
|
|
139
|
+
max-height: ${(props) => props.maxRows * (tagHeight + tagTopMargin) - 0.25}rem;
|
|
140
|
+
`;
|
|
141
|
+
const Tag = styled.span `
|
|
142
|
+
overflow: hidden;
|
|
143
|
+
display: flex;
|
|
144
|
+
align-items: center;
|
|
145
|
+
|
|
146
|
+
height: ${tagHeight}rem;
|
|
147
|
+
padding: 0 0.75rem;
|
|
148
|
+
|
|
149
|
+
font-size: 0.875rem;
|
|
150
|
+
color: ${(props) => (props.disabled ? props.theme.colors.grey3 : props.theme.colors.text)};
|
|
151
|
+
|
|
152
|
+
background-color: ${(props) => (props.disabled ? props.theme.colors.grey3 : props.theme.colors.blue3)};
|
|
153
|
+
border: 1px solid ${(props) => props.theme.colors.primary};
|
|
154
|
+
border-radius: 1rem;
|
|
155
|
+
|
|
156
|
+
svg {
|
|
157
|
+
width: 0.85rem;
|
|
158
|
+
height: 0.85rem;
|
|
159
|
+
margin-left: 0.25rem;
|
|
160
|
+
color: ${(props) => (props.disabled ? props.theme.colors.grey3 : props.theme.colors.text)};
|
|
161
|
+
|
|
162
|
+
:hover {
|
|
163
|
+
color: ${(props) => (props.disabled ? props.theme.colors.grey3 : props.theme.colors.primary)};
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
`;
|
|
167
|
+
const TagText = styled.span `
|
|
168
|
+
overflow: hidden;
|
|
169
|
+
text-overflow: ellipsis;
|
|
170
|
+
white-space: nowrap;
|
|
171
|
+
`;
|
|
172
|
+
/**
|
|
173
|
+
* A multiselect select combobox component, accepts a list of items to select from and an onSelect handler to listen for
|
|
174
|
+
* changes. Renders currently selected items as list of tags which have a cross for removing them. Component will expand
|
|
175
|
+
* vertically to fit all selected items.
|
|
176
|
+
*
|
|
177
|
+
* @param {MultiSelectProps} props - the component props
|
|
178
|
+
*/
|
|
179
|
+
function MultiSelect(_a) {
|
|
180
|
+
var _b, _c;
|
|
181
|
+
var { maxWidth = '100%', maxRows = 3 } = _a, props = __rest(_a, ["maxWidth", "maxRows"]);
|
|
182
|
+
const [inputValue, setInputValue] = useState('');
|
|
183
|
+
const { getSelectedItemProps, getDropdownProps, addSelectedItem, removeSelectedItem, selectedItems } = useMultipleSelection(Object.assign({ initialSelectedItems: (_b = props.initialValue) !== null && _b !== void 0 ? _b : [], onSelectedItemsChange: (changes) => {
|
|
184
|
+
if (props.onSelect) {
|
|
185
|
+
props.onSelect(changes.selectedItems);
|
|
186
|
+
}
|
|
187
|
+
} }, ('selectedItems' in props && { selectedItems: (_c = props.selectedItems) !== null && _c !== void 0 ? _c : [] })));
|
|
188
|
+
const onTermChange = useCallback((term) => {
|
|
189
|
+
setInputValue(term);
|
|
190
|
+
if (props.onTermChange) {
|
|
191
|
+
props.onTermChange(term);
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
195
|
+
[props.onTermChange]);
|
|
196
|
+
// If there is a term change function passed in then don't filter locally
|
|
197
|
+
const filteredItems = useMemo(() => props.onTermChange ?
|
|
198
|
+
props.items
|
|
199
|
+
: props.items.filter((item) => { var _a; return !selectedItems.includes(item) && ((_a = item.label) === null || _a === void 0 ? void 0 : _a.toLowerCase().includes(inputValue.toLowerCase())); }), [props.onTermChange, props.items, selectedItems, inputValue]);
|
|
200
|
+
const [kbdHighlightIdx, setKbdHighlightIdx] = useState();
|
|
201
|
+
const { isOpen, getMenuProps, getInputProps, getItemProps, getToggleButtonProps } = useCombobox(Object.assign(Object.assign({ defaultHighlightedIndex: -1, initialIsOpen: props.initialIsOpen, inputValue, itemToString: (item) => (item === null || item === void 0 ? void 0 : item.label) || '', items: filteredItems, onStateChange: ({ inputValue: internalInputVal, selectedItem, type }) => {
|
|
202
|
+
if (type === stateChangeTypes.InputChange) {
|
|
203
|
+
onTermChange(internalInputVal);
|
|
204
|
+
}
|
|
205
|
+
if ([stateChangeTypes.InputKeyDownEnter, stateChangeTypes.ItemClick, stateChangeTypes.InputBlur].includes(type)) {
|
|
206
|
+
if (selectedItem) {
|
|
207
|
+
onTermChange('');
|
|
208
|
+
addSelectedItem(selectedItem);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
} }, syncKbdHighlightIdx(setKbdHighlightIdx)), { selectedItem: null, stateReducer: (state, { changes, type }) => {
|
|
212
|
+
if (type === stateChangeTypes.ItemClick || type === stateChangeTypes.InputKeyDownEnter) {
|
|
213
|
+
return Object.assign(Object.assign({}, changes), { isOpen: true });
|
|
214
|
+
}
|
|
215
|
+
return changes;
|
|
216
|
+
} }));
|
|
217
|
+
const { refs, floatingStyles, context } = useFloating({
|
|
218
|
+
open: isOpen,
|
|
219
|
+
middleware: [flip(), shift(), matchWidthToReference()],
|
|
220
|
+
whileElementsMounted: isOpen ? autoUpdate : undefined,
|
|
221
|
+
});
|
|
222
|
+
const role = useRole(context, { role: 'listbox' });
|
|
223
|
+
const { getReferenceProps, getFloatingProps } = useInteractions([role]);
|
|
224
|
+
return (_jsxs(Wrapper, { className: props.className, isDisabled: props.disabled, isOpen: isOpen, maxRows: maxRows, maxWidth: maxWidth, style: props.style, children: [_jsx(Tooltip, { content: props.errorMsg, disabled: !props.errorMsg, styling: "error", children: _jsxs(InputWrapper, { isDisabled: props.disabled, isOpen: isOpen, ref: refs.setReference, children: [_jsxs(TagWrapper, { maxRows: maxRows, children: [selectedItems.map((selectedItem, index) => (_jsxs(Tag, Object.assign({ disabled: props.disabled }, getSelectedItemProps({ index, selectedItem }), { children: [_jsx(TagText, { children: selectedItem.label }), _jsx(Cross, { asButton: true, onClick: (e) => {
|
|
225
|
+
// See https://github.com/downshift-js/downshift/issues/1188
|
|
226
|
+
e.stopPropagation();
|
|
227
|
+
return removeSelectedItem(selectedItem);
|
|
228
|
+
} })] }), selectedItem.value))), _jsx(Input, Object.assign({}, getInputProps(getDropdownProps({ preventKeyAction: isOpen })), getReferenceProps(), { disabled: props.disabled, placeholder: props.placeholder, size: props.size, style: { flex: '1 1 5ch' } }))] }), _jsx(ChevronButton, { disabled: props.disabled, isOpen: isOpen, getToggleButtonProps: getToggleButtonProps })] }) }), ReactDOM.createPortal(_jsx(DropdownList, { items: filteredItems, getItemProps: getItemProps, getFloatingProps: getFloatingProps, style: floatingStyles, isOpen: isOpen, getMenuProps: getMenuProps, size: props.size, ref: refs.setFloating, kbdHighlightIdx: kbdHighlightIdx }), document.body)] }));
|
|
229
|
+
}
|
|
230
|
+
export default MultiSelect;
|
|
231
|
+
//# sourceMappingURL=multiselect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multiselect.js","sourceRoot":"","sources":["../../src/multiselect/multiselect.tsx"],"names":[],"mappings":";;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AACpG,OAAO,EAAmC,WAAW,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,OAAO,MAAM,MAAM,2BAA2B,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,OAAO,aAAa,MAAM,0BAA0B,CAAC;AACrD,OAAO,YAAY,MAAM,yBAAyB,CAAC;AACnD,OAAO,OAAO,MAAM,oBAAoB,CAAC;AAEzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAEnE,MAAM,EAAE,gBAAgB,EAAE,GAAG,WAAW,CAAC;AASzC,MAAM,SAAS,GAAG,CAAC,CAAC;AACpB,MAAM,YAAY,GAAG,GAAG,CAAC;AAEzB,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAc;;MAElC,CAAC,KAAK,EAAE,EAAE;IACR,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACnB,OAAO;;aAEN,CAAC;IACN,CAAC;AACL,CAAC;;;iBAGY,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ;kBACxB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,SAAS,GAAG,YAAY,CAAC;;qBAElD,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,SAAS,CAAC;CACvF,CAAC;AAQF,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAmB;;;;;;;;;;;;aAYrC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;;wBAEvE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK;;qBAEtC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,SAAS,CAAC;;;4BAG5D,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;;;;;;;MAOzG,CAAC,KAAK,EAAE,EAAE;IACR,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACnB,OAAO;oCACiB,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK;;;6BAG/B,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK;;;aAGxC,CAAC;IACN,CAAC;IAED,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QAClB,OAAO,qBAAqB,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC;IAC5D,CAAC;IAED,OAAO;gCACiB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK;;oCAE9D,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK;;;SAGnD,CAAC;AACN,CAAC;CACJ,CAAC;AAMF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAY;;;;;;;iBAOrB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;;aAExE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK;;;;;;;;;;;;CAY/C,CAAC;AAMF,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAiB;;;;;;;;;kBAS5B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,SAAS,GAAG,YAAY,CAAC,GAAG,IAAI;CAC7E,CAAC;AAMF,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAU;;;;;cAKnB,SAAS;;;;aAIV,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;;wBAErE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;wBACjF,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO;;;;;;;iBAO5C,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;;;qBAG5E,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC;;;CAGvG,CAAC;AAEF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAA;;;;CAI1B,CAAC;AAuBF;;;;;;GAMG;AACH,SAAS,WAAW,CAAC,EAA8D;;QAA9D,EAAE,QAAQ,GAAG,MAAM,EAAE,OAAO,GAAG,CAAC,OAA8B,EAAzB,KAAK,cAA1C,uBAA4C,CAAF;IAC3D,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEjD,MAAM,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,aAAa,EAAE,GAChG,oBAAoB,iBAChB,oBAAoB,EAAE,MAAA,KAAK,CAAC,YAAY,mCAAI,EAAE,EAC9C,qBAAqB,EAAE,CAAC,OAA8C,EAAE,EAAE;YACtE,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACjB,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC1C,CAAC;QACL,CAAC,IAEE,CAAC,eAAe,IAAI,KAAK,IAAI,EAAE,aAAa,EAAE,MAAA,KAAK,CAAC,aAAa,mCAAI,EAAE,EAAE,CAAC,EAC/E,CAAC;IAEP,MAAM,YAAY,GAAG,WAAW,CAC5B,CAAC,IAAY,EAAE,EAAE;QACb,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACrB,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACL,CAAC;IACD,uDAAuD;IACvD,CAAC,KAAK,CAAC,YAAY,CAAC,CACvB,CAAC;IAEF,yEAAyE;IACzE,MAAM,aAAa,GAAG,OAAO,CACzB,GAAG,EAAE,CACD,KAAK,CAAC,YAAY,CAAC,CAAC;QAChB,KAAK,CAAC,KAAK;QACf,CAAC,CAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CACd,CAAC,IAAI,EAAE,EAAE,WACL,OAAA,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAI,MAAA,IAAI,CAAC,KAAK,0CAAE,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAA,CAAA,EAAA,CACpG,EACT,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,KAAK,EAAE,aAAa,EAAE,UAAU,CAAC,CAC/D,CAAC;IAEF,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,EAAsB,CAAC;IAC7E,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,oBAAoB,EAAE,GAAG,WAAW,+BAC3F,uBAAuB,EAAE,CAAC,CAAC,EAC3B,aAAa,EAAE,KAAK,CAAC,aAAa,EAClC,UAAU,EACV,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,KAAI,EAAE,EACzC,KAAK,EAAE,aAAa,EACpB,aAAa,EAAE,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,YAAY,EAAE,IAAI,EAAO,EAAE,EAAE;YACzE,IAAI,IAAI,KAAK,gBAAgB,CAAC,WAAW,EAAE,CAAC;gBACxC,YAAY,CAAC,gBAAgB,CAAC,CAAC;YACnC,CAAC;YACD,IACI,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,SAAS,EAAE,gBAAgB,CAAC,SAAS,CAAC,CAAC,QAAQ,CACjG,IAAI,CACP,EACH,CAAC;gBACC,IAAI,YAAY,EAAE,CAAC;oBACf,YAAY,CAAC,EAAE,CAAC,CAAC;oBACjB,eAAe,CAAC,YAAY,CAAC,CAAC;gBAClC,CAAC;YACL,CAAC;QACL,CAAC,IACE,mBAAmB,CAAC,kBAAkB,CAAC,KAC1C,YAAY,EAAE,IAAI,EAClB,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;YACvC,IAAI,IAAI,KAAK,gBAAgB,CAAC,SAAS,IAAI,IAAI,KAAK,gBAAgB,CAAC,iBAAiB,EAAE,CAAC;gBACrF,uCAAY,OAAO,KAAE,MAAM,EAAE,IAAI,IAAG;YACxC,CAAC;YACD,OAAO,OAAO,CAAC;QACnB,CAAC,IACH,CAAC;IAEH,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,WAAW,CAAc;QAC/D,IAAI,EAAE,MAAM;QACZ,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,qBAAqB,EAAE,CAAC;QACtD,oBAAoB,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;KACxD,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;IACnD,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,GAAG,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAExE,OAAO,CACH,MAAC,OAAO,IACJ,SAAS,EAAE,KAAK,CAAC,SAAS,EAC1B,UAAU,EAAE,KAAK,CAAC,QAAQ,EAC1B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,KAAK,CAAC,KAAK,aAElB,KAAC,OAAO,IAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAC,OAAO,YACxE,MAAC,YAAY,IAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,YAAY,aAC5E,MAAC,UAAU,IAAC,OAAO,EAAE,OAAO,aACvB,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE,CAAC,CACxC,MAAC,GAAG,kBACA,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAEpB,oBAAoB,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,eAEjD,KAAC,OAAO,cAAE,YAAY,CAAC,KAAK,GAAW,EACvC,KAAC,KAAK,IACF,QAAQ,QACR,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gDACX,4DAA4D;gDAC5D,CAAC,CAAC,eAAe,EAAE,CAAC;gDACpB,OAAO,kBAAkB,CAAC,YAAY,CAAC,CAAC;4CAC5C,CAAC,GACH,MAXG,YAAY,CAAC,KAAK,CAYrB,CACT,CAAC,EACF,KAAC,KAAK,oBACE,aAAa,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC,CAAC,EAC7D,iBAAiB,EAAE,IACvB,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAC5B,IACO,EACb,KAAC,aAAa,IACV,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,MAAM,EAAE,MAAM,EACd,oBAAoB,EAAE,oBAAoB,GAC5C,IACS,GACT,EACT,QAAQ,CAAC,YAAY,CAClB,KAAC,YAAY,IACT,KAAK,EAAE,aAAa,EACpB,YAAY,EAAE,YAAY,EAC1B,gBAAgB,EAAE,gBAAgB,EAClC,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,KAAK,CAAC,IAAI,EAChB,GAAG,EAAE,IAAI,CAAC,WAAW,EACrB,eAAe,EAAE,eAAe,GAClC,EACF,QAAQ,CAAC,IAAI,CAChB,IACK,CACb,CAAC;AACN,CAAC;AAED,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2023 Impulse Innovations Limited
|
|
3
|
+
*
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
import { FunctionComponent } from 'react';
|
|
18
|
+
interface InputStepperProps {
|
|
19
|
+
/** property that disables the stepper */
|
|
20
|
+
disabled: boolean;
|
|
21
|
+
/** callback that determines the logic for increasing or decreasing input value */
|
|
22
|
+
step: (value: number) => void;
|
|
23
|
+
/** Optional property to set how many steps the stepper should take */
|
|
24
|
+
stepSkip?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* A simple stepper component that can be added to an input component to increase or decrease its value
|
|
28
|
+
*
|
|
29
|
+
* @param props the component props
|
|
30
|
+
*/
|
|
31
|
+
declare const InputStepper: FunctionComponent<InputStepperProps>;
|
|
32
|
+
export default InputStepper;
|
|
33
|
+
//# sourceMappingURL=input-stepper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-stepper.d.ts","sourceRoot":"","sources":["../../src/numeric-input/input-stepper.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAkD1C,UAAU,iBAAiB;IACvB,yCAAyC;IACzC,QAAQ,EAAE,OAAO,CAAC;IAClB,kFAAkF;IAClF,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AAEH,QAAA,MAAM,YAAY,EAAE,iBAAiB,CAAC,iBAAiB,CAgBtD,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import styled from '@darajs/styled-components';
|
|
3
|
+
import { ChevronDown, ChevronUp } from '@darajs/ui-icons';
|
|
4
|
+
import Button from '../button/button';
|
|
5
|
+
const StepperWrapper = styled.div `
|
|
6
|
+
cursor: ${(props) => (props.disabled ? 'not-allowed' : 'pointer')};
|
|
7
|
+
|
|
8
|
+
display: flex;
|
|
9
|
+
flex-direction: column;
|
|
10
|
+
justify-content: space-around;
|
|
11
|
+
|
|
12
|
+
box-sizing: border-box;
|
|
13
|
+
padding: 0.25rem 0;
|
|
14
|
+
|
|
15
|
+
border-radius: 0 0.25rem 0.25rem 0;
|
|
16
|
+
`;
|
|
17
|
+
const StepperButton = styled(Button) `
|
|
18
|
+
min-width: 0.75rem;
|
|
19
|
+
height: max-content;
|
|
20
|
+
padding: 0;
|
|
21
|
+
background-color: transparent !important;
|
|
22
|
+
|
|
23
|
+
svg {
|
|
24
|
+
cursor: ${(props) => (props.disabled ? 'not-allowed' : 'pointer')};
|
|
25
|
+
width: 0.75rem;
|
|
26
|
+
height: 0.75rem;
|
|
27
|
+
color: ${(props) => (props.disabled ? props.theme.colors.grey3 : props.theme.colors.grey4)};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
:hover:not(:disabled) {
|
|
31
|
+
svg {
|
|
32
|
+
color: ${(props) => props.theme.colors.grey5};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
:active:not(:disabled) {
|
|
37
|
+
svg {
|
|
38
|
+
transform: scale(0.75);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
`;
|
|
42
|
+
/**
|
|
43
|
+
* A simple stepper component that can be added to an input component to increase or decrease its value
|
|
44
|
+
*
|
|
45
|
+
* @param props the component props
|
|
46
|
+
*/
|
|
47
|
+
const InputStepper = ({ disabled, step, stepSkip }) => {
|
|
48
|
+
const amountToStep = Math.abs(stepSkip !== null && stepSkip !== void 0 ? stepSkip : 1);
|
|
49
|
+
const stepUp = () => step(amountToStep);
|
|
50
|
+
const stepDown = () => step(amountToStep * -1);
|
|
51
|
+
return (_jsxs(StepperWrapper, { disabled: disabled, children: [_jsx(StepperButton, { disabled: disabled, onClick: stepUp, styling: "ghost", tabIndex: -1, children: _jsx(ChevronUp, {}) }), _jsx(StepperButton, { disabled: disabled, onClick: stepDown, styling: "ghost", tabIndex: -1, children: _jsx(ChevronDown, {}) })] }));
|
|
52
|
+
};
|
|
53
|
+
export default InputStepper;
|
|
54
|
+
//# sourceMappingURL=input-stepper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-stepper.js","sourceRoot":"","sources":["../../src/numeric-input/input-stepper.tsx"],"names":[],"mappings":";AAkBA,OAAO,MAAM,MAAM,2BAA2B,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,MAAM,MAAM,kBAAkB,CAAC;AAMtC,MAAM,cAAc,GAAG,MAAM,CAAC,GAAG,CAAqB;cACxC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;;;;;;;;;;CAUpE,CAAC;AAEF,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;;;;;;;kBAOlB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;;;iBAGxD,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;;;;;qBAK7E,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK;;;;;;;;;CASvD,CAAC;AAWF;;;;GAIG;AAEH,MAAM,YAAY,GAAyC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;IACxF,MAAM,YAAY,GAAW,IAAI,CAAC,GAAG,CAAC,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,CAAC,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,GAAS,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,GAAS,EAAE,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;IAErD,OAAO,CACH,MAAC,cAAc,IAAC,QAAQ,EAAE,QAAQ,aAC9B,KAAC,aAAa,IAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAE,CAAC,CAAC,YAC5E,KAAC,SAAS,KAAG,GACD,EAEhB,KAAC,aAAa,IAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAE,CAAC,CAAC,YAC9E,KAAC,WAAW,KAAG,GACH,IACH,CACpB,CAAC;AACN,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2023 Impulse Innovations Limited
|
|
3
|
+
*
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
import * as React from 'react';
|
|
18
|
+
import { InteractiveComponentProps } from '../types';
|
|
19
|
+
export interface NumericInputProps extends InteractiveComponentProps<number>, Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'value' | 'initialValue'> {
|
|
20
|
+
/** An optional parameter to restrict the field to just integers */
|
|
21
|
+
integerOnly?: boolean;
|
|
22
|
+
/** An optional property to set the maximum accepted value */
|
|
23
|
+
maxValue?: number;
|
|
24
|
+
/** An optional property to set the minimum accepted value */
|
|
25
|
+
minValue?: number;
|
|
26
|
+
/** An optional onChange handler for listening to changes in the input */
|
|
27
|
+
onChange?: (value: number, e?: React.SyntheticEvent<HTMLInputElement>) => void | Promise<void>;
|
|
28
|
+
/** An optional event listener for complete events (enter presses) */
|
|
29
|
+
onComplete?: () => void | Promise<void>;
|
|
30
|
+
/** An optional property to set how many steps the stepper should take */
|
|
31
|
+
stepSkip?: number;
|
|
32
|
+
/** An optional property to show input stepper control */
|
|
33
|
+
stepper?: boolean;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* NumericInput is a wrapper around the input component that restricts the value to be numeric, either float or integer.
|
|
37
|
+
*
|
|
38
|
+
* @param props the component props
|
|
39
|
+
*/
|
|
40
|
+
declare const NumericInput: React.ForwardRefExoticComponent<NumericInputProps & React.RefAttributes<HTMLInputElement>>;
|
|
41
|
+
export default NumericInput;
|
|
42
|
+
//# sourceMappingURL=numeric-input.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numeric-input.d.ts","sourceRoot":"","sources":["../../src/numeric-input/numeric-input.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAwHrD,MAAM,WAAW,iBACb,SAAQ,yBAAyB,CAAC,MAAM,CAAC,EAErC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,UAAU,GAAG,OAAO,GAAG,cAAc,CAAC;IAC5F,mEAAmE;IACnE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,gBAAgB,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/F,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;GAIG;AACH,QAAA,MAAM,YAAY,4FAwHjB,CAAC;AAGF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
+
var t = {};
|
|
3
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
+
t[p] = s[p];
|
|
5
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
+
t[p[i]] = s[p[i]];
|
|
9
|
+
}
|
|
10
|
+
return t;
|
|
11
|
+
};
|
|
12
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
13
|
+
/**
|
|
14
|
+
* Copyright 2023 Impulse Innovations Limited
|
|
15
|
+
*
|
|
16
|
+
*
|
|
17
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
18
|
+
* you may not use this file except in compliance with the License.
|
|
19
|
+
* You may obtain a copy of the License at
|
|
20
|
+
*
|
|
21
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
22
|
+
*
|
|
23
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
24
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
25
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
26
|
+
* See the License for the specific language governing permissions and
|
|
27
|
+
* limitations under the License.
|
|
28
|
+
*/
|
|
29
|
+
import * as React from 'react';
|
|
30
|
+
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
31
|
+
import styled from '@darajs/styled-components';
|
|
32
|
+
import { CONTROL_KEYS, Key } from '../constants';
|
|
33
|
+
import Input, { ErrorMessage } from '../input/input';
|
|
34
|
+
import InputStepper from './input-stepper';
|
|
35
|
+
const InputWrapper = styled.div `
|
|
36
|
+
display: flex;
|
|
37
|
+
flex-direction: row;
|
|
38
|
+
|
|
39
|
+
width: 22ch;
|
|
40
|
+
height: 2.5rem;
|
|
41
|
+
padding-right: 0.5rem;
|
|
42
|
+
|
|
43
|
+
background-color: ${(props) => props.theme.colors.grey1};
|
|
44
|
+
border: 1px solid ${(props) => (props.errorMsg ? props.theme.colors.error : props.theme.colors.grey1)};
|
|
45
|
+
border-radius: 0.25rem;
|
|
46
|
+
|
|
47
|
+
input {
|
|
48
|
+
height: calc(2.5rem - 2px);
|
|
49
|
+
border: none;
|
|
50
|
+
border-radius: 0.25rem;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
div {
|
|
54
|
+
border: none;
|
|
55
|
+
border-radius: 0.25rem;
|
|
56
|
+
|
|
57
|
+
div {
|
|
58
|
+
border: none;
|
|
59
|
+
border-radius: 0.25rem;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
:hover {
|
|
64
|
+
background-color: ${(props) => (props.disabled ? props.theme.colors.grey1 : props.theme.colors.grey2)};
|
|
65
|
+
/* stylelint-disable -- fails to parse the statement */
|
|
66
|
+
border: 1px solid
|
|
67
|
+
${(props) => {
|
|
68
|
+
if (props.disabled) {
|
|
69
|
+
return props.theme.colors.grey1;
|
|
70
|
+
}
|
|
71
|
+
if (props.errorMsg) {
|
|
72
|
+
return props.theme.colors.error;
|
|
73
|
+
}
|
|
74
|
+
return props.theme.colors.grey2;
|
|
75
|
+
}};
|
|
76
|
+
/* stylelint-enable */
|
|
77
|
+
|
|
78
|
+
input {
|
|
79
|
+
background-color: ${(props) => (props.disabled ? props.theme.colors.grey1 : props.theme.colors.grey2)};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
div {
|
|
83
|
+
background-color: ${(props) => (props.disabled ? props.theme.colors.grey1 : props.theme.colors.grey2)};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
:focus-within:not(:disabled) {
|
|
88
|
+
border: 1px solid ${(props) => (props.errorMsg ? props.theme.colors.error : props.theme.colors.grey3)};
|
|
89
|
+
|
|
90
|
+
input {
|
|
91
|
+
border: none;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/* Fix: Overrides the 22ch default width of the nested regular input */
|
|
96
|
+
> div:first-child {
|
|
97
|
+
width: 100%;
|
|
98
|
+
height: auto;
|
|
99
|
+
}
|
|
100
|
+
`;
|
|
101
|
+
/**
|
|
102
|
+
* A numeric characters only filter for the input component, can be applied to create a numeric input that prevents
|
|
103
|
+
* invalid entries rather than just erroring them
|
|
104
|
+
*
|
|
105
|
+
* @param integerOnly whether to limit the input to only accept integers
|
|
106
|
+
*/
|
|
107
|
+
const numericFilter = (integerOnly) => (e) => {
|
|
108
|
+
// Check for numbers
|
|
109
|
+
if (parseInt(e.key) || parseInt(e.key) === 0) {
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
// Check control keys
|
|
113
|
+
if (CONTROL_KEYS.includes(e.key)) {
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
const target = e.target;
|
|
117
|
+
// Check for decimal point and make sure there is only one
|
|
118
|
+
if (!integerOnly && e.key === Key.PERIOD && !target.value.includes(Key.PERIOD)) {
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
// Check for minus and make sure it's at the start
|
|
122
|
+
if (e.key === Key.MINUS && !e.shiftKey && target.selectionStart === 0 && !target.value.includes(Key.MINUS)) {
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
return false;
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* A helper function to get the initial value of the input, either from the value or the initialValue props
|
|
129
|
+
*
|
|
130
|
+
* @param value the value prop
|
|
131
|
+
* @param initialValue the initialValue prop
|
|
132
|
+
* @returns the initial value of the numeric input
|
|
133
|
+
*/
|
|
134
|
+
const getInitialValue = (value, initialValue) => {
|
|
135
|
+
if (Number.isFinite(value)) {
|
|
136
|
+
return String(value);
|
|
137
|
+
}
|
|
138
|
+
if (Number.isFinite(initialValue)) {
|
|
139
|
+
return String(initialValue);
|
|
140
|
+
}
|
|
141
|
+
return '';
|
|
142
|
+
};
|
|
143
|
+
/**
|
|
144
|
+
* NumericInput is a wrapper around the input component that restricts the value to be numeric, either float or integer.
|
|
145
|
+
*
|
|
146
|
+
* @param props the component props
|
|
147
|
+
*/
|
|
148
|
+
const NumericInput = React.forwardRef((_a, ref) => {
|
|
149
|
+
var { value, onChange, initialValue } = _a, props = __rest(_a, ["value", "onChange", "initialValue"]);
|
|
150
|
+
const keydownFilter = useMemo(() => numericFilter(props.integerOnly), [props.integerOnly]);
|
|
151
|
+
const [input, setInput] = useState(getInitialValue(value, initialValue));
|
|
152
|
+
const step = (v) => {
|
|
153
|
+
if (!input || input === '-') {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const isFloat = input.includes('.');
|
|
157
|
+
const parsedValue = isFloat ? parseFloat(input) : parseInt(input);
|
|
158
|
+
let nextValueNumber = parsedValue + v;
|
|
159
|
+
let nextValueStr = String(nextValueNumber);
|
|
160
|
+
if (isFloat) {
|
|
161
|
+
const decimals = input.split('.')[1];
|
|
162
|
+
if (decimals) {
|
|
163
|
+
nextValueStr = (parsedValue + v / Math.pow(10, decimals.length)).toFixed(decimals.length);
|
|
164
|
+
nextValueNumber = parseFloat(nextValueStr);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// controlled
|
|
168
|
+
if (value !== undefined) {
|
|
169
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(nextValueNumber, {
|
|
170
|
+
target: {
|
|
171
|
+
value: nextValueStr,
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
// uncontrolled
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
setInput(nextValueStr);
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
const onKeyDown = (e) => {
|
|
181
|
+
var _a, _b;
|
|
182
|
+
// run the keydown event handler if it exists
|
|
183
|
+
(_a = props.onKeyDown) === null || _a === void 0 ? void 0 : _a.call(props, e);
|
|
184
|
+
if (!props.stepper) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
const stepSkip = Math.abs((_b = props.stepSkip) !== null && _b !== void 0 ? _b : 1);
|
|
188
|
+
if (e.key === Key.UP) {
|
|
189
|
+
step(stepSkip);
|
|
190
|
+
}
|
|
191
|
+
if (e.key === Key.DOWN) {
|
|
192
|
+
step(stepSkip * -1);
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
const handleOnChange = useCallback((v, e) => {
|
|
196
|
+
const parsed = props.integerOnly ? parseInt(v) : parseFloat(v);
|
|
197
|
+
// uncontrolled component
|
|
198
|
+
if (value === undefined) {
|
|
199
|
+
setInput(v);
|
|
200
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(parsed, e);
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
// In controlled mode, we need to take over the input updates whenever the value is not a valid number
|
|
204
|
+
// This way onchange is only called with valid number updates and not when user is still entering a valid number
|
|
205
|
+
// if the value ends with a period, don't call onChange as it's not yet a valid number
|
|
206
|
+
if (v.endsWith('.')) {
|
|
207
|
+
setInput(v);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
// if the value is decimal and ends in a zero the user has also not changed the number/finished typing
|
|
211
|
+
if (v.includes('.') && v.endsWith('0')) {
|
|
212
|
+
setInput(v);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
// if the user is typing a negative number, don't call onChange until they have added the number
|
|
216
|
+
if (v === '-') {
|
|
217
|
+
setInput(v);
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
// When the input ends with . and the user backspaces, we should update the input as the value won't have changed
|
|
221
|
+
if (input.endsWith('.')) {
|
|
222
|
+
setInput(v);
|
|
223
|
+
}
|
|
224
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(parsed, e);
|
|
225
|
+
}, [props.integerOnly, value, onChange, input]);
|
|
226
|
+
useEffect(() => {
|
|
227
|
+
setInput(getInitialValue(value, initialValue));
|
|
228
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
229
|
+
}, [value]);
|
|
230
|
+
return (_jsxs("div", { children: [_jsxs(InputWrapper, { disabled: props.disabled, errorMsg: props.errorMsg, stepper: props.stepper, style: props.style, children: [_jsx(Input, Object.assign({}, props, { keydownFilter: keydownFilter, onChange: handleOnChange, onKeyDown: onKeyDown, ref: ref, value: input })), props.stepper && _jsx(InputStepper, { disabled: props.disabled, step: step, stepSkip: props.stepSkip })] }), props.errorMsg && _jsx(ErrorMessage, { children: props.errorMsg })] }));
|
|
231
|
+
});
|
|
232
|
+
Input.displayName = 'NumericInput';
|
|
233
|
+
export default NumericInput;
|
|
234
|
+
//# sourceMappingURL=numeric-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numeric-input.js","sourceRoot":"","sources":["../../src/numeric-input/numeric-input.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
export interface ProgressBarProps {
|
|
3
|
+
/** Standard react className property */
|
|
4
|
+
className?: string;
|
|
5
|
+
/** Optional color prop for the progress bar, should be a hex code. Pass an array for multiple values */
|
|
6
|
+
color?: string | string[];
|
|
7
|
+
/** Optional label for the progress bar. If not provided, the progress will be displayed as a percentage. Pass an array for multiple values */
|
|
8
|
+
label?: React.ReactNode | React.ReactNode[];
|
|
9
|
+
/** The current progress as a percentage. Pass an array for multiple values */
|
|
10
|
+
progress: number | number[];
|
|
11
|
+
/** Set the progress bar to view as a smaller strip with no label */
|
|
12
|
+
small?: boolean;
|
|
13
|
+
/** Native react style property, can be used to fine tune the button appearance */
|
|
14
|
+
style?: React.CSSProperties;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* A simple progress bar component, that displays the current progress to 100% as a bar with a small label
|
|
18
|
+
*
|
|
19
|
+
* @param props see interface for details
|
|
20
|
+
*/
|
|
21
|
+
declare function ProgressBar(props: ProgressBarProps): JSX.Element;
|
|
22
|
+
export default ProgressBar;
|
|
23
|
+
//# sourceMappingURL=progress-bar.d.ts.map
|