@onehat/ui 0.3.82 → 0.3.84

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onehat/ui",
3
- "version": "0.3.82",
3
+ "version": "0.3.84",
4
4
  "description": "Base UI for OneHat apps",
5
5
  "main": "src/index.js",
6
6
  "type": "module",
@@ -1,4 +1,4 @@
1
- import { useEffect, useRef, } from 'react';
1
+ import { useRef, } from 'react';
2
2
  import {
3
3
  Button,
4
4
  } from 'native-base';
@@ -10,9 +10,9 @@ const ButtonComponent = function(props) {
10
10
  } = props,
11
11
  buttonRef = useRef();
12
12
 
13
- useEffect(() => {
13
+ if (self) {
14
14
  self.ref = buttonRef.current;
15
- }, []);
15
+ }
16
16
 
17
17
  return <Button ref={buttonRef} {...props} />;
18
18
  }
@@ -1,4 +1,4 @@
1
- import React, { useEffect, useRef, } from 'react';
1
+ import React, { useRef, } from 'react';
2
2
  import {
3
3
  Icon,
4
4
  Pressable,
@@ -25,10 +25,9 @@ const
25
25
  if (!ref) {
26
26
  ref = useRef();
27
27
  }
28
-
29
- useEffect(() => {
28
+ if (self) {
30
29
  self.ref = ref.current;
31
- }, []);
30
+ }
32
31
 
33
32
  const propsIcon = props._icon || {};
34
33
  let icon = props.icon,
@@ -1,33 +1,31 @@
1
- import React, { useState, useRef, useEffect, } from 'react';
2
- import {
3
- v4 as uuid,
4
- } from 'uuid';
5
- import _ from 'lodash';
1
+ import { useRef, useEffect, } from 'react';
6
2
 
7
3
  // This HOC establishes a parent-child relationship between components.
8
- // Basically anything wrapped in withComponent registers itself with a parent
9
- // and allows children to register.
4
+ // Basically anything wrapped in withComponent that has a reference prop
5
+ // registers itself with a parent and allows children to register.
10
6
 
11
7
  export default function withComponent(WrappedComponent) {
12
8
  return (props) => {
13
9
 
10
+ if (!props.reference) {
11
+ return <WrappedComponent {...props} />;
12
+ }
13
+
14
14
  const {
15
- // self: parent,
16
15
  parent,
17
- componentMethods,
16
+ reference,
18
17
  ...propsToPass
19
18
  } = props,
20
- reference = !_.isEmpty(props.reference) ? props.reference : uuid(),
21
19
  childrenRef = useRef({}),
22
20
  selfRef = useRef({
23
21
  parent,
24
22
  reference,
23
+ path: (parent?.path || '' ) + '/' + reference,
25
24
  hasChild: (childRef) => {
26
25
  const {
27
26
  reference,
28
- } = childRef,
29
- found = _.find(childrenRef.current, (ref, ix) => ix === reference);
30
- return !!found;
27
+ } = childRef;
28
+ return typeof childrenRef.current[reference] !== 'undefined';
31
29
  },
32
30
  registerChild: (childRef) => {
33
31
  const {
@@ -50,16 +48,11 @@ export default function withComponent(WrappedComponent) {
50
48
  });
51
49
 
52
50
  useEffect(() => {
53
- if (componentMethods) {
54
- _.each(componentMethods, (method, name) => {
55
- selfRef.current[name] = method;
56
- });
57
- }
58
- if (parent && reference && !parent.hasChild(selfRef.current)) {
51
+ if (parent && !parent.hasChild(selfRef.current)) {
59
52
  parent.registerChild(selfRef.current);
60
53
  }
61
54
  return () => {
62
- if (parent && reference) {
55
+ if (parent) {
63
56
  parent.unregisterChild(selfRef.current);
64
57
  }
65
58
  childrenRef.current = {};
@@ -67,10 +60,8 @@ export default function withComponent(WrappedComponent) {
67
60
  }, []);
68
61
 
69
62
  return <WrappedComponent
70
- // parent={parent}
71
63
  self={selfRef.current}
72
64
  {...propsToPass}
73
- reference={reference}
74
65
  />;
75
66
 
76
67
  };
@@ -62,7 +62,7 @@ export default function withFilters(WrappedComponent) {
62
62
  defaultFilters: modelDefaultFilters,
63
63
  ancillaryFilters: modelAncillaryFilters,
64
64
  } = Repository.getSchema().model,
65
- id = props.id || props.reference || useId(),
65
+ id = props.id || props.path || useId(),
66
66
 
67
67
  // determine the starting filters
68
68
  startingFilters = !_.isEmpty(customFilters) ? customFilters : // custom filters override component filters
@@ -11,6 +11,7 @@ import {
11
11
  VERTICAL,
12
12
  } from '../../Constants/Directions.js';
13
13
  import UiGlobals from '../../UiGlobals.js';
14
+ import getComponentFromType from '../../Functions/getComponentFromType.js';
14
15
  import withComponent from '../Hoc/withComponent.js';
15
16
  import IconButton from '../Buttons/IconButton.js';
16
17
  import Minimize from '../Icons/Minimize.js';
@@ -35,6 +36,7 @@ function TabBar(props) {
35
36
  startsCollapsed = true,
36
37
  onChangeCurrentTab,
37
38
  onChangeIsCollapsed,
39
+ onPressTab,
38
40
  onTabClose,
39
41
  ...propsToPass
40
42
  } = props,
@@ -59,6 +61,9 @@ function TabBar(props) {
59
61
  },
60
62
  setCurrentTab = (ix) => {
61
63
  if ((useLocal && ix === currentTabIxLocal) || ix === currentTabIx) {
64
+ if (onPressTab) {
65
+ onPressTab(ix); // for when an already shown tab is pressed
66
+ }
62
67
  return; // no change
63
68
  }
64
69
  if (useLocal) {
@@ -184,6 +189,13 @@ function TabBar(props) {
184
189
  if (isCollapsed || !tab.title) {
185
190
  useIconButton = true;
186
191
  }
192
+ const tabIcon = _.clone(tab._icon);
193
+ if (tabIcon.as && _.isString(tabIcon.as)) {
194
+ Type = getComponentFromType(tabIcon.as);
195
+ if (Type) {
196
+ tabIcon.as = Type;
197
+ }
198
+ }
187
199
  if (useIconButton) {
188
200
  button = <IconButton
189
201
  key={'tabIconButton' + ix}
@@ -193,7 +205,7 @@ function TabBar(props) {
193
205
  _icon={{
194
206
  color: isCurrentTab ? styles.TAB_ACTIVE_ICON_COLOR : styles.TAB_ICON_COLOR,
195
207
  ...iconProps,
196
- ...tab._icon,
208
+ ...tabIcon,
197
209
  }}
198
210
  _hover={{
199
211
  bg: isCurrentTab? styles.TAB_ACTIVE_HOVER_BG : styles.TAB_HOVER_BG,
@@ -208,7 +220,7 @@ function TabBar(props) {
208
220
  leftIcon={<Icon
209
221
  color={isCurrentTab ? styles.TAB_ACTIVE_ICON_COLOR : styles.TAB_ICON_COLOR}
210
222
  {...iconProps}
211
- {...tab._icon}
223
+ {...tabIcon}
212
224
  />}
213
225
  {...buttonProps}
214
226
  {...thisButtonProps}
@@ -2,6 +2,179 @@ import {
2
2
  Column,
3
3
  Row,
4
4
  } from 'native-base';
5
+ import AddressBook from '../Components/Icons/AddressBook.js';
6
+ import Alt from '../Components/Icons/Alt.js';
7
+ import AngleLeft from '../Components/Icons/AngleLeft.js';
8
+ import AngleRight from '../Components/Icons/AngleRight.js';
9
+ import AnglesLeft from '../Components/Icons/AnglesLeft.js';
10
+ import AnglesRight from '../Components/Icons/AnglesRight.js';
11
+ import Asterisk from '../Components/Icons/Asterisk.js';
12
+ import Ban from '../Components/Icons/Ban.js';
13
+ import Bars from '../Components/Icons/Bars.js';
14
+ import BarsStaggered from '../Components/Icons/BarsStaggered.js';
15
+ import BigCircle from '../Components/Icons/BigCircle.js';
16
+ import Book from '../Components/Icons/Book.js';
17
+ import Bookmark from '../Components/Icons/Bookmark.js';
18
+ import BookOpen from '../Components/Icons/BookOpen.js';
19
+ import Bug from '../Components/Icons/Bug.js';
20
+ import Building from '../Components/Icons/Building.js';
21
+ import Calendar from '../Components/Icons/Calendar.js';
22
+ import Calendar2 from '../Components/Icons/Calendar2.js';
23
+ import CalendarDays from '../Components/Icons/CalendarDays.js';
24
+ import Camera from '../Components/Icons/Camera.js';
25
+ import CaretDown from '../Components/Icons/CaretDown.js';
26
+ import CaretUp from '../Components/Icons/CaretUp.js';
27
+ import CartPlus from '../Components/Icons/CartPlus.js';
28
+ import CartShopping from '../Components/Icons/CartShopping.js';
29
+ import CashRegister from '../Components/Icons/CashRegister.js';
30
+ import Certificate from '../Components/Icons/Certificate.js';
31
+ import ChartLine from '../Components/Icons/ChartLine.js';
32
+ import ChartPie from '../Components/Icons/ChartPie.js';
33
+ import Check from '../Components/Icons/Check.js';
34
+ import CheckDouble from '../Components/Icons/CheckDouble.js';
35
+ import ChevronDown from '../Components/Icons/ChevronDown.js';
36
+ import ChevronLeft from '../Components/Icons/ChevronLeft.js';
37
+ import ChevronRight from '../Components/Icons/ChevronRight.js';
38
+ import ChevronUp from '../Components/Icons/ChevronUp.js';
39
+ import Circle from '../Components/Icons/Circle.js';
40
+ import CircleArrowRight from '../Components/Icons/CircleArrowRight.js';
41
+ import CircleExclamation from '../Components/Icons/CircleExclamation.js';
42
+ import CircleInfo from '../Components/Icons/CircleInfo.js';
43
+ import CircleQuestion from '../Components/Icons/CircleQuestion.js';
44
+ import CircleXmark from '../Components/Icons/CircleXmark.js';
45
+ import CircleXmarkRegular from '../Components/Icons/CircleXmarkRegular.js';
46
+ import Clipboard from '../Components/Icons/Clipboard.js';
47
+ import ClipboardCheck from '../Components/Icons/ClipboardCheck.js';
48
+ import ClipboardList from '../Components/Icons/ClipboardList.js';
49
+ import Clock from '../Components/Icons/Clock.js';
50
+ import ClockRegular from '../Components/Icons/ClockRegular.js';
51
+ import ClockRotateLeft from '../Components/Icons/ClockRotateLeft.js';
52
+ import Clone from '../Components/Icons/Clone.js';
53
+ import Collapse from '../Components/Icons/Collapse.js';
54
+ import Comment from '../Components/Icons/Comment.js';
55
+ import CommentRegular from '../Components/Icons/CommentRegular.js';
56
+ import Comments from '../Components/Icons/Comments.js';
57
+ import CommentsRegular from '../Components/Icons/CommentsRegular.js';
58
+ import Copyright from '../Components/Icons/Copyright.js';
59
+ import Dot from '../Components/Icons/Dot.js';
60
+ import Duplicate from '../Components/Icons/Duplicate.js';
61
+ import Edit from '../Components/Icons/Edit.js';
62
+ import EllipsisVertical from '../Components/Icons/EllipsisVertical.js';
63
+ import Envelope from '../Components/Icons/Envelope.js';
64
+ import EnvelopeRegular from '../Components/Icons/EnvelopeRegular.js';
65
+ import Excel from '../Components/Icons/Excel.js';
66
+ import Exclamation from '../Components/Icons/Exclamation.js';
67
+ import Expand from '../Components/Icons/Expand.js';
68
+ import Eye from '../Components/Icons/Eye.js';
69
+ import EyeSlash from '../Components/Icons/EyeSlash.js';
70
+ import File from '../Components/Icons/File.js';
71
+ import FloppyDiskRegular from '../Components/Icons/FloppyDiskRegular.js';
72
+ import Folder from '../Components/Icons/Folder.js';
73
+ import FolderClosed from '../Components/Icons/FolderClosed.js';
74
+ import FolderOpen from '../Components/Icons/FolderOpen.js';
75
+ import FolderTree from '../Components/Icons/FolderTree.js';
76
+ import FullWidth from '../Components/Icons/FullWidth.js';
77
+ import Gauge from '../Components/Icons/Gauge.js';
78
+ import Gear from '../Components/Icons/Gear.js';
79
+ import Gears from '../Components/Icons/Gears.js';
80
+ import Gift from '../Components/Icons/Gift.js';
81
+ import Grip from '../Components/Icons/Grip.js';
82
+ import GripLines from '../Components/Icons/GripLines.js';
83
+ import GripLinesVertical from '../Components/Icons/GripLinesVertical.js';
84
+ import GripVertical from '../Components/Icons/GripVertical.js';
85
+ import Hammer from '../Components/Icons/Hammer.js';
86
+ import Hand from '../Components/Icons/Hand.js';
87
+ import HighPriority from '../Components/Icons/HighPriority.js';
88
+ import House from '../Components/Icons/House.js';
89
+ import Images from '../Components/Icons/Images.js';
90
+ import Info from '../Components/Icons/Info.js';
91
+ import ItunesNote from '../Components/Icons/ItunesNote.js';
92
+ import Leaf from '../Components/Icons/Leaf.js';
93
+ import List from '../Components/Icons/List.js';
94
+ import ListCheck from '../Components/Icons/ListCheck.js';
95
+ import LocationDot from '../Components/Icons/LocationDot.js';
96
+ import Loop from '../Components/Icons/Loop.js';
97
+ import Loop1 from '../Components/Icons/Loop1.js';
98
+ import LoopAll from '../Components/Icons/LoopAll.js';
99
+ import LowPriority from '../Components/Icons/LowPriority.js';
100
+ import MagnifyingGlass from '../Components/Icons/MagnifyingGlass.js';
101
+ import Maximize from '../Components/Icons/Maximize.js';
102
+ import MedPriority from '../Components/Icons/MedPriority.js';
103
+ import Microphone from '../Components/Icons/Microphone.js';
104
+ import Minimize from '../Components/Icons/Minimize.js';
105
+ import Minus from '../Components/Icons/Minus.js';
106
+ import MobileScreenButton from '../Components/Icons/MobileScreenButton.js';
107
+ import MoneyBill from '../Components/Icons/MoneyBill.js';
108
+ import MoneyBillWave from '../Components/Icons/MoneyBillWave.js';
109
+ import Mouth from '../Components/Icons/Mouth.js';
110
+ import Music from '../Components/Icons/Music.js';
111
+ import Na from '../Components/Icons/Na.js';
112
+ import NoLoop from '../Components/Icons/NoLoop.js';
113
+ import NoReorderRows from '../Components/Icons/NoReorderRows.js';
114
+ import ObjectGroupRegular from '../Components/Icons/ObjectGroupRegular.js';
115
+ import Pause from '../Components/Icons/Pause.js';
116
+ import Pdf from '../Components/Icons/Pdf.js';
117
+ import Pencil from '../Components/Icons/Pencil.js';
118
+ import Phone from '../Components/Icons/Phone.js';
119
+ import Play from '../Components/Icons/Play.js';
120
+ import Plus from '../Components/Icons/Plus.js';
121
+ import Presentation from '../Components/Icons/Presentation.js';
122
+ import Print from '../Components/Icons/Print.js';
123
+ import Question from '../Components/Icons/Question.js';
124
+ import Rate5x from '../Components/Icons/Rate-.5x.js';
125
+ import Rate25x from '../Components/Icons/Rate-.25x.js';
126
+ import Rate75x from '../Components/Icons/Rate-.75x.js';
127
+ import Rate15x from '../Components/Icons/Rate-1.5x.js';
128
+ import Rate125x from '../Components/Icons/Rate-1.25x.js';
129
+ import Rate175x from '../Components/Icons/Rate-1.75x.js';
130
+ import Rate1x from '../Components/Icons/Rate-1x.js';
131
+ import Rate2x from '../Components/Icons/Rate-2x.js';
132
+ import RateIcon5x from '../Components/Icons/RateIcon-.5x.js';
133
+ import RateIcon25x from '../Components/Icons/RateIcon-.25x.js';
134
+ import RateIcon75x from '../Components/Icons/RateIcon-.75x.js';
135
+ import RateIcon15x from '../Components/Icons/RateIcon-1.5x.js';
136
+ import RateIcon125x from '../Components/Icons/RateIcon-1.25x.js';
137
+ import RateIcon175x from '../Components/Icons/RateIcon-1.75x.js';
138
+ import RateIcon1x from '../Components/Icons/RateIcon-1x.js';
139
+ import RateIcon2x from '../Components/Icons/RateIcon-2x.js';
140
+ import RectangleXmark from '../Components/Icons/RectangleXmark.js';
141
+ import RectangleXmarkRegular from '../Components/Icons/RectangleXmarkRegular.js';
142
+ import ReorderRows from '../Components/Icons/ReorderRows.js';
143
+ import RightFromBracket from '../Components/Icons/RightFromBracket.js';
144
+ import RightToBracket from '../Components/Icons/RightToBracket.js';
145
+ import Rotate from '../Components/Icons/Rotate.js';
146
+ import RotateLeft from '../Components/Icons/RotateLeft.js';
147
+ import RotateRight from '../Components/Icons/RotateRight.js';
148
+ import ScrewdriverWrench from '../Components/Icons/ScrewdriverWrench.js';
149
+ import Scroll from '../Components/Icons/Scroll.js';
150
+ import Share from '../Components/Icons/Share.js';
151
+ import Shop from '../Components/Icons/Shop.js';
152
+ import SideBySide from '../Components/Icons/SideBySide.js';
153
+ import SortDown from '../Components/Icons/SortDown.js';
154
+ import SortUp from '../Components/Icons/SortUp.js';
155
+ import Square from '../Components/Icons/Square.js';
156
+ import SquareCheck from '../Components/Icons/SquareCheck.js';
157
+ import SquareCheckRegular from '../Components/Icons/SquareCheckRegular.js';
158
+ import SquareMinus from '../Components/Icons/SquareMinus.js';
159
+ import SquareRegular from '../Components/Icons/SquareRegular.js';
160
+ import Store from '../Components/Icons/Store.js';
161
+ import ThumbsDown from '../Components/Icons/ThumbsDown.js';
162
+ import ThumbsDownRegular from '../Components/Icons/ThumbsDownRegular.js';
163
+ import ThumbsUp from '../Components/Icons/ThumbsUp.js';
164
+ import ThumbsUpRegular from '../Components/Icons/ThumbsUpRegular.js';
165
+ import Trash from '../Components/Icons/Trash.js';
166
+ import TrashCan from '../Components/Icons/TrashCan.js';
167
+ import TriangleExclamation from '../Components/Icons/TriangleExclamation.js';
168
+ import Truck from '../Components/Icons/Truck.js';
169
+ import TruckFast from '../Components/Icons/TruckFast.js';
170
+ import User from '../Components/Icons/User.js';
171
+ import UserGroup from '../Components/Icons/UserGroup.js';
172
+ import UserPlus from '../Components/Icons/UserPlus.js';
173
+ import UserSecret from '../Components/Icons/UserSecret.js';
174
+ import Video from '../Components/Icons/Video.js';
175
+ import X from '../Components/Icons/X.js';
176
+ import Xmark from '../Components/Icons/Xmark.js';
177
+
5
178
  // import AccordionGridPanel from '../Components/Panel/AccordionGridPanel.js';
6
179
  import ArrayCheckboxGroup from './Form/Field/Checkbox/ArrayCheckboxGroup.js';
7
180
  import ArrayCombo from './Form/Field/Combo/ArrayCombo.js';
@@ -53,6 +226,179 @@ import YearsCombo from './Form/Field/Combo/YearsCombo.js';
53
226
  import _ from 'lodash';
54
227
 
55
228
  const components = {
229
+ AddressBook,
230
+ Alt,
231
+ AngleLeft,
232
+ AngleRight,
233
+ AnglesLeft,
234
+ AnglesRight,
235
+ Asterisk,
236
+ Ban,
237
+ Bars,
238
+ BarsStaggered,
239
+ BigCircle,
240
+ Book,
241
+ Bookmark,
242
+ BookOpen,
243
+ Bug,
244
+ Building,
245
+ Calendar,
246
+ Calendar2,
247
+ CalendarDays,
248
+ Camera,
249
+ CaretDown,
250
+ CaretUp,
251
+ CartPlus,
252
+ CartShopping,
253
+ CashRegister,
254
+ Certificate,
255
+ ChartLine,
256
+ ChartPie,
257
+ Check,
258
+ CheckDouble,
259
+ ChevronDown,
260
+ ChevronLeft,
261
+ ChevronRight,
262
+ ChevronUp,
263
+ Circle,
264
+ CircleArrowRight,
265
+ CircleExclamation,
266
+ CircleInfo,
267
+ CircleQuestion,
268
+ CircleXmark,
269
+ CircleXmarkRegular,
270
+ Clipboard,
271
+ ClipboardCheck,
272
+ ClipboardList,
273
+ Clock,
274
+ ClockRegular,
275
+ ClockRotateLeft,
276
+ Clone,
277
+ Collapse,
278
+ Comment,
279
+ CommentRegular,
280
+ Comments,
281
+ CommentsRegular,
282
+ Copyright,
283
+ Dot,
284
+ Duplicate,
285
+ Edit,
286
+ EllipsisVertical,
287
+ Envelope,
288
+ EnvelopeRegular,
289
+ Excel,
290
+ Exclamation,
291
+ Expand,
292
+ Eye,
293
+ EyeSlash,
294
+ File,
295
+ FloppyDiskRegular,
296
+ Folder,
297
+ FolderClosed,
298
+ FolderOpen,
299
+ FolderTree,
300
+ FullWidth,
301
+ Gauge,
302
+ Gear,
303
+ Gears,
304
+ Gift,
305
+ Grip,
306
+ GripLines,
307
+ GripLinesVertical,
308
+ GripVertical,
309
+ Hammer,
310
+ Hand,
311
+ HighPriority,
312
+ House,
313
+ Images,
314
+ Info,
315
+ ItunesNote,
316
+ Leaf,
317
+ List,
318
+ ListCheck,
319
+ LocationDot,
320
+ Loop,
321
+ Loop1,
322
+ LoopAll,
323
+ LowPriority,
324
+ MagnifyingGlass,
325
+ Maximize,
326
+ MedPriority,
327
+ Microphone,
328
+ Minimize,
329
+ Minus,
330
+ MobileScreenButton,
331
+ MoneyBill,
332
+ MoneyBillWave,
333
+ Mouth,
334
+ Music,
335
+ Na,
336
+ NoLoop,
337
+ NoReorderRows,
338
+ ObjectGroupRegular,
339
+ Pause,
340
+ Pdf,
341
+ Pencil,
342
+ Phone,
343
+ Play,
344
+ Plus,
345
+ Presentation,
346
+ Print,
347
+ Question,
348
+ Rate5x,
349
+ Rate25x,
350
+ Rate75x,
351
+ Rate15x,
352
+ Rate125x,
353
+ Rate175x,
354
+ Rate1x,
355
+ Rate2x,
356
+ RateIcon5x,
357
+ RateIcon25x,
358
+ RateIcon75x,
359
+ RateIcon15x,
360
+ RateIcon125x,
361
+ RateIcon175x,
362
+ RateIcon1x,
363
+ RateIcon2x,
364
+ RectangleXmark,
365
+ RectangleXmarkRegular,
366
+ ReorderRows,
367
+ RightFromBracket,
368
+ RightToBracket,
369
+ Rotate,
370
+ RotateLeft,
371
+ RotateRight,
372
+ ScrewdriverWrench,
373
+ Scroll,
374
+ Share,
375
+ Shop,
376
+ SideBySide,
377
+ SortDown,
378
+ SortUp,
379
+ Square,
380
+ SquareCheck,
381
+ SquareCheckRegular,
382
+ SquareMinus,
383
+ SquareRegular,
384
+ Store,
385
+ ThumbsDown,
386
+ ThumbsDownRegular,
387
+ ThumbsUp,
388
+ ThumbsUpRegular,
389
+ Trash,
390
+ TrashCan,
391
+ TriangleExclamation,
392
+ Truck,
393
+ TruckFast,
394
+ User,
395
+ UserGroup,
396
+ UserPlus,
397
+ UserSecret,
398
+ Video,
399
+ X,
400
+ Xmark,
401
+
56
402
  // AccordionGridPanel,
57
403
  ArrayCheckboxGroup,
58
404
  ArrayCombo,