sea-chart 1.1.21 → 1.1.22-alpha.2

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 (64) hide show
  1. package/dist/components/data-process-setter/data-setting-header.js +11 -0
  2. package/dist/components/data-process-setter/hide-column-setter.js +79 -0
  3. package/dist/components/data-process-setter/index.js +4 -0
  4. package/dist/components/data-process-setter/sort-setter.js +75 -0
  5. package/dist/components/popover/hide-column-popover/hide-column-popover-widgets/hide-column-item.js +60 -0
  6. package/dist/components/popover/hide-column-popover/hide-column-popover.css +38 -0
  7. package/dist/components/popover/hide-column-popover/hide-column-popover.js +208 -0
  8. package/dist/components/popover/sort-popover/sort-popover-widgets/sort-utils.js +71 -0
  9. package/dist/components/popover/sort-popover/sort-popover.css +83 -0
  10. package/dist/components/popover/sort-popover/sort-popover.js +290 -0
  11. package/dist/components/types-dialog/index.js +5 -2
  12. package/dist/constants/common-constants.js +3 -1
  13. package/dist/constants/index.js +1 -1
  14. package/dist/constants/type-image.js +2 -1
  15. package/dist/constants/type.js +5 -3
  16. package/dist/context.js +1 -1
  17. package/dist/locale/lang/de.js +17 -2
  18. package/dist/locale/lang/en.js +16 -1
  19. package/dist/locale/lang/es.js +16 -1
  20. package/dist/locale/lang/fr.js +17 -2
  21. package/dist/locale/lang/pt.js +16 -1
  22. package/dist/locale/lang/ru.js +16 -1
  23. package/dist/locale/lang/zh_CN.js +16 -1
  24. package/dist/model/index.js +3 -1
  25. package/dist/model/table-element.js +22 -0
  26. package/dist/settings/data-settings.js +5 -0
  27. package/dist/settings/table-element-settings/components/data-filter.css +17 -0
  28. package/dist/settings/table-element-settings/components/data-filter.js +89 -0
  29. package/dist/settings/table-element-settings/data-settings.js +100 -0
  30. package/dist/settings/table-element-settings/index.css +190 -0
  31. package/dist/settings/table-element-settings/index.js +2 -0
  32. package/dist/settings/widgets/chart-type/index.js +3 -1
  33. package/dist/settings/widgets/common-data-settings.js +1 -0
  34. package/dist/settings/widgets/data-filter/index.css +1 -1
  35. package/dist/utils/chart-utils/base-utils.js +7 -1
  36. package/dist/utils/chart-utils/index.js +5 -5
  37. package/dist/utils/chart-utils/original-data-utils/index.js +2 -2
  38. package/dist/utils/chart-utils/sql-statistics-utils.js +10 -4
  39. package/dist/utils/chart.js +9 -1
  40. package/dist/utils/hotkey.js +5 -0
  41. package/dist/utils/row-utils.js +10 -1
  42. package/dist/utils/sql/chart-data-sql.js +4 -0
  43. package/dist/utils/sql/column-2-sql-column.js +4 -0
  44. package/dist/view/index.css +5 -1
  45. package/dist/view/index.js +56 -14
  46. package/dist/view/wrapper/bar-group.js +1 -1
  47. package/dist/view/wrapper/index.js +7 -0
  48. package/dist/view/wrapper/table-element/components/dataset-utils.js +123 -0
  49. package/dist/view/wrapper/table-element/components/formatter.js +309 -0
  50. package/dist/view/wrapper/table-element/components/formula-formatter.js +36 -0
  51. package/dist/view/wrapper/table-element/components/link-formatter.js +269 -0
  52. package/dist/view/wrapper/table-element/components/record.js +67 -0
  53. package/dist/view/wrapper/table-element/components/records-body.js +117 -0
  54. package/dist/view/wrapper/table-element/components/records-header/index.js +41 -0
  55. package/dist/view/wrapper/table-element/components/records-header/records-header-cell.js +51 -0
  56. package/dist/view/wrapper/table-element/components/records.js +117 -0
  57. package/dist/view/wrapper/table-element/components/resize-column-handle/index.css +11 -0
  58. package/dist/view/wrapper/table-element/components/resize-column-handle/resize-column-handle.js +48 -0
  59. package/dist/view/wrapper/table-element/components/value-display-utils.js +13 -0
  60. package/dist/view/wrapper/table-element/components/vertical-scrollbar/index.css +12 -0
  61. package/dist/view/wrapper/table-element/components/vertical-scrollbar/index.js +36 -0
  62. package/dist/view/wrapper/table-element/css/index.css +239 -0
  63. package/dist/view/wrapper/table-element/index.js +101 -0
  64. package/package.json +1 -1
@@ -0,0 +1,89 @@
1
+ import _DTableFiltersPopover from "dtable-ui-component/lib/DTableFiltersPopover";
2
+ import React, { useCallback, useContext, useMemo, useState } from 'react';
3
+ import { getTableById } from 'dtable-utils';
4
+ import { eventStopPropagation, generatorKey } from '../../../utils';
5
+ import intl from '../../../intl';
6
+ import context from '../../../context';
7
+ import { DepartmentsContext } from '../../../utils/contexts';
8
+ import { CHART_TYPE } from '../../../constants';
9
+ import './data-filter.css';
10
+ const DataFilter = _ref => {
11
+ var _availableFilters;
12
+ let {
13
+ chart,
14
+ tables,
15
+ onChange
16
+ } = _ref;
17
+ const [isFilterSetterShow, setIsFilterSetterShow] = useState(false);
18
+ const {
19
+ departments
20
+ } = useContext(DepartmentsContext);
21
+ const {
22
+ config
23
+ } = chart;
24
+ const {
25
+ type,
26
+ table_id,
27
+ shown_column_keys,
28
+ filters,
29
+ filter_conjunction
30
+ } = config;
31
+ let availableFilters = [];
32
+ // some of the filters of TABLE_ELEMENT maybe one of the hidden columns, so we need to filter them out
33
+ if (shown_column_keys && type === CHART_TYPE.TABLE_ELEMENT) {
34
+ availableFilters = filters === null || filters === void 0 ? void 0 : filters.filter(filter => shown_column_keys.includes(filter.column_key));
35
+ } else {
36
+ availableFilters = filters;
37
+ }
38
+ const toggleFilterPopover = useCallback(event => {
39
+ eventStopPropagation(event);
40
+ setIsFilterSetterShow(!isFilterSetterShow);
41
+ }, [isFilterSetterShow]);
42
+ const updateFilters = useCallback(update => {
43
+ onChange && onChange(update);
44
+ }, [onChange]);
45
+ const id = useMemo(() => {
46
+ return 'sea-chart-data-filter-' + generatorKey();
47
+ }, []);
48
+ const shownColumns = useMemo(() => {
49
+ const table = getTableById(tables, table_id);
50
+ if (!table || !table.columns) return [];
51
+ if (!shown_column_keys) {
52
+ return table.columns;
53
+ } else {
54
+ return table.columns.filter(column => shown_column_keys.includes(column.key));
55
+ }
56
+ }, [shown_column_keys, table_id, tables]);
57
+ const filterLength = ((_availableFilters = availableFilters) === null || _availableFilters === void 0 ? void 0 : _availableFilters.length) || 0;
58
+ const filterMessage = useMemo(() => {
59
+ let filterMessage = intl.get('Filter');
60
+ if (filterLength === 1) {
61
+ filterMessage = intl.get('1 Filter');
62
+ } else if (filterLength > 1) {
63
+ filterMessage = filterLength + ' ' + intl.get('Filters');
64
+ }
65
+ return filterMessage;
66
+ }, [filterLength]);
67
+ const filterConjunction = useMemo(() => {
68
+ return filter_conjunction || 'And';
69
+ }, [filter_conjunction]);
70
+ const collaborators = context.getCollaboratorsFromCache();
71
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
72
+ id: id,
73
+ className: "sea-chart-data-filter mb-1",
74
+ onClick: toggleFilterPopover
75
+ }, /*#__PURE__*/React.createElement("i", {
76
+ className: "dtable-font dtable-icon-filter"
77
+ }), /*#__PURE__*/React.createElement("span", null, filterMessage)), isFilterSetterShow && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_DTableFiltersPopover, {
78
+ isNeedSubmit: true,
79
+ target: id,
80
+ filters: availableFilters,
81
+ filterConjunction: filterConjunction,
82
+ columns: shownColumns,
83
+ departments: departments,
84
+ collaborators: collaborators,
85
+ hidePopover: toggleFilterPopover,
86
+ update: updateFilters
87
+ })));
88
+ };
89
+ export default DataFilter;
@@ -0,0 +1,100 @@
1
+ import React, { useCallback } from 'react';
2
+ import { getTableById } from 'dtable-utils';
3
+ import SelectTable from '../widgets/select-table/index.js';
4
+ import StatisticType from '../widgets/chart-type';
5
+ import { generateChartConfig } from '../../utils/chart.js';
6
+ import { SortSetter, DataSettingHeader, HideColumnSetter } from '../../components/data-process-setter';
7
+ import Divider from '../widgets/divider/index.js';
8
+ import DataFilter from './components/data-filter.js';
9
+ import './index.css';
10
+ export default function TableElementDataSetting(_ref) {
11
+ let {
12
+ tables,
13
+ chart,
14
+ onChange
15
+ } = _ref;
16
+ const {
17
+ config
18
+ } = chart;
19
+ const {
20
+ table_id,
21
+ shown_column_keys,
22
+ sorts
23
+ } = config;
24
+ const onTableChange = option => {
25
+ const newTableId = option.value;
26
+ if (newTableId === table_id) return;
27
+ const selectedTable = getTableById(tables, newTableId);
28
+ const shown_column_keys = selectedTable.columns.map(col => col.key);
29
+ // initially show all columns
30
+ let newChartConfig = {
31
+ table_id: newTableId,
32
+ shown_column_keys,
33
+ sorts: [],
34
+ groupbys: [],
35
+ filters: [],
36
+ filter_conjunction: 'And'
37
+ };
38
+ onChange && onChange(newChartConfig);
39
+ };
40
+ const onTypeChange = newConfig => {
41
+ onChange && onChange(newConfig);
42
+ };
43
+ const onFiltersChange = newConfig => {
44
+ onChange && onChange(newConfig);
45
+ };
46
+ const onSortsChange = sorts => {
47
+ onChange && onChange({
48
+ sorts
49
+ });
50
+ };
51
+ const onGroupbyChange = groupbys => {
52
+ onChange && onChange({
53
+ groupbys
54
+ });
55
+ };
56
+ const onHideColumnChange = shownColumnKeys => {
57
+ onChange && onChange({
58
+ shown_column_keys: shownColumnKeys
59
+ });
60
+ };
61
+ const generateConfig = useCallback(newConfig => {
62
+ return generateChartConfig(newConfig, tables);
63
+ }, [tables]);
64
+ const selectedTable = getTableById(tables, table_id) || {};
65
+ const {
66
+ columns = []
67
+ } = selectedTable;
68
+ let available_columns;
69
+ // if shown_column_keys is not set, then show all columns
70
+ if (!shown_column_keys) {
71
+ available_columns = columns;
72
+ } else {
73
+ available_columns = columns.filter(column => shown_column_keys.includes(column.key));
74
+ }
75
+ const availableColumnsKeys = available_columns.map(col => col.key);
76
+ return /*#__PURE__*/React.createElement("div", {
77
+ className: "sea-chart-table-element-settings"
78
+ }, /*#__PURE__*/React.createElement(StatisticType, {
79
+ chart: chart,
80
+ generateChartConfig: generateConfig,
81
+ onChange: onTypeChange
82
+ }), /*#__PURE__*/React.createElement(SelectTable, {
83
+ tables: tables,
84
+ selectedTableId: table_id,
85
+ onChange: onTableChange
86
+ }), /*#__PURE__*/React.createElement(DataSettingHeader, null), /*#__PURE__*/React.createElement(DataFilter, {
87
+ tables: tables,
88
+ chart: chart,
89
+ onChange: onFiltersChange
90
+ }), /*#__PURE__*/React.createElement(SortSetter, {
91
+ isNeedSubmit: true,
92
+ sorts: sorts,
93
+ columns: available_columns,
94
+ onSortsChange: onSortsChange
95
+ }), /*#__PURE__*/React.createElement(HideColumnSetter, {
96
+ shownColumnKeys: availableColumnsKeys,
97
+ columns: columns,
98
+ onSettingUpdate: onHideColumnChange
99
+ }), /*#__PURE__*/React.createElement(Divider, null));
100
+ }
@@ -0,0 +1,190 @@
1
+
2
+ .sea-chart-table-element-settings {
3
+ flex: 1;
4
+ display: flex;
5
+ flex-direction: column;
6
+ min-height: 0;
7
+ /* padding: 16px 16px 50px; */
8
+ overflow: auto;
9
+ }
10
+
11
+ .sea-chart-table-element-settings .dtable-icon-use-help {
12
+ font-size: 14px;
13
+ color: #bdbdbd;
14
+ }
15
+
16
+ .seatable-page-settings-header .link-settings-return .dtable-icon-return {
17
+ font-size: 14px;
18
+ color: #666666;
19
+ }
20
+
21
+ .sea-chart-table-element-settings .setting-item .no-image-column-tip {
22
+ font-size: 13px;
23
+ color: #666666;
24
+ }
25
+
26
+ .sea-chart-table-element-settings .setting-item .custom-switch-description {
27
+ white-space: break-spaces;
28
+ }
29
+
30
+ /* hidden column settings */
31
+ .field-settings {
32
+ margin: 8px 0;
33
+ }
34
+
35
+ .field-settings-header {
36
+ display: flex;
37
+ justify-content: space-between;
38
+ width: 100%;
39
+ padding: 0 17px;
40
+ }
41
+
42
+ .field-settings-header .hide-all,
43
+ .field-settings-header .show-all {
44
+ display: flex;
45
+ align-items: center;
46
+ justify-content: center;
47
+ height: 28px;
48
+ background: #f5f5f5;
49
+ color: #666666;
50
+ border-radius: 3px;
51
+ cursor: pointer;
52
+ }
53
+
54
+ .field-settings-header .hide-all:hover,
55
+ .field-settings-header .show-all:hover {
56
+ background: #e9e9e9;
57
+ color: #212529;
58
+ }
59
+
60
+ .hidden-column-popover .search-column {
61
+ height: 28px;
62
+ padding: 0 10px;
63
+ }
64
+
65
+ .hidden-column-popover .search-column input {
66
+ width: 100%;
67
+ height: 28px;
68
+ }
69
+
70
+ .field-settings .field-settings-body {
71
+ padding: 0.5rem 0;
72
+ max-height: 300px;
73
+ overflow-x: auto;
74
+ min-width: 260px;
75
+ }
76
+
77
+ .field-settings .field-settings-body .custom-switch {
78
+ cursor: pointer;
79
+ }
80
+
81
+ .field-settings .field-settings-body > div {
82
+ font-size: 14px;
83
+ height: 30px;
84
+ line-height: 30px;
85
+ display: flex;
86
+ cursor: pointer;
87
+ }
88
+
89
+ .field-settings .field-settings-body > div:hover {
90
+ background: #f5f5f5;
91
+ }
92
+
93
+ .field-settings .empty-hidden-columns-container {
94
+ height: 80px;
95
+ width: 270px;
96
+ padding: 10px;
97
+ }
98
+
99
+ .field-settings .empty-hidden-columns-list {
100
+ padding: 0.25rem;
101
+ font-size: 13px;
102
+ color: #666666;
103
+ }
104
+
105
+ .dtable-dropdown-menu .dropdown-item:hover .item-icon {
106
+ color: #fff;
107
+ }
108
+
109
+ .setting-item .filters-setting-btn,
110
+ .setting-item .groupbys-setting-btn {
111
+ cursor: pointer;
112
+ width: 100%;
113
+ padding: 3px 4px;
114
+ border-radius: 4px;
115
+ line-height: 22px;
116
+ }
117
+
118
+ .setting-item .filters-setting-btn:hover,
119
+ .setting-item .groupbys-setting-btn:hover {
120
+ background-color: #efefef;
121
+ }
122
+
123
+ .setting-item .filters-setting-btn .dtable-font,
124
+ .setting-item .groupbys-setting-btn .dtable-font,
125
+ .setting-item .column-read-only {
126
+ font-size: 14px;
127
+ color: #666666;
128
+ }
129
+
130
+ .setting-item-permission-title:hover {
131
+ cursor: pointer;
132
+ }
133
+
134
+ .setting-item-permission-title.disable:hover {
135
+ cursor: default;
136
+ }
137
+
138
+ .setting-item .filters-setting-btn.disable:hover,
139
+ .setting-item .setting-item-permission-title.disabled:hover {
140
+ cursor: not-allowed;
141
+ color: hsl(0, 0%, 60%);
142
+ background-color: hsl(0, 0%, 95%);
143
+ }
144
+
145
+ .setting-item .filters-setting-btn.disable:hover .column-read-only,
146
+ .setting-item .filters-setting-btn.disable .dtable-font {
147
+ color: hsl(0, 0%, 60%);
148
+ }
149
+
150
+ .setting-item.column-permission .dtable-icon-permissions {
151
+ color: #666666;
152
+ }
153
+
154
+ .setting-item .setting-item-permission-title .dtable-icon-right {
155
+ color: #ccc;
156
+ font-size: 10px;
157
+ cursor: pointer;
158
+ transition: transform 0.3s cubic-bezier(0.645, 0.045, 0.355, 1);
159
+ }
160
+
161
+ .setting-item .setting-item-permission-title .dtable-icon-right:hover {
162
+ color: #666666;
163
+ }
164
+
165
+ .setting-item .setting-item-permission-title .dtable-icon-right.rotate {
166
+ transform: rotate(90deg);
167
+ }
168
+
169
+ .setting-item .setting-item-permission-title.disabled {
170
+ padding: 3px 4px;
171
+ border-radius: 4px;
172
+ line-height: 22px;
173
+ }
174
+
175
+ .setting-item .check-record-format-switch .custom-switch .custom-switch-description {
176
+ width: 230px;
177
+ white-space: break-spaces;
178
+ }
179
+
180
+ @media (max-width: 768px) {
181
+ .seatable-app .seatable-page-settings-container {
182
+ float: right;
183
+ }
184
+ }
185
+
186
+ /* note setting */
187
+ .seatable-app .seatable-page-settings-content .note-setting-textarea {
188
+ min-height: 100px;
189
+ margin-top: 4px;
190
+ }
@@ -0,0 +1,2 @@
1
+ import TableElementDataSettings from './data-settings';
2
+ export { TableElementDataSettings };
@@ -9,7 +9,8 @@ const ChartType = _ref => {
9
9
  let {
10
10
  chart,
11
11
  generateChartConfig,
12
- onChange
12
+ onChange,
13
+ dataSources
13
14
  } = _ref;
14
15
  const [isDialogShow, setDialogShow] = useState(false);
15
16
  const openTypesDialog = useCallback(event => {
@@ -55,6 +56,7 @@ const ChartType = _ref => {
55
56
  symbol: "type-change",
56
57
  className: "sea-chart-type-icon"
57
58
  })))), isDialogShow && /*#__PURE__*/React.createElement(TypesDialog, {
59
+ dataSources: dataSources,
58
60
  type: type,
59
61
  onToggle: closeTypesDialog,
60
62
  onChange: onTypeChange
@@ -47,6 +47,7 @@ const CommonDataSettings = _ref => {
47
47
  table_id
48
48
  } = chart.config;
49
49
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(StatisticType, {
50
+ dataSources: dataSources,
50
51
  chart: chart,
51
52
  generateChartConfig: generateConfig,
52
53
  onChange: onChange
@@ -13,5 +13,5 @@
13
13
  .sea-chart-settings .sea-chart-data-filter .dtable-icon-filter {
14
14
  font-size: 14px;
15
15
  color: #666;
16
- margin-right: 10px;
16
+ margin-right: .5rem;
17
17
  }
@@ -2,6 +2,7 @@ var _BaseUtils;
2
2
  import shallowEqual from 'shallowequal';
3
3
  import dayjs from 'dayjs';
4
4
  import { CellType, COLLABORATOR_COLUMN_TYPES, FORMULA_COLUMN_TYPES_MAP, FORMULA_RESULT_TYPE, getDateDisplayString, getNumberDisplayString, getOption, getPrecisionNumber, getTableById, getTableColumnByKey, isNumber, isNumericColumn, isDateColumn, sortText, sortNumber, sortDate, sortSingleSelect, sortFormula, getColumnOptions, DateUtils, getGeolocationDisplayString, getFormulaDisplayString, isArchiveView, getViewById, MULTIPLE_CELL_VALUE_COLUMN_TYPE_MAP } from 'dtable-utils';
5
+ import { isEqual } from 'lodash-es';
5
6
  import { PIE_CHART_COLORS, CHART_SUMMARY_TYPE, CHART_SUPPORT_SORT_COLUMNS, CHART_TYPE, CHART_STYLE_SETTING_KEYS, DEFAULT_LABEL_FONT_SIZE, DEFAULT_NUMBER_FORMAT_OBJECT, X_AXIS_IS_GROUPBY_COLUMN_KEY_CHART_TYPES, STYLE_COLORS, CHART_DATA_SORT_TYPE, CHART_Y_GROUP_TYPE, HORIZONTAL_BAR_CHART_TYPES, COMPLTETELESS_CHART_TYPES } from '../../constants';
6
7
  import { getClientFormulaDisplayString } from '../cell-format-utils';
7
8
  import { getKnownCollaboratorByEmail, generateDefaultUser, getUsers } from '../collaborator-utils';
@@ -58,6 +59,11 @@ BaseUtils.isValidExistChart = (tables, chart) => {
58
59
  } = config;
59
60
  const table = getTableById(tables, table_id);
60
61
  if (!table) return false;
62
+
63
+ // if table exists then it's a valid TABLE_ELEMENT chart
64
+ if (type === CHART_TYPE.TABLE_ELEMENT) {
65
+ return true;
66
+ }
61
67
  if (type === CHART_TYPE.SCATTER) {
62
68
  const {
63
69
  column_groupby_column_key
@@ -384,7 +390,7 @@ BaseUtils.isChartStyleChange = (preChartElement, curChartElement) => {
384
390
  if ((preChartElement === null || preChartElement === void 0 ? void 0 : (_preChartElement$heig = preChartElement.height) === null || _preChartElement$heig === void 0 ? void 0 : _preChartElement$heig.value) !== (curChartElement === null || curChartElement === void 0 ? void 0 : (_curChartElement$heig = curChartElement.height) === null || _curChartElement$heig === void 0 ? void 0 : _curChartElement$heig.value)) return true;
385
391
  if ((preChartElement === null || preChartElement === void 0 ? void 0 : preChartElement.left_in_unit) !== (curChartElement === null || curChartElement === void 0 ? void 0 : curChartElement.left_in_unit)) return true;
386
392
  if ((preChartElement === null || preChartElement === void 0 ? void 0 : preChartElement.width_in_unit) !== (curChartElement === null || curChartElement === void 0 ? void 0 : curChartElement.width_in_unit)) return true;
387
- if (!ObjectUtils.isSameObject(preChartElement.style_config, curChartElement.style_config)) return true;
393
+ if (!isEqual(preChartElement.style_config, curChartElement.style_config)) return true;
388
394
  return !CHART_STYLE_SETTING_KEYS.every(key => preChartElement.config[key] === curChartElement.config[key]);
389
395
  };
390
396
  BaseUtils.isChartTypeChange = (preChartElement, curChartElement) => {
@@ -15,7 +15,7 @@ ChartUtils.calculateChart = (chart, value, callback) => {
15
15
  tables: value.tables,
16
16
  onSuccess: async function (res) {
17
17
  var _res$data;
18
- let dataSources = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : SQLStatisticsUtils.dataSources;
18
+ let dataSources = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : SQLStatisticsUtils.DATA_SOURCE;
19
19
  const {
20
20
  success,
21
21
  error_message
@@ -25,7 +25,7 @@ ChartUtils.calculateChart = (chart, value, callback) => {
25
25
  callback && callback(errMsg, '', null);
26
26
  return;
27
27
  }
28
- if (dataSources === OriginalDataUtils.dataSources) {
28
+ if (dataSources === OriginalDataUtils.DATA_SOURCE) {
29
29
  OriginalDataUtils.calculateChart(chart, value, callback);
30
30
  return;
31
31
  }
@@ -49,10 +49,10 @@ ChartUtils.calculateStaticChart = (chart, value, statisticalResult, callback) =>
49
49
  const {
50
50
  data_sources: dataSources
51
51
  } = statisticalResult;
52
- if (dataSources === OriginalDataUtils.dataSources) {
52
+ if (dataSources === OriginalDataUtils.DATA_SOURCE) {
53
53
  OriginalDataUtils.calculateChart(chart, value, callback);
54
- return;
54
+ } else {
55
+ SQLStatisticsUtils.calculateStaticChart(chart, value, statisticalResult, callback);
55
56
  }
56
- SQLStatisticsUtils.calculateStaticChart(chart, value, statisticalResult, callback);
57
57
  };
58
58
  export { BaseUtils, ChartUtils };
@@ -37,7 +37,7 @@ const calculatorMap = {
37
37
  };
38
38
  class OriginalDataUtils {}
39
39
  _OriginalDataUtils = OriginalDataUtils;
40
- OriginalDataUtils.dataSources = 'original_data';
40
+ OriginalDataUtils.DATA_SOURCE = 'original_data';
41
41
  OriginalDataUtils.isValidExistChart = (tables, chart) => {
42
42
  const isValid = BaseUtils.isValidExistChart(tables || [], chart);
43
43
  if (!isValid) return false;
@@ -82,7 +82,7 @@ OriginalDataUtils.calculateChart = async (chart, value, callback) => {
82
82
  const chartTableColumns = table.columns;
83
83
  return callback && callback('', '', {
84
84
  result,
85
- data_sources: _OriginalDataUtils.dataSources,
85
+ data_sources: _OriginalDataUtils.DATA_SOURCE,
86
86
  groupbyColumn,
87
87
  columnGroupbyColumn,
88
88
  summaryColumn,
@@ -14,7 +14,7 @@ import { convertQuarterToDate } from '../date-translate';
14
14
  import BaseUtils, { findIfColumnDataIsArray } from './base-utils';
15
15
  class SQLStatisticsUtils {}
16
16
  _SQLStatisticsUtils = SQLStatisticsUtils;
17
- SQLStatisticsUtils.dataSources = 'sql_statistics';
17
+ SQLStatisticsUtils.DATA_SOURCE = 'sql_statistics';
18
18
  SQLStatisticsUtils.getGroupLabelFromDB = async (cellValue, column, chart, isPivot) => {
19
19
  const dateGranularity = BaseUtils.getDateGranularityByType(chart);
20
20
  const {
@@ -1527,6 +1527,12 @@ SQLStatisticsUtils.sqlResult2JavaScript = async (chart, sqlRows, chartSQLMap, co
1527
1527
  type
1528
1528
  } = chart.config;
1529
1529
  switch (type) {
1530
+ case CHART_TYPE.TABLE_ELEMENT:
1531
+ {
1532
+ return {
1533
+ result: sqlRows
1534
+ };
1535
+ }
1530
1536
  case CHART_TYPE.TABLE:
1531
1537
  {
1532
1538
  sqlRows = BaseUtils.recalculateAvg(sqlRows);
@@ -2000,7 +2006,7 @@ SQLStatisticsUtils.calculateChart = async (chart, value, callback, sqlRows) => {
2000
2006
  }
2001
2007
  callback && callback('', '', {
2002
2008
  result,
2003
- data_sources: _SQLStatisticsUtils.dataSources,
2009
+ data_sources: _SQLStatisticsUtils.DATA_SOURCE,
2004
2010
  groupbyColumn,
2005
2011
  columnGroupbyColumn,
2006
2012
  summaryColumn,
@@ -2024,7 +2030,7 @@ SQLStatisticsUtils.calculateChart = async (chart, value, callback, sqlRows) => {
2024
2030
  }
2025
2031
  callback && callback('', '', {
2026
2032
  ...chartResult,
2027
- data_sources: _SQLStatisticsUtils.dataSources,
2033
+ data_sources: _SQLStatisticsUtils.DATA_SOURCE,
2028
2034
  groupbyColumn,
2029
2035
  columnGroupbyColumn,
2030
2036
  summaryColumn,
@@ -2046,7 +2052,7 @@ SQLStatisticsUtils.calculateStaticChart = (chart, value, statisticalResult, call
2046
2052
  const {
2047
2053
  type
2048
2054
  } = config;
2049
- if (type === CHART_TYPE.TABLE) return callback && callback('', '', statisticalResult);
2055
+ if ([CHART_TYPE.TABLE, CHART_TYPE.TABLE_ELEMENT].includes(type)) return callback && callback('', '', statisticalResult);
2050
2056
  const {
2051
2057
  table_id,
2052
2058
  sort_type
@@ -1,6 +1,14 @@
1
1
  import { GenericModel, CHART_MAP } from '../model';
2
+ import { CHART_TYPE } from '../constants';
3
+ import BaseModel from '../model/base-model';
2
4
  export const generateChartConfig = (options, tables) => {
3
- const genericChart = new GenericModel(options);
5
+ let genericChart;
6
+ // TABLE_ELEMENT don't need normal chart's properties
7
+ if (options.type === CHART_TYPE.TABLE_ELEMENT) {
8
+ genericChart = new BaseModel(options);
9
+ } else {
10
+ genericChart = new GenericModel(options);
11
+ }
4
12
  const ChartModel = CHART_MAP[genericChart.type];
5
13
  return new ChartModel(genericChart, tables);
6
14
  };
@@ -0,0 +1,5 @@
1
+ import isHotkey from 'is-hotkey';
2
+ const isEsc = isHotkey('esc');
3
+ const isSpace = isHotkey('space');
4
+ const isEnter = isHotkey('enter');
5
+ export { isEsc, isEnter, isSpace };
@@ -1,6 +1,15 @@
1
1
  import { CellType, COLLABORATOR_COLUMN_TYPES, FORMULA_COLUMN_TYPES_MAP, FORMULA_RESULT_TYPE, isNumber, getNumberDisplayString, getOption, getColumnOptions } from 'dtable-utils';
2
- import { CHART_TYPE } from '../constants';
3
2
  import { getClientFormulaDisplayString } from './cell-format-utils';
3
+ export const resizeColumn = (resizedColumnKey, width, columns) => {
4
+ const columnIndex = columns.findIndex(column => column.key === resizedColumnKey);
5
+ const column = columns[columnIndex];
6
+ const newColumn = Object.assign({}, column, {
7
+ width
8
+ });
9
+ let updateColumns = columns.slice(0);
10
+ updateColumns[columnIndex] = newColumn;
11
+ return updateColumns;
12
+ };
4
13
  export const isEmptyGeolocationCell = (cellValue, format) => {
5
14
  if (!cellValue) return null;
6
15
  if (format === 'lng_lat') {
@@ -961,6 +961,10 @@ class ChartDataSQL {
961
961
  error: this.error
962
962
  };
963
963
  }
964
+
965
+ // TODO
966
+ // support TableElement
967
+
964
968
  return {};
965
969
  };
966
970
  this.get_sql_group_name = (name, original_name, column) => {
@@ -757,6 +757,10 @@ const chartColumn2SqlColumn = (chartElement, table) => {
757
757
  type
758
758
  } = chart;
759
759
  switch (type) {
760
+ case CHART_TYPE.TABLE_ELEMENT:
761
+ {
762
+ return {};
763
+ }
760
764
  case CHART_TYPE.TABLE:
761
765
  {
762
766
  const {
@@ -27,7 +27,11 @@
27
27
  .sea-chart-formatter .sea-chart-cavans-container {
28
28
  position: relative;
29
29
  width: 100%;
30
- height: 100%;
30
+ height: 100%
31
+ }
32
+
33
+ .sea-chart-formatter .sea-chart-cavans-container.has-title {
34
+ height: calc(100% - 41px);
31
35
  }
32
36
 
33
37
  .sea-chart-formatter .sea-chart-table-formatter-container {