siam-ui-utils 3.0.31 → 3.1.0
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/dist/CustomBootstrap.js +9 -0
- package/dist/CustomBootstrap.js.map +1 -0
- package/dist/_virtual/_commonjsHelpers.js +7 -0
- package/dist/_virtual/_commonjsHelpers.js.map +1 -0
- package/dist/_virtual/events.js +6 -0
- package/dist/_virtual/events.js.map +1 -0
- package/dist/_virtual/events2.js +5 -0
- package/dist/_virtual/events2.js.map +1 -0
- package/dist/_virtual/index.js +8 -0
- package/dist/_virtual/index.js.map +1 -0
- package/dist/_virtual/index2.js +5 -0
- package/dist/_virtual/index2.js.map +1 -0
- package/dist/assets/img/copiar.png.js +5 -0
- package/dist/assets/img/copiar.png.js.map +1 -0
- package/dist/assets/img/take-photo.jpg.js +5 -0
- package/dist/assets/img/take-photo.jpg.js.map +1 -0
- package/dist/constants.js +9 -0
- package/dist/constants.js.map +1 -0
- package/dist/copy-link/index.js +60 -0
- package/dist/copy-link/index.js.map +1 -0
- package/dist/copy-link/styles.css +38 -0
- package/dist/custom-input/CustomInputCheckbox.js +37 -0
- package/dist/custom-input/CustomInputCheckbox.js.map +1 -0
- package/dist/custom-input/CustomInputCurrency.js +84 -0
- package/dist/custom-input/CustomInputCurrency.js.map +1 -0
- package/dist/custom-input/CustomInputFile.js +47 -0
- package/dist/custom-input/CustomInputFile.js.map +1 -0
- package/dist/custom-input/CustomInputRadio.js +68 -0
- package/dist/custom-input/CustomInputRadio.js.map +1 -0
- package/dist/custom-input/constant.js +5 -0
- package/dist/custom-input/constant.js.map +1 -0
- package/dist/custom-input/index.css +167 -0
- package/dist/custom-input/index.js +12 -0
- package/dist/custom-input/index.js.map +1 -0
- package/dist/drag-and-dropzone/DropzoneComponent.js +83 -0
- package/dist/drag-and-dropzone/DropzoneComponent.js.map +1 -0
- package/dist/drag-and-dropzone/config.js +59 -0
- package/dist/drag-and-dropzone/config.js.map +1 -0
- package/dist/drag-and-dropzone/index.css +276 -0
- package/dist/drag-and-dropzone/index.js +39 -0
- package/dist/drag-and-dropzone/index.js.map +1 -0
- package/dist/dropzone/Input.js +77 -0
- package/dist/dropzone/Input.js.map +1 -0
- package/dist/dropzone/Layout.js +50 -0
- package/dist/dropzone/Layout.js.map +1 -0
- package/dist/dropzone/Preview.js +117 -0
- package/dist/dropzone/Preview.js.map +1 -0
- package/dist/dropzone/SubmitButton.js +34 -0
- package/dist/dropzone/SubmitButton.js.map +1 -0
- package/dist/dropzone/assets/cancel.svg.js +5 -0
- package/dist/dropzone/assets/cancel.svg.js.map +1 -0
- package/dist/dropzone/assets/remove.svg.js +5 -0
- package/dist/dropzone/assets/remove.svg.js.map +1 -0
- package/dist/dropzone/assets/restart.svg.js +5 -0
- package/dist/dropzone/assets/restart.svg.js.map +1 -0
- package/dist/dropzone/index.js +514 -0
- package/dist/dropzone/index.js.map +1 -0
- package/dist/dropzone/utils.js +93 -0
- package/dist/dropzone/utils.js.map +1 -0
- package/dist/dropzone-uploader/base/index.css +207 -0
- package/dist/dropzone-uploader/base/index.js +135 -0
- package/dist/dropzone-uploader/base/index.js.map +1 -0
- package/dist/dropzone-uploader/index.js +7 -0
- package/dist/dropzone-uploader/index.js.map +1 -0
- package/dist/dropzone-uploader/styled/index.css +348 -0
- package/dist/dropzone-uploader/styled/index.js +148 -0
- package/dist/dropzone-uploader/styled/index.js.map +1 -0
- package/dist/iconos/constants-svg.js +666 -0
- package/dist/iconos/constants-svg.js.map +1 -0
- package/dist/iconos/icon-button-svg.js +50 -0
- package/dist/iconos/icon-button-svg.js.map +1 -0
- package/dist/iconos/index.js +24 -0
- package/dist/iconos/index.js.map +1 -0
- package/dist/iconos/styled-icon.js +26 -0
- package/dist/iconos/styled-icon.js.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/intl-messages/index.js +11 -0
- package/dist/intl-messages/index.js.map +1 -0
- package/dist/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js +8 -0
- package/dist/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js.map +1 -0
- package/dist/node_modules/@babel/runtime/helpers/esm/extends.js +13 -0
- package/dist/node_modules/@babel/runtime/helpers/esm/extends.js.map +1 -0
- package/dist/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js +8 -0
- package/dist/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js.map +1 -0
- package/dist/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +13 -0
- package/dist/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js.map +1 -0
- package/dist/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js +9 -0
- package/dist/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js.map +1 -0
- package/dist/node_modules/@neolution-ch/reactstrap/esm/Button.js +111 -0
- package/dist/node_modules/@neolution-ch/reactstrap/esm/Button.js.map +1 -0
- package/dist/node_modules/@neolution-ch/reactstrap/esm/CloseButton.js +106 -0
- package/dist/node_modules/@neolution-ch/reactstrap/esm/CloseButton.js.map +1 -0
- package/dist/node_modules/@neolution-ch/reactstrap/esm/Col.js +125 -0
- package/dist/node_modules/@neolution-ch/reactstrap/esm/Col.js.map +1 -0
- package/dist/node_modules/@neolution-ch/reactstrap/esm/FormGroup.js +75 -0
- package/dist/node_modules/@neolution-ch/reactstrap/esm/FormGroup.js.map +1 -0
- package/dist/node_modules/@neolution-ch/reactstrap/esm/Input.js +225 -0
- package/dist/node_modules/@neolution-ch/reactstrap/esm/Input.js.map +1 -0
- package/dist/node_modules/@neolution-ch/reactstrap/esm/Label.js +122 -0
- package/dist/node_modules/@neolution-ch/reactstrap/esm/Label.js.map +1 -0
- package/dist/node_modules/@neolution-ch/reactstrap/esm/Row.js +83 -0
- package/dist/node_modules/@neolution-ch/reactstrap/esm/Row.js.map +1 -0
- package/dist/node_modules/@neolution-ch/reactstrap/esm/utils.js +68 -0
- package/dist/node_modules/@neolution-ch/reactstrap/esm/utils.js.map +1 -0
- package/dist/node_modules/classnames/index.js +62 -0
- package/dist/node_modules/classnames/index.js.map +1 -0
- package/dist/node_modules/dom-helpers/esm/addClass.js +10 -0
- package/dist/node_modules/dom-helpers/esm/addClass.js.map +1 -0
- package/dist/node_modules/dom-helpers/esm/hasClass.js +8 -0
- package/dist/node_modules/dom-helpers/esm/hasClass.js.map +1 -0
- package/dist/node_modules/dom-helpers/esm/removeClass.js +16 -0
- package/dist/node_modules/dom-helpers/esm/removeClass.js.map +1 -0
- package/dist/node_modules/dropzone/dist/dropzone.js +1968 -0
- package/dist/node_modules/dropzone/dist/dropzone.js.map +1 -0
- package/dist/node_modules/events/events.js +372 -0
- package/dist/node_modules/events/events.js.map +1 -0
- package/dist/node_modules/just-extend/index.esm.js +43 -0
- package/dist/node_modules/just-extend/index.esm.js.map +1 -0
- package/dist/node_modules/react-transition-group/esm/CSSTransition.js +275 -0
- package/dist/node_modules/react-transition-group/esm/CSSTransition.js.map +1 -0
- package/dist/node_modules/react-transition-group/esm/Transition.js +441 -0
- package/dist/node_modules/react-transition-group/esm/Transition.js.map +1 -0
- package/dist/node_modules/react-transition-group/esm/TransitionGroup.js +146 -0
- package/dist/node_modules/react-transition-group/esm/TransitionGroup.js.map +1 -0
- package/dist/node_modules/react-transition-group/esm/TransitionGroupContext.js +6 -0
- package/dist/node_modules/react-transition-group/esm/TransitionGroupContext.js.map +1 -0
- package/dist/node_modules/react-transition-group/esm/config.js +7 -0
- package/dist/node_modules/react-transition-group/esm/config.js.map +1 -0
- package/dist/node_modules/react-transition-group/esm/utils/ChildMapping.js +100 -0
- package/dist/node_modules/react-transition-group/esm/utils/ChildMapping.js.map +1 -0
- package/dist/node_modules/react-transition-group/esm/utils/PropTypes.js +24 -0
- package/dist/node_modules/react-transition-group/esm/utils/PropTypes.js.map +1 -0
- package/dist/node_modules/react-transition-group/esm/utils/reflow.js +7 -0
- package/dist/node_modules/react-transition-group/esm/utils/reflow.js.map +1 -0
- package/dist/react-notifications/Notification.js +73 -0
- package/dist/react-notifications/Notification.js.map +1 -0
- package/dist/react-notifications/NotificationContainer.js +59 -0
- package/dist/react-notifications/NotificationContainer.js.map +1 -0
- package/dist/react-notifications/NotificationManager.js +174 -0
- package/dist/react-notifications/NotificationManager.js.map +1 -0
- package/dist/react-notifications/Notifications.js +72 -0
- package/dist/react-notifications/Notifications.js.map +1 -0
- package/dist/react-notifications/constants.js +26 -0
- package/dist/react-notifications/constants.js.map +1 -0
- package/dist/react-notifications/index.js +11 -0
- package/dist/react-notifications/index.js.map +1 -0
- package/dist/react-notifications/notifications.css +213 -0
- package/dist/select/custom-select/constants.js +8 -0
- package/dist/select/custom-select/constants.js.map +1 -0
- package/dist/select/custom-select/index.js +89 -0
- package/dist/select/custom-select/index.js.map +1 -0
- package/dist/select/custom-select-input/index.js +12 -0
- package/dist/select/custom-select-input/index.js.map +1 -0
- package/dist/select/index.js +9 -0
- package/dist/select/index.js.map +1 -0
- package/dist/select/multi-select/badge-label-multi-select.js +29 -0
- package/dist/select/multi-select/badge-label-multi-select.js.map +1 -0
- package/dist/select/multi-select/index.css +37 -0
- package/dist/select/multi-select/index.js +171 -0
- package/dist/select/multi-select/index.js.map +1 -0
- package/dist/select/multi-select/styled-component.js +23 -0
- package/dist/select/multi-select/styled-component.js.map +1 -0
- package/dist/timer/index.js +60 -0
- package/dist/timer/index.js.map +1 -0
- package/dist/timer/styles.css +59 -0
- package/dist/tomar-foto/index.js +62 -0
- package/dist/tomar-foto/index.js.map +1 -0
- package/dist/view-layout/button-editor.js +14 -0
- package/dist/view-layout/button-editor.js.map +1 -0
- package/dist/view-layout/constants.js +11 -0
- package/dist/view-layout/constants.js.map +1 -0
- package/dist/view-layout/editor-layer.js +28 -0
- package/dist/view-layout/editor-layer.js.map +1 -0
- package/dist/view-layout/index.js +53 -0
- package/dist/view-layout/index.js.map +1 -0
- package/dist/view-layout/slot-wrapper.js +39 -0
- package/dist/view-layout/slot-wrapper.js.map +1 -0
- package/dist/view-layout/styles.css +127 -0
- package/dist/where-by-room/index.js +20 -0
- package/dist/where-by-room/index.js.map +1 -0
- package/dist/where-by-room/room.js +78 -0
- package/dist/where-by-room/room.js.map +1 -0
- package/index.d.ts +1 -1
- package/package.json +12 -10
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
.notification-container {
|
|
2
|
+
box-sizing: border-box;
|
|
3
|
+
position: fixed;
|
|
4
|
+
top: 0;
|
|
5
|
+
right: 0;
|
|
6
|
+
z-index: 999999;
|
|
7
|
+
width: 320px;
|
|
8
|
+
padding: 0px 15px;
|
|
9
|
+
max-height: calc(100% - 30px);
|
|
10
|
+
overflow-x: hidden;
|
|
11
|
+
overflow-y: auto;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.notification-container-empty {
|
|
15
|
+
display: none;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
.notification {
|
|
19
|
+
box-sizing: border-box;
|
|
20
|
+
padding: 15px 15px 15px 15px;
|
|
21
|
+
text-align: start;
|
|
22
|
+
border-radius: 2px;
|
|
23
|
+
cursor: pointer;
|
|
24
|
+
font-size: 1em;
|
|
25
|
+
line-height: 1.2em;
|
|
26
|
+
position: relative;
|
|
27
|
+
opacity: 0.9;
|
|
28
|
+
margin-top: 15px;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.notification .title {
|
|
32
|
+
font-size: 1em;
|
|
33
|
+
line-height: 1.2em;
|
|
34
|
+
font-weight: bold;
|
|
35
|
+
margin: 0 0 5px 0;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.notification:hover,
|
|
39
|
+
.notification:focus {
|
|
40
|
+
opacity: 1;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.notification-enter {
|
|
44
|
+
visibility: hidden;
|
|
45
|
+
transform: translate3d(100%, 0, 0);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.notification-enter-active {
|
|
49
|
+
visibility: visible;
|
|
50
|
+
transform: translate3d(0, 0, 0);
|
|
51
|
+
transition: all 0.4s;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.notification-exit {
|
|
55
|
+
visibility: visible;
|
|
56
|
+
transform: translate3d(0, 0, 0);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.notification-exit-active {
|
|
60
|
+
visibility: hidden;
|
|
61
|
+
transform: translate3d(100%, 0, 0);
|
|
62
|
+
transition: all 0.4s;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.notification-primary {
|
|
66
|
+
color: #922c88;
|
|
67
|
+
background-color: #ffffff;
|
|
68
|
+
border: 1px solid #922c88;
|
|
69
|
+
opacity: 1;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
.notification-primary .notification-message .title {
|
|
73
|
+
color: #922c88;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.notification-primary .notification-message .message {
|
|
77
|
+
color: #212529;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.notification-primary.filled {
|
|
81
|
+
color: #ffffff;
|
|
82
|
+
background-color: #922c88;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.notification-primary.filled .notification-message .title,
|
|
86
|
+
.notification-primary.filled .notification-message .message {
|
|
87
|
+
color: #ffffff;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.notification-secondary {
|
|
91
|
+
color: #145388;
|
|
92
|
+
background-color: #ffffff;
|
|
93
|
+
border: 1px solid #145388;
|
|
94
|
+
opacity: 1;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.notification-secondary .notification-message .title {
|
|
98
|
+
color: #145388;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.notification-secondary .notification-message .message {
|
|
102
|
+
color: #6c757d;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.notification-secondary.filled {
|
|
106
|
+
color: #ffffff;
|
|
107
|
+
background-color: #145388;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.notification-secondary.filled .notification-message .title,
|
|
111
|
+
.notification-secondary.filled .notification-message .message {
|
|
112
|
+
color: #ffffff;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.notification-info {
|
|
116
|
+
color: #17a2b8;
|
|
117
|
+
background-color: #ffffff;
|
|
118
|
+
border: 1px solid #17a2b8;
|
|
119
|
+
opacity: 1;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.notification-info .notification-message .title {
|
|
123
|
+
color: #17a2b8;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.notification-info .notification-message .message {
|
|
127
|
+
color: #6c757d;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.notification-info.filled {
|
|
131
|
+
color: #ffffff;
|
|
132
|
+
background-color: #17a2b8;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.notification-info.filled .notification-message .title,
|
|
136
|
+
.notification-info.filled .notification-message .message {
|
|
137
|
+
color: #ffffff;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.notification-success {
|
|
141
|
+
color: #28a745;
|
|
142
|
+
background-color: #ffffff;
|
|
143
|
+
border: 1px solid #28a745;
|
|
144
|
+
opacity: 1;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.notification-success .notification-message .title {
|
|
148
|
+
color: #28a745;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.notification-success .notification-message .message {
|
|
152
|
+
color: #6c757d;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.notification-success.filled {
|
|
156
|
+
color: #ffffff;
|
|
157
|
+
background-color: #28a745;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.notification-success.filled .notification-message .title,
|
|
161
|
+
.notification-success.filled .notification-message .message {
|
|
162
|
+
color: #ffffff;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.notification-warning {
|
|
166
|
+
color: #ffc107;
|
|
167
|
+
background-color: #ffffff;
|
|
168
|
+
border: 1px solid #ffc107;
|
|
169
|
+
opacity: 1;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
.notification-warning .notification-message .title {
|
|
173
|
+
color: #ffc107;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.notification-warning .notification-message .message {
|
|
177
|
+
color: #6c757d;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.notification-warning.filled {
|
|
181
|
+
color: #ffffff;
|
|
182
|
+
background-color: #ffc107;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.notification-warning.filled .notification-message .title,
|
|
186
|
+
.notification-warning.filled .notification-message .message {
|
|
187
|
+
color: #ffffff;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.notification-error {
|
|
191
|
+
color: #dc3545;
|
|
192
|
+
background-color: #ffffff;
|
|
193
|
+
border: 1px solid #dc3545;
|
|
194
|
+
opacity: 1;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.notification-error .notification-message .title {
|
|
198
|
+
color: #dc3545;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.notification-error .notification-message .message {
|
|
202
|
+
color: #6c757d;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.notification-error.filled {
|
|
206
|
+
color: #ffffff;
|
|
207
|
+
background-color: #dc3545;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.notification-error.filled .notification-message .title,
|
|
211
|
+
.notification-error.filled .notification-message .message {
|
|
212
|
+
color: #ffffff;
|
|
213
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../../../src/select/custom-select/constants.js"],"sourcesContent":["export const LABELS = {\r\n SIN_DATOS: \"SIN DATOS\",\r\n SELECCIONE: \"SELECCIONE...\",\r\n};\r\n"],"names":[],"mappings":"AAAY,MAAC,SAAS;AAAA,EACpB,WAAW;AAAA,EACX,YAAY;AACd;"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { jsxs, Fragment, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect } from "react";
|
|
3
|
+
import Select from "react-select";
|
|
4
|
+
import Label from "../../node_modules/@neolution-ch/reactstrap/esm/Label.js";
|
|
5
|
+
import { CustomSelectInput } from "../custom-select-input/index.js";
|
|
6
|
+
import { LABELS } from "./constants.js";
|
|
7
|
+
const { SIN_DATOS, SELECCIONE } = LABELS;
|
|
8
|
+
const CustomSelect = (props) => {
|
|
9
|
+
const [firstElement] = useState(props.firstElement);
|
|
10
|
+
const [newItem] = useState(props.newItem);
|
|
11
|
+
const [selectedIoption, setIoption] = useState({});
|
|
12
|
+
const [customStylesOption] = useState(props.customStylesOption);
|
|
13
|
+
const [customStyles, setCustomStyles] = useState({});
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
if (newItem) {
|
|
16
|
+
props.options.push(newItem);
|
|
17
|
+
}
|
|
18
|
+
}, [newItem, props.options]);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
const { options = [] } = props;
|
|
21
|
+
if (firstElement && Number(options?.length) > 1) {
|
|
22
|
+
const propIOption = options.filter((item) => item === firstElement);
|
|
23
|
+
if (propIOption?.length === 0) {
|
|
24
|
+
props.options.unshift(firstElement);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}, [firstElement, props.options]);
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
const { selectedValue } = props;
|
|
30
|
+
const errorProp = { value: null };
|
|
31
|
+
if (selectedValue || firstElement && firstElement.value === selectedValue) {
|
|
32
|
+
const propIOption = props.options.filter(({ value }) => {
|
|
33
|
+
return JSON.stringify(value) === JSON.stringify(selectedValue);
|
|
34
|
+
});
|
|
35
|
+
if (propIOption[0]) {
|
|
36
|
+
setIoption(propIOption[0]);
|
|
37
|
+
if (!Object.getOwnPropertyDescriptor(selectedIoption, "label")) {
|
|
38
|
+
props.onChange(propIOption[0]);
|
|
39
|
+
}
|
|
40
|
+
} else {
|
|
41
|
+
setIoption(errorProp);
|
|
42
|
+
props.onChange(errorProp);
|
|
43
|
+
}
|
|
44
|
+
} else if (props.options.length > 0) {
|
|
45
|
+
setIoption(errorProp);
|
|
46
|
+
props.onChange(errorProp);
|
|
47
|
+
}
|
|
48
|
+
}, [props.selectedValue, props.options, firstElement]);
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
if (customStylesOption) {
|
|
51
|
+
const stylesOption = {
|
|
52
|
+
option: (base, { data }) => {
|
|
53
|
+
return {
|
|
54
|
+
...base,
|
|
55
|
+
color: data.fields && data.fields[customStylesOption.fieldMatch] === customStylesOption.valueMatch ? "blue !important" : "",
|
|
56
|
+
fontWeight: data.fields && data.fields[customStylesOption.fieldMatch] === customStylesOption.valueMatch ? "bold" : ""
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
setCustomStyles(stylesOption);
|
|
61
|
+
}
|
|
62
|
+
}, [customStylesOption]);
|
|
63
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
64
|
+
props.label && props.label !== "" && /* @__PURE__ */ jsxs(Label, { className: "mb-0", children: [
|
|
65
|
+
props.label,
|
|
66
|
+
":"
|
|
67
|
+
] }),
|
|
68
|
+
/* @__PURE__ */ jsx(
|
|
69
|
+
Select,
|
|
70
|
+
{
|
|
71
|
+
...props,
|
|
72
|
+
components: { Input: CustomSelectInput },
|
|
73
|
+
className: "react-select",
|
|
74
|
+
classNamePrefix: "react-select",
|
|
75
|
+
name: "form-field-name",
|
|
76
|
+
value: Object.getOwnPropertyDescriptor(selectedIoption, "label") ? selectedIoption : "",
|
|
77
|
+
onChange: props.onChange,
|
|
78
|
+
options: props.options,
|
|
79
|
+
placeholder: Number(props.options.length) === 0 ? SIN_DATOS : props.placeholder || SELECCIONE,
|
|
80
|
+
isDisabled: props.disabled,
|
|
81
|
+
styles: customStyles
|
|
82
|
+
}
|
|
83
|
+
)
|
|
84
|
+
] });
|
|
85
|
+
};
|
|
86
|
+
export {
|
|
87
|
+
CustomSelect
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/select/custom-select/index.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\r\nimport Select from 'react-select';\r\nimport { Label } from '@neolution-ch/reactstrap';\r\nimport { CustomSelectInput } from '../custom-select-input';\r\nimport { LABELS } from './constants';\r\n\r\ninterface ICustomStylesOption {\r\n fieldMatch: string;\r\n valueMatch: any;\r\n}\r\ninterface IOption {\r\n label: string;\r\n value: any;\r\n fields?: any;\r\n}\r\ninterface IOption {\r\n label: string;\r\n value: any;\r\n fields?: any;\r\n}\r\ninterface Props {\r\n label: string;\r\n tabIndex: number;\r\n options: [IOption];\r\n onChange: any;\r\n selectedValue: any;\r\n firstElement?: IOption; // no ingresar null como VALUE del elemento, setear '' ya que lo toma como que no se selecciono nada\r\n newItem?: IOption;\r\n placeholder?: string;\r\n disabled?: boolean;\r\n customStylesOption?: ICustomStylesOption;\r\n}\r\n\r\nconst { SIN_DATOS, SELECCIONE } = LABELS;\r\n\r\nexport const CustomSelect: React.FC<Props> = (props: Props) => {\r\n const [firstElement] = useState(props.firstElement);\r\n const [newItem] = useState(props.newItem);\r\n const [selectedIoption, setIoption] = useState({});\r\n const [customStylesOption] = useState(props.customStylesOption);\r\n const [customStyles, setCustomStyles] = useState({});\r\n\r\n // agrega items\r\n useEffect(() => {\r\n if (newItem) {\r\n props.options.push(newItem);\r\n }\r\n }, [newItem, props.options]);\r\n\r\n // Seleccion del 1er item.\r\n useEffect(() => {\r\n const { options = [] } = props;\r\n if (firstElement && Number(options?.length) > 1) {\r\n const propIOption = options.filter((item) => item === firstElement);\r\n\r\n if (propIOption?.length === 0) {\r\n props.options.unshift(firstElement);\r\n }\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [firstElement, props.options]);\r\n\r\n // selecciona un valor seteado dentro de la coleccion\r\n useEffect(() => {\r\n const { selectedValue } = props;\r\n const errorProp = { value: null };\r\n\r\n if (\r\n selectedValue ||\r\n (firstElement && firstElement.value === selectedValue)\r\n ) {\r\n const propIOption = props.options.filter(({ value }) => {\r\n return JSON.stringify(value) === JSON.stringify(selectedValue);\r\n });\r\n\r\n if (propIOption[0]) {\r\n setIoption(propIOption[0]);\r\n if (!Object.getOwnPropertyDescriptor(selectedIoption, 'label')) {\r\n props.onChange(propIOption[0]);\r\n }\r\n } else {\r\n setIoption(errorProp);\r\n props.onChange(errorProp);\r\n }\r\n } else if (props.options.length > 0) {\r\n setIoption(errorProp);\r\n props.onChange(errorProp);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [props.selectedValue, props.options, firstElement]);\r\n\r\n useEffect(() => {\r\n if (customStylesOption) {\r\n const stylesOption = {\r\n option: (base: any, { data }: any) => {\r\n return {\r\n ...base,\r\n color:\r\n data.fields &&\r\n data.fields[customStylesOption.fieldMatch] ===\r\n customStylesOption.valueMatch\r\n ? 'blue !important'\r\n : '',\r\n fontWeight:\r\n data.fields &&\r\n data.fields[customStylesOption.fieldMatch] ===\r\n customStylesOption.valueMatch\r\n ? 'bold'\r\n : '',\r\n };\r\n },\r\n };\r\n setCustomStyles(stylesOption);\r\n }\r\n }, [customStylesOption]);\r\n\r\n return (\r\n <>\r\n {props.label && props.label !== '' && (\r\n <Label className=\"mb-0\">{props.label}:</Label>\r\n )}\r\n <Select\r\n {...props}\r\n components={{ Input: CustomSelectInput }}\r\n className=\"react-select\"\r\n classNamePrefix=\"react-select\"\r\n name=\"form-field-name\"\r\n value={\r\n Object.getOwnPropertyDescriptor(selectedIoption, 'label')\r\n ? selectedIoption\r\n : ''\r\n }\r\n onChange={props.onChange}\r\n options={props.options}\r\n placeholder={\r\n Number(props.options.length) === 0\r\n ? SIN_DATOS\r\n : props.placeholder || SELECCIONE\r\n }\r\n isDisabled={props.disabled}\r\n styles={customStyles}\r\n />\r\n </>\r\n );\r\n};\r\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { components } from "react-select";
|
|
3
|
+
const CustomSelectInput = (props) => {
|
|
4
|
+
const customProps = { ...props };
|
|
5
|
+
delete customProps.autoCorrect;
|
|
6
|
+
delete customProps.autoCapitalize;
|
|
7
|
+
return /* @__PURE__ */ jsx(components.Input, { ...customProps });
|
|
8
|
+
};
|
|
9
|
+
export {
|
|
10
|
+
CustomSelectInput
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/select/custom-select-input/index.jsx"],"sourcesContent":["import { components } from 'react-select';\r\n\r\nexport const CustomSelectInput = (props) => {\r\n const customProps = { ...props };\r\n delete customProps.autoCorrect;\r\n delete customProps.autoCapitalize;\r\n return <components.Input {...customProps} />;\r\n};\r\n"],"names":[],"mappings":";;AAEO,MAAM,oBAAoB,CAAC,UAAU;AAC1C,QAAM,cAAc,EAAE,GAAG,MAAA;AACzB,SAAO,YAAY;AACnB,SAAO,YAAY;AACnB,SAAO,oBAAC,WAAW,OAAX,EAAkB,GAAG,YAAA,CAAa;AAC5C;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CustomSelect } from "./custom-select/index.js";
|
|
2
|
+
import { CustomMultiSelect } from "./multi-select/index.js";
|
|
3
|
+
import { CustomSelectInput } from "./custom-select-input/index.js";
|
|
4
|
+
export {
|
|
5
|
+
CustomMultiSelect,
|
|
6
|
+
CustomSelect,
|
|
7
|
+
CustomSelectInput
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { jsx, Fragment, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { toCamelCase } from "siam-utils";
|
|
3
|
+
import { ClickableBadge } from "./styled-component.js";
|
|
4
|
+
const BadgeLabelMultiSelect = ({
|
|
5
|
+
descripcionLabel = [],
|
|
6
|
+
onRemove = () => {
|
|
7
|
+
}
|
|
8
|
+
}) => {
|
|
9
|
+
const getBadgeColor = (value) => {
|
|
10
|
+
return value.color || "dark";
|
|
11
|
+
};
|
|
12
|
+
return /* @__PURE__ */ jsx(Fragment, { children: descripcionLabel.map((item) => /* @__PURE__ */ jsxs(
|
|
13
|
+
ClickableBadge,
|
|
14
|
+
{
|
|
15
|
+
color: getBadgeColor(item),
|
|
16
|
+
pill: true,
|
|
17
|
+
onClick: () => onRemove(item.value),
|
|
18
|
+
children: [
|
|
19
|
+
toCamelCase(item.label),
|
|
20
|
+
" ×"
|
|
21
|
+
]
|
|
22
|
+
},
|
|
23
|
+
item.value
|
|
24
|
+
)) });
|
|
25
|
+
};
|
|
26
|
+
export {
|
|
27
|
+
BadgeLabelMultiSelect as default
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=badge-label-multi-select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge-label-multi-select.js","sources":["../../../src/select/multi-select/badge-label-multi-select.jsx"],"sourcesContent":["import { toCamelCase } from 'siam-utils';\r\nimport { ClickableBadge } from './styled-component';\r\n\r\nconst BadgeLabelMultiSelect = ({\r\n descripcionLabel = [],\r\n onRemove = () => {},\r\n}) => {\r\n const getBadgeColor = (value) => {\r\n return value.color || 'dark';\r\n };\r\n\r\n return (\r\n <>\r\n {descripcionLabel.map((item) => (\r\n <ClickableBadge\r\n key={item.value}\r\n color={getBadgeColor(item)}\r\n pill\r\n onClick={() => onRemove(item.value)}\r\n >\r\n {toCamelCase(item.label)} ×\r\n </ClickableBadge>\r\n ))}\r\n </>\r\n );\r\n};\r\n\r\nexport default BadgeLabelMultiSelect;\r\n"],"names":[],"mappings":";;;AAGA,MAAM,wBAAwB,CAAC;AAAA,EAC7B,mBAAmB,CAAA;AAAA,EACnB,WAAW,MAAM;AAAA,EAAC;AACpB,MAAM;AACJ,QAAM,gBAAgB,CAAC,UAAU;AAC/B,WAAO,MAAM,SAAS;AAAA,EACxB;AAEA,SACE,oBAAA,UAAA,EACG,UAAA,iBAAiB,IAAI,CAAC,SACrB;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,OAAO,cAAc,IAAI;AAAA,MACzB,MAAI;AAAA,MACJ,SAAS,MAAM,SAAS,KAAK,KAAK;AAAA,MAEjC,UAAA;AAAA,QAAA,YAAY,KAAK,KAAK;AAAA,QAAE;AAAA,MAAA;AAAA,IAAA;AAAA,IALpB,KAAK;AAAA,EAAA,CAOb,GACH;AAEJ;"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
.multiselect-checkbox-option .custom-checkbox {
|
|
2
|
+
margin-bottom: 0;
|
|
3
|
+
}
|
|
4
|
+
.multiselect-checkbox-option .custom-checkbox input[type=checkbox] + label {
|
|
5
|
+
line-height: 1.2 !important;
|
|
6
|
+
display: flex;
|
|
7
|
+
align-items: center;
|
|
8
|
+
padding-left: 1.75rem;
|
|
9
|
+
}
|
|
10
|
+
.multiselect-checkbox-option .custom-checkbox input[type=checkbox] + label::before {
|
|
11
|
+
top: 50%;
|
|
12
|
+
transform: translateY(-50%);
|
|
13
|
+
}
|
|
14
|
+
.multiselect-checkbox-option .custom-checkbox input[type=checkbox]:checked + label::after {
|
|
15
|
+
top: 50%;
|
|
16
|
+
transform: translateY(-65%) rotate(45deg);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.custom-multiselect__control {
|
|
20
|
+
min-height: 38px;
|
|
21
|
+
border-color: #ccc;
|
|
22
|
+
}
|
|
23
|
+
.custom-multiselect__control:hover {
|
|
24
|
+
border-color: #900604;
|
|
25
|
+
}
|
|
26
|
+
.custom-multiselect__control--is-focused {
|
|
27
|
+
border-color: #900604;
|
|
28
|
+
box-shadow: 0 0 0 1px #900604;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.dropdown-heading-value {
|
|
32
|
+
color: green;
|
|
33
|
+
height: 2rem;
|
|
34
|
+
display: inline;
|
|
35
|
+
font-weight: bold;
|
|
36
|
+
padding: 0.4rem;
|
|
37
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useRef, useEffect, useCallback } from "react";
|
|
3
|
+
import Select, { components } from "react-select";
|
|
4
|
+
import { Row, Col } from "reactstrap";
|
|
5
|
+
import { CustomInputCheckbox } from "../../custom-input/CustomInputCheckbox.js";
|
|
6
|
+
import BadgeLabelMultiSelect from "./badge-label-multi-select.js";
|
|
7
|
+
import { BadgeWrapper, ClickableBadge } from "./styled-component.js";
|
|
8
|
+
import "./index.css";
|
|
9
|
+
const SELECT_ALL_VALUE = "__select_all__";
|
|
10
|
+
const SELECT_ALL_OPTION = {
|
|
11
|
+
value: SELECT_ALL_VALUE,
|
|
12
|
+
label: "SELECCIONAR TODOS"
|
|
13
|
+
};
|
|
14
|
+
function CheckboxOption({
|
|
15
|
+
data,
|
|
16
|
+
isSelected,
|
|
17
|
+
isFocused,
|
|
18
|
+
innerRef,
|
|
19
|
+
selectProps
|
|
20
|
+
}) {
|
|
21
|
+
const isSelectAll = data.value === SELECT_ALL_VALUE;
|
|
22
|
+
const handleMouseDown = (e) => {
|
|
23
|
+
e.preventDefault();
|
|
24
|
+
e.stopPropagation();
|
|
25
|
+
if (isSelectAll) {
|
|
26
|
+
selectProps.onSelectAll?.();
|
|
27
|
+
} else {
|
|
28
|
+
selectProps.onOptionClick?.(data);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
return /* @__PURE__ */ jsx(
|
|
32
|
+
"div",
|
|
33
|
+
{
|
|
34
|
+
ref: innerRef,
|
|
35
|
+
onMouseDown: handleMouseDown,
|
|
36
|
+
onTouchEnd: handleMouseDown,
|
|
37
|
+
className: "multiselect-checkbox-option",
|
|
38
|
+
style: {
|
|
39
|
+
backgroundColor: isFocused ? "#f8e1e1" : "white",
|
|
40
|
+
borderBottom: isSelectAll ? "1px solid #ccc" : "none",
|
|
41
|
+
padding: "6px 12px",
|
|
42
|
+
cursor: "pointer"
|
|
43
|
+
},
|
|
44
|
+
children: /* @__PURE__ */ jsx(
|
|
45
|
+
CustomInputCheckbox,
|
|
46
|
+
{
|
|
47
|
+
id: `opt_${data.value}`,
|
|
48
|
+
checked: isSelected,
|
|
49
|
+
onChange: () => {
|
|
50
|
+
},
|
|
51
|
+
label: /* @__PURE__ */ jsx("span", { style: { fontWeight: isSelectAll ? "bold" : "normal" }, children: data.label })
|
|
52
|
+
}
|
|
53
|
+
)
|
|
54
|
+
}
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
function CustomValueContainer({ children, getValue, ...props }) {
|
|
58
|
+
const selected = getValue();
|
|
59
|
+
const totalOptions = props.selectProps.options.length - 1;
|
|
60
|
+
const count = selected.length;
|
|
61
|
+
const isAll = count > 0 && count === totalOptions;
|
|
62
|
+
const text = isAll ? "Todos Seleccionados" : count > 0 ? selected.map((s) => s.label).join(", ") : null;
|
|
63
|
+
console.log("selected", selected, text);
|
|
64
|
+
return /* @__PURE__ */ jsxs(components.ValueContainer, { ...props, getValue, children: [
|
|
65
|
+
text ? /* @__PURE__ */ jsx("span", { style: { color: "#333" }, children: text }) : /* @__PURE__ */ jsx(
|
|
66
|
+
"span",
|
|
67
|
+
{
|
|
68
|
+
style: {
|
|
69
|
+
color: count ? "transparent" : "#999",
|
|
70
|
+
position: "absolute"
|
|
71
|
+
},
|
|
72
|
+
children: props.selectProps.placeholder
|
|
73
|
+
}
|
|
74
|
+
),
|
|
75
|
+
children[children.length - 1]
|
|
76
|
+
] });
|
|
77
|
+
}
|
|
78
|
+
const CUSTOM_COMPONENTS = {
|
|
79
|
+
Option: CheckboxOption,
|
|
80
|
+
ValueContainer: CustomValueContainer
|
|
81
|
+
};
|
|
82
|
+
const CustomMultiSelect = ({
|
|
83
|
+
lista = [],
|
|
84
|
+
onListaUpdate = () => {
|
|
85
|
+
},
|
|
86
|
+
value = [],
|
|
87
|
+
styles = {}
|
|
88
|
+
}) => {
|
|
89
|
+
const [selected, setSelected] = useState(value);
|
|
90
|
+
const isInternalChange = useRef(false);
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
if (isInternalChange.current) {
|
|
93
|
+
isInternalChange.current = false;
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
setSelected(value);
|
|
97
|
+
}, [JSON.stringify(value)]);
|
|
98
|
+
const update = useCallback(
|
|
99
|
+
(newSelected) => {
|
|
100
|
+
isInternalChange.current = true;
|
|
101
|
+
setSelected(newSelected);
|
|
102
|
+
onListaUpdate(newSelected);
|
|
103
|
+
},
|
|
104
|
+
[onListaUpdate]
|
|
105
|
+
);
|
|
106
|
+
const handleOptionClick = useCallback(
|
|
107
|
+
(data) => {
|
|
108
|
+
setSelected((prev) => {
|
|
109
|
+
const isAlreadySelected = prev.some((s) => s.value === data.value);
|
|
110
|
+
const next = isAlreadySelected ? prev.filter((s) => s.value !== data.value) : [...prev, data];
|
|
111
|
+
isInternalChange.current = true;
|
|
112
|
+
onListaUpdate(next);
|
|
113
|
+
return next;
|
|
114
|
+
});
|
|
115
|
+
},
|
|
116
|
+
[onListaUpdate]
|
|
117
|
+
);
|
|
118
|
+
const handleSelectAll = useCallback(() => {
|
|
119
|
+
setSelected((prev) => {
|
|
120
|
+
const next = prev.length === lista.length ? [] : [...lista];
|
|
121
|
+
isInternalChange.current = true;
|
|
122
|
+
onListaUpdate(next);
|
|
123
|
+
return next;
|
|
124
|
+
});
|
|
125
|
+
}, [lista, onListaUpdate]);
|
|
126
|
+
const handleRemoveBadge = useCallback(
|
|
127
|
+
(valueToRemove) => {
|
|
128
|
+
update(selected.filter((item) => item.value !== valueToRemove));
|
|
129
|
+
},
|
|
130
|
+
[selected, update]
|
|
131
|
+
);
|
|
132
|
+
const allSelected = lista.length > 0 && selected.length === lista.length;
|
|
133
|
+
const optionsWithSelectAll = [SELECT_ALL_OPTION, ...lista];
|
|
134
|
+
const isOptionSelected = useCallback(
|
|
135
|
+
(option) => option.value === SELECT_ALL_VALUE ? allSelected : selected.some((s) => s.value === option.value),
|
|
136
|
+
[allSelected, selected]
|
|
137
|
+
);
|
|
138
|
+
return /* @__PURE__ */ jsxs(Row, { className: "align-items-center", children: [
|
|
139
|
+
/* @__PURE__ */ jsx(Col, { xs: 6, style: styles, children: /* @__PURE__ */ jsx(
|
|
140
|
+
Select,
|
|
141
|
+
{
|
|
142
|
+
options: optionsWithSelectAll,
|
|
143
|
+
value: selected,
|
|
144
|
+
onChange: update,
|
|
145
|
+
isMulti: true,
|
|
146
|
+
placeholder: "Seleccione",
|
|
147
|
+
noOptionsMessage: () => "Sin opciones",
|
|
148
|
+
className: "custom-multiselect",
|
|
149
|
+
classNamePrefix: "custom-multiselect",
|
|
150
|
+
components: CUSTOM_COMPONENTS,
|
|
151
|
+
closeMenuOnSelect: false,
|
|
152
|
+
hideSelectedOptions: false,
|
|
153
|
+
isSearchable: false,
|
|
154
|
+
onSelectAll: handleSelectAll,
|
|
155
|
+
onOptionClick: handleOptionClick,
|
|
156
|
+
isOptionSelected
|
|
157
|
+
}
|
|
158
|
+
) }),
|
|
159
|
+
/* @__PURE__ */ jsx(Col, { xs: 6, children: selected.length > 0 && /* @__PURE__ */ jsx(BadgeWrapper, { children: allSelected ? /* @__PURE__ */ jsx(ClickableBadge, { color: "info", pill: true, children: "Todos" }) : /* @__PURE__ */ jsx(
|
|
160
|
+
BadgeLabelMultiSelect,
|
|
161
|
+
{
|
|
162
|
+
descripcionLabel: selected,
|
|
163
|
+
onRemove: handleRemoveBadge
|
|
164
|
+
}
|
|
165
|
+
) }) })
|
|
166
|
+
] });
|
|
167
|
+
};
|
|
168
|
+
export {
|
|
169
|
+
CustomMultiSelect
|
|
170
|
+
};
|
|
171
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/select/multi-select/index.jsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\r\nimport Select, { components } from 'react-select';\r\nimport { Col, Row } from 'reactstrap';\r\nimport { CustomInputCheckbox } from '../../custom-input/CustomInputCheckbox';\r\nimport BadgeLabelMultiSelect from './badge-label-multi-select';\r\nimport { BadgeWrapper, ClickableBadge } from './styled-component';\r\nimport './index.scss';\r\n\r\nconst SELECT_ALL_VALUE = '__select_all__';\r\nconst SELECT_ALL_OPTION = {\r\n value: SELECT_ALL_VALUE,\r\n label: 'SELECCIONAR TODOS',\r\n};\r\n\r\nfunction CheckboxOption({\r\n data,\r\n isSelected,\r\n isFocused,\r\n innerRef,\r\n selectProps,\r\n}) {\r\n const isSelectAll = data.value === SELECT_ALL_VALUE;\r\n\r\n const handleMouseDown = (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n if (isSelectAll) {\r\n selectProps.onSelectAll?.();\r\n } else {\r\n selectProps.onOptionClick?.(data);\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n ref={innerRef}\r\n onMouseDown={handleMouseDown}\r\n onTouchEnd={handleMouseDown}\r\n className=\"multiselect-checkbox-option\"\r\n style={{\r\n backgroundColor: isFocused ? '#f8e1e1' : 'white',\r\n borderBottom: isSelectAll ? '1px solid #ccc' : 'none',\r\n padding: '6px 12px',\r\n cursor: 'pointer',\r\n }}\r\n >\r\n <CustomInputCheckbox\r\n id={`opt_${data.value}`}\r\n checked={isSelected}\r\n onChange={() => {}}\r\n label={\r\n <span style={{ fontWeight: isSelectAll ? 'bold' : 'normal' }}>\r\n {data.label}\r\n </span>\r\n }\r\n />\r\n </div>\r\n );\r\n}\r\n\r\nfunction CustomValueContainer({ children, getValue, ...props }) {\r\n const selected = getValue();\r\n const totalOptions = props.selectProps.options.length - 1;\r\n const count = selected.length;\r\n const isAll = count > 0 && count === totalOptions;\r\n\r\n const text = isAll\r\n ? 'Todos Seleccionados'\r\n : count > 0\r\n ? selected.map((s) => s.label).join(', ')\r\n : null;\r\n console.log('selected', selected, text);\r\n\r\n return (\r\n <components.ValueContainer {...props} getValue={getValue}>\r\n {text ? (\r\n <span style={{ color: '#333' }}>{text}</span>\r\n ) : (\r\n <span\r\n style={{\r\n color: count ? 'transparent' : '#999',\r\n position: 'absolute',\r\n }}\r\n >\r\n {props.selectProps.placeholder}\r\n </span>\r\n )}\r\n {children[children.length - 1]}\r\n </components.ValueContainer>\r\n );\r\n}\r\n\r\nconst CUSTOM_COMPONENTS = {\r\n Option: CheckboxOption,\r\n ValueContainer: CustomValueContainer,\r\n};\r\n\r\nexport const CustomMultiSelect = ({\r\n lista = [],\r\n onListaUpdate = () => {},\r\n value = [],\r\n styles = {},\r\n}) => {\r\n const [selected, setSelected] = useState(value);\r\n const isInternalChange = useRef(false);\r\n\r\n useEffect(() => {\r\n if (isInternalChange.current) {\r\n isInternalChange.current = false;\r\n return;\r\n }\r\n setSelected(value);\r\n }, [JSON.stringify(value)]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n const update = useCallback(\r\n (newSelected) => {\r\n isInternalChange.current = true;\r\n setSelected(newSelected);\r\n onListaUpdate(newSelected);\r\n },\r\n [onListaUpdate]\r\n );\r\n\r\n const handleOptionClick = useCallback(\r\n (data) => {\r\n setSelected((prev) => {\r\n const isAlreadySelected = prev.some((s) => s.value === data.value);\r\n const next = isAlreadySelected\r\n ? prev.filter((s) => s.value !== data.value)\r\n : [...prev, data];\r\n isInternalChange.current = true;\r\n onListaUpdate(next);\r\n return next;\r\n });\r\n },\r\n [onListaUpdate]\r\n );\r\n\r\n const handleSelectAll = useCallback(() => {\r\n setSelected((prev) => {\r\n const next = prev.length === lista.length ? [] : [...lista];\r\n isInternalChange.current = true;\r\n onListaUpdate(next);\r\n return next;\r\n });\r\n }, [lista, onListaUpdate]);\r\n\r\n const handleRemoveBadge = useCallback(\r\n (valueToRemove) => {\r\n update(selected.filter((item) => item.value !== valueToRemove));\r\n },\r\n [selected, update]\r\n );\r\n\r\n const allSelected = lista.length > 0 && selected.length === lista.length;\r\n const optionsWithSelectAll = [SELECT_ALL_OPTION, ...lista];\r\n\r\n const isOptionSelected = useCallback(\r\n (option) =>\r\n option.value === SELECT_ALL_VALUE\r\n ? allSelected\r\n : selected.some((s) => s.value === option.value),\r\n [allSelected, selected]\r\n );\r\n\r\n return (\r\n <Row className=\"align-items-center\">\r\n <Col xs={6} style={styles}>\r\n <Select\r\n options={optionsWithSelectAll}\r\n value={selected}\r\n onChange={update}\r\n isMulti\r\n placeholder=\"Seleccione\"\r\n noOptionsMessage={() => 'Sin opciones'}\r\n className=\"custom-multiselect\"\r\n classNamePrefix=\"custom-multiselect\"\r\n components={CUSTOM_COMPONENTS}\r\n closeMenuOnSelect={false}\r\n hideSelectedOptions={false}\r\n isSearchable={false}\r\n onSelectAll={handleSelectAll}\r\n onOptionClick={handleOptionClick}\r\n isOptionSelected={isOptionSelected}\r\n />\r\n </Col>\r\n <Col xs={6}>\r\n {selected.length > 0 && (\r\n <BadgeWrapper>\r\n {allSelected ? (\r\n <ClickableBadge color=\"info\" pill>\r\n Todos\r\n </ClickableBadge>\r\n ) : (\r\n <BadgeLabelMultiSelect\r\n descripcionLabel={selected}\r\n onRemove={handleRemoveBadge}\r\n />\r\n )}\r\n </BadgeWrapper>\r\n )}\r\n </Col>\r\n </Row>\r\n );\r\n};\r\n\r\nexport default CustomMultiSelect;\r\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Badge } from "reactstrap";
|
|
2
|
+
import styled from "styled-components";
|
|
3
|
+
const ClickableBadge = styled(Badge)`
|
|
4
|
+
cursor: pointer;
|
|
5
|
+
width: fit-content;
|
|
6
|
+
white-space: nowrap;
|
|
7
|
+
`;
|
|
8
|
+
const BadgeWrapper = styled.div`
|
|
9
|
+
display: inline-flex;
|
|
10
|
+
flex-wrap: wrap;
|
|
11
|
+
gap: 10px;
|
|
12
|
+
padding: 0.5rem;
|
|
13
|
+
border-radius: 0.5rem;
|
|
14
|
+
background-color: #f1f1f1;
|
|
15
|
+
border: 1px solid #ccc;
|
|
16
|
+
max-width: 100%;
|
|
17
|
+
overflow-x: auto;
|
|
18
|
+
`;
|
|
19
|
+
export {
|
|
20
|
+
BadgeWrapper,
|
|
21
|
+
ClickableBadge
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=styled-component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styled-component.js","sources":["../../../src/select/multi-select/styled-component.js"],"sourcesContent":["import { Badge } from 'reactstrap';\r\nimport styled from 'styled-components';\r\n\r\nexport const ClickableBadge = styled(Badge)`\r\n cursor: pointer;\r\n width: fit-content;\r\n white-space: nowrap;\r\n`;\r\n\r\nexport const BadgeWrapper = styled.div`\r\n display: inline-flex;\r\n flex-wrap: wrap;\r\n gap: 10px;\r\n padding: 0.5rem;\r\n border-radius: 0.5rem;\r\n background-color: #f1f1f1;\r\n border: 1px solid #ccc;\r\n max-width: 100%;\r\n overflow-x: auto;\r\n`;\r\n"],"names":[],"mappings":";;AAGY,MAAC,iBAAiB,OAAO,KAAK;AAAA;AAAA;AAAA;AAAA;AAM9B,MAAC,eAAe,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;"}
|