@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,182 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright 2023 Impulse Innovations Limited
|
|
4
|
+
*
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/
|
|
18
|
+
import { isEqual } from 'lodash';
|
|
19
|
+
import { nanoid } from 'nanoid';
|
|
20
|
+
import * as React from 'react';
|
|
21
|
+
import styled from '@darajs/styled-components';
|
|
22
|
+
import { PaperPlane, Xmark } from '@darajs/ui-icons';
|
|
23
|
+
import Button from '../button/button';
|
|
24
|
+
import TextArea from '../textarea/textarea';
|
|
25
|
+
import { default as MessageComponent } from './message';
|
|
26
|
+
const ChatWrapper = styled.div `
|
|
27
|
+
overflow-y: auto;
|
|
28
|
+
display: flex;
|
|
29
|
+
flex-direction: column;
|
|
30
|
+
gap: 1rem;
|
|
31
|
+
|
|
32
|
+
width: ${(props) => (props.$isPopup ? '350px' : '100%')};
|
|
33
|
+
height: ${(props) => (props.$isPopup ? 'calc(100vh - 2rem)' : '100%')};
|
|
34
|
+
padding: 1.5rem;
|
|
35
|
+
|
|
36
|
+
background-color: ${(props) => (props.$isPopup ? `${props.theme.colors.background}e6` : 'inherit')};
|
|
37
|
+
border-radius: ${(props) => (props.$isPopup ? '0.4rem' : 0)};
|
|
38
|
+
box-shadow: ${(props) => props.theme.shadow.medium};
|
|
39
|
+
`;
|
|
40
|
+
const ReplyWrapper = styled.div `
|
|
41
|
+
display: flex;
|
|
42
|
+
gap: 0.5rem;
|
|
43
|
+
align-items: end;
|
|
44
|
+
margin-top: auto;
|
|
45
|
+
`;
|
|
46
|
+
const ReplyButtons = styled.div `
|
|
47
|
+
display: flex;
|
|
48
|
+
gap: 1rem;
|
|
49
|
+
align-items: end;
|
|
50
|
+
`;
|
|
51
|
+
const ChatBody = styled.div `
|
|
52
|
+
overflow-y: auto;
|
|
53
|
+
display: flex;
|
|
54
|
+
flex-direction: column;
|
|
55
|
+
gap: 1rem;
|
|
56
|
+
|
|
57
|
+
max-height: calc(100% - 6.225rem);
|
|
58
|
+
margin: -0.25rem;
|
|
59
|
+
padding: 0.25rem;
|
|
60
|
+
`;
|
|
61
|
+
const ChatTop = styled.div `
|
|
62
|
+
display: flex;
|
|
63
|
+
align-items: center;
|
|
64
|
+
justify-content: space-between;
|
|
65
|
+
|
|
66
|
+
width: 100%;
|
|
67
|
+
height: 1.625rem;
|
|
68
|
+
|
|
69
|
+
font-size: 1.2rem;
|
|
70
|
+
`;
|
|
71
|
+
const CloseIcon = styled(Xmark) `
|
|
72
|
+
height: 1.2rem;
|
|
73
|
+
color: ${(props) => props.theme.colors.grey4};
|
|
74
|
+
|
|
75
|
+
:hover {
|
|
76
|
+
color: ${(props) => props.theme.colors.grey5};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
:active {
|
|
80
|
+
color: ${(props) => props.theme.colors.grey6};
|
|
81
|
+
}
|
|
82
|
+
`;
|
|
83
|
+
/**
|
|
84
|
+
* A function to scroll to the bottom of the chat so that the latest message is visible
|
|
85
|
+
*/
|
|
86
|
+
function scrollToBottom(node) {
|
|
87
|
+
setTimeout(() => {
|
|
88
|
+
if (node) {
|
|
89
|
+
node.scrollTop = node.scrollHeight;
|
|
90
|
+
}
|
|
91
|
+
}, 100);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* A function to check if the user wrote the message
|
|
95
|
+
*
|
|
96
|
+
* @param message - the message to check
|
|
97
|
+
* @param user - the user to check against
|
|
98
|
+
*/
|
|
99
|
+
function didUserWriteMessage(message, user) {
|
|
100
|
+
var _a;
|
|
101
|
+
if (user === null || user === void 0 ? void 0 : user.id) {
|
|
102
|
+
return ((_a = message.user) === null || _a === void 0 ? void 0 : _a.id) === user.id;
|
|
103
|
+
}
|
|
104
|
+
return message.user.name === user.name;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* A chat component
|
|
108
|
+
*
|
|
109
|
+
* @param {ChatProps} props - the component props
|
|
110
|
+
*/
|
|
111
|
+
function Chat(props) {
|
|
112
|
+
var _a, _b, _c;
|
|
113
|
+
const [reply, setReply] = React.useState('');
|
|
114
|
+
const [localMessages, setLocalMessages] = React.useState((_a = props.value) !== null && _a !== void 0 ? _a : []);
|
|
115
|
+
const chatBodyRef = React.useRef(null);
|
|
116
|
+
const localMessagesRef = React.useRef(localMessages);
|
|
117
|
+
React.useLayoutEffect(() => {
|
|
118
|
+
localMessagesRef.current = localMessages;
|
|
119
|
+
}, [localMessages]);
|
|
120
|
+
React.useEffect(() => {
|
|
121
|
+
var _a;
|
|
122
|
+
if (!isEqual(props.value, localMessagesRef.current)) {
|
|
123
|
+
setLocalMessages((_a = props.value) !== null && _a !== void 0 ? _a : []);
|
|
124
|
+
scrollToBottom(chatBodyRef === null || chatBodyRef === void 0 ? void 0 : chatBodyRef.current);
|
|
125
|
+
}
|
|
126
|
+
}, [props.value]);
|
|
127
|
+
const onChangeReply = (text) => {
|
|
128
|
+
// Prevents the message starting with a newline
|
|
129
|
+
if (!text.startsWith('\n')) {
|
|
130
|
+
setReply(text);
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
const onSubmitMessage = () => {
|
|
134
|
+
var _a;
|
|
135
|
+
if (reply) {
|
|
136
|
+
// Create a new message
|
|
137
|
+
const timestamp = new Date().toISOString();
|
|
138
|
+
const newMessage = {
|
|
139
|
+
id: nanoid(),
|
|
140
|
+
// remove any /n and trailing whitespace
|
|
141
|
+
message: reply.trim(),
|
|
142
|
+
created_at: timestamp,
|
|
143
|
+
updated_at: timestamp,
|
|
144
|
+
user: props.activeUser,
|
|
145
|
+
};
|
|
146
|
+
const newMessages = [...localMessages, newMessage];
|
|
147
|
+
// Add the new message to the chat
|
|
148
|
+
(_a = props.onUpdate) === null || _a === void 0 ? void 0 : _a.call(props, newMessages);
|
|
149
|
+
setLocalMessages(newMessages);
|
|
150
|
+
// Clear the reply field and scroll to the bottom of the chat to show latest message
|
|
151
|
+
setReply('');
|
|
152
|
+
scrollToBottom(chatBodyRef === null || chatBodyRef === void 0 ? void 0 : chatBodyRef.current);
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
const onEditMessage = (message) => {
|
|
156
|
+
var _a;
|
|
157
|
+
// Find the message to edit and replace it with the new message
|
|
158
|
+
const newMessages = localMessages.map((m) => {
|
|
159
|
+
if (m.id === message.id) {
|
|
160
|
+
return message;
|
|
161
|
+
}
|
|
162
|
+
return m;
|
|
163
|
+
});
|
|
164
|
+
// Update the chat
|
|
165
|
+
(_a = props.onUpdate) === null || _a === void 0 ? void 0 : _a.call(props, newMessages);
|
|
166
|
+
setLocalMessages(newMessages);
|
|
167
|
+
};
|
|
168
|
+
const onDeleteMessage = (id) => {
|
|
169
|
+
var _a;
|
|
170
|
+
// Remove the message with the given id
|
|
171
|
+
const newMessages = localMessages.filter((message) => message.id !== id);
|
|
172
|
+
// Update the chat
|
|
173
|
+
(_a = props.onUpdate) === null || _a === void 0 ? void 0 : _a.call(props, newMessages);
|
|
174
|
+
setLocalMessages(newMessages);
|
|
175
|
+
};
|
|
176
|
+
React.useLayoutEffect(() => {
|
|
177
|
+
scrollToBottom(chatBodyRef === null || chatBodyRef === void 0 ? void 0 : chatBodyRef.current);
|
|
178
|
+
}, []);
|
|
179
|
+
return (_jsxs(ChatWrapper, { className: props.className, style: props.style, "$isPopup": props.isPopup, children: [_jsxs(ChatTop, { children: [_jsx("span", { children: (_b = props.chatTitle) !== null && _b !== void 0 ? _b : 'Chat' }), props.isPopup && _jsx(CloseIcon, { onClick: props.onClose, "aria-label": "Close chat" })] }), _jsxs(ChatBody, { ref: chatBodyRef, role: "log", children: [localMessages.map((message) => (_jsx(MessageComponent, { onChange: onEditMessage, onDelete: onDeleteMessage, value: message, didUserWriteMessage: didUserWriteMessage(message, props.activeUser), isEditable: !props.isHistoryReadonly }, message.id))), props.loadingComponent] }), _jsxs(ReplyWrapper, { children: [_jsx(TextArea, { onChange: onChangeReply, onComplete: onSubmitMessage, placeholder: (_c = props.placeholder) !== null && _c !== void 0 ? _c : 'Add a comment', resize: "none", maxHeight: 6, value: reply, style: { width: '100%' } }), _jsx(ReplyButtons, { children: _jsx(Button, { "aria-label": "Send", style: { height: '3.4rem' }, disabled: !!props.loadingComponent || !(reply.trim().length > 0), onClick: onSubmitMessage, children: _jsx(PaperPlane, { onClick: onSubmitMessage }) }) })] })] }));
|
|
180
|
+
}
|
|
181
|
+
export default Chat;
|
|
182
|
+
//# sourceMappingURL=chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/chat/chat.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { InteractiveComponentProps, Message } from '../types';
|
|
3
|
+
export interface MessageProps extends InteractiveComponentProps<Message> {
|
|
4
|
+
/** An optional onChange handler for listening to changes in the input */
|
|
5
|
+
onChange?: (value: Message, e?: React.SyntheticEvent<HTMLInputElement>) => void | Promise<void>;
|
|
6
|
+
/** An optional event listener for complete events (enter presses) */
|
|
7
|
+
onDelete?: (id: string) => void | Promise<void>;
|
|
8
|
+
/** An optional flag to determine if the message is editable */
|
|
9
|
+
isEditable?: boolean;
|
|
10
|
+
/** Flag to check if the user wrote the message */
|
|
11
|
+
didUserWriteMessage?: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* A function to get the formatted timestamp to display in the submitted message
|
|
15
|
+
*/
|
|
16
|
+
export declare function getFormattedTimestamp(date: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* A function to porcess the text for the markdown render
|
|
19
|
+
*/
|
|
20
|
+
export declare function processText(text: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* A Message component that displays a message with a timestamp and allows for editing and deleting
|
|
23
|
+
*
|
|
24
|
+
* @param {MessageProps} props - the component props
|
|
25
|
+
*/
|
|
26
|
+
declare function MessageComponent(props: MessageProps): JSX.Element;
|
|
27
|
+
export default MessageComponent;
|
|
28
|
+
//# sourceMappingURL=message.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/chat/message.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAS/B,OAAO,EAAE,yBAAyB,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAwH9D,MAAM,WAAW,YAAa,SAAQ,yBAAyB,CAAC,OAAO,CAAC;IACpE,yEAAyE;IACzE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,gBAAgB,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChG,qEAAqE;IACrE,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,+DAA+D;IAC/D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kDAAkD;IAClD,mBAAmB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAmCD;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;;;GAIG;AACH,iBAAS,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,GAAG,CAAC,OAAO,CA8G1D;AAED,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright 2024 Impulse Innovations Limited
|
|
4
|
+
*
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/
|
|
18
|
+
import { format, parseISO } from 'date-fns';
|
|
19
|
+
import { isEqual } from 'lodash';
|
|
20
|
+
import * as React from 'react';
|
|
21
|
+
import styled, { useTheme } from '@darajs/styled-components';
|
|
22
|
+
import { PenToSquare, Trash } from '@darajs/ui-icons';
|
|
23
|
+
import Button from '../button/button';
|
|
24
|
+
import Markdown from '../markdown/markdown';
|
|
25
|
+
import TextArea from '../textarea/textarea';
|
|
26
|
+
import Tooltip from '../tooltip/tooltip';
|
|
27
|
+
const InteractiveIcons = styled.div `
|
|
28
|
+
position: absolute;
|
|
29
|
+
top: 0.75rem;
|
|
30
|
+
right: 0.75rem;
|
|
31
|
+
|
|
32
|
+
display: none;
|
|
33
|
+
gap: 0.5rem;
|
|
34
|
+
|
|
35
|
+
padding: 0.3rem;
|
|
36
|
+
|
|
37
|
+
background-color: ${(props) => props.theme.colors.blue1};
|
|
38
|
+
border-radius: 0.25rem;
|
|
39
|
+
box-shadow: ${(props) => props.theme.shadow.medium};
|
|
40
|
+
`;
|
|
41
|
+
const MessageWrapper = styled.div `
|
|
42
|
+
position: relative;
|
|
43
|
+
|
|
44
|
+
display: flex;
|
|
45
|
+
flex-direction: column;
|
|
46
|
+
gap: 0.5rem;
|
|
47
|
+
|
|
48
|
+
width: 100%;
|
|
49
|
+
padding: 1rem;
|
|
50
|
+
|
|
51
|
+
background-color: ${(props) => props.$messageFromActiveUser ? props.theme.colors.blue2 : props.theme.colors.blue1};
|
|
52
|
+
border-radius: 0.25rem;
|
|
53
|
+
box-shadow: ${(props) => props.theme.shadow.medium};
|
|
54
|
+
|
|
55
|
+
:hover ${InteractiveIcons} {
|
|
56
|
+
display: flex;
|
|
57
|
+
}
|
|
58
|
+
`;
|
|
59
|
+
const MessageTop = styled.div `
|
|
60
|
+
display: flex;
|
|
61
|
+
justify-content: space-between;
|
|
62
|
+
width: 100%;
|
|
63
|
+
font-size: 0.875rem;
|
|
64
|
+
`;
|
|
65
|
+
const MessageTimestamp = styled.span `
|
|
66
|
+
font-size: 0.75rem;
|
|
67
|
+
color: ${(props) => props.theme.colors.grey5};
|
|
68
|
+
`;
|
|
69
|
+
const MessageBody = styled.div `
|
|
70
|
+
display: flex;
|
|
71
|
+
flex-direction: column;
|
|
72
|
+
gap: 0.5rem;
|
|
73
|
+
|
|
74
|
+
width: 100%;
|
|
75
|
+
|
|
76
|
+
color: ${(props) => props.theme.colors.text};
|
|
77
|
+
overflow-wrap: break-word;
|
|
78
|
+
`;
|
|
79
|
+
const EditedText = styled.span `
|
|
80
|
+
align-self: end;
|
|
81
|
+
font-size: 0.8rem;
|
|
82
|
+
color: ${(props) => props.theme.colors.grey4};
|
|
83
|
+
`;
|
|
84
|
+
const DeleteIcon = styled(Trash) `
|
|
85
|
+
cursor: pointer;
|
|
86
|
+
height: 0.8rem;
|
|
87
|
+
color: ${(props) => props.theme.colors.secondary};
|
|
88
|
+
|
|
89
|
+
:hover {
|
|
90
|
+
color: ${(props) => props.theme.colors.secondaryHover}CC;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
:active {
|
|
94
|
+
color: ${(props) => props.theme.colors.secondaryDown}99;
|
|
95
|
+
}
|
|
96
|
+
`;
|
|
97
|
+
const EditIcon = styled(PenToSquare) `
|
|
98
|
+
cursor: pointer;
|
|
99
|
+
height: 0.8rem;
|
|
100
|
+
color: ${(props) => props.theme.colors.secondary};
|
|
101
|
+
|
|
102
|
+
:hover {
|
|
103
|
+
color: ${(props) => props.theme.colors.secondaryHover}CC;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
:active {
|
|
107
|
+
color: ${(props) => props.theme.colors.secondaryDown}99;
|
|
108
|
+
}
|
|
109
|
+
`;
|
|
110
|
+
const EditButtons = styled.div `
|
|
111
|
+
display: flex;
|
|
112
|
+
gap: 1rem;
|
|
113
|
+
justify-content: flex-end;
|
|
114
|
+
`;
|
|
115
|
+
const UserInfoWrapper = styled.div `
|
|
116
|
+
display: flex;
|
|
117
|
+
gap: 0.5rem;
|
|
118
|
+
align-items: center;
|
|
119
|
+
`;
|
|
120
|
+
const AvatarIcon = styled.div `
|
|
121
|
+
display: flex;
|
|
122
|
+
align-items: center;
|
|
123
|
+
justify-content: center;
|
|
124
|
+
|
|
125
|
+
width: 2rem;
|
|
126
|
+
height: 2rem;
|
|
127
|
+
|
|
128
|
+
font-weight: 700;
|
|
129
|
+
color: white;
|
|
130
|
+
|
|
131
|
+
border-radius: 50%;
|
|
132
|
+
`;
|
|
133
|
+
/**
|
|
134
|
+
* A function to get the formatted timestamp to display in the submitted message
|
|
135
|
+
*/
|
|
136
|
+
export function getFormattedTimestamp(date) {
|
|
137
|
+
return format(parseISO(date), 'HH:mm dd/MM/yyyy');
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* A function to assign a color to user token depending on their name
|
|
141
|
+
*/
|
|
142
|
+
function selectColor(name, colors) {
|
|
143
|
+
// Convert the name to lowercase for consistency
|
|
144
|
+
const lowerCaseName = name.toLowerCase();
|
|
145
|
+
// Calculate the sum of ASCII values of the characters in the name
|
|
146
|
+
let asciiSum = 0;
|
|
147
|
+
for (const char of lowerCaseName) {
|
|
148
|
+
asciiSum += char.charCodeAt(0);
|
|
149
|
+
}
|
|
150
|
+
// Use the remainder to select a color
|
|
151
|
+
const colorIndex = asciiSum % colors.length;
|
|
152
|
+
return colors[colorIndex];
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* A function to get the user's initials
|
|
156
|
+
*/
|
|
157
|
+
function getInitials(name) {
|
|
158
|
+
const parts = name.trim().split(/\s+/);
|
|
159
|
+
let initials = parts[0][0];
|
|
160
|
+
// If there's a second part, add its first character, so we only get two letter initials
|
|
161
|
+
if (parts.length > 1) {
|
|
162
|
+
initials += parts[parts.length - 1][0];
|
|
163
|
+
}
|
|
164
|
+
return initials.toUpperCase();
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* A function to porcess the text for the markdown render
|
|
168
|
+
*/
|
|
169
|
+
export function processText(text) {
|
|
170
|
+
return text.replace(/\n/g, '\n\n');
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* A Message component that displays a message with a timestamp and allows for editing and deleting
|
|
174
|
+
*
|
|
175
|
+
* @param {MessageProps} props - the component props
|
|
176
|
+
*/
|
|
177
|
+
function MessageComponent(props) {
|
|
178
|
+
var _a, _b;
|
|
179
|
+
const theme = useTheme();
|
|
180
|
+
const [editMode, setEditMode] = React.useState(false);
|
|
181
|
+
const [editMessage, setEditMessage] = React.useState(props.value.message);
|
|
182
|
+
const [localMessage, setLocalMessage] = React.useState(props.value);
|
|
183
|
+
if (props.value && !isEqual(props.value, localMessage)) {
|
|
184
|
+
setLocalMessage(props.value);
|
|
185
|
+
}
|
|
186
|
+
// List of colors for user token to pick from
|
|
187
|
+
const tokenColors = [
|
|
188
|
+
theme.colors.secondary,
|
|
189
|
+
theme.colors.violet,
|
|
190
|
+
theme.colors.turquoise,
|
|
191
|
+
theme.colors.purple,
|
|
192
|
+
theme.colors.teal,
|
|
193
|
+
theme.colors.orange,
|
|
194
|
+
theme.colors.plum,
|
|
195
|
+
];
|
|
196
|
+
const onAccept = () => {
|
|
197
|
+
// if the message hasn't changed, just close the edit mode
|
|
198
|
+
if (editMessage === localMessage.message) {
|
|
199
|
+
setEditMode(false);
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
// remove any /n and trailing whitespace
|
|
203
|
+
const newMessage = Object.assign(Object.assign({}, localMessage), { message: editMessage.trim(), updated_at: new Date().toISOString() });
|
|
204
|
+
props === null || props === void 0 ? void 0 : props.onChange(newMessage);
|
|
205
|
+
setLocalMessage(newMessage);
|
|
206
|
+
// reset the textarea message to the message without the /n and trailing whitespace
|
|
207
|
+
setEditMessage(newMessage.message);
|
|
208
|
+
setEditMode(false);
|
|
209
|
+
};
|
|
210
|
+
const onDelete = () => {
|
|
211
|
+
if (props.onDelete) {
|
|
212
|
+
props.onDelete(props.value.id);
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
return (_jsxs(MessageWrapper, { role: "listitem", className: props.className, style: props.style, "$messageFromActiveUser": props.didUserWriteMessage, children: [_jsxs(MessageTop, { children: [_jsxs(UserInfoWrapper, { children: [_jsx(AvatarIcon, { "aria-hidden": "true", style: {
|
|
216
|
+
backgroundColor: (_a = localMessage.user.color) !== null && _a !== void 0 ? _a : selectColor(localMessage.user.name, tokenColors),
|
|
217
|
+
}, children: (_b = localMessage.user.bubbleContent) !== null && _b !== void 0 ? _b : getInitials(localMessage.user.name) }), _jsxs("div", { style: { display: 'flex', flexDirection: 'column' }, children: [localMessage.user.name, _jsx(MessageTimestamp, { children: getFormattedTimestamp(props.value.created_at) })] }), localMessage.updated_at !== localMessage.created_at && (_jsx(Tooltip, { content: getFormattedTimestamp(props.value.updated_at), children: _jsx(EditedText, { children: " (edited)" }) }))] }), !editMode && props.isEditable && props.didUserWriteMessage && (_jsxs(InteractiveIcons, { children: [_jsx(EditIcon, { "aria-label": "Edit message", "data-testid": "message-edit-button", onClick: () => setEditMode(true), role: "button" }), _jsx(DeleteIcon, { "aria-label": "Delete message", "data-testid": "message-delete-button", onClick: onDelete, role: "button" })] }))] }), editMode && (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: '1rem' }, children: [_jsx(TextArea, { onChange: setEditMessage, resize: "vertical", value: editMessage }), _jsxs(EditButtons, { children: [_jsx(Button, { onClick: () => setEditMode(false), outline: true, children: "Cancel" }), _jsx(Button, { onClick: onAccept, children: "Save" })] })] })), !editMode && (_jsxs(MessageBody, { children: [_jsx(Markdown, { markdown: processText(localMessage.message) }), props.value.actions] }))] }));
|
|
218
|
+
}
|
|
219
|
+
export default MessageComponent;
|
|
220
|
+
//# sourceMappingURL=message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/chat/message.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Item } from '../types';
|
|
2
|
+
export interface ItemState {
|
|
3
|
+
state: boolean;
|
|
4
|
+
value: any;
|
|
5
|
+
}
|
|
6
|
+
export interface CheckboxGroupProps {
|
|
7
|
+
/** Standard react className property */
|
|
8
|
+
className?: string;
|
|
9
|
+
/** Standard react className property */
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
/** Initial checkboxes that should be checked */
|
|
12
|
+
initialValue?: Array<Item> | Item;
|
|
13
|
+
/** Whether to show checkboxes in list style */
|
|
14
|
+
isListStyle?: boolean;
|
|
15
|
+
/** The items to pick from the list. Each should have a label and a value */
|
|
16
|
+
items: Array<Item>;
|
|
17
|
+
/** An optional onChange handler, will be called whenever the state of the checkbox changes */
|
|
18
|
+
onChange?: (value: Array<Item> | Item, e?: React.FormEvent<HTMLInputElement>) => void | Promise<void>;
|
|
19
|
+
/** The maximum number of items that can be selected at one time */
|
|
20
|
+
selectMax?: number;
|
|
21
|
+
/** The minimum number of items that should be selected */
|
|
22
|
+
selectMin?: number;
|
|
23
|
+
/** Default React style prop */
|
|
24
|
+
style?: React.CSSProperties;
|
|
25
|
+
/** An optional value field to put the input into a controlled mode */
|
|
26
|
+
values?: Array<Item>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* A checkbox group component
|
|
30
|
+
*
|
|
31
|
+
* @param {CheckboxGroupProps} props - the component props
|
|
32
|
+
*/
|
|
33
|
+
declare function CheckboxGroup(props: CheckboxGroupProps): JSX.Element;
|
|
34
|
+
export default CheckboxGroup;
|
|
35
|
+
//# sourceMappingURL=checkbox-group.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkbox-group.d.ts","sourceRoot":"","sources":["../../src/checkbox/checkbox-group.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAGhC,MAAM,WAAW,SAAS;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,GAAG,CAAC;CACd;AAkBD,MAAM,WAAW,kBAAkB;IAC/B,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gDAAgD;IAChD,YAAY,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAClC,+CAA+C;IAC/C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4EAA4E;IAC5E,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACnB,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtG,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,sEAAsE;IACtE,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;CACxB;AAmBD;;;;GAIG;AACH,iBAAS,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,GAAG,CAAC,OAAO,CA0F7D;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright 2023 Impulse Innovations Limited
|
|
4
|
+
*
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/
|
|
18
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
19
|
+
import styled from '@darajs/styled-components';
|
|
20
|
+
import Checkbox from './checkbox';
|
|
21
|
+
const CheckboxWrapper = styled.div `
|
|
22
|
+
user-select: none;
|
|
23
|
+
display: flex;
|
|
24
|
+
width: 100%;
|
|
25
|
+
border: none;
|
|
26
|
+
`;
|
|
27
|
+
const CheckboxGroupWrapper = styled.div `
|
|
28
|
+
color: ${(props) => props.theme.colors.text};
|
|
29
|
+
`;
|
|
30
|
+
const CheckboxInfo = styled.p `
|
|
31
|
+
font-size: 0.75rem;
|
|
32
|
+
color: ${(props) => props.theme.colors.grey4};
|
|
33
|
+
`;
|
|
34
|
+
function getInitialValue(initialValue) {
|
|
35
|
+
if (Array.isArray(initialValue)) {
|
|
36
|
+
return initialValue;
|
|
37
|
+
}
|
|
38
|
+
if (initialValue) {
|
|
39
|
+
return [initialValue];
|
|
40
|
+
}
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
function getInitialCheckedState(items, initialValues) {
|
|
44
|
+
if (initialValues) {
|
|
45
|
+
return items.map((item) => ({ state: initialValues.includes(item.value), value: item.value }));
|
|
46
|
+
}
|
|
47
|
+
return items.map((item) => ({ state: initialValues.includes(item.value), value: false }));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* A checkbox group component
|
|
51
|
+
*
|
|
52
|
+
* @param {CheckboxGroupProps} props - the component props
|
|
53
|
+
*/
|
|
54
|
+
function CheckboxGroup(props) {
|
|
55
|
+
const [values, setValues] = useState(() => getInitialValue(props.values || props.initialValue));
|
|
56
|
+
const [checkedState, setCheckedState] = useState(() => getInitialCheckedState(props.items, values));
|
|
57
|
+
const isSelectPermitted = useMemo(() => {
|
|
58
|
+
if (!props.selectMax || values.length < props.selectMax) {
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
}, [values, props.selectMax]);
|
|
63
|
+
const infoMessage = useMemo(() => {
|
|
64
|
+
if (props.selectMax && props.selectMin) {
|
|
65
|
+
return `You can select from ${props.selectMin} to ${props.selectMax} options`;
|
|
66
|
+
}
|
|
67
|
+
if (props.selectMax) {
|
|
68
|
+
return `You can select up to ${props.selectMax} options`;
|
|
69
|
+
}
|
|
70
|
+
if (props.selectMin) {
|
|
71
|
+
return `You should select at least ${props.selectMin} options`;
|
|
72
|
+
}
|
|
73
|
+
}, [props.selectMax, props.selectMin]);
|
|
74
|
+
const onChangeValue = (event) => {
|
|
75
|
+
var _a;
|
|
76
|
+
const target = event.target;
|
|
77
|
+
const chosenIndex = Number(target.value);
|
|
78
|
+
const chosenValue = props.items[chosenIndex].value;
|
|
79
|
+
let newValues = [...values];
|
|
80
|
+
// find what the new values would be
|
|
81
|
+
if (values.includes(chosenValue)) {
|
|
82
|
+
newValues = newValues.filter((value) => value !== chosenValue);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
newValues.push(chosenValue);
|
|
86
|
+
}
|
|
87
|
+
// if new values would result in above the number permitted, only allow to uncheck selected checkboxes
|
|
88
|
+
// or if values below above permited/unconstrained then allow it to switch states
|
|
89
|
+
if ((newValues.length > props.selectMax && checkedState[chosenIndex]) ||
|
|
90
|
+
newValues.length <= props.selectMax ||
|
|
91
|
+
!props.selectMax) {
|
|
92
|
+
const indexToUpdate = checkedState.findIndex((item) => item.value === chosenValue);
|
|
93
|
+
checkedState[indexToUpdate].state = !checkedState[indexToUpdate].state;
|
|
94
|
+
setCheckedState(checkedState);
|
|
95
|
+
setValues(newValues);
|
|
96
|
+
if (!props.selectMin || newValues.length >= props.selectMin) {
|
|
97
|
+
(_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, props.items.filter((item) => newValues.includes(item.value)), event);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
useEffect(() => {
|
|
102
|
+
if (props.values) {
|
|
103
|
+
const valuesArray = props.values.map((value) => value.value);
|
|
104
|
+
setCheckedState(props.items.map((item) => ({ state: valuesArray.includes(item.value), value: item.value })));
|
|
105
|
+
setValues(valuesArray);
|
|
106
|
+
}
|
|
107
|
+
}, [props.values, props.items]);
|
|
108
|
+
return (_jsxs(CheckboxGroupWrapper, { className: props.className, style: props.style, children: [(props.selectMax || props.selectMin) && _jsx(CheckboxInfo, { children: infoMessage }), props.items.map((item, index) => {
|
|
109
|
+
var _a, _b;
|
|
110
|
+
return (_jsx(CheckboxWrapper, { "aria-disabled": props.disabled, children: _jsx(Checkbox, { disabled: isSelectPermitted ?
|
|
111
|
+
props.disabled
|
|
112
|
+
: ((_a = checkedState.find((option) => option.value === item.value)) === null || _a === void 0 ? void 0 : _a.state) === false, id: index, isListStyle: props.isListStyle, label: item.label ? item.label : item.value, onChange: (checked, e) => onChangeValue(e), selected: (_b = checkedState.find((option) => option.value === item.value)) === null || _b === void 0 ? void 0 : _b.state }) }, `item-${index}`));
|
|
113
|
+
})] }));
|
|
114
|
+
}
|
|
115
|
+
export default CheckboxGroup;
|
|
116
|
+
//# sourceMappingURL=checkbox-group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkbox-group.js","sourceRoot":"","sources":["../../src/checkbox/checkbox-group.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { InteractiveComponentProps } from '../types';
|
|
2
|
+
export interface CheckboxProps extends InteractiveComponentProps<boolean> {
|
|
3
|
+
/** Standard react className property */
|
|
4
|
+
className?: string;
|
|
5
|
+
/** Whether the checkbox is disabled. */
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
/** id of the current checkbox */
|
|
8
|
+
id?: number;
|
|
9
|
+
/** Whether to show list style of checkbox */
|
|
10
|
+
isListStyle?: boolean;
|
|
11
|
+
/** Sets the label to appear next to the checkbox */
|
|
12
|
+
label?: string;
|
|
13
|
+
/** An optional onChange handler, will be called whenever the state of the checkbox changes */
|
|
14
|
+
onChange?: (checked: boolean, e: React.FormEvent<HTMLInputElement>) => void | Promise<void>;
|
|
15
|
+
/** An optional onCLick handler */
|
|
16
|
+
onClick?: (e: React.FormEvent<HTMLInputElement>) => void | Promise<void>;
|
|
17
|
+
/** Setting this puts the checkbox in controlled mode */
|
|
18
|
+
selected?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A simple checkbox component
|
|
22
|
+
*
|
|
23
|
+
* @param {CheckboxProps} props - the component props
|
|
24
|
+
*/
|
|
25
|
+
declare function Checkbox(props: CheckboxProps): JSX.Element;
|
|
26
|
+
export default Checkbox;
|
|
27
|
+
//# sourceMappingURL=checkbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checkbox.d.ts","sourceRoot":"","sources":["../../src/checkbox/checkbox.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AA+HrD,MAAM,WAAW,aAAc,SAAQ,yBAAyB,CAAC,OAAO,CAAC;IACrE,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iCAAiC;IACjC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,6CAA6C;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5F,kCAAkC;IAClC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzE,wDAAwD;IACxD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;GAIG;AACH,iBAAS,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,GAAG,CAAC,OAAO,CAuCnD;AAED,eAAe,QAAQ,CAAC"}
|