@king-design/react 2.0.14 → 2.0.16

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.
@@ -1,6 +1,6 @@
1
- import React, {createRef, useState} from 'react';
1
+ import React, {createRef, useState, useEffect} from 'react';
2
2
  import * as ReactDOM from 'react-dom';
3
- import {Drawer, Card, Button} from '../../';
3
+ import {Drawer, Card, Button, Select, Option} from '../../';
4
4
  import {Component} from 'intact-react';
5
5
  import {getElement, wait, dispatchEvent} from '../../../../test/utils';
6
6
 
@@ -79,4 +79,28 @@ describe('Drawer', () => {
79
79
  await wait();
80
80
  expect(click3.callCount).to.eql(1);
81
81
  });
82
+
83
+ it('$update call before mountedQueue in $receive', async () => {
84
+ function App() {
85
+ const [state, setState] = useState(false);
86
+ useEffect(() => {
87
+ setState(true);
88
+ }, []);
89
+ return <Drawer value={true} mode="destroy">
90
+ <div>
91
+ <Card>
92
+ <div>react element</div>
93
+ <Select container={parentElement => parentElement.closest('.k-dialog-body')!}>
94
+ {state ? <Option value="1">1</Option> : null}
95
+ </Select>
96
+ </Card>
97
+ </div>
98
+ </Drawer>
99
+ }
100
+
101
+ ReactDOM.render(<App />, container);
102
+
103
+ await wait();
104
+ expect(document.querySelector<HTMLElement>('.k-dialog-body .k-select-menu')!.textContent).to.eql('1');
105
+ });
82
106
  });
@@ -7,6 +7,7 @@ export interface ColorpickerProps {
7
7
  size?: Sizes;
8
8
  disabled?: boolean;
9
9
  container?: Container;
10
+ show?: boolean;
10
11
  }
11
12
  export interface ColorpickerEvents {
12
13
  }
@@ -10,7 +10,8 @@ var typeDefs = {
10
10
  presets: Array,
11
11
  size: sizes,
12
12
  disabled: Boolean,
13
- container: [Function, String]
13
+ container: [Function, String],
14
+ show: Boolean
14
15
  };
15
16
 
16
17
  var defaults = function defaults() {
@@ -48,7 +48,11 @@ export default function ($props, $blocks, $__proto__) {
48
48
  },
49
49
  'value': $this.get('value')
50
50
  })
51
- })]
51
+ })],
52
+ 'ev-$model:value': function ev$modelValue($v) {
53
+ $this.set('show', $v);
54
+ },
55
+ 'value': $this.get('show')
52
56
  }));
53
57
  }
54
58
  ;
@@ -15,7 +15,9 @@ export default function ($props, $blocks, $__proto__) {
15
15
  hideIcon = _this$get.hideIcon,
16
16
  hideFooter = _this$get.hideFooter,
17
17
  hideClose = _this$get.hideClose,
18
- title = _this$get.title;
18
+ title = _this$get.title,
19
+ iconClassName = _this$get.iconClassName,
20
+ icon = _this$get.icon;
19
21
 
20
22
  var classNameObj = (_classNameObj = {
21
23
  'k-alert-dialog': true
@@ -37,14 +39,14 @@ export default function ($props, $blocks, $__proto__) {
37
39
 
38
40
  return block ? block.call($this, callBlock, data) : callBlock();
39
41
  }), (_$blocks['body'] = function ($super) {
40
- return [_$ce(2, 'div', !hideIcon ? _$cc(Icon, {
41
- 'className': _$cn({
42
+ return [_$ce(2, 'div', [!hideIcon && !icon ? _$cc(Icon, {
43
+ 'className': _$cn(iconClassName || {
42
44
  "ion-ios-checkmark": type === 'success',
43
45
  "ion-ios-information": type === 'warning',
44
46
  "ion-ios-close": type === 'error',
45
47
  "ion-ios-help": type === 'confirm'
46
48
  })
47
- }) : undefined, 0, 'k-dialog-tip-icon'), _$ce(2, 'div', [title ? _$ce(2, 'div', title, 0, 'k-alert-dialog-title') : undefined, content], 0, 'k-alert-dialog-wrapper')];
49
+ }) : undefined, icon], 0, 'k-dialog-tip-icon'), _$ce(2, 'div', [title ? _$ce(2, 'div', title, 0, 'k-alert-dialog-title') : undefined, content], 0, 'k-alert-dialog-wrapper')];
48
50
  }, __$blocks['body'] = function ($super, data) {
49
51
  var block = $blocks['body'];
50
52
 
@@ -7,7 +7,7 @@ import _asyncToGenerator from "@babel/runtime-corejs3/helpers/asyncToGenerator";
7
7
 
8
8
  function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof _Symbol !== "undefined" && _getIteratorMethod(o) || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
9
9
 
10
- function _unsupportedIterableToArray(o, minLen) { var _context16; if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = _sliceInstanceProperty(_context16 = Object.prototype.toString.call(o)).call(_context16, 8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return _Array$from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
10
+ function _unsupportedIterableToArray(o, minLen) { var _context18; if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = _sliceInstanceProperty(_context18 = Object.prototype.toString.call(o)).call(_context18, 8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return _Array$from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
11
11
 
12
12
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
13
13
 
@@ -15,8 +15,10 @@ import _concatInstanceProperty from "@babel/runtime-corejs3/core-js/instance/con
15
15
  import _keysInstanceProperty from "@babel/runtime-corejs3/core-js/instance/keys";
16
16
  import _startsWithInstanceProperty from "@babel/runtime-corejs3/core-js/instance/starts-with";
17
17
  import _regeneratorRuntime from "@babel/runtime-corejs3/regenerator";
18
+ import { __decorate } from "tslib";
18
19
  import { Component } from 'intact-react';
19
20
  import { Dialog, BaseDialog } from './';
21
+ import { bind } from '../utils';
20
22
  import { getElement, mount, unmount, dispatchEvent, wait } from '../../test/utils';
21
23
  import BasicDemo from '~/components/dialog/demos/basic';
22
24
  import AsyncCloseDemo from '~/components/dialog/demos/asyncClose';
@@ -590,6 +592,64 @@ describe('Dialog', function () {
590
592
  }
591
593
  }
592
594
  }, _callee12);
595
+ })));
596
+ it('should remove body style when destroy', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee13() {
597
+ var Demo, _mount13, instance, element;
598
+
599
+ return _regeneratorRuntime.wrap(function _callee13$(_context17) {
600
+ while (1) {
601
+ switch (_context17.prev = _context17.next) {
602
+ case 0:
603
+ Demo = /*#__PURE__*/function (_Component4) {
604
+ _inheritsLoose(Demo, _Component4);
605
+
606
+ function Demo() {
607
+ var _context16;
608
+
609
+ var _this4;
610
+
611
+ for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
612
+ args[_key4] = arguments[_key4];
613
+ }
614
+
615
+ _this4 = _Component4.call.apply(_Component4, _concatInstanceProperty(_context16 = [this]).call(_context16, args)) || this;
616
+ _this4.Dialog = Dialog;
617
+ return _this4;
618
+ }
619
+
620
+ Demo.defaults = function defaults() {
621
+ return {
622
+ show: true
623
+ };
624
+ };
625
+
626
+ var _proto = Demo.prototype;
627
+
628
+ _proto.onClose = function onClose() {
629
+ this.set('show', false);
630
+ };
631
+
632
+ return Demo;
633
+ }(Component);
634
+
635
+ Demo.template = "\n var Dialog = this.Dialog;\n <div>\n <Dialog v-if={this.get('show')}\n value={this.get('show')}\n ev-close={this.onClose}\n ref=\"dialog\"\n >test</Dialog>\n </div>\n ";
636
+
637
+ __decorate([bind], Demo.prototype, "onClose", null);
638
+
639
+ _mount13 = mount(Demo), instance = _mount13[0], element = _mount13[1];
640
+ instance.refs.dialog.close();
641
+ _context17.next = 7;
642
+ return wait();
643
+
644
+ case 7:
645
+ expect(document.body.getAttribute('style')).to.be.null;
646
+
647
+ case 8:
648
+ case "end":
649
+ return _context17.stop();
650
+ }
651
+ }
652
+ }, _callee13);
593
653
  }))); // it('should handle v-if and v-model at the same time correctly in Vue', async () => {
594
654
  // const Test = {
595
655
  // template: `<Dialog v-model="show" v-if="show" ref="dialog">test</Dialog>`,
@@ -1,11 +1,13 @@
1
- import { VNode } from 'intact-react';
2
1
  import type { Dialog, DialogProps } from './';
3
2
  export interface AlertDialogProps extends DialogProps {
4
- content?: string | VNode;
3
+ content?: string | object;
5
4
  type?: 'success' | 'warning' | 'error' | 'confirm';
6
5
  hideIcon?: boolean;
7
6
  hideFooter?: boolean;
8
7
  ref?: (i: Dialog) => void;
8
+ className?: string;
9
+ iconClassName?: string;
10
+ icon?: object;
9
11
  }
10
12
  export declare type StaticMethod = (options?: AlertDialogProps) => Promise<void>;
11
13
  export declare function addStaticMethods(Component: typeof Dialog): void;
@@ -29,6 +29,22 @@ export function addStaticMethods(Component) {
29
29
  options = {};
30
30
  }
31
31
 
32
+ var normalize = Component.normalize;
33
+
34
+ if (normalize) {
35
+ if (options.content) {
36
+ options = _extends({}, options, {
37
+ content: normalize(options.content)
38
+ });
39
+ }
40
+
41
+ if (options.icon) {
42
+ options = _extends({}, options, {
43
+ icon: normalize(options.icon)
44
+ });
45
+ }
46
+ }
47
+
32
48
  var dialog = new AlertDialog(options);
33
49
  dialog.show();
34
50
  if (options.ref) options.ref(dialog);
@@ -11,7 +11,9 @@ export function useFixBody(elementRef) {
11
11
  instance.on(SHOW, onEnter);
12
12
  instance.on('afterClose', onAfterLeave);
13
13
  onBeforeUnmount(function () {
14
- if (fixedBody && instance.get('value')) {
14
+ // should also remove body style when dialog is removed, #805
15
+ // if (fixedBody && instance.get('value')) {
16
+ if (fixedBody) {
15
17
  // maybe HIDE event has not triggered
16
18
  onClosed(instance);
17
19
  }
@@ -13,6 +13,8 @@ export interface PaginationProps {
13
13
  showTotal?: boolean;
14
14
  showGoto?: boolean;
15
15
  showLimits?: boolean;
16
+ disableBtn?: (page: number, limit: number) => boolean;
17
+ disablePage?: (page: number, limit: number) => boolean;
16
18
  }
17
19
  export interface PaginationEvents {
18
20
  change: [PaginationChangeData];
@@ -16,7 +16,9 @@ var typeDefs = {
16
16
  simple: Boolean,
17
17
  showTotal: Boolean,
18
18
  showGoto: Boolean,
19
- showLimits: Boolean
19
+ showLimits: Boolean,
20
+ disableBtn: Function,
21
+ disablePage: Function
20
22
  };
21
23
 
22
24
  var defaults = function defaults() {
@@ -141,7 +143,16 @@ export var Pagination = /*#__PURE__*/function (_Component) {
141
143
  };
142
144
 
143
145
  _proto.goto = function goto(e) {
146
+ var _this$get4 = this.get(),
147
+ disablePage = _this$get4.disablePage,
148
+ limit = _this$get4.limit;
149
+
144
150
  var value = parseInt(e.target.value) || 1;
151
+
152
+ if (disablePage && disablePage(value, limit)) {
153
+ return;
154
+ }
155
+
145
156
  this.changePage(value);
146
157
  };
147
158
 
@@ -3,6 +3,7 @@ import _regeneratorRuntime from "@babel/runtime-corejs3/regenerator";
3
3
  import BasicDemo from '~/components/pagination/demos/basic';
4
4
  import GotoDemo from '~/components/pagination/demos/goto';
5
5
  import CurrentDemo from '~/components/pagination/demos/current';
6
+ import DisableDemo from '~/components/pagination/demos/disable';
6
7
  import { mount, unmount, dispatchEvent, wait } from '../../test/utils';
7
8
  describe('Pagination', function () {
8
9
  afterEach(function () {
@@ -141,4 +142,31 @@ describe('Pagination', function () {
141
142
  }
142
143
  }, _callee3);
143
144
  })));
145
+ it('should not goto disabled page', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
146
+ var _mount4, instance, element, input;
147
+
148
+ return _regeneratorRuntime.wrap(function _callee4$(_context4) {
149
+ while (1) {
150
+ switch (_context4.prev = _context4.next) {
151
+ case 0:
152
+ _mount4 = mount(DisableDemo), instance = _mount4[0], element = _mount4[1];
153
+ input = element.querySelector('.k-input-inner');
154
+ dispatchEvent(input, 'focus');
155
+ input.value = '11';
156
+ dispatchEvent(input, 'change');
157
+ dispatchEvent(input, 'blur');
158
+ _context4.next = 8;
159
+ return wait();
160
+
161
+ case 8:
162
+ expect(input.value).to.eql('10');
163
+ expect(instance.get('value2')).to.eql(10);
164
+
165
+ case 10:
166
+ case "end":
167
+ return _context4.stop();
168
+ }
169
+ }
170
+ }, _callee4);
171
+ })));
144
172
  });
@@ -32,7 +32,9 @@ export default function ($props, $blocks, $__proto__) {
32
32
  value = _this$get.value,
33
33
  limit = _this$get.limit,
34
34
  limits = _this$get.limits,
35
- showLimits = _this$get.showLimits;
35
+ showLimits = _this$get.showLimits,
36
+ disableBtn = _this$get.disableBtn,
37
+ disablePage = _this$get.disablePage;
36
38
 
37
39
  if (!total) return _$ccv(' pagination ');
38
40
  var classNameObj = (_classNameObj = {
@@ -47,11 +49,24 @@ export default function ($props, $blocks, $__proto__) {
47
49
  var totalPages = Math.ceil(total / limit) || 0;
48
50
 
49
51
  var paginationButton = function paginationButton(page) {
52
+ var disabled = false;
53
+
54
+ if (page !== value) {
55
+ if (disablePage) {
56
+ disabled || (disabled = !!disablePage(page, limit));
57
+ }
58
+
59
+ if (disableBtn) {
60
+ disabled || (disabled = !!disableBtn(page, limit));
61
+ }
62
+ }
63
+
50
64
  return _$cc(Button, {
51
65
  'type': type,
52
66
  'size': size,
53
67
  'icon': true,
54
68
  'value': page,
69
+ 'disabled': disabled,
55
70
  'children': page
56
71
  });
57
72
  };
@@ -131,14 +146,14 @@ export default function ($props, $blocks, $__proto__) {
131
146
  'icon': true,
132
147
  'size': size,
133
148
  'type': type,
134
- 'disabled': value <= 1,
149
+ 'disabled': value <= 1 || !!(disablePage && disablePage(value - 1, limit)),
135
150
  'ev-click': this.prev,
136
151
  'children': _$cc(Icon, _$tmp0)
137
152
  }), paginationItems, _$cc(Button, {
138
153
  'icon': true,
139
154
  'size': size,
140
155
  'type': type,
141
- 'disabled': value >= totalPages,
156
+ 'disabled': value >= totalPages || !!(disablePage && disablePage(value + 1, limit)),
142
157
  'ev-click': this.next,
143
158
  'children': _$cc(Icon, _$tmp1)
144
159
  })],
@@ -55,7 +55,7 @@ setDefault(function () {
55
55
  }).pagination;
56
56
  });
57
57
  export function makeStyles() {
58
- return /*#__PURE__*/css("font-size:", pagination.fontSize, ";.k-pagination-limits,.k-pagination-goto,.k-pagination-total{margin-left:", pagination.gap, ";display:inline-block;vertical-align:middle;}.k-pagination-ellipsis{background-color:transparent;border-color:transparent;}.k-btns{.k-btn{width:auto!important;min-width:", button.height, ";padding:", pagination.btn.padding, ";margin-right:", pagination.btn.gap, ";&:last-of-type{margin:0!important;}}.k-icon{font-size:18px;}}.k-pagination-goto{.k-input{font-size:inherit;width:", pagination.goto.width, ";margin:", pagination.goto.gap, ";}}.k-select{width:auto;}", _mapInstanceProperty(sizes).call(sizes, function (size) {
58
+ return /*#__PURE__*/css("font-size:", pagination.fontSize, ";.k-pagination-limits,.k-pagination-goto,.k-pagination-total{margin-left:", pagination.gap, ";display:inline-block;vertical-align:middle;}.k-pagination-ellipsis{background-color:transparent;border-color:transparent;}.k-btns{.k-btn{width:auto!important;min-width:", button.height, ";padding:", pagination.btn.padding, ";margin-right:", pagination.btn.gap, ";&:last-of-type{margin:0!important;}}.k-icon{font-size:18px;}}.k-pagination-goto{.k-input{font-size:inherit;width:", pagination.goto.width, ";margin:", pagination.goto.gap, ";}.k-input-inner{text-align:center;}}.k-select{width:auto;}", _mapInstanceProperty(sizes).call(sizes, function (size) {
59
59
  var styles = pagination[size];
60
60
  var btnStyles = button[size];
61
61
  return /*#__PURE__*/css("&.k-", size, "{font-size:", styles.fontSize, ";.k-btn{margin-right:", styles.btnGap, ";min-width:", btnStyles.height, ";.k-icon{font-size:", styles.iconFontSize, ";}}}");
@@ -60,25 +60,37 @@ export var Portal = /*#__PURE__*/function (_Component) {
60
60
  };
61
61
 
62
62
  _proto.$update = function $update(lastVNode, nextVNode, parentDom, anchor, mountedQueue, force) {
63
+ var _this3 = this;
64
+
63
65
  // update container if it has changed
64
66
  var lastProps = lastVNode.props;
65
67
  var nextProps = nextVNode.props;
66
- var lastContainer = this.container;
67
68
 
68
- if (lastProps.container !== nextProps.container) {
69
- this.initContainer(nextProps.container, parentDom, anchor);
70
- }
69
+ var update = function update() {
70
+ var lastContainer = _this3.container;
71
+
72
+ if (lastProps.container !== nextProps.container) {
73
+ _this3.initContainer(nextProps.container, parentDom, anchor);
74
+ }
75
+
76
+ var nextContainer = _this3.container;
71
77
 
72
- var nextContainer = this.container;
78
+ if (lastContainer === nextContainer) {
79
+ patch(lastProps.children, nextProps.children, nextContainer, _this3, _this3.$SVG, anchor, mountedQueue, false);
80
+ } else {
81
+ remove(lastProps.children, lastContainer, false);
82
+ mount(nextProps.children, nextContainer, _this3, _this3.$SVG, anchor, mountedQueue);
83
+ }
84
+
85
+ _Component.prototype.$update.call(_this3, lastVNode, nextVNode, parentDom, anchor, mountedQueue, force);
86
+ };
73
87
 
74
- if (lastContainer === nextContainer) {
75
- patch(lastProps.children, nextProps.children, nextContainer, this, this.$SVG, anchor, mountedQueue, false);
88
+ if (!this.container) {
89
+ // in react, sometimes $update will be called before mountedQueue in $render
90
+ mountedQueue.push(update);
76
91
  } else {
77
- remove(lastProps.children, lastContainer, false);
78
- mount(nextProps.children, nextContainer, this, this.$SVG, anchor, mountedQueue);
92
+ update();
79
93
  }
80
-
81
- _Component.prototype.$update.call(this, lastVNode, nextVNode, parentDom, anchor, mountedQueue, force);
82
94
  };
83
95
 
84
96
  _proto.$unmount = function $unmount(vNode, nextVNode) {
@@ -1,5 +1,5 @@
1
1
  import _sortInstanceProperty from "@babel/runtime-corejs3/core-js/instance/sort";
2
- import { createUnknownComponentVNode as _$cc, createElementVNode as _$ce, noop as _$no, className as _$cn, map as _$ma } from 'intact-react';
2
+ import { createUnknownComponentVNode as _$cc, createElementVNode as _$ce, noop as _$no, className as _$cn, extend as _$ex, EMPTY_OBJ as _$em, map as _$ma } from 'intact-react';
3
3
  import { getClassAndStyleForFixed } from './useFixedColumns';
4
4
  import { Dropdown, DropdownMenu, DropdownItem } from '../dropdown';
5
5
  import { Button } from '../button';
@@ -14,13 +14,18 @@ import { context as TableContext } from './useColumns';
14
14
  import { context as ResizableContext } from './useResizable';
15
15
  import { context as FixedColumnsContext } from './useFixedColumns';
16
16
  import { stopPropagation } from '../utils';
17
+ import { Input } from '../input';
18
+ import { _$ } from '../../i18n';
17
19
  var _$tmp0 = {
18
20
  'className': 'ion-android-arrow-dropdown'
19
21
  };
20
22
  var _$tmp1 = {
21
- 'className': 'ion-android-arrow-dropup k-asc'
23
+ 'className': 'ion-ios-search'
22
24
  };
23
25
  var _$tmp2 = {
26
+ 'className': 'ion-android-arrow-dropup k-asc'
27
+ };
28
+ var _$tmp3 = {
24
29
  'className': 'ion-android-arrow-dropdown k-desc'
25
30
  };
26
31
  export default function ($props, $blocks, $__proto__) {
@@ -45,7 +50,9 @@ export default function ($props, $blocks, $__proto__) {
45
50
  var _this$group = this.group,
46
51
  onSelect = _this$group.onSelect,
47
52
  isChecked = _this$group.isChecked,
48
- getGroupText = _this$group.getGroupText;
53
+ getGroupText = _this$group.getGroupText,
54
+ keywords = _this$group.keywords,
55
+ filteredGroup = _this$group.filteredGroup;
49
56
  return _$cc(TableContext.Consumer, {
50
57
  'children': function children(checkType) {
51
58
  return _$cc(GroupContext.Consumer, {
@@ -98,17 +105,46 @@ export default function ($props, $blocks, $__proto__) {
98
105
  collision: 'flipfit'
99
106
  },
100
107
  'key': 'dropdown',
108
+ 'trigger': 'click',
109
+ 'ev-show': function evShow() {
110
+ return keywords.set('');
111
+ },
101
112
  'children': [_$cc(Button, {
102
113
  'icon': true,
103
114
  'size': 'mini',
104
115
  'className': 'k-table-group',
105
- 'ev-click': stopPropagation,
116
+ 'ev-click': function evClick(e) {
117
+ return e._ignoreSortable = true;
118
+ },
106
119
  'children': _$cc(Icon, _$tmp0)
107
120
  }), _$cc(DropdownMenu, {
108
121
  'className': _$cn((_$cn2 = {
109
122
  "k-table-group-dropdown": true
110
123
  }, _$cn2[makeGroupMenuStyles()] = true, _$cn2)),
111
- 'children': _$ma(group, function ($value, $key) {
124
+ 'children': [_$ce(2, 'div', _$cc(Input, {
125
+ 'size': 'small',
126
+ 'fluid': true,
127
+ 'placeholder': _$('请输入关键字'),
128
+ 'value': keywords.value,
129
+ 'ev-$change:value': keywords.set,
130
+ 'clearable': true,
131
+ '$blocks': function ($blocks) {
132
+ var _$blocks = {},
133
+ __$blocks = _$ex({}, $blocks);
134
+
135
+ return (_$blocks['suffix'] = function ($super) {
136
+ return _$cc(Icon, _$tmp1);
137
+ }, __$blocks['suffix'] = function ($super, data) {
138
+ var block = $blocks['suffix'];
139
+
140
+ var callBlock = function callBlock() {
141
+ return _$blocks['suffix'].call($this, $super, data);
142
+ };
143
+
144
+ return block ? block.call($this, callBlock, data) : callBlock();
145
+ }), __$blocks;
146
+ }.call($this, _$em)
147
+ }), 2, 'k-table-group-header'), _$ce(2, 'div', _$ma(filteredGroup.value, function ($value, $key) {
112
148
  return _$cc(DropdownItem, {
113
149
  'ev-select': function evSelect() {
114
150
  return onSelect($value.value, groupValue, onChange);
@@ -122,9 +158,9 @@ export default function ($props, $blocks, $__proto__) {
122
158
  'children': $value.label
123
159
  }) : _$ce(2, 'span', $value.label, 0)
124
160
  });
125
- }, $this)
161
+ }, $this), 4, 'k-table-group-body')]
126
162
  })]
127
- }, 'dropdown') : undefined, sortable ? _$ce(2, 'div', [_$cc(Icon, _$tmp1), _$cc(Icon, _$tmp2)], 4, _$cn((_$cn3 = {
163
+ }, 'dropdown') : undefined, sortable ? _$ce(2, 'div', [_$cc(Icon, _$tmp2), _$cc(Icon, _$tmp3)], 4, _$cn((_$cn3 = {
128
164
  'k-column-sort': true
129
165
  }, _$cn3["k-" + type] = type, _$cn3))) : undefined], 0, 'k-table-title')], 0, _$cn(classNameObj), {
130
166
  'style': style,
@@ -352,7 +352,7 @@ describe('Table', function () {
352
352
  _instance$refs4 = instance.refs, __test1 = _instance$refs4.__test1, __test2 = _instance$refs4.__test2;
353
353
  _element$querySelecto8 = element.querySelectorAll('.k-table'), table1 = _element$querySelecto8[0], table2 = _element$querySelecto8[1];
354
354
  icon = table1.querySelector('.k-table-group');
355
- dispatchEvent(icon, 'mouseenter');
355
+ dispatchEvent(icon, 'click');
356
356
  _context7.next = 7;
357
357
  return wait();
358
358
 
@@ -370,7 +370,7 @@ describe('Table', function () {
370
370
  });
371
371
  expect(table1.innerHTML).to.matchSnapshot();
372
372
  icon2 = table2.querySelector('.k-table-group');
373
- dispatchEvent(icon2, 'mouseenter');
373
+ dispatchEvent(icon2, 'click');
374
374
  _context7.next = 19;
375
375
  return wait();
376
376
 
@@ -53,6 +53,12 @@ var defaults = {
53
53
 
54
54
  get activeColor() {
55
55
  return theme.color.primary;
56
+ },
57
+
58
+ headerPadding: "8px",
59
+
60
+ get headerBorder() {
61
+ return "1px solid " + theme.color.bg;
56
62
  }
57
63
 
58
64
  },
@@ -89,5 +95,5 @@ export function makeStyles() {
89
95
  }), ";");
90
96
  }
91
97
  export function makeGroupMenuStyles() {
92
- return /*#__PURE__*/css("max-height:", table.group.menuMaxHeight, ";overflow:auto;.k-dropdown-item.k-active{color:", table.group.activeColor, ";}");
98
+ return /*#__PURE__*/css("max-height:", table.group.menuMaxHeight, ";overflow:auto;.k-dropdown-item.k-active{color:", table.group.activeColor, ";}.k-table-group-header{padding:", table.group.headerPadding, ";border-bottom:", table.group.headerBorder, ";}");
93
99
  }
@@ -1,3 +1,4 @@
1
+ import type { TableColumnGroupItem } from './column';
1
2
  declare type ContextValue = {
2
3
  groupValue: any;
3
4
  onChange: (key: string, groupValue: any) => void;
@@ -10,5 +11,7 @@ export declare function useGroup(): {
10
11
  onSelect: (value: any, groupValue: any, onChange: ContextValue['onChange']) => void;
11
12
  isChecked: (value: any, groupValue: any) => any;
12
13
  getGroupText: (groupValue: any) => string | null;
14
+ keywords: import("../../hooks/useState").State<string>;
15
+ filteredGroup: import("../../hooks/useState").State<TableColumnGroupItem[] | undefined>;
13
16
  };
14
17
  export {};
@@ -1,13 +1,17 @@
1
1
  import _includesInstanceProperty from "@babel/runtime-corejs3/core-js/instance/includes";
2
2
  import _mapInstanceProperty from "@babel/runtime-corejs3/core-js/instance/map";
3
3
  import _filterInstanceProperty from "@babel/runtime-corejs3/core-js/instance/filter";
4
+ import _trimInstanceProperty from "@babel/runtime-corejs3/core-js/instance/trim";
4
5
  import { useInstance } from 'intact-react';
5
6
  import { isNullOrUndefined } from 'intact-shared';
6
7
  import { toggleArray } from '../utils';
7
8
  import { createContext } from '../context';
9
+ import { useState, watchState } from '../../hooks/useState';
8
10
  export var context = createContext();
9
11
  export function useGroup() {
10
12
  var instance = useInstance();
13
+ var keywords = useState('');
14
+ var filteredGroup = useState(instance.get('group'));
11
15
 
12
16
  function onSelect(value, groupValue, onChange) {
13
17
  var _instance$get = instance.get(),
@@ -60,9 +64,28 @@ export function useGroup() {
60
64
  return null;
61
65
  }
62
66
 
67
+ watchState(keywords, function (v) {
68
+ var _instance$get4 = instance.get(),
69
+ _instance$get4$group = _instance$get4.group,
70
+ group = _instance$get4$group === void 0 ? [] : _instance$get4$group;
71
+
72
+ v = _trimInstanceProperty(v).call(v);
73
+
74
+ if (!v) {
75
+ filteredGroup.set(group);
76
+ } else {
77
+ filteredGroup.set(_filterInstanceProperty(group).call(group, function (item) {
78
+ var _context2, _context3;
79
+
80
+ return _includesInstanceProperty(_context2 = String(item.label)).call(_context2, v) || _includesInstanceProperty(_context3 = String(item.value)).call(_context3, v);
81
+ }));
82
+ }
83
+ });
63
84
  return {
64
85
  onSelect: onSelect,
65
86
  isChecked: isChecked,
66
- getGroupText: getGroupText
87
+ getGroupText: getGroupText,
88
+ keywords: keywords,
89
+ filteredGroup: filteredGroup
67
90
  };
68
91
  }
@@ -3,5 +3,7 @@ export declare const context: {
3
3
  Consumer: import("intact").ComponentConstructor<import("intact").Component<import("../context").ConsumerProps<any>, {}, {}, {}>>;
4
4
  };
5
5
  export declare function useSortable(): {
6
- onChange: (key: string) => void;
6
+ onChange: (key: string, event: Event & {
7
+ _ignoreSortable?: boolean;
8
+ }) => void;
7
9
  };
@@ -8,7 +8,10 @@ export function useSortable() {
8
8
 
9
9
  var count = 0;
10
10
 
11
- function onChange(key) {
11
+ function onChange(key, event) {
12
+ // ignore when click group dropdown menu
13
+ if (event._ignoreSortable) return;
14
+
12
15
  var sort = _extends({}, instance.get('sort'));
13
16
 
14
17
  if (sort.key === key) {