@seafile/sdoc-editor 1.0.31 → 1.0.32

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 (24) hide show
  1. package/dist/basic-sdk/extension/plugins/seatable-column/helpers.js +11 -1
  2. package/dist/basic-sdk/extension/plugins/seatable-column/menu/column-list-menu.js +9 -4
  3. package/dist/basic-sdk/extension/plugins/seatable-column/menu/index.js +8 -6
  4. package/dist/basic-sdk/extension/plugins/seatable-tables/helpers.js +10 -2
  5. package/dist/basic-sdk/extension/plugins/seatable-tables/menu/index.js +11 -6
  6. package/dist/basic-sdk/extension/plugins/seatable-tables/op-menu/index.css +171 -6
  7. package/dist/basic-sdk/extension/plugins/seatable-tables/op-menu/index.js +313 -18
  8. package/dist/basic-sdk/extension/plugins/seatable-tables/render-element/index.css +1 -1
  9. package/dist/basic-sdk/extension/plugins/seatable-tables/render-element/seatable-table.js +4 -3
  10. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover-widgets/filters-list.css +1 -0
  11. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/filter-popover.js +5 -12
  12. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/filter-setter/index.js +7 -30
  13. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/hide-column-setter/hide-column-popover.js +5 -12
  14. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/hide-column-setter/index.js +8 -52
  15. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/sort-setter/index.js +10 -34
  16. package/dist/basic-sdk/extension/plugins/seatable-tables/seatable-settings/sort-setter/sort-popover.js +6 -12
  17. package/dist/basic-sdk/extension/toolbar/side-toolbar/insert-block-menu.js +11 -1
  18. package/package.json +1 -1
  19. package/public/media/sdoc-editor-font/iconfont.eot +0 -0
  20. package/public/media/sdoc-editor-font/iconfont.svg +8 -0
  21. package/public/media/sdoc-editor-font/iconfont.ttf +0 -0
  22. package/public/media/sdoc-editor-font/iconfont.woff +0 -0
  23. package/public/media/sdoc-editor-font/iconfont.woff2 +0 -0
  24. package/public/media/sdoc-editor-font.css +24 -10
@@ -2,6 +2,7 @@ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
2
  import { Editor, Transforms, Range } from '@seafile/slate';
3
3
  import slugid from 'slugid';
4
4
  import { BLOCKQUOTE, CHECK_LIST_ITEM, COLUMN, IMAGE, ORDERED_LIST, PARAGRAPH, TABLE_CELL, UNORDERED_LIST } from '../../constants/element-type';
5
+ import { INSERT_POSITION } from '../../constants';
5
6
  import { focusEditor, getNodeType } from '../../core';
6
7
  import Column from './model';
7
8
  import * as CellType from './constants/cell-types';
@@ -46,10 +47,19 @@ export const getColumnType = editor => {
46
47
  const [n] = match;
47
48
  return getNodeType(n);
48
49
  };
49
- export const insertSeaTableColumn = (editor, active, option) => {
50
+ export const insertSeaTableColumn = function (editor, active, option) {
51
+ let insertPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : INSERT_POSITION.CURRENT;
50
52
  if (!active) {
51
53
  const column = new Column(option);
52
54
  column.id = slugid.nice();
55
+ if (insertPosition === INSERT_POSITION.AFTER) {
56
+ const path = Editor.path(editor, editor.selection);
57
+ path && Transforms.insertNodes(editor, _objectSpread({}, column), {
58
+ at: [path[0] + 1]
59
+ });
60
+ focusEditor(editor);
61
+ return;
62
+ }
53
63
  Transforms.insertNodes(editor, _objectSpread({}, column));
54
64
  }
55
65
  focusEditor(editor);
@@ -6,8 +6,10 @@ import './column-list-menu.css';
6
6
  const NOT_SUPPORT_COLUMN_TYPES = ['button', 'file'];
7
7
  export default function ColumnListMenu(_ref) {
8
8
  let {
9
- editor
9
+ editor,
10
+ insertPosition
10
11
  } = _ref;
12
+ const computedBottom = insertPosition ? '0px' : '';
11
13
  const columns = useMemo(() => {
12
14
  if (!editor.columns) return [];
13
15
  return editor.columns.filter(column => !NOT_SUPPORT_COLUMN_TYPES.includes(column.type));
@@ -27,10 +29,13 @@ export default function ColumnListMenu(_ref) {
27
29
  };
28
30
  const onMousedown = useCallback(option => {
29
31
  const active = isActive(editor);
30
- insertSeaTableColumn(editor, active, option);
31
- }, [editor]);
32
+ insertSeaTableColumn(editor, active, option, insertPosition);
33
+ }, [editor, insertPosition]);
32
34
  return /*#__PURE__*/React.createElement("div", {
33
- className: "column-list-menu"
35
+ className: "column-list-menu",
36
+ style: {
37
+ bottom: computedBottom
38
+ }
34
39
  }, options.map(option => {
35
40
  return /*#__PURE__*/React.createElement("div", {
36
41
  key: option.value,
@@ -7,7 +7,8 @@ import { isMenuDisabled } from '../helpers';
7
7
  const SeaTableColumnMenu = _ref => {
8
8
  let {
9
9
  editor,
10
- readonly
10
+ readonly,
11
+ insertPosition
11
12
  } = _ref;
12
13
  const disabled = isMenuDisabled(editor, readonly);
13
14
  const menuConfig = MENUS_CONFIG_MAP[ELEMENT_TYPE.COLUMN];
@@ -17,16 +18,17 @@ const SeaTableColumnMenu = _ref => {
17
18
  className: "pr-2"
18
19
  }, !disabled && /*#__PURE__*/React.createElement("i", {
19
20
  className: "sdocfont sdoc-right-slide sdoc-dropdown-item-right-icon"
20
- })), !disabled && /*#__PURE__*/React.createElement(UncontrolledPopover, {
21
+ }), !disabled && /*#__PURE__*/React.createElement(UncontrolledPopover, {
21
22
  target: menuConfig.id,
22
- className: "sdoc-menu-popover sdoc-dropdown-menu sdoc-sub-dropdown-menu",
23
23
  trigger: "hover",
24
24
  placement: "right-start",
25
25
  hideArrow: true,
26
- fade: false
26
+ fade: false,
27
+ popperClassName: "seatable-column-popover"
27
28
  }, /*#__PURE__*/React.createElement(ColumnListMenu, {
28
29
  editor: editor,
29
- readonly: readonly
30
- })));
30
+ readonly: readonly,
31
+ insertPosition: insertPosition
32
+ }))));
31
33
  };
32
34
  export default SeaTableColumnMenu;
@@ -2,7 +2,7 @@ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
2
  import { Editor, Transforms } from '@seafile/slate';
3
3
  import slugId from 'slugid';
4
4
  import { getNodeType, isTextNode, getParentNode, generateDefaultText } from '../../core';
5
- import { ELEMENT_TYPE, SEATABLE_TABLE } from '../../constants';
5
+ import { ELEMENT_TYPE, SEATABLE_TABLE, INSERT_POSITION } from '../../constants';
6
6
  export const isInsertSeaTableTableDisabled = (editor, readonly) => {
7
7
  if (readonly) return true;
8
8
  const {
@@ -51,8 +51,16 @@ export const generateSeaTableTable = (table_id, editor) => {
51
51
  children: [generateDefaultText()]
52
52
  };
53
53
  };
54
- export const insertSeaTableTable = (editor, item) => {
54
+ export const insertSeaTableTable = function (editor, item) {
55
+ let insertPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : INSERT_POSITION.CURRENT;
55
56
  const node = generateSeaTableTable(item._id, editor);
57
+ if (insertPosition === INSERT_POSITION.AFTER) {
58
+ const path = Editor.path(editor, editor.selection);
59
+ path && Transforms.insertNodes(editor, node, {
60
+ at: [path[0] + 1]
61
+ });
62
+ return;
63
+ }
56
64
  Transforms.setNodes(editor, node);
57
65
  };
58
66
  export const updateSeaTableTable = (editor, props) => {
@@ -7,21 +7,23 @@ import './index.css';
7
7
  const SeaTableTableMenu = _ref => {
8
8
  let {
9
9
  editor,
10
- readonly
10
+ readonly,
11
+ insertPosition
11
12
  } = _ref;
12
13
  const disabled = isInsertSeaTableTableDisabled(editor, readonly);
13
14
  const menuConfig = MENUS_CONFIG_MAP[SEATABLE_TABLE];
15
+ const computedBottom = insertPosition ? '0px' : '';
14
16
  const tables = editor.tables;
15
17
  const onViewClick = useCallback(item => {
16
- insertSeaTableTable(editor, item);
17
- }, [editor]);
18
+ insertSeaTableTable(editor, item, insertPosition);
19
+ }, [editor, insertPosition]);
18
20
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(DropdownMenuItem, {
19
21
  disabled: disabled,
20
22
  menuConfig: menuConfig,
21
23
  className: "pr-2"
22
24
  }, !disabled && /*#__PURE__*/React.createElement("i", {
23
25
  className: "sdocfont sdoc-right-slide sdoc-dropdown-item-right-icon"
24
- })), !disabled && /*#__PURE__*/React.createElement(UncontrolledPopover, {
26
+ }), !disabled && /*#__PURE__*/React.createElement(UncontrolledPopover, {
25
27
  target: menuConfig.id,
26
28
  trigger: "hover",
27
29
  className: "sdoc-menu-popover sdoc-dropdown-menu sdoc-sub-dropdown-menu",
@@ -29,13 +31,16 @@ const SeaTableTableMenu = _ref => {
29
31
  hideArrow: true,
30
32
  fade: false
31
33
  }, /*#__PURE__*/React.createElement("div", {
32
- className: "sdoc-dropdown-menu-container table-list-menu"
34
+ className: "sdoc-dropdown-menu-container",
35
+ style: {
36
+ bottom: computedBottom
37
+ }
33
38
  }, tables.map(item => {
34
39
  return /*#__PURE__*/React.createElement("div", {
35
40
  key: item._id,
36
41
  className: "sdoc-dropdown-menu-item",
37
42
  onClick: () => onViewClick(item)
38
43
  }, item.name);
39
- }))));
44
+ })))));
40
45
  };
41
46
  export default SeaTableTableMenu;
@@ -1,16 +1,181 @@
1
- .seatable-op-menu {
1
+ .sdoc-seatable-hover-menu-container {
2
2
  position: absolute;
3
- padding: 7px;
3
+ height: 42px;
4
+ z-index: 101;
5
+ width: fit-content;
6
+ max-width: 250px;
7
+ }
8
+
9
+ .sdoc-seatable-hover-menu-container .hover-menu-container {
4
10
  height: 36px;
11
+ width: 100%;
12
+ padding: 7px 8px;
5
13
  background-color: #fff;
6
- border: 1px solid #eee;
7
- border-radius: 3px;
8
- z-index: 100;
9
14
  display: flex;
15
+ justify-content: space-around;
16
+ align-items: center;
17
+ border-radius: 3px;
18
+ box-shadow: 0 1px 0 rgba(0, 0, 0, 0.08);
19
+ border: 1px solid #e8e8e8;
10
20
  }
11
21
 
12
- .seatable-op-menu .sdocfont {
22
+ .sdoc-seatable-hover-menu-container .hover-menu-container .active {
23
+ color: #212529;
24
+ text-decoration: none;
25
+ background: #f2f2f2;
26
+ }
27
+
28
+ .sdoc-seatable-hover-menu-container .hover-menu-container .op-item {
29
+ position: relative;
30
+ height: 100%;
31
+ width: 100%;
32
+ font-size: 12px;
33
+ color: #212529;
34
+ border-radius: 2px;
35
+ text-align: center;
36
+ line-height: 20px;
37
+ }
38
+
39
+ .sdoc-seatable-hover-menu-container .sdoc-seatable-hover-operation-item.sdoc-seatable-hover-operation-lang .op-item {
40
+ padding: 0 5px;
41
+ }
42
+
43
+ .sdoc-seatable-hover-menu-container .hover-menu-container .sdoc-seatable-hover-operation-lang .icon-font {
44
+ display: inline-flex;
45
+ align-items: center;
46
+ justify-content: center;
47
+ margin-left: 8px;
48
+ }
49
+
50
+ .sdoc-seatable-hover-menu-container .sdoc-seatable-hover-operation-item {
51
+ height: 20px;
52
+ width: 20px;
53
+ text-align: center;
54
+ justify-content: center;
55
+ }
56
+
57
+ .sdoc-seatable-hover-menu-container .sdoc-seatable-hover-operation-item.sdoc-seatable-hover-operation-lang {
58
+ width: fit-content;
59
+ }
60
+
61
+ .sdoc-seatable-hover-menu-container .sdoc-seatable-hover-operation-lang .icon-font {
62
+ color: #999;
63
+ }
64
+
65
+ .sdoc-seatable-hover-menu-container .sdoc-seatable-hover-operation-divider {
66
+ height: 20px;
67
+ width: 1px;
68
+ background-color: #e5e5e5;
69
+ margin: 0 8px;
70
+ }
71
+
72
+ .sdoc-seatable-hover-menu-container .hover-menu-container .op-item:hover {
73
+ color: #212529;
74
+ text-decoration: none;
75
+ background: #f2f2f2;
76
+ }
77
+
78
+ .sdoc-seatable-hover-menu-container .icon-font {
13
79
  font-size: 12px;
14
80
  color: #444;
81
+ }
82
+
83
+ .sdoc-seatable-hover-menu-container .hover-menu-container .sdoc-seatable-setting-popver {
84
+ position: absolute;
85
+ top: 38px;
86
+ left: 0px;
87
+ width: 200px;
88
+ overflow-y: hidden;
89
+ background-color: #fff;
90
+ border-radius: 4px;
91
+ box-shadow: 0 0 5px #ccc;
92
+ border: 1px solid #dedede;
93
+ }
94
+
95
+ .sdoc-seatable-hover-menu-container .hover-menu-container .sdoc-seatable-setting-right-popver {
96
+ left: 200px;
97
+ width: 300px;
98
+ }
99
+
100
+ .sdoc-seatable-hover-menu-container .hover-menu-container .sdoc-seatable-setting-popver .tables-list-empty {
101
+ padding: 10px;
102
+ width: 100%;
103
+ font-size: 13px;
104
+ text-align: center;
105
+ line-height: 30px;
106
+ vertical-align: middle;
107
+ }
108
+
109
+ .sdoc-seatable-hover-menu-container .hover-menu-container .sdoc-seatable-setting-popver .seatable-setting-container {
110
+ list-style: none;
111
+ overflow-y: auto;
112
+ max-height: 280px;
113
+ min-height: 80px;
114
+ padding: 8px 0px;
115
+ }
116
+
117
+ .sdoc-seatable-hover-menu-container .hover-menu-container .sdoc-seatable-setting-popver .seatable-setting-container .seatable-setting-item {
118
+ position: relative;
119
+ white-space: nowrap;
120
+ cursor: pointer;
121
+ line-height: 32px;
122
+ height: 32px;
123
+ font-size: 14px;
124
+ padding: 0px 16px;
125
+ display: flex;
126
+ justify-content: space-between;
127
+ }
128
+
129
+ .sdoc-seatable-hover-menu-container .hover-menu-container .sdoc-seatable-setting-popver .seatable-setting-container .seatable-custom-switch-item .custom-switch-description {
130
+ margin-left: 0px;
131
+ }
132
+
133
+ .sdoc-seatable-hover-menu-container .hover-menu-container .sdoc-seatable-setting-popver .seatable-setting-container .seatable-custom-switch-item .custom-switch {
134
+ padding-left: 0px;
135
+ }
136
+
137
+ .sdoc-seatable-hover-menu-container .hover-menu-container .sdoc-seatable-setting-popver .seatable-setting-container .seatable-custom-switch-item .custom-switch-indicator {
138
+ position: absolute;
139
+ right: 0px;
15
140
  cursor: pointer;
16
141
  }
142
+
143
+ .sdoc-seatable-hover-menu-container .hover-menu-container .sdoc-seatable-setting-popver .seatable-setting-container .seatable-setting-item:hover {
144
+ background-color: #f5f5f5;;
145
+ }
146
+
147
+ .sdoc-seatable-hover-menu-container .hover-menu-container .sdoc-seatable-setting-popver .seatable-setting-container .seatable-setting-item .active {
148
+ background-color: #f5f5f5;;
149
+ }
150
+
151
+ .sdoc-seatable-hover-menu-container .hover-menu-container .sdoc-seatable-setting-popver .seatable-setting-container .seatable-setting-item .check-mark {
152
+ opacity: 0;
153
+ padding: 0 10px;
154
+ }
155
+
156
+ .sdoc-seatable-hover-menu-container .hover-menu-container .sdoc-seatable-setting-popver .seatable-setting-container .seatable-setting-item .checked {
157
+ opacity: 1;
158
+ }
159
+
160
+ .sdoc-seatable-setting-filter-popver-wrapper {
161
+ top: 38px !important;
162
+ left: 83px !important;
163
+ transform: unset !important;
164
+ margin-top: 0px !important;
165
+ }
166
+
167
+ .sdoc-seatable-setting-sort-popver-wrapper {
168
+ top: 38px !important;
169
+ left: 122px !important;
170
+ transform: unset !important;
171
+ margin-top: 0px !important;
172
+ }
173
+
174
+ .sdoc-seatable-setting-hide-column-popver-wrapper {
175
+ top: 38px !important;
176
+ left: 158px !important;
177
+ transform: unset !important;
178
+ max-height: 350px;
179
+ overflow: auto;
180
+ margin-top: 0px !important;
181
+ }
@@ -1,29 +1,324 @@
1
- import React, { useCallback, useState } from 'react';
1
+ import React, { useCallback, useState, useEffect, useRef } from 'react';
2
+ import { useTranslation } from 'react-i18next';
2
3
  import { ElementPopover } from '../../../commons';
3
- import TableSettings from '../seatable-settings';
4
+ import Tooltip from '../../../../../components/tooltip';
5
+ import CustomSwitch from '../seatable-settings/custom-switch';
6
+ import FilterSetter from '../seatable-settings/filter-setter';
7
+ import SortSetter from '../seatable-settings/sort-setter';
8
+ import HideColumnSetter from '../seatable-settings/hide-column-setter';
9
+ import { useScrollContext } from '../../../../hooks/use-scroll-context';
10
+ import { updateSeaTableTable } from '../helpers';
4
11
  import './index.css';
5
- export default function OpMenu(_ref) {
12
+ const TablesList = _ref => {
13
+ let {
14
+ tablesData,
15
+ onSelectTable,
16
+ selectedTableText
17
+ } = _ref;
18
+ const {
19
+ t
20
+ } = useTranslation();
21
+ if (!tablesData.length) {
22
+ return /*#__PURE__*/React.createElement("div", {
23
+ className: "tables-list-empty"
24
+ }, /*#__PURE__*/React.createElement("span", null, t('Search_not_found')));
25
+ }
26
+ return /*#__PURE__*/React.createElement("div", {
27
+ className: "seatable-setting-container"
28
+ }, tablesData.map(item => {
29
+ return /*#__PURE__*/React.createElement("div", {
30
+ className: "seatable-setting-item ".concat(selectedTableText === item.name ? 'active' : ''),
31
+ id: item._id,
32
+ key: item._id,
33
+ onClick: () => {
34
+ onSelectTable(item);
35
+ }
36
+ }, item.name, /*#__PURE__*/React.createElement("span", {
37
+ className: "check-mark ".concat(selectedTableText === item.name ? 'checked' : '')
38
+ }, /*#__PURE__*/React.createElement("i", {
39
+ className: "sdocfont sdoc-check-mark icon-font"
40
+ })));
41
+ }));
42
+ };
43
+ const TablesSettings = _ref2 => {
44
+ let {
45
+ settings,
46
+ updatePageSettings
47
+ } = _ref2;
48
+ const {
49
+ t
50
+ } = useTranslation();
51
+ return /*#__PURE__*/React.createElement("div", {
52
+ className: "seatable-setting-container"
53
+ }, /*#__PURE__*/React.createElement("div", {
54
+ className: "seatable-setting-item seatable-custom-switch-item"
55
+ }, /*#__PURE__*/React.createElement(CustomSwitch, {
56
+ checked: settings['show_record_numbers'] === true ? true : false,
57
+ isLocked: false,
58
+ title: t('Show_record_numbers'),
59
+ onPropertiesChanged: value => {
60
+ updatePageSettings({
61
+ show_record_numbers: value
62
+ });
63
+ }
64
+ })), /*#__PURE__*/React.createElement("div", {
65
+ className: "seatable-setting-item seatable-custom-switch-item"
66
+ }, /*#__PURE__*/React.createElement(CustomSwitch, {
67
+ checked: settings['alternate_color'] === false ? false : true,
68
+ isLocked: false,
69
+ title: t('Alternate_color'),
70
+ onPropertiesChanged: value => {
71
+ updatePageSettings({
72
+ alternate_color: value
73
+ });
74
+ }
75
+ })));
76
+ };
77
+ export default function OpMenu(_ref3) {
6
78
  let {
7
79
  editor,
8
80
  element,
9
- menuPosition
10
- } = _ref;
81
+ menuPosition,
82
+ seaTableRef
83
+ } = _ref3;
84
+ const {
85
+ t
86
+ } = useTranslation();
87
+ const scrollRef = useScrollContext();
88
+ const timer = useRef(null);
89
+ const tablesData = editor.tables;
90
+ const [isShowTooltip, setIsShowTooltip] = useState(false);
91
+ const [selectedTable, setSelectedTable] = useState({});
92
+ const [selectedTableText, setSelectedTableText] = useState('');
93
+ const [isShowTableList, setIsShowTablesList] = useState(false);
94
+ const [isShowFilter, setIsShowFilter] = useState(false);
95
+ const [isShowSort, setIsShowSort] = useState(false);
96
+ const [isShowHideColumn, setIsShowHideColumn] = useState(false);
11
97
  const [isShowSeaTableSetting, setIsShowSeaTableSetting] = useState(false);
12
- const onShowSettings = useCallback(() => {
13
- setIsShowSeaTableSetting(true);
98
+ const onCloseOther = useCallback(closeList => {
99
+ closeList.forEach(item => {
100
+ item === 'tableList' && setIsShowTablesList(false);
101
+ item === 'tableFilter' && setIsShowFilter(false);
102
+ item === 'tableSort' && setIsShowSort(false);
103
+ item === 'tableColumnHidden' && setIsShowHideColumn(false);
104
+ item === 'tableSetting' && setIsShowSeaTableSetting(false);
105
+ });
14
106
  }, []);
15
- const onHideSettings = useCallback(() => {
16
- setIsShowSeaTableSetting(false);
107
+ const onClickOutside = useCallback(e => {
108
+ if (seaTableRef === null || seaTableRef === void 0 ? void 0 : seaTableRef.current.contains(e.target)) {
109
+ onCloseOther(['tableList', 'tableFilter', 'tableSort', 'tableColumnHidden', 'tableSetting']);
110
+ }
111
+ }, [onCloseOther, seaTableRef]);
112
+ const handleScroll = useCallback(e => {
113
+ onCloseOther(['tableList', 'tableFilter', 'tableSort', 'tableColumnHidden', 'tableSetting']);
114
+ }, [onCloseOther]);
115
+ useEffect(() => {
116
+ setIsShowTooltip(true);
117
+ document.addEventListener('click', onClickOutside);
118
+ let observerRefValue = null;
119
+ if (scrollRef.current) {
120
+ scrollRef.current.addEventListener('scroll', handleScroll);
121
+ observerRefValue = scrollRef.current;
122
+ }
123
+ return () => {
124
+ document.removeEventListener('click', onClickOutside);
125
+ observerRefValue.removeEventListener('scroll', handleScroll);
126
+ };
127
+ // eslint-disable-next-line react-hooks/exhaustive-deps
17
128
  }, []);
129
+ useEffect(() => {
130
+ const {
131
+ table_id
132
+ } = element;
133
+ const table = editor.tables.find(item => item._id === table_id);
134
+ if (table) {
135
+ setSelectedTable(table);
136
+ setSelectedTableText(table.name);
137
+ }
138
+ }, [editor.tables, element]);
139
+ const updatePageSettings = useCallback(updateProperties => {
140
+ if (timer.current) {
141
+ clearTimeout(timer.current);
142
+ }
143
+ timer.current = setTimeout(() => {
144
+ updateSeaTableTable(editor, updateProperties);
145
+ }, 300);
146
+ }, [editor]);
147
+ const onShowTables = useCallback(() => {
148
+ setIsShowTablesList(!isShowTableList);
149
+ onCloseOther(['tableFilter', 'tableSort', 'tableColumnHidden', 'tableSetting']);
150
+ // eslint-disable-next-line react-hooks/exhaustive-deps
151
+ }, [isShowTableList]);
152
+ const onSelectTable = useCallback(item => {
153
+ const {
154
+ name,
155
+ _id
156
+ } = item;
157
+ setSelectedTableText(name);
158
+ const table = editor.tables.find(item => item._id === _id);
159
+ updatePageSettings({
160
+ table_id: _id,
161
+ filters: [],
162
+ filter_conjunction: 'And',
163
+ sorts: [],
164
+ shown_column_keys: table.columns.map(item => item.key),
165
+ show_record_numbers: false,
166
+ alternate_color: true,
167
+ select_column_display_option_color: true
168
+ });
169
+ // eslint-disable-next-line react-hooks/exhaustive-deps
170
+ }, [editor]);
171
+ const onFilter = useCallback(() => {
172
+ setIsShowFilter(!isShowFilter);
173
+ onCloseOther(['tableList', 'tableSort', 'tableColumnHidden', 'tableSetting']);
174
+ // eslint-disable-next-line react-hooks/exhaustive-deps
175
+ }, [isShowFilter]);
176
+ const onFiltersChange = useCallback((filters, filter_conjunction) => {
177
+ updatePageSettings({
178
+ filters,
179
+ filter_conjunction
180
+ });
181
+ }, [updatePageSettings]);
182
+ const onSort = useCallback(() => {
183
+ setIsShowSort(!isShowSort);
184
+ onCloseOther(['tableList', 'tableFilter', 'tableColumnHidden', 'tableSetting']);
185
+ // eslint-disable-next-line react-hooks/exhaustive-deps
186
+ }, [isShowSort]);
187
+ const onSortsChange = useCallback(sorts => {
188
+ updatePageSettings({
189
+ sorts
190
+ });
191
+ }, [updatePageSettings]);
192
+ const onHiddenColumn = useCallback(() => {
193
+ setIsShowHideColumn(!isShowHideColumn);
194
+ onCloseOther(['tableList', 'tableSort', 'tableFilter', 'tableSetting']);
195
+ // eslint-disable-next-line react-hooks/exhaustive-deps
196
+ }, [isShowHideColumn]);
197
+ const onHideColumnChange = useCallback(shownColumnKeys => {
198
+ updatePageSettings({
199
+ shown_column_keys: shownColumnKeys
200
+ });
201
+ }, [updatePageSettings]);
202
+ const onSettings = useCallback(() => {
203
+ setIsShowSeaTableSetting(!isShowSeaTableSetting);
204
+ onCloseOther(['tableList', 'tableSort', 'tableColumnHidden', 'tableFilter']);
205
+ // eslint-disable-next-line react-hooks/exhaustive-deps
206
+ }, [isShowSeaTableSetting]);
18
207
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ElementPopover, null, /*#__PURE__*/React.createElement("div", {
19
- className: "seatable-op-menu",
208
+ id: "sdoc-seatable-hover-menu-container",
209
+ className: "sdoc-seatable-hover-menu-container",
20
210
  style: menuPosition
21
- }, /*#__PURE__*/React.createElement("span", {
22
- className: "sdocfont sdoc-settings",
23
- onClick: onShowSettings
24
- }))), isShowSeaTableSetting && /*#__PURE__*/React.createElement(TableSettings, {
25
- editor: editor,
26
- element: element,
27
- onHideSettings: onHideSettings
28
- }));
211
+ }, /*#__PURE__*/React.createElement("div", {
212
+ className: "hover-menu-container"
213
+ }, /*#__PURE__*/React.createElement("div", {
214
+ className: "sdoc-seatable-hover-operation-item sdoc-seatable-hover-operation-lang"
215
+ }, /*#__PURE__*/React.createElement("div", {
216
+ role: "button",
217
+ className: "op-item ".concat(isShowTableList ? 'active' : ''),
218
+ onClick: onShowTables
219
+ }, /*#__PURE__*/React.createElement("span", null, selectedTableText), /*#__PURE__*/React.createElement("i", {
220
+ className: "sdocfont sdoc-drop-down icon-font"
221
+ }))), /*#__PURE__*/React.createElement("div", {
222
+ className: "sdoc-seatable-hover-operation-divider"
223
+ }), /*#__PURE__*/React.createElement("div", {
224
+ id: "sdoc_seatable_filter",
225
+ className: "sdoc-seatable-hover-operation-item"
226
+ }, /*#__PURE__*/React.createElement("div", {
227
+ role: "button",
228
+ className: "op-item",
229
+ onClick: onFilter
230
+ }, /*#__PURE__*/React.createElement("i", {
231
+ className: "sdocfont sdoc-filter1 icon-font"
232
+ })), isShowTooltip && /*#__PURE__*/React.createElement(Tooltip, {
233
+ target: "sdoc_seatable_filter",
234
+ placement: "top",
235
+ fade: true
236
+ }, t('Filter'))), /*#__PURE__*/React.createElement("div", {
237
+ className: "sdoc-seatable-hover-operation-divider"
238
+ }), /*#__PURE__*/React.createElement("div", {
239
+ id: "sdoc_seatable_sort",
240
+ className: "sdoc-seatable-hover-operation-item"
241
+ }, /*#__PURE__*/React.createElement("div", {
242
+ role: "button",
243
+ className: "op-item",
244
+ onClick: onSort
245
+ }, /*#__PURE__*/React.createElement("i", {
246
+ className: "sdocfont sdoc-sort icon-font"
247
+ })), isShowTooltip && /*#__PURE__*/React.createElement(Tooltip, {
248
+ target: "sdoc_seatable_sort",
249
+ placement: "top",
250
+ fade: true
251
+ }, t('Sort'))), /*#__PURE__*/React.createElement("div", {
252
+ className: "sdoc-seatable-hover-operation-divider"
253
+ }), /*#__PURE__*/React.createElement("div", {
254
+ id: "sdoc_seatable_hidden_column",
255
+ className: "sdoc-seatable-hover-operation-item"
256
+ }, /*#__PURE__*/React.createElement("div", {
257
+ role: "button",
258
+ className: "op-item",
259
+ onClick: onHiddenColumn
260
+ }, /*#__PURE__*/React.createElement("i", {
261
+ className: "sdocfont sdoc-eye-slash icon-font"
262
+ })), isShowTooltip && /*#__PURE__*/React.createElement(Tooltip, {
263
+ target: "sdoc_seatable_hidden_column",
264
+ placement: "top",
265
+ fade: true
266
+ }, t('Hide_columns'))), /*#__PURE__*/React.createElement("div", {
267
+ className: "sdoc-seatable-hover-operation-divider"
268
+ }), /*#__PURE__*/React.createElement("div", {
269
+ id: "sdoc_seatable_settings",
270
+ className: "sdoc-seatable-hover-operation-item"
271
+ }, /*#__PURE__*/React.createElement("div", {
272
+ role: "button",
273
+ className: "op-item",
274
+ onClick: onSettings
275
+ }, /*#__PURE__*/React.createElement("i", {
276
+ className: "sdocfont sdoc-set-up icon-font"
277
+ })), isShowTooltip && /*#__PURE__*/React.createElement(Tooltip, {
278
+ target: "sdoc_seatable_settings",
279
+ placement: "top",
280
+ fade: true
281
+ }, t('Style_settings'))), isShowTableList && /*#__PURE__*/React.createElement("div", {
282
+ className: "sdoc-seatable-setting-popver"
283
+ }, /*#__PURE__*/React.createElement(TablesList, {
284
+ tablesData: tablesData,
285
+ onSelectTable: onSelectTable,
286
+ selectedTableText: selectedTableText
287
+ })), /*#__PURE__*/React.createElement(FilterSetter, {
288
+ target: "sdoc_seatable_filter",
289
+ container: document.getElementById('sdoc-seatable-hover-menu-container'),
290
+ popperClassName: "sdoc-seatable-setting-filter-popver-wrapper",
291
+ columns: selectedTable.columns,
292
+ filterConjunction: element.filter_conjunction || 'And',
293
+ filters: element.filters || [],
294
+ collaborators: [],
295
+ isNeedSubmit: true,
296
+ isShowFilterPopover: isShowFilter,
297
+ onFiltersChange: onFiltersChange,
298
+ hidePopover: onFilter
299
+ }), /*#__PURE__*/React.createElement(SortSetter, {
300
+ target: "sdoc_seatable_sort",
301
+ container: document.getElementById('sdoc-seatable-hover-menu-container'),
302
+ popperClassName: "sdoc-seatable-setting-sort-popver-wrapper",
303
+ columns: selectedTable.columns,
304
+ sorts: element.sorts || [],
305
+ isShowSortPopover: isShowSort,
306
+ isNeedSubmit: true,
307
+ onSortsChange: onSortsChange,
308
+ onSortToggle: onSort
309
+ }), /*#__PURE__*/React.createElement(HideColumnSetter, {
310
+ target: "sdoc_seatable_hidden_column",
311
+ container: document.getElementById('sdoc-seatable-hover-menu-container'),
312
+ popperClassName: "sdoc-seatable-setting-hide-column-popver-wrapper",
313
+ columns: selectedTable.columns,
314
+ shownColumnKeys: element.shown_column_keys || [],
315
+ isShowHideColumnSetter: isShowHideColumn,
316
+ onSettingUpdate: onHideColumnChange,
317
+ onPopoverToggle: onHiddenColumn
318
+ }), isShowSeaTableSetting && /*#__PURE__*/React.createElement("div", {
319
+ className: "sdoc-seatable-setting-popver sdoc-seatable-setting-right-popver"
320
+ }, /*#__PURE__*/React.createElement(TablesSettings, {
321
+ settings: element,
322
+ updatePageSettings: updatePageSettings
323
+ }))))));
29
324
  }
@@ -6,7 +6,7 @@
6
6
  }
7
7
 
8
8
  .seatable-view-container.selected {
9
- border: 1px solid red;
9
+ border: 2px solid #007BFF;
10
10
  }
11
11
 
12
12
  .seatable-view-container .seatable-view-records {
@@ -130,7 +130,7 @@ function SeaTableTable(_ref) {
130
130
  top,
131
131
  left
132
132
  } = seaTableRef.current.getBoundingClientRect();
133
- const menuTop = top - 36; // top = top distance - menu height
133
+ const menuTop = top - 42; // top = top distance - menu height
134
134
  const newMenuPosition = {
135
135
  top: menuTop,
136
136
  left: left // left = code-block left distance
@@ -164,7 +164,7 @@ function SeaTableTable(_ref) {
164
164
  top,
165
165
  left
166
166
  } = seaTableRef.current.getBoundingClientRect();
167
- const menuTop = top - 36; // top = top distance - menu height
167
+ const menuTop = top - 42; // top = top distance - menu height
168
168
  const newMenuPosition = {
169
169
  top: menuTop,
170
170
  left: left // left = callout left distance
@@ -189,7 +189,8 @@ function SeaTableTable(_ref) {
189
189
  }, isShowMenu && /*#__PURE__*/React.createElement(OpMenu, {
190
190
  editor: editor,
191
191
  element: element,
192
- menuPosition: menuPosition
192
+ menuPosition: menuPosition,
193
+ seaTableRef: seaTableRef
193
194
  }), isLoading && /*#__PURE__*/React.createElement(Loading, null), !isLoading && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("table", {
194
195
  className: classNames('seatable-view-records', {
195
196
  'no_alternate_color': !element.alternate_color
@@ -42,6 +42,7 @@
42
42
 
43
43
  .filters-list .filter-item .filter-term {
44
44
  max-width: 300px;
45
+ min-width: 150px;
45
46
  }
46
47
 
47
48
  .filters-list .filter-item .filter-term .option-group-content .option.option-active .dtable-font {
@@ -5,7 +5,6 @@ import { Button, UncontrolledPopover } from 'reactstrap';
5
5
  import { withTranslation } from 'react-i18next';
6
6
  import { FILTER_COLUMN_OPTIONS, getValidFilters } from 'dtable-utils';
7
7
  import CommonAddTool from '../common-add-tool';
8
- import { getEventClassName } from '../utils/utils';
9
8
  import FiltersList from './filter-popover-widgets/filters-list';
10
9
  import { getFilterByColumn } from './filters-utils';
11
10
  import './filter-popover.css';
@@ -27,14 +26,6 @@ class FilterPopover extends Component {
27
26
  this.props.hidePopover();
28
27
  }
29
28
  });
30
- _defineProperty(this, "hideDTablePopover", e => {
31
- if (this.dtablePopoverRef && !getEventClassName(e).includes('popover') && !this.dtablePopoverRef.contains(e.target)) {
32
- this.props.hidePopover(e);
33
- e.preventDefault();
34
- e.stopPropagation();
35
- return false;
36
- }
37
- });
38
29
  _defineProperty(this, "isNeedSubmit", () => {
39
30
  return this.props.isNeedSubmit;
40
31
  });
@@ -130,17 +121,17 @@ class FilterPopover extends Component {
130
121
  };
131
122
  }
132
123
  componentDidMount() {
133
- document.addEventListener('mousedown', this.hideDTablePopover, true);
134
124
  document.addEventListener('keydown', this.onHotKey);
135
125
  }
136
126
  componentWillUnmount() {
137
- document.removeEventListener('mousedown', this.hideDTablePopover, true);
138
127
  document.removeEventListener('keydown', this.onHotKey);
139
128
  }
140
129
  render() {
141
130
  const {
142
131
  target,
143
132
  columns,
133
+ container,
134
+ popperClassName,
144
135
  t
145
136
  } = this.props;
146
137
  const {
@@ -149,7 +140,9 @@ class FilterPopover extends Component {
149
140
  } = this.state;
150
141
  const canAddFilter = columns.length > 0;
151
142
  return /*#__PURE__*/React.createElement(UncontrolledPopover, {
152
- placement: "auto-start",
143
+ container: container,
144
+ popperClassName: popperClassName,
145
+ placement: "bottom-start",
153
146
  isOpen: true,
154
147
  target: target,
155
148
  fade: false,
@@ -7,11 +7,6 @@ import FilterPopover from './filter-popover';
7
7
  class FilterSetter extends React.Component {
8
8
  constructor(props) {
9
9
  super(props);
10
- _defineProperty(this, "onFilterSetterToggle", () => {
11
- this.setState({
12
- isShowFilterPopover: !this.state.isShowFilterPopover
13
- });
14
- });
15
10
  _defineProperty(this, "update", update => {
16
11
  const {
17
12
  filters,
@@ -29,47 +24,29 @@ class FilterSetter extends React.Component {
29
24
  }
30
25
  render() {
31
26
  const {
32
- wrapperClass,
33
27
  filtersClassName,
28
+ popperClassName,
34
29
  filterConjunction,
35
30
  filters,
36
31
  columns,
37
32
  collaborators,
38
33
  isNeedSubmit,
39
- t
34
+ isShowFilterPopover,
35
+ container
40
36
  } = this.props;
41
37
  if (!columns) return null;
42
- const {
43
- isShowFilterPopover
44
- } = this.state;
45
38
  const validFilters = deepCopy(getValidFilters(filters || [], columns));
46
- const filtersLength = validFilters ? validFilters.length : 0;
47
- let filterMessage = t('Filter');
48
- if (filtersLength === 1) {
49
- filterMessage = t('1 Filter');
50
- } else if (filtersLength > 1) {
51
- filterMessage = t('Filters');
52
- filterMessage = filtersLength + ' ' + filterMessage;
53
- }
54
- let labelClass = wrapperClass || '';
55
- labelClass = labelClass && filtersLength > 0 ? labelClass + ' active' : labelClass;
56
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
57
- className: "setting-item ".concat(labelClass ? 'mr-2' : 'mb-1')
58
- }, /*#__PURE__*/React.createElement("div", {
59
- className: "setting-item-btn filters-setting-btn ".concat(labelClass),
60
- onClick: this.onFilterSetterToggle
61
- }, /*#__PURE__*/React.createElement("i", {
62
- className: "dtable-font dtable-icon-filter mr-2",
63
- id: this.props.target
64
- }), /*#__PURE__*/React.createElement("span", null, filterMessage))), isShowFilterPopover && /*#__PURE__*/React.createElement(FilterPopover, {
39
+ return /*#__PURE__*/React.createElement(React.Fragment, null, isShowFilterPopover && /*#__PURE__*/React.createElement(FilterPopover, {
40
+ container: container,
65
41
  filtersClassName: filtersClassName,
42
+ popperClassName: popperClassName,
66
43
  target: this.props.target,
67
44
  isNeedSubmit: isNeedSubmit,
68
45
  columns: columns,
69
46
  collaborators: collaborators,
70
47
  filterConjunction: filterConjunction,
71
48
  filters: validFilters,
72
- hidePopover: this.onFilterSetterToggle,
49
+ hidePopover: this.props.hidePopover,
73
50
  update: this.update,
74
51
  isPre: this.props.isPre
75
52
  }));
@@ -4,19 +4,10 @@ import { UncontrolledPopover } from 'reactstrap';
4
4
  import { withTranslation } from 'react-i18next';
5
5
  import isHotkey from 'is-hotkey';
6
6
  import { COLUMNS_ICON_CONFIG } from 'dtable-utils';
7
- import { getEventClassName } from '../utils/utils';
8
7
  import HideColumnItem from './hide-column-item';
9
8
  class HideColumnPopover extends React.Component {
10
9
  constructor(props) {
11
10
  super(props);
12
- _defineProperty(this, "hidePopover", e => {
13
- if (this.popoverRef && !getEventClassName(e).includes('popover') && !this.popoverRef.contains(e.target)) {
14
- this.props.onPopoverToggle(e);
15
- e.preventDefault();
16
- e.stopPropagation();
17
- return false;
18
- }
19
- });
20
11
  _defineProperty(this, "onHotKey", e => {
21
12
  if (isHotkey('esc', e)) {
22
13
  e.preventDefault();
@@ -120,11 +111,9 @@ class HideColumnPopover extends React.Component {
120
111
  };
121
112
  }
122
113
  componentDidMount() {
123
- document.addEventListener('click', this.hidePopover, true);
124
114
  document.addEventListener('keydown', this.onHotKey);
125
115
  }
126
116
  componentWillUnmount() {
127
- document.removeEventListener('click', this.hidePopover, true);
128
117
  document.removeEventListener('keydown', this.onHotKey);
129
118
  }
130
119
  static getDerivedStateFromProps(nextProps, preState) {
@@ -149,12 +138,16 @@ class HideColumnPopover extends React.Component {
149
138
  render() {
150
139
  const {
151
140
  target,
141
+ container,
142
+ popperClassName,
152
143
  t
153
144
  } = this.props;
154
145
  const fieldSettings = this.getFilteredColumns();
155
146
  const isEmpty = fieldSettings.length === 0 ? true : false;
156
147
  return /*#__PURE__*/React.createElement(UncontrolledPopover, {
157
- placement: "auto-start",
148
+ placement: "bottom-start",
149
+ container: container,
150
+ popperClassName: popperClassName,
158
151
  isOpen: true,
159
152
  target: target,
160
153
  fade: false,
@@ -1,85 +1,41 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
2
  import React, { Component } from 'react';
3
3
  import { withTranslation } from 'react-i18next';
4
- import isEqual from 'lodash.isequal';
5
4
  import HideColumnPopover from './hide-column-popover';
6
5
  import './index.css';
7
6
  class HideColumnSetter extends Component {
8
7
  constructor(props) {
9
8
  super(props);
10
- _defineProperty(this, "onHideColumnToggle", () => {
11
- const {
12
- isShowHideColumnSetter
13
- } = this.state;
14
- if (isShowHideColumnSetter) {
15
- const {
16
- shownColumnKeys
17
- } = this.state;
18
- this.props.onSettingUpdate(shownColumnKeys);
19
- }
20
- this.setState({
21
- isShowHideColumnSetter: !isShowHideColumnSetter
22
- });
23
- });
24
9
  _defineProperty(this, "modifyHiddenColumns", shownColumnKeys => {
25
10
  this.setState({
26
11
  shownColumnKeys
27
12
  });
13
+ this.props.onSettingUpdate(shownColumnKeys);
28
14
  });
29
15
  this.state = {
30
- isShowHideColumnSetter: false,
31
16
  shownColumnKeys: props.shownColumnKeys || []
32
17
  };
33
18
  }
34
- UNSAFE_componentWillReceiveProps(nextProps) {
35
- const {
36
- shownColumnKeys: oldShownColumnKeys
37
- } = this.props;
38
- const {
39
- shownColumnKeys: newShownColumnKeys
40
- } = nextProps;
41
- if (!isEqual(oldShownColumnKeys, newShownColumnKeys)) {
42
- this.setState({
43
- isShowHideColumnSetter: false,
44
- shownColumnKeys: newShownColumnKeys
45
- });
46
- }
47
- }
48
19
  render() {
49
20
  const {
50
21
  target,
51
22
  columns,
52
- wrapperClass,
53
- t
23
+ isShowHideColumnSetter,
24
+ container,
25
+ popperClassName
54
26
  } = this.props;
55
27
  const {
56
28
  shownColumnKeys
57
29
  } = this.state;
58
30
  if (!columns) return null;
59
- let message = t('Hide_columns');
60
- const hiddenColumns = columns.filter(column => !shownColumnKeys.includes(column.key));
61
- const hiddenColumnsLength = hiddenColumns.length;
62
- if (hiddenColumnsLength === 1) {
63
- message = t('1_hidden_column');
64
- } else if (hiddenColumnsLength > 1) {
65
- message = hiddenColumnsLength + ' ' + t('hidden_columns');
66
- }
67
- let labelClass = wrapperClass || '';
68
- labelClass = labelClass && hiddenColumnsLength > 0 ? labelClass + ' active' : labelClass;
69
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
70
- className: "setting-item ".concat(labelClass ? '' : 'mb-1')
71
- }, /*#__PURE__*/React.createElement("div", {
72
- className: "mr-2 setting-item-btn filters-setting-btn ".concat(labelClass),
73
- onClick: this.onHideColumnToggle
74
- }, /*#__PURE__*/React.createElement("i", {
75
- className: "dtable-font dtable-icon-hide mr-2",
76
- id: target
77
- }), /*#__PURE__*/React.createElement("span", null, message))), this.state.isShowHideColumnSetter && /*#__PURE__*/React.createElement(HideColumnPopover, {
31
+ return /*#__PURE__*/React.createElement(React.Fragment, null, isShowHideColumnSetter && /*#__PURE__*/React.createElement(HideColumnPopover, {
32
+ container: container,
78
33
  target: target,
34
+ popperClassName: popperClassName,
79
35
  columns: columns,
80
36
  shownColumnKeys: shownColumnKeys,
81
37
  modifyHiddenColumns: this.modifyHiddenColumns,
82
- onPopoverToggle: this.onHideColumnToggle
38
+ onPopoverToggle: this.props.onPopoverToggle
83
39
  }));
84
40
  }
85
41
  }
@@ -1,60 +1,36 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
2
  import React, { Component } from 'react';
3
3
  import { withTranslation } from 'react-i18next';
4
- import { getValidSorts } from 'dtable-utils';
5
4
  import SortPopover from './sort-popover';
6
5
  import './index.css';
7
6
  class SortSetter extends Component {
8
- constructor(props) {
9
- super(props);
10
- _defineProperty(this, "onSortToggle", () => {
11
- this.setState({
12
- isShowSortPopover: !this.state.isShowSortPopover
13
- });
14
- });
7
+ constructor() {
8
+ super(...arguments);
15
9
  _defineProperty(this, "update", update => {
16
10
  const {
17
11
  sorts
18
12
  } = update || {};
19
13
  this.props.onSortsChange(sorts);
20
14
  });
21
- this.state = {
22
- isShowSortPopover: false
23
- };
24
15
  }
25
16
  render() {
26
17
  const {
27
18
  sorts,
28
19
  columns,
29
20
  isNeedSubmit,
30
- wrapperClass,
31
- t
21
+ isShowSortPopover,
22
+ container,
23
+ popperClassName,
24
+ onSortToggle
32
25
  } = this.props;
33
26
  if (!columns) return null;
34
- const validSorts = getValidSorts(sorts || [], columns);
35
- const sortsLength = validSorts ? validSorts.length : 0;
36
- let sortMessage = t('Sort');
37
- if (sortsLength === 1) {
38
- sortMessage = t('1 Sort');
39
- } else if (sortsLength > 1) {
40
- sortMessage = t('Sorts');
41
- sortMessage = sortsLength + ' ' + sortMessage;
42
- }
43
- let labelClass = wrapperClass || '';
44
- labelClass = labelClass && sortsLength > 0 ? labelClass + ' active' : labelClass;
45
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
46
- className: "setting-item ".concat(labelClass ? '' : 'mb-1')
47
- }, /*#__PURE__*/React.createElement("div", {
48
- className: "mr-2 setting-item-btn filters-setting-btn ".concat(labelClass),
49
- onClick: this.onSortToggle
50
- }, /*#__PURE__*/React.createElement("i", {
51
- className: "dtable-font dtable-icon-sort mr-2",
52
- id: this.props.target
53
- }), /*#__PURE__*/React.createElement("span", null, sortMessage))), this.state.isShowSortPopover && /*#__PURE__*/React.createElement(SortPopover, {
27
+ return /*#__PURE__*/React.createElement(React.Fragment, null, isShowSortPopover && /*#__PURE__*/React.createElement(SortPopover, {
54
28
  target: this.props.target,
29
+ popperClassName: popperClassName,
30
+ container: container,
55
31
  isNeedSubmit: isNeedSubmit,
56
32
  columns: columns,
57
- onSortComponentToggle: this.onSortToggle,
33
+ onSortComponentToggle: onSortToggle,
58
34
  update: this.update,
59
35
  sorts: sorts
60
36
  }));
@@ -4,7 +4,7 @@ import React, { Component, Fragment } from 'react';
4
4
  import isHotkey from 'is-hotkey';
5
5
  import { Button, UncontrolledPopover } from 'reactstrap';
6
6
  import { COLUMNS_ICON_CONFIG, SORT_COLUMN_OPTIONS, SORT_TYPE } from 'dtable-utils';
7
- import { getEventClassName, getColumnByKey } from '../utils/utils';
7
+ import { getColumnByKey } from '../utils/utils';
8
8
  import CommonAddTool from '../common-add-tool';
9
9
  import { execSortsOperation, getDisplaySorts, isSortsEmpty, SORT_OPERATION } from './sort-utils';
10
10
  import { withTranslation } from 'react-i18next';
@@ -12,14 +12,6 @@ const SORT_TYPES = [SORT_TYPE.UP, SORT_TYPE.DOWN];
12
12
  class SortPopover extends Component {
13
13
  constructor(props) {
14
14
  super(props);
15
- _defineProperty(this, "hideDTablePopover", e => {
16
- if (this.sortPopoverRef && !getEventClassName(e).includes('popover') && !this.sortPopoverRef.contains(e.target)) {
17
- this.props.onSortComponentToggle(e);
18
- e.preventDefault();
19
- e.stopPropagation();
20
- return false;
21
- }
22
- });
23
15
  _defineProperty(this, "isNeedSubmit", () => {
24
16
  return this.props.isNeedSubmit;
25
17
  });
@@ -222,11 +214,9 @@ class SortPopover extends Component {
222
214
  };
223
215
  }
224
216
  componentDidMount() {
225
- document.addEventListener('click', this.hideDTablePopover, true);
226
217
  document.addEventListener('keydown', this.onHotKey);
227
218
  }
228
219
  componentWillUnmount() {
229
- document.removeEventListener('click', this.hideDTablePopover, true);
230
220
  document.removeEventListener('keydown', this.onHotKey);
231
221
  }
232
222
  UNSAFE_componentWillReceiveProps(nextProps) {
@@ -238,6 +228,8 @@ class SortPopover extends Component {
238
228
  render() {
239
229
  const {
240
230
  target,
231
+ container,
232
+ popperClassName,
241
233
  t
242
234
  } = this.props;
243
235
  const {
@@ -245,12 +237,14 @@ class SortPopover extends Component {
245
237
  } = this.state;
246
238
  const isEmpty = isSortsEmpty(sorts);
247
239
  return /*#__PURE__*/React.createElement(UncontrolledPopover, {
248
- placement: "auto-start",
240
+ placement: "bottom-start",
249
241
  isOpen: true,
250
242
  target: target,
251
243
  fade: false,
252
244
  hideArrow: true,
253
245
  className: "sort-popover",
246
+ popperClassName: popperClassName,
247
+ container: container,
254
248
  boundariesElement: document.body
255
249
  }, /*#__PURE__*/React.createElement("div", {
256
250
  ref: ref => this.sortPopoverRef = ref,
@@ -1,5 +1,5 @@
1
1
  import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2
- import React, { useCallback } from 'react';
2
+ import React, { useCallback, useMemo } from 'react';
3
3
  import { useSlateStatic } from '@seafile/slate-react';
4
4
  import { Transforms } from '@seafile/slate';
5
5
  import { insertElement } from './helpers';
@@ -12,6 +12,8 @@ import { ELEMENT_TYPE, INSERT_POSITION, LOCAL_IMAGE, PARAGRAPH, SIDE_INSERT_MENU
12
12
  import EventBus from '../../../utils/event-bus';
13
13
  import { INTERNAL_EVENT } from '../../../constants';
14
14
  import DropdownMenuItem from '../../commons/dropdown-menu-item';
15
+ import SeaTableColumnMenu from '../../plugins/seatable-column/menu';
16
+ import SeaTableTableMenu from '../../plugins/seatable-tables/menu';
15
17
  import { wrapCallout } from '../../plugins/callout/helper';
16
18
  const InsertBlockMenu = _ref => {
17
19
  let {
@@ -119,6 +121,14 @@ const InsertBlockMenu = _ref => {
119
121
  menuConfig: item,
120
122
  onClick: () => onInsert(item.type)
121
123
  });
124
+ }), editor.columns && /*#__PURE__*/React.createElement(SeaTableColumnMenu, {
125
+ editor: editor,
126
+ readonly: editor.readonly,
127
+ insertPosition: insertPosition
128
+ }), editor.tables && /*#__PURE__*/React.createElement(SeaTableTableMenu, {
129
+ editor: editor,
130
+ readonly: editor.readonly,
131
+ insertPosition: insertPosition
122
132
  }));
123
133
  };
124
134
  InsertBlockMenu.defaultProps = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seafile/sdoc-editor",
3
- "version": "1.0.31",
3
+ "version": "1.0.32",
4
4
  "private": false,
5
5
  "description": "This is a sdoc editor",
6
6
  "main": "dist/index.js",
@@ -14,6 +14,14 @@
14
14
  />
15
15
  <missing-glyph />
16
16
 
17
+ <glyph glyph-name="sdoc-sort" unicode="&#58996;" d="M294.4 790.4l201.6-204.8c19.2-19.2 19.2-51.2 0-73.6-19.2-19.2-51.2-19.2-70.4 0L320 620.8v-604.8c0-25.6-22.4-48-48-48S224-9.6 224 16V620.8L118.4 512c-19.2-19.2-48-19.2-67.2-3.2l-3.2 3.2c-19.2 19.2-19.2 51.2 0 73.6l201.6 204.8c12.8 12.8 32 12.8 44.8 0zM752 800c25.6 0 48-22.4 48-48v-604.8l105.6 108.8c19.2 19.2 51.2 19.2 70.4 0 19.2-19.2 19.2-51.2 0-73.6l-201.6-204.8c-12.8-12.8-32-12.8-44.8 0l-201.6 204.8c-19.2 19.2-19.2 51.2 0 73.6l3.2 3.2c19.2 16 48 16 67.2-3.2l105.6-108.8V752c0 25.6 22.4 48 48 48z" horiz-adv-x="1024" />
18
+
19
+ <glyph glyph-name="sdoc-set-up" unicode="&#58997;" d="M598.52384 809.6l12.8-92.8 6.4-38.4 35.2-16c12.8-6.4 28.8-16 41.6-25.6l32-19.2 35.2 12.8 92.8 35.2 86.4-140.8-76.8-54.4-32-25.6 3.2-38.4v-44.8l-3.2-38.4 32-25.6 76.8-57.6-83.2-140.8-92.8 35.2-35.2 12.8-32-19.2c-12.8-9.6-28.8-19.2-41.6-25.6l-35.2-16-6.4-38.4-12.8-92.8h-172.8l-12.8 92.8-6.4 38.4-35.2 16c-12.8 6.4-28.8 16-41.6 25.6l-32 19.2-35.2-12.8-92.8-35.2-86.4 140.8L160.12384 297.6l32 25.6-3.2 38.4V384v22.4l3.2 38.4-32 25.6-76.8 57.6 83.2 140.8 92.8-35.2 35.2-12.8 32 19.2c12.8 9.6 28.8 19.2 41.6 25.6l35.2 16 6.4 38.4 12.8 92.8h176m12.8 83.2H416.12384c-32 0-57.6-22.4-60.8-51.2l-16-105.6c-19.2-9.6-35.2-19.2-54.4-32L182.52384 748.8c-9.6 3.2-16 3.2-22.4 3.2-22.4 0-41.6-9.6-54.4-28.8L6.52384 560c-12.8-28.8-6.4-60.8 16-80l86.4-67.2c0-9.6-3.2-22.4-3.2-28.8 0-9.6 0-19.2 3.2-28.8L22.52384 288c-22.4-19.2-28.8-51.2-16-76.8l96-163.2c9.6-19.2 32-32 54.4-32 6.4 0 12.8 0 22.4 3.2l102.4 41.6c16-12.8 35.2-22.4 54.4-28.8l16-105.6c3.2-28.8 28.8-51.2 60.8-51.2H608.12384c32 0 57.6 22.4 60.8 51.2l16 105.6c19.2 9.6 35.2 19.2 54.4 28.8l102.4-41.6c6.4-3.2 16-3.2 22.4-3.2 22.4 0 41.6 9.6 54.4 28.8l99.2 166.4c16 25.6 9.6 57.6-16 76.8l-86.4 67.2c0 9.6 3.2 19.2 3.2 28.8s0 22.4-3.2 28.8l86.4 67.2c22.4 19.2 28.8 51.2 16 76.8l-96 163.2c-9.6 19.2-32 32-54.4 32-6.4 0-12.8 0-22.4-3.2l-102.4-41.6c-16 12.8-35.2 22.4-54.4 28.8L672.12384 844.8C665.72384 873.6 640.12384 896 611.32384 896zM512.12384 512c70.4 0 128-57.6 128-128s-57.6-128-128-128-128 57.6-128 128 57.6 128 128 128m0 86.4a214.4 214.4 0 1 1 0-428.8 214.4 214.4 0 0 1 0 428.8z" horiz-adv-x="1026" />
20
+
21
+ <glyph glyph-name="sdoc-filter1" unicode="&#58994;" d="M617.6 160c28.8 0 54.4-22.4 54.4-48s-22.4-48-54.4-48h-214.4c-28.8 0-54.4 22.4-54.4 48s22.4 48 54.4 48h214.4z m169.6 272c25.6 0 44.8-22.4 44.8-48s-19.2-48-44.8-48H236.8c-25.6 0-44.8 22.4-44.8 48s19.2 48 44.8 48h550.4z m236.8 224c0-25.6-22.4-48-48-48h-928C22.4 608 0 630.4 0 656S22.4 704 48 704h931.2c22.4 0 44.8-22.4 44.8-48z" horiz-adv-x="1024" />
22
+
23
+ <glyph glyph-name="sdoc-eye-slash" unicode="&#58995;" d="M83.84448 790.4l156.8-124.8c73.6 57.6 166.4 99.2 275.2 99.2 134.4 0 243.2-64 320-137.6 76.8-73.6 131.2-163.2 153.6-224 6.4-12.8 6.4-28.8 0-41.6-22.4-51.2-64-124.8-124.8-192l140.8-112c19.2-16 22.4-44.8 6.4-67.2-16-19.2-48-22.4-67.2-6.4l-928 736C-2.55552 736-5.75552 764.8 10.24448 787.2s51.2 19.2 73.6 3.2z m32-256l73.6-60.8c-25.6-35.2-44.8-70.4-57.6-96 22.4-51.2 64-121.6 128-179.2 67.2-64 153.6-112 256-112 44.8 0 86.4 9.6 124.8 22.4l76.8-64c-57.6-32-124.8-51.2-201.6-51.2-134.4 0-243.2 64-320 137.6-76.8 73.6-131.2 163.2-153.6 224-6.4 12.8-6.4 28.8 0 41.6 12.8 41.6 38.4 89.6 73.6 137.6z m185.6-153.6l112-89.6c12.8-16 25.6-25.6 44.8-35.2l112-89.6c-19.2-3.2-35.2-6.4-54.4-6.4-118.4 0-214.4 99.2-214.4 220.8z m214.4 288c-76.8 0-144-25.6-198.4-64l67.2-51.2c35.2 28.8 80 44.8 131.2 44.8 118.4 0 214.4-99.2 214.4-220.8 0-32-6.4-60.8-19.2-89.6l86.4-70.4c48 54.4 83.2 112 102.4 153.6-22.4 51.2-64 121.6-128 179.2-64 67.2-150.4 118.4-256 118.4z m0-153.6h-3.2c3.2-9.6 3.2-19.2 3.2-28.8 0-12.8-3.2-25.6-6.4-38.4l134.4-108.8c3.2 12.8 3.2 22.4 3.2 35.2 3.2 80-57.6 140.8-131.2 140.8z" horiz-adv-x="1027" />
24
+
17
25
  <glyph glyph-name="sdoc-settings" unicode="&#58993;" d="M976 467.2c3.2-3.2 3.2-3.2 3.2-9.6L976 326.4c0-3.2-3.2-12.8-9.6-12.8l-108.8-38.4c-3.2-12.8-12.8-28.8-19.2-41.6l51.2-102.4c0-3.2 0-12.8-3.2-19.2l-96-96c-3.2-3.2-12.8-9.6-19.2-3.2L668.8 64c-12.8-9.6-28.8-12.8-41.6-19.2L588.8-64c0-3.2-3.2-9.6-12.8-9.6H444.8c-3.2 0-12.8 3.2-12.8 9.6l-38.4 108.8c-12.8 3.2-28.8 12.8-41.6 19.2l-102.4-51.2c-3.2 0-12.8 0-19.2 3.2l-96 96c-6.4 0-12.8 9.6-6.4 16l51.2 102.4c-9.6 12.8-12.8 28.8-19.2 41.6L51.2 310.4c-3.2 0-9.6 3.2-9.6 12.8V454.4c0 3.2 3.2 12.8 9.6 12.8L160 508.8c3.2 12.8 9.6 28.8 19.2 41.6L128 656c-6.4 6.4-6.4 12.8 0 12.8l96 96c3.2 9.6 9.6 9.6 16 3.2l102.4-51.2c12.8 9.6 28.8 12.8 41.6 19.2l38.4 112c0 3.2 3.2 9.6 12.8 9.6h128c3.2 0 12.8-3.2 12.8-9.6l38.4-108.8c12.8-3.2 28.8-12.8 41.6-19.2l102.4 51.2c3.2 0 12.8 0 19.2-3.2l96-96c3.2-3.2 9.6-12.8 3.2-19.2l-51.2-102.4c9.6-12.8 12.8-28.8 19.2-41.6L976 467.2zM566.4 614.4c-176 48-329.6-108.8-288-288 19.2-76.8 86.4-140.8 160-160 176-48 329.6 108.8 288 288-19.2 80-80 140.8-160 160z" horiz-adv-x="1024" />
18
26
 
19
27
  <glyph glyph-name="sdoc-seatable-table" unicode="&#58991;" d="M384 896c35.2 0 64-28.8 64-64v-320c0-35.2-28.8-64-64-64H64c-35.2 0-64 28.8-64 64V832C0 867.2 28.8 896 64 896h320z m-32-96H96v-256h256V800z m608 96c35.2 0 64-28.8 64-64v-320c0-35.2-28.8-64-64-64H640c-35.2 0-64 28.8-64 64V832c0 35.2 28.8 64 64 64h320z m-32-96h-256v-256h256V800zM384 320c35.2 0 64-28.8 64-64v-320c0-35.2-28.8-64-64-64H64c-35.2 0-64 28.8-64 64V256c0 35.2 28.8 64 64 64h320z m-32-96H96v-256h256v256z m608 96c35.2 0 64-28.8 64-64v-320c0-35.2-28.8-64-64-64H640c-35.2 0-64 28.8-64 64V256c0 35.2 28.8 64 64 64h320z m-32-96h-256v-256h256v256z" horiz-adv-x="1024" />
@@ -1,14 +1,11 @@
1
1
  @font-face {
2
- font-family: "sdocfont";
3
- /* Project id 4097705 */
4
- src: url('./sdoc-editor-font/iconfont.eot?t=1719382079268');
5
- /* IE9 */
6
- src: url('./sdoc-editor-font/iconfont.eot?t=1719382079268#iefix') format('embedded-opentype'),
7
- /* IE6-IE8 */
8
- url('./sdoc-editor-font/iconfont.woff2?t=1719382079268') format('woff2'),
9
- url('./sdoc-editor-font/iconfont.woff?t=1719382079268') format('woff'),
10
- url('./sdoc-editor-font/iconfont.ttf?t=1719382079268') format('truetype'),
11
- url('./sdoc-editor-font/iconfont.svg?t=1719382079268#sdocfont') format('svg');
2
+ font-family: "sdocfont"; /* Project id 4097705 */
3
+ src: url('./sdoc-editor-font/iconfont.eot?t=1721201136436'); /* IE9 */
4
+ src: url('./sdoc-editor-font/iconfont.eot?t=1721201136436#iefix') format('embedded-opentype'), /* IE6-IE8 */
5
+ url('./sdoc-editor-font/iconfont.woff2?t=1721201136436') format('woff2'),
6
+ url('./sdoc-editor-font/iconfont.woff?t=1721201136436') format('woff'),
7
+ url('./sdoc-editor-font/iconfont.ttf?t=1721201136436') format('truetype'),
8
+ url('./sdoc-editor-font/iconfont.svg?t=1721201136436#sdocfont') format('svg');
12
9
  }
13
10
 
14
11
  .sdocfont {
@@ -19,6 +16,22 @@
19
16
  -moz-osx-font-smoothing: grayscale;
20
17
  }
21
18
 
19
+ .sdoc-sort:before {
20
+ content: "\e674";
21
+ }
22
+
23
+ .sdoc-set-up:before {
24
+ content: "\e675";
25
+ }
26
+
27
+ .sdoc-filter1:before {
28
+ content: "\e672";
29
+ }
30
+
31
+ .sdoc-eye-slash:before {
32
+ content: "\e673";
33
+ }
34
+
22
35
  .sdoc-settings:before {
23
36
  content: "\e671";
24
37
  }
@@ -466,3 +479,4 @@
466
479
  .sdoc-user:before {
467
480
  content: "\e629";
468
481
  }
482
+