@progress/kendo-react-spreadsheet 5.14.0-dev.202305151331

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 (119) hide show
  1. package/LICENSE.md +11 -0
  2. package/NOTICE.txt +117 -0
  3. package/README.md +46 -0
  4. package/about.md +3 -0
  5. package/dist/cdn/js/kendo-react-spreadsheet.js +1 -0
  6. package/dist/es/FormulaInput.d.ts +5 -0
  7. package/dist/es/FormulaInput.js +116 -0
  8. package/dist/es/List.d.ts +5 -0
  9. package/dist/es/List.js +17 -0
  10. package/dist/es/NameBox.d.ts +5 -0
  11. package/dist/es/NameBox.js +88 -0
  12. package/dist/es/SheetsBar.d.ts +5 -0
  13. package/dist/es/SheetsBar.js +233 -0
  14. package/dist/es/Spreadsheet.d.ts +3 -0
  15. package/dist/es/Spreadsheet.js +206 -0
  16. package/dist/es/SpreadsheetProps.d.ts +104 -0
  17. package/dist/es/SpreadsheetProps.js +1 -0
  18. package/dist/es/main.d.ts +3 -0
  19. package/dist/es/main.js +2 -0
  20. package/dist/es/messages.d.ts +76 -0
  21. package/dist/es/messages.js +208 -0
  22. package/dist/es/package-metadata.d.ts +5 -0
  23. package/dist/es/package-metadata.js +11 -0
  24. package/dist/es/tools/align.d.ts +9 -0
  25. package/dist/es/tools/align.js +39 -0
  26. package/dist/es/tools/backgroundColor.d.ts +5 -0
  27. package/dist/es/tools/backgroundColor.js +12 -0
  28. package/dist/es/tools/bold.d.ts +5 -0
  29. package/dist/es/tools/bold.js +5 -0
  30. package/dist/es/tools/defaultTools.d.ts +2 -0
  31. package/dist/es/tools/defaultTools.js +42 -0
  32. package/dist/es/tools/export.d.ts +5 -0
  33. package/dist/es/tools/export.js +16 -0
  34. package/dist/es/tools/fontFamily.d.ts +5 -0
  35. package/dist/es/tools/fontFamily.js +18 -0
  36. package/dist/es/tools/fontSize.d.ts +5 -0
  37. package/dist/es/tools/fontSize.js +20 -0
  38. package/dist/es/tools/format.d.ts +5 -0
  39. package/dist/es/tools/format.js +23 -0
  40. package/dist/es/tools/gridLines.d.ts +6 -0
  41. package/dist/es/tools/gridLines.js +22 -0
  42. package/dist/es/tools/index.d.ts +17 -0
  43. package/dist/es/tools/index.js +17 -0
  44. package/dist/es/tools/italic.d.ts +5 -0
  45. package/dist/es/tools/italic.js +5 -0
  46. package/dist/es/tools/open.d.ts +5 -0
  47. package/dist/es/tools/open.js +33 -0
  48. package/dist/es/tools/redo.d.ts +5 -0
  49. package/dist/es/tools/redo.js +5 -0
  50. package/dist/es/tools/tableTools.d.ts +20 -0
  51. package/dist/es/tools/tableTools.js +72 -0
  52. package/dist/es/tools/textColor.d.ts +5 -0
  53. package/dist/es/tools/textColor.js +12 -0
  54. package/dist/es/tools/textWrap.d.ts +6 -0
  55. package/dist/es/tools/textWrap.js +23 -0
  56. package/dist/es/tools/underline.d.ts +5 -0
  57. package/dist/es/tools/underline.js +5 -0
  58. package/dist/es/tools/undo.d.ts +5 -0
  59. package/dist/es/tools/undo.js +5 -0
  60. package/dist/es/tools/utils.d.ts +79 -0
  61. package/dist/es/tools/utils.js +102 -0
  62. package/dist/npm/FormulaInput.d.ts +5 -0
  63. package/dist/npm/FormulaInput.js +119 -0
  64. package/dist/npm/List.d.ts +5 -0
  65. package/dist/npm/List.js +20 -0
  66. package/dist/npm/NameBox.d.ts +5 -0
  67. package/dist/npm/NameBox.js +91 -0
  68. package/dist/npm/SheetsBar.d.ts +5 -0
  69. package/dist/npm/SheetsBar.js +237 -0
  70. package/dist/npm/Spreadsheet.d.ts +3 -0
  71. package/dist/npm/Spreadsheet.js +209 -0
  72. package/dist/npm/SpreadsheetProps.d.ts +104 -0
  73. package/dist/npm/SpreadsheetProps.js +2 -0
  74. package/dist/npm/main.d.ts +3 -0
  75. package/dist/npm/main.js +20 -0
  76. package/dist/npm/messages.d.ts +76 -0
  77. package/dist/npm/messages.js +211 -0
  78. package/dist/npm/package-metadata.d.ts +5 -0
  79. package/dist/npm/package-metadata.js +14 -0
  80. package/dist/npm/tools/align.d.ts +9 -0
  81. package/dist/npm/tools/align.js +43 -0
  82. package/dist/npm/tools/backgroundColor.d.ts +5 -0
  83. package/dist/npm/tools/backgroundColor.js +15 -0
  84. package/dist/npm/tools/bold.d.ts +5 -0
  85. package/dist/npm/tools/bold.js +8 -0
  86. package/dist/npm/tools/defaultTools.d.ts +2 -0
  87. package/dist/npm/tools/defaultTools.js +45 -0
  88. package/dist/npm/tools/export.d.ts +5 -0
  89. package/dist/npm/tools/export.js +20 -0
  90. package/dist/npm/tools/fontFamily.d.ts +5 -0
  91. package/dist/npm/tools/fontFamily.js +22 -0
  92. package/dist/npm/tools/fontSize.d.ts +5 -0
  93. package/dist/npm/tools/fontSize.js +24 -0
  94. package/dist/npm/tools/format.d.ts +5 -0
  95. package/dist/npm/tools/format.js +27 -0
  96. package/dist/npm/tools/gridLines.d.ts +6 -0
  97. package/dist/npm/tools/gridLines.js +26 -0
  98. package/dist/npm/tools/index.d.ts +17 -0
  99. package/dist/npm/tools/index.js +33 -0
  100. package/dist/npm/tools/italic.d.ts +5 -0
  101. package/dist/npm/tools/italic.js +8 -0
  102. package/dist/npm/tools/open.d.ts +5 -0
  103. package/dist/npm/tools/open.js +37 -0
  104. package/dist/npm/tools/redo.d.ts +5 -0
  105. package/dist/npm/tools/redo.js +8 -0
  106. package/dist/npm/tools/tableTools.d.ts +20 -0
  107. package/dist/npm/tools/tableTools.js +75 -0
  108. package/dist/npm/tools/textColor.d.ts +5 -0
  109. package/dist/npm/tools/textColor.js +15 -0
  110. package/dist/npm/tools/textWrap.d.ts +6 -0
  111. package/dist/npm/tools/textWrap.js +27 -0
  112. package/dist/npm/tools/underline.d.ts +5 -0
  113. package/dist/npm/tools/underline.js +8 -0
  114. package/dist/npm/tools/undo.d.ts +5 -0
  115. package/dist/npm/tools/undo.js +8 -0
  116. package/dist/npm/tools/utils.d.ts +79 -0
  117. package/dist/npm/tools/utils.js +108 -0
  118. package/dist/systemjs/kendo-react-spreadsheet.js +1 -0
  119. package/package.json +78 -0
@@ -0,0 +1,102 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import * as React from 'react';
13
+ import { Button } from '@progress/kendo-react-buttons';
14
+ import { ColorPicker } from '@progress/kendo-react-inputs';
15
+ import { useLocalization } from '@progress/kendo-react-intl';
16
+ import { messages } from '../messages';
17
+ /**
18
+ * @hidden
19
+ */
20
+ export const FONT_FAMILIES = ['Arial', 'Courier New', 'Georgia', 'Times New Roman', 'Trebuchet MS', 'Verdana'];
21
+ /**
22
+ * @hidden
23
+ */
24
+ export const DEFAULT_FONT_FAMILY = 'Arial';
25
+ /**
26
+ * @hidden
27
+ */
28
+ export const FONT_SIZES = [8, 9, 10, 11, 12, 13, 14, 16, 18, 20, 22, 24, 26, 28, 36, 48, 72];
29
+ /**
30
+ * @hidden
31
+ */
32
+ export const DEFAULT_FONT_SIZE = 12;
33
+ /**
34
+ * @hidden
35
+ */
36
+ export const FORMATS = [
37
+ { text: 'Automatic', value: null },
38
+ { text: 'Text', value: '@' },
39
+ { text: 'Number', value: '#,0.00' },
40
+ { text: 'Percent', value: '0.00%' },
41
+ { text: 'Financial', value: '_("$"* #,##0.00_);_("$"* (#,##0.00);_("$"* "-"??_);_(@_)' },
42
+ { text: 'Currency', value: '$#,##0.00;[Red]$#,##0.00' },
43
+ { text: 'Date', value: 'm/d/yyyy' },
44
+ { text: 'Time', value: 'h:mm:ss AM/PM' },
45
+ { text: 'Date time', value: 'm/d/yyyy h:mm' },
46
+ { text: 'Duration', value: '[h]:mm:ss' }
47
+ ];
48
+ /**
49
+ * @hidden
50
+ */
51
+ export const PropertyChangeTool = (settings) => {
52
+ const tool = props => {
53
+ const { property, icon, svgIcon, titleKey } = settings;
54
+ const { spreadsheetRef, value: selected } = props;
55
+ const onClick = React.useCallback(() => {
56
+ if (spreadsheetRef.current) {
57
+ const value = !selected;
58
+ const options = {
59
+ command: 'PropertyChangeCommand', options: { property, value }
60
+ };
61
+ spreadsheetRef.current.executeCommand(options);
62
+ }
63
+ }, [selected]);
64
+ return (React.createElement(Button, { type: "button", icon: icon, svgIcon: svgIcon, togglable: true, onClick: onClick, selected: selected, title: useLocalization().toLanguageString(titleKey, messages[titleKey]) }));
65
+ };
66
+ return tool;
67
+ };
68
+ /**
69
+ * @hidden
70
+ */
71
+ export const ColorTool = (settings) => {
72
+ const tool = props => {
73
+ const { property, titleKey } = settings, colorPickerProps = __rest(settings, ["property", "titleKey"]);
74
+ const { spreadsheetRef, value } = props;
75
+ const onChange = React.useCallback((event) => {
76
+ if (spreadsheetRef.current) {
77
+ const options = {
78
+ command: 'PropertyChangeCommand', options: { property, value: event.value || null }
79
+ };
80
+ spreadsheetRef.current.executeCommand(options);
81
+ }
82
+ }, [property]);
83
+ return (React.createElement(ColorPicker, Object.assign({ onChange: onChange, onActiveColorClick: onChange }, colorPickerProps, { title: useLocalization().toLanguageString(titleKey, messages[titleKey]), value: value })));
84
+ };
85
+ return tool;
86
+ };
87
+ /**
88
+ * @hidden
89
+ */
90
+ export const UndoRedo = (settings) => {
91
+ const tool = props => {
92
+ const { spreadsheetRef } = props;
93
+ const onClick = React.useCallback(() => {
94
+ if (spreadsheetRef.current) {
95
+ const workbook = spreadsheetRef.current.workbook;
96
+ workbook.undoRedoStack[settings.action]();
97
+ }
98
+ }, []);
99
+ return (React.createElement(Button, { type: "button", fillMode: "flat", icon: settings.icon, svgIcon: settings.svgIcon, title: useLocalization().toLanguageString(settings.titleKey, messages[settings.titleKey]), onClick: onClick }));
100
+ };
101
+ return tool;
102
+ };
@@ -0,0 +1,5 @@
1
+ import * as React from 'react';
2
+ /**
3
+ * @hidden
4
+ */
5
+ export declare const FormulaInput: React.ForwardRefExoticComponent<Omit<any, "ref"> & React.RefAttributes<any>>;
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FormulaInput = void 0;
4
+ const React = require("react");
5
+ const kendo_react_popup_1 = require("@progress/kendo-react-popup");
6
+ const List_1 = require("./List");
7
+ const kendo_react_common_1 = require("@progress/kendo-react-common");
8
+ /**
9
+ * @hidden
10
+ */
11
+ exports.FormulaInput = React.forwardRef((props, ref) => {
12
+ const [showPopup, setShowPopup] = React.useState(false);
13
+ const [popupContentKey, setPopupContentKey] = React.useState(0);
14
+ const [data, setData] = React.useState([]);
15
+ const memo = React.useMemo(() => ({}), []);
16
+ memo.showPopup = showPopup;
17
+ memo.popupContentKey = popupContentKey;
18
+ memo.data = data;
19
+ const target = React.useRef(null);
20
+ const elementRef = React.useRef(null);
21
+ const listRef = React.useRef(null);
22
+ const focusedItem = React.useCallback(() => {
23
+ if (listRef.current && listRef.current.element) {
24
+ return listRef.current.element.querySelector('.k-focus');
25
+ }
26
+ }, []);
27
+ const unfocus = React.useCallback(() => {
28
+ const focused = focusedItem();
29
+ if (focused) {
30
+ focused.classList.remove('k-focus');
31
+ }
32
+ }, []);
33
+ const focusNext = React.useCallback((dir) => {
34
+ const items = Array.from((listRef.current && listRef.current.element.children) || []);
35
+ const focused = focusedItem();
36
+ let next;
37
+ if (focused) {
38
+ const index = items.indexOf(focused);
39
+ focused.classList.remove('k-focus');
40
+ next = items[index + dir] ? items[index + dir] : (dir === 1 ? items[0] : items[items.length - 1]);
41
+ }
42
+ else {
43
+ next = (dir === 1 ? items[0] : items[items.length - 1]);
44
+ }
45
+ if (next) {
46
+ next.classList.add('k-focus');
47
+ }
48
+ }, []);
49
+ React.useImperativeHandle(target, () => ({
50
+ element: elementRef.current,
51
+ props,
52
+ popup: {
53
+ open: () => {
54
+ setShowPopup(true);
55
+ },
56
+ close: () => {
57
+ setShowPopup(false);
58
+ },
59
+ position: () => {
60
+ setPopupContentKey(memo.popupContentKey + 1);
61
+ },
62
+ visible: () => {
63
+ return memo.showPopup;
64
+ }
65
+ },
66
+ list: {
67
+ get element() { return listRef.current && listRef.current.element; },
68
+ data: (d) => {
69
+ if (d) {
70
+ setData(d);
71
+ }
72
+ else {
73
+ return memo.data;
74
+ }
75
+ },
76
+ value: () => { return {}; },
77
+ focus: () => {
78
+ const items = Array.from((listRef.current && listRef.current.element && listRef.current.element.children) || []);
79
+ return items.indexOf(focusedItem());
80
+ },
81
+ // select: (x) => {
82
+ // console.log('select', x);
83
+ // },
84
+ focusNext: () => {
85
+ focusNext(1);
86
+ },
87
+ focusPrev: () => {
88
+ focusNext(-1);
89
+ },
90
+ focusFirst: () => {
91
+ const list = listRef.current && listRef.current.element;
92
+ if (list && list.children.item(0)) {
93
+ unfocus();
94
+ list.children.item(0).classList.add('k-focus');
95
+ }
96
+ },
97
+ focusLast: () => {
98
+ const list = listRef.current && listRef.current.element;
99
+ if (list && list.children.length) {
100
+ unfocus();
101
+ list.children.item(list.children.length - 1).classList.add('k-focus');
102
+ }
103
+ },
104
+ itemClick: (handler) => { memo.itemClick = handler; }
105
+ }
106
+ }), []);
107
+ React.useImperativeHandle(ref, () => target.current, []);
108
+ const onItemClick = React.useCallback((value) => {
109
+ if (memo.itemClick) {
110
+ memo.itemClick(value);
111
+ }
112
+ }, []);
113
+ return (React.createElement(React.Fragment, null,
114
+ React.createElement("div", { className: (0, kendo_react_common_1.classNames)('k-spreadsheet-formula-input', props.className), contentEditable: "true", spellCheck: "false", style: { whiteSpace: 'pre' }, ref: elementRef }),
115
+ React.createElement(kendo_react_popup_1.Popup, { show: showPopup, anchor: elementRef.current, animate: { openDuration: 100, closeDuration: 100 }, contentKey: popupContentKey },
116
+ React.createElement(List_1.List, { data: data, ref: listRef, onItemClick: onItemClick }))));
117
+ });
118
+ exports.FormulaInput.displayName = 'FormulaInput';
119
+ exports.FormulaInput.propTypes = {};
@@ -0,0 +1,5 @@
1
+ import * as React from 'react';
2
+ /**
3
+ * @hidden
4
+ */
5
+ export declare const List: React.ForwardRefExoticComponent<Omit<any, "ref"> & React.RefAttributes<any>>;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.List = void 0;
4
+ const React = require("react");
5
+ /**
6
+ * @hidden
7
+ */
8
+ exports.List = React.forwardRef((props, ref) => {
9
+ const target = React.useRef(null);
10
+ const ulRef = React.useRef(null);
11
+ React.useImperativeHandle(target, () => ({
12
+ element: ulRef.current,
13
+ props
14
+ }));
15
+ React.useImperativeHandle(ref, () => target.current);
16
+ return (React.createElement("ul", { ref: ulRef, className: "k-spreadsheet-formula-list k-list-ul k-popup k-group k-reset", onMouseDown: e => e.preventDefault() }, props.data.map((item) => (React.createElement("li", { key: item.text, className: "k-list-item", onClick: () => props.onItemClick(item.value) },
17
+ React.createElement("span", { className: "k-list-item-text" }, item.text))))));
18
+ });
19
+ exports.List.displayName = 'List';
20
+ exports.List.propTypes = {};
@@ -0,0 +1,5 @@
1
+ import * as React from 'react';
2
+ /**
3
+ * @hidden
4
+ */
5
+ export declare const NameBox: React.ForwardRefExoticComponent<Omit<any, "ref"> & React.RefAttributes<any>>;
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NameBox = void 0;
4
+ const React = require("react");
5
+ const kendo_react_dropdowns_1 = require("@progress/kendo-react-dropdowns");
6
+ const kendo_react_common_1 = require("@progress/kendo-react-common");
7
+ const kendo_svg_icons_1 = require("@progress/kendo-svg-icons");
8
+ const kendo_react_intl_1 = require("@progress/kendo-react-intl");
9
+ const messages_1 = require("./messages");
10
+ /**
11
+ * @hidden
12
+ */
13
+ exports.NameBox = React.forwardRef((props, ref) => {
14
+ const target = React.useRef(null);
15
+ const comboboxRef = React.useRef(null);
16
+ const [data, setData] = React.useState([]);
17
+ const [open, setOpen] = React.useState(false);
18
+ const [value, setValue] = React.useState('');
19
+ const memo = React.useMemo(() => ({}), []);
20
+ memo.data = data;
21
+ React.useImperativeHandle(target, () => ({
22
+ value: (val) => {
23
+ if (val === undefined) {
24
+ const item = comboboxRef.current && comboboxRef.current.value;
25
+ return item ? (item.name || item) : item;
26
+ }
27
+ else {
28
+ setValue(val || '');
29
+ }
30
+ }
31
+ }), []);
32
+ React.useImperativeHandle(ref, () => target.current, []);
33
+ const onDelete = React.useCallback((name) => {
34
+ const editor = props.nameEditor();
35
+ if (editor) {
36
+ editor.trigger('delete', { name });
37
+ }
38
+ }, []);
39
+ const itemRender = React.useCallback((li, itemProps) => {
40
+ const itemChildren = (React.createElement(React.Fragment, null,
41
+ li.props.children,
42
+ React.createElement("span", { role: 'button', className: 'k-button-delete', onClick: () => onDelete(itemProps.dataItem[itemProps.textField]), onMouseDown: e => e.preventDefault(), onPointerDown: e => e.preventDefault(), "data-role": "delete" },
43
+ React.createElement(kendo_react_common_1.IconWrap, { name: 'x', icon: kendo_svg_icons_1.xIcon }))));
44
+ return React.cloneElement(li, li.props, itemChildren);
45
+ }, []);
46
+ const listNoDataRender = React.useCallback((el) => React.cloneElement(el, Object.assign({}, el.props), React.createElement("div", null)), []);
47
+ const onOpen = React.useCallback((event) => {
48
+ if (event.syntheticEvent && event.syntheticEvent.type === 'change') {
49
+ return;
50
+ }
51
+ const editor = props.nameEditor();
52
+ if (editor) {
53
+ setData(editor.readData());
54
+ setOpen(true);
55
+ }
56
+ }, []);
57
+ const onClose = React.useCallback(() => {
58
+ setOpen(false);
59
+ }, []);
60
+ const onChange = React.useCallback((event) => {
61
+ if (event.syntheticEvent.target.closest('[data-role]')) {
62
+ return;
63
+ }
64
+ const editor = props.nameEditor();
65
+ if (editor && event.value) {
66
+ editor.trigger('select', { name: event.value.name });
67
+ setValue(event.value.name);
68
+ }
69
+ }, []);
70
+ const onKeyDown = React.useCallback((event) => {
71
+ const editor = props.nameEditor();
72
+ if (editor) {
73
+ if (event.key === 'Enter') {
74
+ const name = event.target.value;
75
+ editor.trigger('enter', { value: name });
76
+ setValue(name);
77
+ }
78
+ else if (event.key === 'Escape') {
79
+ editor.trigger('cancel');
80
+ setValue(memo.prevValue);
81
+ }
82
+ }
83
+ }, []);
84
+ const onFocus = React.useCallback((event) => {
85
+ memo.prevValue = event.value.name;
86
+ }, []);
87
+ return (React.createElement("div", { className: "k-spreadsheet-name-editor", onKeyDown: onKeyDown },
88
+ React.createElement(kendo_react_dropdowns_1.ComboBox, { ref: comboboxRef, title: (0, kendo_react_intl_1.useLocalization)().toLanguageString(messages_1.keys.nameBox, messages_1.messages[messages_1.keys.nameBox]), popupSettings: { className: 'k-spreadsheet-names-popup' }, clearButton: false, dataItemKey: "name", textField: "name", itemRender: itemRender, data: data, value: value ? (data.find((d) => d.name === name) || { name: value }) : null, onChange: onChange, opened: open, onOpen: onOpen, onClose: onClose, onFocus: onFocus, listNoDataRender: listNoDataRender, allowCustom: true })));
89
+ });
90
+ exports.NameBox.displayName = 'NameBox';
91
+ exports.NameBox.propTypes = {};
@@ -0,0 +1,5 @@
1
+ /// <reference types="react" />
2
+ /**
3
+ * @hidden
4
+ */
5
+ export declare const SheetsBar: (props: any) => JSX.Element;
@@ -0,0 +1,237 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.SheetsBar = void 0;
15
+ const React = require("react");
16
+ const kendo_react_buttons_1 = require("@progress/kendo-react-buttons");
17
+ const kendo_react_common_1 = require("@progress/kendo-react-common");
18
+ const kendo_react_sortable_1 = require("@progress/kendo-react-sortable");
19
+ const kendo_svg_icons_1 = require("@progress/kendo-svg-icons");
20
+ const kendo_react_intl_1 = require("@progress/kendo-react-intl");
21
+ const messages_1 = require("./messages");
22
+ const contextDefaultValue = {
23
+ onSelect: (() => { }),
24
+ onDelete: (() => { }),
25
+ onEnterEdit: (() => { }),
26
+ onCancelEdit: (() => { }),
27
+ onExitEdit: (() => { }),
28
+ onEdit: (() => { })
29
+ };
30
+ const ItemsContext = React.createContext(contextDefaultValue);
31
+ const TabItem = (props) => {
32
+ const dataItem = props.dataItem;
33
+ const { onSelect, onDelete, onEnterEdit, onExitEdit, onCancelEdit, onEdit } = React.useContext(ItemsContext);
34
+ const onClick = React.useCallback((e) => {
35
+ if (e.target instanceof HTMLElement && e.target.nodeName === 'INPUT') {
36
+ return;
37
+ }
38
+ onSelect.call(undefined, dataItem, e);
39
+ }, [dataItem, onSelect]);
40
+ const onClickDelete = React.useCallback((e) => {
41
+ onDelete.call(undefined, dataItem, e);
42
+ }, [dataItem, onDelete]);
43
+ const onDoubleClick = React.useCallback((e) => {
44
+ if (e.target instanceof HTMLElement && e.target.nodeName === 'INPUT') {
45
+ return;
46
+ }
47
+ onEnterEdit.call(undefined, dataItem, e);
48
+ }, [dataItem, onEnterEdit]);
49
+ const onInputBlur = React.useCallback((e) => {
50
+ onExitEdit.call(undefined, dataItem, e);
51
+ }, [dataItem, onExitEdit]);
52
+ const onInputKeyDown = React.useCallback((e) => {
53
+ if (e.key === 'Enter') {
54
+ onExitEdit.call(undefined, dataItem, e);
55
+ }
56
+ else if (e.key === 'Escape') {
57
+ onCancelEdit.call(undefined, dataItem, e);
58
+ }
59
+ }, [dataItem, onExitEdit, onCancelEdit]);
60
+ const onInputChange = React.useCallback((e) => {
61
+ onEdit.call(undefined, Object.assign(Object.assign({}, dataItem), { text: e.target.value }), e);
62
+ }, [dataItem, onEdit]);
63
+ return (React.createElement("li", Object.assign({ style: props.style }, props.attributes, { ref: props.forwardRef, role: 'tab', className: (0, kendo_react_common_1.classNames)('k-item k-tabstrip-item', {
64
+ 'k-disabled': props.isDisabled,
65
+ 'k-active k-state-tab-on-top k-spreadsheet-sheets-bar-active': dataItem.active,
66
+ 'k-spreadsheet-sheets-bar-inactive': !dataItem.active,
67
+ 'k-first': dataItem.first,
68
+ 'k-last': dataItem.last
69
+ }), onClick: onClick, onDoubleClick: onDoubleClick }), dataItem.inEdit ? (React.createElement("input", { type: 'text', className: 'k-textbox k-spreadsheet-sheets-editor', value: dataItem.text, onChange: onInputChange, maxLength: 50, autoFocus: true, onBlur: onInputBlur, onKeyDown: onInputKeyDown })) : (React.createElement(React.Fragment, null,
70
+ React.createElement("span", { className: 'k-link' }, dataItem.text),
71
+ (dataItem.first && dataItem.last) ? null :
72
+ React.createElement("span", { className: "k-link k-spreadsheet-sheets-remove", onClick: onClickDelete },
73
+ React.createElement(kendo_react_common_1.IconWrap, { name: "x", icon: kendo_svg_icons_1.xIcon }))))));
74
+ };
75
+ const TabsList = React.forwardRef((props, ref) => {
76
+ const { children, className } = props, restProps = __rest(props, ["children", "className"]);
77
+ return (React.createElement("ul", Object.assign({ className: (0, kendo_react_common_1.classNames)('k-tabstrip-items k-reset', className), role: 'tablist' }, restProps, { ref: ref }), children));
78
+ });
79
+ TabsList.displayName = 'TabsList';
80
+ const Tabs = (props) => {
81
+ const { sheets, setSheets, onSheetSelect, onSheetDelete, onSheetEdit, onSheetReorderEnd } = props;
82
+ const [inEditItem, setInEditItem] = React.useState(null);
83
+ const dragging = React.useRef(false);
84
+ const prevIndex = React.useRef(-1);
85
+ const updateData = React.useCallback((d) => {
86
+ setSheets(d.map((item, index, array) => (Object.assign(Object.assign({}, item), { first: index === 0, last: index === array.length - 1 }))));
87
+ }, []);
88
+ const onDragOver = React.useCallback((event) => {
89
+ updateData(event.newState);
90
+ // const { prevIndex, nextIndex } = event;
91
+ }, [updateData, onSheetReorderEnd]);
92
+ const onNavigate = React.useCallback((event) => {
93
+ onSheetReorderEnd.call(undefined, event);
94
+ }, [onSheetReorderEnd]);
95
+ const onDragStart = React.useCallback((e) => {
96
+ dragging.current = true;
97
+ prevIndex.current = e.prevIndex;
98
+ }, []);
99
+ const onDragEnd = React.useCallback((event) => {
100
+ setTimeout(() => {
101
+ dragging.current = false;
102
+ }, 50);
103
+ onSheetReorderEnd.call(undefined, Object.assign(Object.assign({}, event), { prevIndex: prevIndex.current }));
104
+ }, []);
105
+ const onSelect = React.useCallback((dataItem, e) => {
106
+ if (!dragging.current) {
107
+ onSheetSelect.call(undefined, dataItem, e);
108
+ }
109
+ }, [onSheetSelect]);
110
+ const onDelete = React.useCallback((dataItem, e) => {
111
+ e.stopPropagation();
112
+ onSheetDelete.call(undefined, dataItem);
113
+ }, [sheets, onSheetDelete]);
114
+ const onEnterEdit = React.useCallback((dataItem, e) => {
115
+ e.stopPropagation();
116
+ e.preventDefault();
117
+ const newData = sheets.map((item) => (Object.assign(Object.assign({}, item), { active: item.id === dataItem.id, inEdit: item.id === dataItem.id })));
118
+ setSheets(newData);
119
+ setInEditItem(Object.assign({}, dataItem));
120
+ }, [sheets]);
121
+ const onCancelEdit = React.useCallback((_dataItem, e) => {
122
+ e.stopPropagation();
123
+ e.preventDefault();
124
+ const newData = sheets.map((item) => (Object.assign(Object.assign({}, item), { inEdit: false, text: item.inEdit && inEditItem ? inEditItem.text : item.text })));
125
+ setSheets(newData);
126
+ setInEditItem(null);
127
+ }, [sheets, inEditItem]);
128
+ const onExitEdit = React.useCallback((dataItem, e) => {
129
+ e.stopPropagation();
130
+ e.preventDefault();
131
+ const newData = sheets.map((item) => (Object.assign(Object.assign({}, item), { inEdit: false })));
132
+ const index = sheets.findIndex((i) => i.id === dataItem.id);
133
+ setSheets(newData);
134
+ setInEditItem(null);
135
+ onSheetEdit.call(undefined, dataItem, index);
136
+ }, [sheets, onSheetEdit]);
137
+ const onEdit = React.useCallback((dataItem, e) => {
138
+ e.stopPropagation();
139
+ e.preventDefault();
140
+ const newData = sheets.map((item) => (Object.assign(Object.assign({}, item), { text: dataItem.id === item.id ? dataItem.text : item.text })));
141
+ setSheets(newData);
142
+ }, [sheets]);
143
+ return (React.createElement("div", { className: 'k-spreadsheet-sheets-items k-tabstrip k-floatwrap k-tabstrip-bottom' },
144
+ React.createElement("div", { className: 'k-tabstrip-items-wrapper k-hstack' },
145
+ React.createElement(ItemsContext.Provider, { value: { onSelect, onDelete, onEnterEdit, onCancelEdit, onExitEdit, onEdit } },
146
+ React.createElement(kendo_react_sortable_1.Sortable, { idField: 'id', data: sheets, itemUI: TabItem, itemsWrapUI: TabsList, onDragOver: onDragOver, onNavigate: onNavigate, onDragStart: onDragStart, onDragEnd: onDragEnd })))));
147
+ };
148
+ const mapSheets = (sheets, active) => sheets.map((sheet, i, arr) => ({
149
+ text: sheet.name(),
150
+ id: (0, kendo_react_common_1.guid)(),
151
+ first: i === 0,
152
+ last: i === arr.length - 1,
153
+ active: sheet.name() === active
154
+ }));
155
+ /**
156
+ * @hidden
157
+ */
158
+ const SheetsBar = (props) => {
159
+ const { spreadsheetRef } = props;
160
+ const [sheets, setSheets] = React.useState([]);
161
+ const activeSheet = React.useRef((sheets.find((s) => s.active) || {}).text);
162
+ const selectActiveSheet = React.useCallback(() => {
163
+ if (spreadsheetRef.current) {
164
+ spreadsheetRef.current.view.sheetsbar.onSheetSelect(activeSheet.current);
165
+ setSheets(mapSheets(spreadsheetRef.current.sheets(), activeSheet.current));
166
+ }
167
+ }, []);
168
+ const onUpdate = React.useCallback(() => {
169
+ if (spreadsheetRef.current) {
170
+ const sh = spreadsheetRef.current.sheets();
171
+ if (!sh.find((s) => s.name() === activeSheet.current)) {
172
+ activeSheet.current = sh[sh.length - 1].name();
173
+ }
174
+ selectActiveSheet();
175
+ }
176
+ }, []);
177
+ React.useEffect(() => {
178
+ if (spreadsheetRef.current) {
179
+ activeSheet.current = spreadsheetRef.current.sheets()[0].name();
180
+ selectActiveSheet();
181
+ spreadsheetRef.current.view.bind('update', onUpdate);
182
+ }
183
+ return () => {
184
+ if (spreadsheetRef.current) {
185
+ spreadsheetRef.current.view.unbind('update', onUpdate);
186
+ }
187
+ };
188
+ }, [spreadsheetRef.current]);
189
+ const onSelect = React.useCallback((dataItem) => {
190
+ if (activeSheet.current !== dataItem.text) {
191
+ activeSheet.current = dataItem.text;
192
+ selectActiveSheet();
193
+ }
194
+ }, []);
195
+ const onAddSheet = React.useCallback(() => {
196
+ if (spreadsheetRef.current) {
197
+ spreadsheetRef.current.view.sheetsbar.onAddSelect();
198
+ const spSheets = spreadsheetRef.current.sheets();
199
+ activeSheet.current = spSheets[spSheets.length - 1].name();
200
+ selectActiveSheet();
201
+ }
202
+ }, []);
203
+ const onSheetDelete = React.useCallback((dataItem) => {
204
+ if (spreadsheetRef.current) {
205
+ if (activeSheet.current === dataItem.text) {
206
+ const curSheets = spreadsheetRef.current.sheets();
207
+ const index = curSheets.findIndex((s) => s.name() === dataItem.text);
208
+ const active = curSheets[index + 1] || curSheets[index - 1];
209
+ activeSheet.current = active ? active.name() : '';
210
+ }
211
+ spreadsheetRef.current.view.sheetsbar.onSheetRemove(dataItem.text);
212
+ selectActiveSheet();
213
+ }
214
+ }, []);
215
+ const onSheetRename = React.useCallback((dataItem, index) => {
216
+ if (spreadsheetRef.current) {
217
+ let text = dataItem.text;
218
+ const curSheets = spreadsheetRef.current.sheets();
219
+ if (!text || curSheets.find((s) => s.name() === text)) {
220
+ text = curSheets[index].name();
221
+ }
222
+ spreadsheetRef.current.view.sheetsbar.onSheetRename(text, index);
223
+ activeSheet.current = text;
224
+ selectActiveSheet();
225
+ }
226
+ }, []);
227
+ const onSheetReorderEnd = React.useCallback((event) => {
228
+ if (spreadsheetRef.current) {
229
+ const { prevIndex, nextIndex } = event;
230
+ spreadsheetRef.current.view.sheetsbar.onSheetReorderEnd({ oldIndex: prevIndex, newIndex: nextIndex });
231
+ }
232
+ }, []);
233
+ return (React.createElement("div", { className: "k-spreadsheet-sheets-bar" },
234
+ React.createElement(kendo_react_buttons_1.Button, { fillMode: "flat", icon: "plus", title: (0, kendo_react_intl_1.useLocalization)().toLanguageString(messages_1.keys.addNewSheet, messages_1.messages[messages_1.keys.addNewSheet]), svgIcon: kendo_svg_icons_1.plusIcon, onClick: onAddSheet }),
235
+ React.createElement(Tabs, { sheets: sheets, setSheets: setSheets, onSheetSelect: onSelect, onSheetDelete: onSheetDelete, onSheetEdit: onSheetRename, onSheetReorderEnd: onSheetReorderEnd })));
236
+ };
237
+ exports.SheetsBar = SheetsBar;
@@ -0,0 +1,3 @@
1
+ import * as React from 'react';
2
+ import { SpreadsheetProps, SpreadsheetHandle } from './SpreadsheetProps';
3
+ export declare const Spreadsheet: React.ForwardRefExoticComponent<SpreadsheetProps & React.RefAttributes<SpreadsheetHandle | null>>;