@steroidsjs/bootstrap 3.0.30 → 3.0.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/content/Accordion/AccordionItemView.js +0 -1
  2. package/content/Accordion/AccordionItemView.scss +56 -7
  3. package/content/Accordion/AccordionView.scss +2 -0
  4. package/content/Calendar/CalendarView.js +8 -3
  5. package/content/Calendar/CalendarView.scss +2 -2
  6. package/form/CheckboxListField/CheckboxListFieldView.js +1 -1
  7. package/form/DateRangeField/DateRangeFieldView.js +10 -1
  8. package/form/DateRangeField/DateRangeFieldView.scss +54 -0
  9. package/form/DateRangeField/views/RangeButtons/RangeButtons.d.ts +11 -0
  10. package/form/DateRangeField/views/RangeButtons/RangeButtons.js +60 -0
  11. package/form/DateRangeField/views/RangeButtons/RangeButtons.scss +126 -0
  12. package/form/DateRangeField/views/RangeButtons/consts.d.ts +34 -0
  13. package/form/DateRangeField/views/RangeButtons/consts.js +71 -0
  14. package/form/DateRangeField/views/RangeButtons/index.d.ts +2 -0
  15. package/form/DateRangeField/views/RangeButtons/index.js +7 -0
  16. package/form/DateRangeField/views/RangeButtons/utils.d.ts +14 -0
  17. package/form/DateRangeField/views/RangeButtons/utils.js +36 -0
  18. package/form/DateTimeRangeField/DateTimeRangeFieldView.js +12 -3
  19. package/form/DateTimeRangeField/DateTimeRangeFieldView.scss +54 -0
  20. package/form/DropDownField/DropDownFieldView.js +54 -35
  21. package/form/DropDownField/DropDownFieldView.scss +57 -45
  22. package/form/InputField/InputFieldView.js +4 -4
  23. package/form/InputField/InputFieldView.scss +128 -174
  24. package/form/RadioField/RadioFieldView.d.ts +2 -2
  25. package/form/RadioListField/RadioListFieldView.d.ts +2 -2
  26. package/form/RadioListField/RadioListFieldView.js +1 -1
  27. package/form/SwitcherField/SwitcherFieldView.d.ts +2 -2
  28. package/form/SwitcherField/SwitcherFieldView.js +17 -35
  29. package/form/SwitcherField/SwitcherFieldView.scss +63 -69
  30. package/form/SwitcherListField/SwitcherListFieldView.d.ts +3 -0
  31. package/form/SwitcherListField/SwitcherListFieldView.js +54 -0
  32. package/form/SwitcherListField/SwitcherListFieldView.scss +9 -0
  33. package/hooks/index.d.ts +2 -0
  34. package/hooks/index.js +8 -0
  35. package/hooks/useHideScroll.d.ts +1 -0
  36. package/hooks/useHideScroll.js +37 -0
  37. package/icons/index.js +2 -0
  38. package/icons/svgs/long-arrow-alt-down.svg +3 -0
  39. package/icons/svgs/long-arrow-alt-up.svg +3 -0
  40. package/index.d.ts +3 -0
  41. package/index.js +3 -0
  42. package/index.scss +1 -0
  43. package/list/Grid/GridView.js +2 -3
  44. package/list/Grid/GridView.scss +46 -0
  45. package/modal/Modal/ModalView.js +3 -1
  46. package/modal/Modal/ModalView.scss +0 -5
  47. package/package.json +2 -2
  48. package/scss/normalize.scss +5 -0
@@ -44,13 +44,22 @@ var Icon_1 = __importDefault(require("@steroidsjs/core/ui/content/Icon"));
44
44
  var DropDown_1 = __importDefault(require("@steroidsjs/core/ui/content/DropDown"));
45
45
  var Calendar_1 = __importDefault(require("@steroidsjs/core/ui/content/Calendar"));
46
46
  var TimePanelView_1 = __importDefault(require("../TimeField/TimePanelView"));
47
+ var RangeButtons_1 = __importDefault(require("../DateRangeField/views/RangeButtons"));
47
48
  function DateTimeRangeFieldView(props) {
48
49
  var bem = (0, hooks_1.useBem)('DateTimeRangeFieldView');
49
50
  var hasValue = props.inputPropsFrom.value || props.inputPropsTo.value;
50
- var renderCalendar = (0, react_1.useCallback)(function () { return (React.createElement("div", { className: bem.element('panel-container') },
51
- React.createElement(Calendar_1["default"], __assign({}, props.calendarProps, { className: bem.element('calendar') })),
51
+ var calendarComponent = React.useMemo(function () { return (React.createElement("div", { className: bem.element('panel-container') },
52
+ React.createElement(Calendar_1["default"], __assign({}, props.calendarProps, { className: bem.element('calendar'), showTodayButton: !props.withRangeButtons })),
52
53
  React.createElement("div", { className: bem.element('separator') }),
53
- React.createElement(TimePanelView_1["default"], __assign({}, props.timePanelViewProps, { className: bem.element('time-panel') })))); }, [bem, props.calendarProps, props.timePanelViewProps]);
54
+ React.createElement(TimePanelView_1["default"], __assign({}, props.timePanelViewProps, { className: bem.element('time-panel') })))); }, [bem, props.calendarProps, props.timePanelViewProps, props.withRangeButtons]);
55
+ var renderCalendar = (0, react_1.useCallback)(function () { return (props.withRangeButtons ? (React.createElement("div", { className: bem.element('calendar-wrapper', {
56
+ position: props.rangeButtonsPosition
57
+ }) },
58
+ React.createElement("div", { className: bem.element('additional-buttons') },
59
+ React.createElement(RangeButtons_1["default"], { config: props.withRangeButtons, changeTo: props.inputPropsTo.onChange, changeFrom: props.inputPropsFrom.onChange, position: props.rangeButtonsPosition, format: props.displayFormat })),
60
+ React.createElement("div", { className: bem.element('calendar') }, calendarComponent)))
61
+ : calendarComponent); }, [bem, calendarComponent, props.inputPropsFrom.onChange, props.inputPropsTo.onChange,
62
+ props.rangeButtonsPosition, props.displayFormat, props.withRangeButtons]);
54
63
  return (React.createElement(DropDown_1["default"], { content: renderCalendar, position: 'bottomLeft', visible: props.isOpened, onClose: props.onClose, hasArrow: false, className: bem.element('dropdown') },
55
64
  React.createElement("div", { className: bem(bem.block({
56
65
  disabled: props.disabled,
@@ -2,6 +2,26 @@
2
2
  @use "../../scss/variables";
3
3
  @use '../../scss/mixins';
4
4
 
5
+ $positions: (
6
+ top: (
7
+ direction: column,
8
+ responsive: top
9
+ ),
10
+ bottom: (
11
+ direction: column-reverse,
12
+ responsive: bottom
13
+ ),
14
+ left: (
15
+ direction: row,
16
+ responsive: left
17
+ ),
18
+ right: (
19
+ direction: row-reverse,
20
+ responsive: right
21
+ )
22
+ );
23
+
24
+ $all-directions: top, bottom, left, right;
5
25
 
6
26
  .DateTimeRangeFieldView {
7
27
  $root: &;
@@ -44,4 +64,38 @@
44
64
  @include mixins.calendar-border();
45
65
  background-color: variables.$element-background-color;
46
66
  }
67
+
68
+ &__calendar-wrapper {
69
+ display: flex;
70
+ width: min-content;
71
+
72
+ &_position {
73
+ @each $pos, $config in $positions {
74
+ &_#{$pos} {
75
+ flex-direction: map-get($config, direction);
76
+ align-items: center;
77
+
78
+ @media (max-width: variables.$tablet-width) {
79
+ flex-direction: map-get($config, responsive);
80
+ align-items: center;
81
+ }
82
+ }
83
+ }
84
+ @each $dir1 in $all-directions {
85
+ @each $dir2 in $all-directions {
86
+ @if $dir1 != $dir2 {
87
+ &_#{$dir1}-#{$dir2} {
88
+ flex-direction: map-get(map-get($positions, $dir1), direction);
89
+ align-items: center;
90
+
91
+ @media (max-width: variables.$tablet-width) {
92
+ flex-direction: map-get(map-get($positions, $dir2), direction);
93
+ align-items: center;
94
+ }
95
+ }
96
+ }
97
+ }
98
+ }
99
+ }
100
+ }
47
101
  }
@@ -38,54 +38,73 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
38
38
  };
39
39
  exports.__esModule = true;
40
40
  var React = __importStar(require("react"));
41
- var react_1 = require("react");
42
41
  var hooks_1 = require("@steroidsjs/core/hooks");
43
42
  var Icon_1 = __importDefault(require("@steroidsjs/core/ui/content/Icon"));
43
+ var content_1 = require("@steroidsjs/core/ui/content");
44
44
  var utils_1 = require("./utils");
45
45
  function DropDownFieldView(props) {
46
46
  var _a;
47
47
  var bem = (0, hooks_1.useBem)('DropDownFieldView');
48
- // Auto focus on search
49
- (0, react_1.useEffect)(function () {
50
- var _a;
51
- if (props.isSearchAutoFocus && props.isAutoComplete && props.isOpened && ((_a = props.forwardedInputRef) === null || _a === void 0 ? void 0 : _a.current)) {
52
- props.forwardedInputRef.current.focus();
48
+ var onClose = props.onClose;
49
+ var setFocusOnAutoCompleteInput = React.useCallback(function (isComponentVisible) {
50
+ if (isComponentVisible && props.autoCompleteInputForwardedRef.current && props.isSearchAutoFocus) {
51
+ props.autoCompleteInputForwardedRef.current.focus();
53
52
  }
54
- }, [props.forwardedInputRef, props.isAutoComplete, props.isOpened, props.isSearchAutoFocus]);
53
+ }, [props.autoCompleteInputForwardedRef, props.isSearchAutoFocus]);
55
54
  var renderPlaceholder = React.useCallback(function () {
56
55
  var _a;
57
56
  return props.placeholder && !((_a = props.selectedIds) === null || _a === void 0 ? void 0 : _a.length)
58
57
  ? (React.createElement("div", { className: bem.element('placeholder') }, props.placeholder))
59
58
  : null;
60
59
  }, [bem, props.placeholder, props.selectedIds]);
61
- return (React.createElement("div", { ref: props.forwardedRef, className: bem(bem.block((_a = {
60
+ var fieldRef = React.useRef(null);
61
+ var menuWidth = React.useMemo(function () {
62
+ if (!fieldRef.current) {
63
+ return 0;
64
+ }
65
+ return fieldRef.current.getBoundingClientRect().width;
66
+ // Отключена проверка, т.к. необходимо пересчитывать ширину меню, когда меняется fieldRef.current
67
+ // eslint-disable-next-line react-hooks/exhaustive-deps
68
+ }, [fieldRef.current, props.isOpened]);
69
+ var renderList = React.useCallback(function () { return (React.createElement("div", { className: bem.element('drop-down'), style: {
70
+ '--width': menuWidth + 'px',
71
+ '--maxHeight': props.maxHeight
72
+ } },
73
+ props.isAutoComplete && (React.createElement("div", { className: bem.element('search', {
62
74
  size: props.size
63
- },
64
- _a["".concat(props.color)] = !!props.color && !props.outline,
65
- _a["outline_".concat(props.color)] = props.outline,
66
- _a.opened = props.isOpened,
67
- _a['is-invalid'] = !!props.errors,
68
- _a.disabled = props.disabled,
69
- _a)), props.className), onKeyPress: function (e) { return e.key === 'Enter' && !props.disabled && props.onOpen(); }, style: props.style, role: "button", tabIndex: 0 },
70
- React.createElement("div", { className: bem.element('selected-items', {
71
- reset: props.showReset
72
- }), onClick: props.onOpen, tabIndex: -1, role: 'button' },
73
- renderPlaceholder(),
74
- React.createElement("span", { className: bem.element('selected-items') }, props.showEllipses
75
- ? (0, utils_1.getSelectedItemsLabel)(props.selectedItems)
76
- : (0, utils_1.getSelectedItemsCount)(props.selectedItems))),
77
- props.showReset && props.selectedIds.length > 0 && (React.createElement(Icon_1["default"], { name: "cross_8x8", className: bem.element('icon-close'), tabIndex: -1, onClick: props.onReset, "aria-label": __('Сбросить') })),
78
- React.createElement(Icon_1["default"], { name: 'arrow_down_24x24', className: bem.element('icon-chevron'), tabIndex: -1, onClick: props.onOpen }),
79
- props.isOpened && (React.createElement("div", { className: bem.element('drop-down') },
80
- props.isAutoComplete && (React.createElement("div", { className: bem.element('search', {
81
- size: props.size
82
- }) },
83
- React.createElement(Icon_1["default"], { name: 'search', className: bem.element('search-icon') }),
84
- React.createElement("input", __assign({}, props.searchInputProps, { ref: props.forwardedInputRef, onChange: function (e) { return props.searchInputProps.onChange(e.target.value); }, className: bem(bem.element('search-input'), props.searchInputProps.className) })))),
85
- React.createElement("div", { className: bem.element('drop-down-list') },
86
- props.multiple
87
- && props.itemToSelectAll
88
- && props.renderItem(props.itemToSelectAll),
89
- props.items.map(function (item) { return props.renderItem(item); }))))));
75
+ }) },
76
+ React.createElement(Icon_1["default"], { name: 'search', className: bem.element('search-icon') }),
77
+ React.createElement("input", __assign({}, props.searchInputProps, { ref: props.autoCompleteInputForwardedRef, onChange: function (e) { return props.searchInputProps.onChange(e.target.value); }, className: bem(bem.element('search-input'), props.searchInputProps.className) })))),
78
+ React.createElement("div", { className: bem.element('drop-down-list') },
79
+ props.multiple
80
+ && props.itemToSelectAll
81
+ && props.renderItem(props.itemToSelectAll),
82
+ props.items.map(function (item) { return props.renderItem(item); })))); }, [bem, menuWidth, props]);
83
+ var closeIfOpened = React.useCallback(function () {
84
+ if (props.isOpened) {
85
+ onClose();
86
+ }
87
+ }, [onClose, props.isOpened]);
88
+ return (React.createElement(content_1.DropDown, __assign({ content: renderList, onVisibleChange: setFocusOnAutoCompleteInput, visible: props.isOpened, onClose: onClose, hasArrow: false, className: bem.element('wrapper') }, props.dropDownProps),
89
+ React.createElement("div", null,
90
+ React.createElement("div", { className: bem(bem.block((_a = {
91
+ size: props.size
92
+ },
93
+ _a["".concat(props.color)] = !!props.color && !props.outline,
94
+ _a["outline_".concat(props.color)] = props.outline,
95
+ _a.opened = props.isOpened,
96
+ _a['is-invalid'] = !!props.errors,
97
+ _a.disabled = props.disabled,
98
+ _a)), props.className), onKeyPress: function (e) { return e.key === 'Enter' && !props.disabled && props.onOpen(); }, style: props.style, role: "button", tabIndex: 0, onClick: closeIfOpened, ref: fieldRef },
99
+ React.createElement("div", { className: bem.element('selected-items', {
100
+ reset: props.showReset
101
+ }), onClick: props.onOpen, tabIndex: -1, role: 'button' },
102
+ renderPlaceholder(),
103
+ React.createElement("span", { className: bem.element('selected-items') }, props.showEllipses
104
+ ? (0, utils_1.getSelectedItemsLabel)(props.selectedItems)
105
+ : (0, utils_1.getSelectedItemsCount)(props.selectedItems)),
106
+ React.createElement("input", { className: bem.element('input'), ref: props.inputRef })),
107
+ props.showReset && props.selectedIds.length > 0 && (React.createElement(Icon_1["default"], { name: "cross_8x8", className: bem.element('icon-close'), tabIndex: -1, onClick: props.onReset, "aria-label": __('Сбросить') })),
108
+ React.createElement(Icon_1["default"], { name: 'arrow_down_24x24', className: bem.element('icon-chevron'), tabIndex: -1, onClick: props.onOpen })))));
90
109
  }
91
110
  exports["default"] = DropDownFieldView;
@@ -9,13 +9,13 @@
9
9
  --chevron-background-color: #ffffff;
10
10
  --chevron-background-color-outline: #f5f8fa;
11
11
  --chevron-inner-color: #323232;
12
- --drop-down-border-color: #e9e9e9;
13
- --search-color: #626262;
14
- --search-background-color: #f5f8fa;
15
- --search-hover-background-color: #eef1f2;
16
12
 
17
13
  --drop-down-item-hover-background-color: #f5f8fa;
18
14
  --drop-down-item-select-background-color: #eef1f2;
15
+ --drop-down-border-color: #e9e9e9;
16
+ --search-background-color: #f5f8fa;
17
+ --search-hover-background-color: #eef1f2;
18
+ --search-color: #626262;
19
19
  }
20
20
 
21
21
  html[data-theme="dark"] {
@@ -25,13 +25,13 @@ html[data-theme="dark"] {
25
25
  --chevron-background-color: #16171b;
26
26
  --chevron-background-color-outline: #191b1f;
27
27
  --chevron-inner-color: #ffffff;
28
- --drop-down-border-color: #595959;
29
- --search-color: #adacac;
30
- --search-background-color: #4e4f57;
31
- --search-hover-background-color: #5b5c6b;
32
28
 
33
29
  --drop-down-item-select-background-color: #5b5c6b;
34
30
  --drop-down-item-hover-background-color: #4e4f57;
31
+ --drop-down-border-color: #595959;
32
+ --search-background-color: #4e4f57;
33
+ --search-hover-background-color: #5b5c6b;
34
+ --search-color: #adacac;
35
35
  }
36
36
 
37
37
  $basic-color: var(--basic-color);
@@ -40,13 +40,13 @@ $basic-active-color: var(--basic-active-color);
40
40
  $chevron-background-color: var(--chevron-background-color);
41
41
  $chevron-background-color-outline: var(--chevron-background-color-outline);
42
42
  $chevron-inner-color: var(--chevron-inner-color);
43
- $drop-down-border-color: var(--drop-down-border-color);
44
- $search-color: var(--search-color);
45
- $search-background-color: var(--search-background-color);
46
- $search-hover-background-color: var(--search-hover-background-color);
47
43
 
48
44
  $drop-down-item-select-background-color: var(--drop-down-item-select-background-color);
49
45
  $drop-down-item-hover-background-color: var(--drop-down-item-hover-background-color);
46
+ $drop-down-border-color: var(--drop-down-border-color);
47
+ $search-background-color: var(--search-background-color);
48
+ $search-hover-background-color: var(--search-hover-background-color);
49
+ $search-color: var(--search-color);
50
50
 
51
51
  $drop-down-color-themes: () !default;
52
52
  $drop-down-color-themes: map.merge(
@@ -291,48 +291,20 @@ $drop-down-color-themes: map.merge(
291
291
  }
292
292
  }
293
293
 
294
- &__selected-items {
295
- position: absolute;
296
- width: calc(100% - 29px);
297
- height: 100%;
298
- top: 0;
299
- left: 0;
300
- overflow: hidden;
301
- padding-left: 8px;
302
- outline: none;
303
-
304
- text-overflow: ellipsis;
305
- white-space: nowrap;
306
- overflow: hidden;
307
- }
308
-
309
294
  &__drop-down {
310
- position: absolute;
311
- z-index: 2;
312
- width: 100%;
295
+ width: var(--width);
296
+ max-height: var(--maxHeight);
313
297
  height: fit-content;
314
- top: calc(100% + 8px);
315
- left: 0;
316
-
298
+
317
299
  background-color: variables.$element-background-color;
318
-
319
- border: 1px solid $drop-down-border-color;
300
+
320
301
  overflow: hidden;
321
- border-radius: 12px;
322
-
302
+
323
303
  &-list {
324
304
  @include mixins.scrollWrapper(240px, 0, variables.$scroll-thumb-color, variables.$scroll-track-color);
325
305
  }
326
306
  }
327
307
 
328
- &_opened {
329
- #{$root}__icon-chevron {
330
- svg {
331
- transform: rotate(180deg);
332
- }
333
- }
334
- }
335
-
336
308
  &__search {
337
309
  width: 100%;
338
310
  padding: 9px;
@@ -402,6 +374,29 @@ $drop-down-color-themes: map.merge(
402
374
  }
403
375
  }
404
376
 
377
+ &__selected-items {
378
+ position: absolute;
379
+ width: calc(100% - 29px);
380
+ height: 100%;
381
+ top: 0;
382
+ left: 0;
383
+ overflow: hidden;
384
+ padding-left: 8px;
385
+ outline: none;
386
+
387
+ text-overflow: ellipsis;
388
+ white-space: nowrap;
389
+ overflow: hidden;
390
+ }
391
+
392
+ &_opened {
393
+ #{$root}__icon-chevron {
394
+ svg {
395
+ transform: rotate(180deg);
396
+ }
397
+ }
398
+ }
399
+
405
400
  &__placeholder {
406
401
  text-overflow: ellipsis;
407
402
  white-space: nowrap;
@@ -435,4 +430,21 @@ $drop-down-color-themes: map.merge(
435
430
  border-color: transparent;
436
431
  pointer-events: none;
437
432
  }
433
+
434
+ &__input {
435
+ position: absolute;
436
+ width: 100%;
437
+ height: 100%;
438
+ top: 0;
439
+ left: 0;
440
+ opacity: 0;
441
+ cursor: default;
442
+ pointer-events: none;
443
+ user-select: none;
444
+ }
445
+ &__wrapper {
446
+ padding: unset;
447
+ overflow: hidden;
448
+ min-width: unset;
449
+ }
438
450
  }
@@ -58,9 +58,9 @@ function InputFieldView(props) {
58
58
  hasTextAddonBefore: !!props.textBefore,
59
59
  hasTextAddonAfter: !!props.textAfter
60
60
  }), props.className), style: props.style },
61
- props.addonBefore && (React.createElement("span", { className: bem.element('addon-before') }, props.addonBefore)),
62
61
  props.textBefore && (React.createElement("span", { className: bem.element('text-before') }, props.textBefore)),
63
62
  React.createElement("div", { className: bem.element('input-wrapper') },
63
+ props.addonBefore && (React.createElement("span", { className: bem.element('addon-before') }, props.addonBefore)),
64
64
  props.leadIcon && (0, renderIcon_1["default"])(props.leadIcon, {
65
65
  className: bem.element('lead-icon'),
66
66
  tabIndex: -1
@@ -72,8 +72,8 @@ function InputFieldView(props) {
72
72
  : (React.createElement("input", __assign({ className: bem(bem.element('input', {
73
73
  size: props.size
74
74
  })) }, props.inputProps, { type: props.inputProps.type, placeholder: props.placeholder, disabled: props.disabled, required: props.required, id: props.id, ref: props.inputRef }))),
75
- !props.disabled && props.showClear && !props.maskProps && !!props.inputProps.value && (React.createElement(Icon_1["default"], { name: 'cross_8x8', className: bem.element('icon-clear'), tabIndex: -1, onClick: props.onClear }))),
76
- props.textAfter && (React.createElement("span", { className: bem.element('text-after') }, props.textAfter)),
77
- props.addonAfter && (React.createElement("span", { className: bem.element('addon-after') }, props.addonAfter))));
75
+ !props.disabled && props.showClear && !props.maskProps && !!props.inputProps.value && (React.createElement(Icon_1["default"], { name: 'cross_8x8', className: bem.element('icon-clear'), tabIndex: -1, onClick: props.onClear })),
76
+ props.addonAfter && (React.createElement("span", { className: bem.element('addon-after') }, props.addonAfter))),
77
+ props.textAfter && (React.createElement("span", { className: bem.element('text-after') }, props.textAfter))));
78
78
  }
79
79
  exports["default"] = InputFieldView;