@gravity-ui/dashkit 3.0.1
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.
- package/CHANGELOG.md +58 -0
- package/LICENSE +21 -0
- package/README.md +364 -0
- package/build/cjs/components/DashKit/DashKit.d.ts +50 -0
- package/build/cjs/components/DashKit/DashKit.js +70 -0
- package/build/cjs/components/DashKit/index.d.ts +1 -0
- package/build/cjs/components/DashKit/index.js +4 -0
- package/build/cjs/components/DashKitView/DashKitView.css +4 -0
- package/build/cjs/components/DashKitView/DashKitView.d.ts +3 -0
- package/build/cjs/components/DashKitView/DashKitView.js +23 -0
- package/build/cjs/components/GridItem/GridItem.css +83 -0
- package/build/cjs/components/GridItem/GridItem.d.ts +3 -0
- package/build/cjs/components/GridItem/GridItem.js +70 -0
- package/build/cjs/components/GridLayout/GridLayout.d.ts +25 -0
- package/build/cjs/components/GridLayout/GridLayout.js +89 -0
- package/build/cjs/components/Item/Item.css +19 -0
- package/build/cjs/components/Item/Item.d.ts +67 -0
- package/build/cjs/components/Item/Item.js +23 -0
- package/build/cjs/components/MobileLayout/MobileLayout.css +10 -0
- package/build/cjs/components/MobileLayout/MobileLayout.d.ts +16 -0
- package/build/cjs/components/MobileLayout/MobileLayout.js +54 -0
- package/build/cjs/components/MobileLayout/helpers.d.ts +3 -0
- package/build/cjs/components/MobileLayout/helpers.js +32 -0
- package/build/cjs/components/OverlayControls/OverlayControls.css +28 -0
- package/build/cjs/components/OverlayControls/OverlayControls.d.ts +54 -0
- package/build/cjs/components/OverlayControls/OverlayControls.js +212 -0
- package/build/cjs/components/index.d.ts +1 -0
- package/build/cjs/components/index.js +4 -0
- package/build/cjs/constants/common.d.ts +7 -0
- package/build/cjs/constants/common.js +10 -0
- package/build/cjs/constants/index.d.ts +1 -0
- package/build/cjs/constants/index.js +4 -0
- package/build/cjs/context/DashKitContext.d.ts +2 -0
- package/build/cjs/context/DashKitContext.js +7 -0
- package/build/cjs/hocs/prepareItem.d.ts +66 -0
- package/build/cjs/hocs/prepareItem.js +66 -0
- package/build/cjs/hocs/withContext.d.ts +165 -0
- package/build/cjs/hocs/withContext.js +203 -0
- package/build/cjs/hooks/useCalcLayout.d.ts +13 -0
- package/build/cjs/hooks/useCalcLayout.js +31 -0
- package/build/cjs/i18n/en.json +8 -0
- package/build/cjs/i18n/index.d.ts +4 -0
- package/build/cjs/i18n/index.js +19 -0
- package/build/cjs/i18n/ru.json +8 -0
- package/build/cjs/icons/CloseIcon.d.ts +2 -0
- package/build/cjs/icons/CloseIcon.js +10 -0
- package/build/cjs/icons/CogIcon.d.ts +2 -0
- package/build/cjs/icons/CogIcon.js +10 -0
- package/build/cjs/icons/CopyIcon.d.ts +2 -0
- package/build/cjs/icons/CopyIcon.js +10 -0
- package/build/cjs/icons/DeleteIcon.d.ts +2 -0
- package/build/cjs/icons/DeleteIcon.js +12 -0
- package/build/cjs/icons/DotsIcon.d.ts +2 -0
- package/build/cjs/icons/DotsIcon.js +10 -0
- package/build/cjs/icons/TickIcon.d.ts +2 -0
- package/build/cjs/icons/TickIcon.js +10 -0
- package/build/cjs/icons/WarningIcon.d.ts +2 -0
- package/build/cjs/icons/WarningIcon.js +10 -0
- package/build/cjs/index.d.ts +5 -0
- package/build/cjs/index.js +8 -0
- package/build/cjs/plugins/Text/Text.css +34 -0
- package/build/cjs/plugins/Text/Text.d.ts +52 -0
- package/build/cjs/plugins/Text/Text.js +119 -0
- package/build/cjs/plugins/Title/Title.css +24 -0
- package/build/cjs/plugins/Title/Title.d.ts +14 -0
- package/build/cjs/plugins/Title/Title.js +25 -0
- package/build/cjs/shared/constants/common.d.ts +2 -0
- package/build/cjs/shared/constants/common.js +5 -0
- package/build/cjs/shared/constants/index.d.ts +1 -0
- package/build/cjs/shared/constants/index.js +4 -0
- package/build/cjs/shared/index.d.ts +4 -0
- package/build/cjs/shared/index.js +7 -0
- package/build/cjs/shared/modules/__tests__/helpers.test.d.ts +1 -0
- package/build/cjs/shared/modules/__tests__/helpers.test.js +217 -0
- package/build/cjs/shared/modules/helpers.d.ts +42 -0
- package/build/cjs/shared/modules/helpers.js +172 -0
- package/build/cjs/shared/modules/index.d.ts +2 -0
- package/build/cjs/shared/modules/index.js +5 -0
- package/build/cjs/shared/modules/state-and-params.d.ts +16 -0
- package/build/cjs/shared/modules/state-and-params.js +94 -0
- package/build/cjs/shared/types/common.d.ts +5 -0
- package/build/cjs/shared/types/common.js +2 -0
- package/build/cjs/shared/types/config.d.ts +49 -0
- package/build/cjs/shared/types/config.js +2 -0
- package/build/cjs/shared/types/index.d.ts +4 -0
- package/build/cjs/shared/types/index.js +7 -0
- package/build/cjs/shared/types/plugin.d.ts +8 -0
- package/build/cjs/shared/types/plugin.js +2 -0
- package/build/cjs/shared/types/state-and-params.d.ts +22 -0
- package/build/cjs/shared/types/state-and-params.js +3 -0
- package/build/cjs/shared/units/__tests__/state-and-params.test.d.ts +241 -0
- package/build/cjs/shared/units/__tests__/state-and-params.test.js +299 -0
- package/build/cjs/shared/units/datalens/index.d.ts +5 -0
- package/build/cjs/shared/units/datalens/index.js +25 -0
- package/build/cjs/shared/units/index.d.ts +1 -0
- package/build/cjs/shared/units/index.js +4 -0
- package/build/cjs/typings/common.d.ts +32 -0
- package/build/cjs/typings/common.js +2 -0
- package/build/cjs/typings/config.d.ts +7 -0
- package/build/cjs/typings/config.js +2 -0
- package/build/cjs/typings/global.d.ts +7 -0
- package/build/cjs/typings/index.d.ts +3 -0
- package/build/cjs/typings/index.js +6 -0
- package/build/cjs/typings/plugin.d.ts +39 -0
- package/build/cjs/typings/plugin.js +2 -0
- package/build/cjs/utils/__tests__/mock.test.d.ts +1 -0
- package/build/cjs/utils/__tests__/mock.test.js +8 -0
- package/build/cjs/utils/configure.d.ts +9 -0
- package/build/cjs/utils/configure.js +21 -0
- package/build/cjs/utils/i18n.d.ts +7 -0
- package/build/cjs/utils/i18n.js +13 -0
- package/build/cjs/utils/index.d.ts +3 -0
- package/build/cjs/utils/index.js +6 -0
- package/build/cjs/utils/register-manager.d.ts +46 -0
- package/build/cjs/utils/register-manager.js +58 -0
- package/build/cjs/utils/update-manager.d.ts +37 -0
- package/build/cjs/utils/update-manager.js +274 -0
- package/build/esm/components/DashKit/DashKit.d.ts +50 -0
- package/build/esm/components/DashKit/DashKit.js +65 -0
- package/build/esm/components/DashKit/index.d.ts +1 -0
- package/build/esm/components/DashKit/index.js +1 -0
- package/build/esm/components/DashKitView/DashKitView.css +4 -0
- package/build/esm/components/DashKitView/DashKitView.d.ts +3 -0
- package/build/esm/components/DashKitView/DashKitView.js +21 -0
- package/build/esm/components/GridItem/GridItem.css +83 -0
- package/build/esm/components/GridItem/GridItem.d.ts +3 -0
- package/build/esm/components/GridItem/GridItem.js +68 -0
- package/build/esm/components/GridLayout/GridLayout.d.ts +25 -0
- package/build/esm/components/GridLayout/GridLayout.js +85 -0
- package/build/esm/components/Item/Item.css +19 -0
- package/build/esm/components/Item/Item.d.ts +67 -0
- package/build/esm/components/Item/Item.js +21 -0
- package/build/esm/components/MobileLayout/MobileLayout.css +10 -0
- package/build/esm/components/MobileLayout/MobileLayout.d.ts +16 -0
- package/build/esm/components/MobileLayout/MobileLayout.js +51 -0
- package/build/esm/components/MobileLayout/helpers.d.ts +3 -0
- package/build/esm/components/MobileLayout/helpers.js +28 -0
- package/build/esm/components/OverlayControls/OverlayControls.css +28 -0
- package/build/esm/components/OverlayControls/OverlayControls.d.ts +55 -0
- package/build/esm/components/OverlayControls/OverlayControls.js +209 -0
- package/build/esm/components/index.d.ts +1 -0
- package/build/esm/components/index.js +1 -0
- package/build/esm/constants/common.d.ts +7 -0
- package/build/esm/constants/common.js +7 -0
- package/build/esm/constants/index.d.ts +1 -0
- package/build/esm/constants/index.js +1 -0
- package/build/esm/context/DashKitContext.d.ts +2 -0
- package/build/esm/context/DashKitContext.js +3 -0
- package/build/esm/hocs/prepareItem.d.ts +66 -0
- package/build/esm/hocs/prepareItem.js +61 -0
- package/build/esm/hocs/withContext.d.ts +165 -0
- package/build/esm/hocs/withContext.js +198 -0
- package/build/esm/hooks/useCalcLayout.d.ts +13 -0
- package/build/esm/hooks/useCalcLayout.js +26 -0
- package/build/esm/i18n/en.json +8 -0
- package/build/esm/i18n/index.d.ts +4 -0
- package/build/esm/i18n/index.js +15 -0
- package/build/esm/i18n/ru.json +8 -0
- package/build/esm/icons/CloseIcon.d.ts +2 -0
- package/build/esm/icons/CloseIcon.js +5 -0
- package/build/esm/icons/CogIcon.d.ts +2 -0
- package/build/esm/icons/CogIcon.js +5 -0
- package/build/esm/icons/CopyIcon.d.ts +2 -0
- package/build/esm/icons/CopyIcon.js +5 -0
- package/build/esm/icons/DeleteIcon.d.ts +2 -0
- package/build/esm/icons/DeleteIcon.js +7 -0
- package/build/esm/icons/DotsIcon.d.ts +2 -0
- package/build/esm/icons/DotsIcon.js +5 -0
- package/build/esm/icons/TickIcon.d.ts +2 -0
- package/build/esm/icons/TickIcon.js +5 -0
- package/build/esm/icons/WarningIcon.d.ts +2 -0
- package/build/esm/icons/WarningIcon.js +5 -0
- package/build/esm/index.d.ts +5 -0
- package/build/esm/index.js +5 -0
- package/build/esm/plugins/Text/Text.css +34 -0
- package/build/esm/plugins/Text/Text.d.ts +53 -0
- package/build/esm/plugins/Text/Text.js +115 -0
- package/build/esm/plugins/Title/Title.css +24 -0
- package/build/esm/plugins/Title/Title.d.ts +15 -0
- package/build/esm/plugins/Title/Title.js +21 -0
- package/build/esm/shared/constants/common.d.ts +2 -0
- package/build/esm/shared/constants/common.js +2 -0
- package/build/esm/shared/constants/index.d.ts +1 -0
- package/build/esm/shared/constants/index.js +1 -0
- package/build/esm/shared/index.d.ts +4 -0
- package/build/esm/shared/index.js +4 -0
- package/build/esm/shared/modules/__tests__/helpers.test.d.ts +1 -0
- package/build/esm/shared/modules/__tests__/helpers.test.js +215 -0
- package/build/esm/shared/modules/helpers.d.ts +42 -0
- package/build/esm/shared/modules/helpers.js +157 -0
- package/build/esm/shared/modules/index.d.ts +2 -0
- package/build/esm/shared/modules/index.js +2 -0
- package/build/esm/shared/modules/state-and-params.d.ts +16 -0
- package/build/esm/shared/modules/state-and-params.js +87 -0
- package/build/esm/shared/types/common.d.ts +5 -0
- package/build/esm/shared/types/common.js +1 -0
- package/build/esm/shared/types/config.d.ts +49 -0
- package/build/esm/shared/types/config.js +1 -0
- package/build/esm/shared/types/index.d.ts +4 -0
- package/build/esm/shared/types/index.js +4 -0
- package/build/esm/shared/types/plugin.d.ts +8 -0
- package/build/esm/shared/types/plugin.js +1 -0
- package/build/esm/shared/types/state-and-params.d.ts +22 -0
- package/build/esm/shared/types/state-and-params.js +1 -0
- package/build/esm/shared/units/__tests__/state-and-params.test.d.ts +241 -0
- package/build/esm/shared/units/__tests__/state-and-params.test.js +295 -0
- package/build/esm/shared/units/datalens/index.d.ts +5 -0
- package/build/esm/shared/units/datalens/index.js +20 -0
- package/build/esm/shared/units/index.d.ts +1 -0
- package/build/esm/shared/units/index.js +1 -0
- package/build/esm/typings/common.d.ts +32 -0
- package/build/esm/typings/common.js +1 -0
- package/build/esm/typings/config.d.ts +7 -0
- package/build/esm/typings/config.js +1 -0
- package/build/esm/typings/global.d.ts +7 -0
- package/build/esm/typings/index.d.ts +3 -0
- package/build/esm/typings/index.js +3 -0
- package/build/esm/typings/plugin.d.ts +39 -0
- package/build/esm/typings/plugin.js +1 -0
- package/build/esm/utils/__tests__/mock.test.d.ts +1 -0
- package/build/esm/utils/__tests__/mock.test.js +8 -0
- package/build/esm/utils/configure.d.ts +9 -0
- package/build/esm/utils/configure.js +15 -0
- package/build/esm/utils/i18n.d.ts +7 -0
- package/build/esm/utils/i18n.js +9 -0
- package/build/esm/utils/index.d.ts +3 -0
- package/build/esm/utils/index.js +3 -0
- package/build/esm/utils/register-manager.d.ts +46 -0
- package/build/esm/utils/register-manager.js +54 -0
- package/build/esm/utils/update-manager.d.ts +37 -0
- package/build/esm/utils/update-manager.js +269 -0
- package/package.json +107 -0
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { DashKitContext } from '../context/DashKitContext';
|
|
3
|
+
import { UpdateManager } from '../utils';
|
|
4
|
+
import { getItemsParams, getItemsState } from '../shared';
|
|
5
|
+
import PropTypes from 'prop-types';
|
|
6
|
+
import isEqual from 'lodash/isEqual';
|
|
7
|
+
import { utils as gridLayoutUtils } from 'react-grid-layout';
|
|
8
|
+
const LAYOUT_COMPACTING_TYPE = 'vertical';
|
|
9
|
+
export function withContext(Component) {
|
|
10
|
+
var _a;
|
|
11
|
+
return _a = class DashKitWithContext extends React.Component {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments);
|
|
14
|
+
// так как мы не хотим хранить параметры виджета с активированной автовысотой в сторе и на сервере, актуальный
|
|
15
|
+
// (видимый юзером в конкретный момент времени) лэйаут (массив объектов с данными о ширине, высоте,
|
|
16
|
+
// расположении конкретного виджета на сетке) будет храниться в стейте, но, для того, чтобы в стор попадал
|
|
17
|
+
// лэйаут без учета вижетов с активированной автовысотой, в момент "подстройки" высоты виджета значение h
|
|
18
|
+
// (высота) из конфига будет запоминаться в originalLayouts, новое значение высоты в adjustedLayouts
|
|
19
|
+
this.state = { currentLayout: this.props.layout };
|
|
20
|
+
this.originalLayouts = {};
|
|
21
|
+
this.adjustedLayouts = {};
|
|
22
|
+
// каллбэк вызывающийся при изменение лэйаута сетки, первым аргументом приходит актуальный конфиг лэйаута,
|
|
23
|
+
// т.е. если на текущей сетке есть виджеты, с активированной опцией автовысоты, их параметр "h" будет
|
|
24
|
+
// "подстроенный"; чтобы, для сохранения в сторе "ушли" значения без учёта подстройки (как если бы у этих
|
|
25
|
+
// виджетов автовысота была деактивирована) корректируем их используя this.originalLayouts
|
|
26
|
+
this._onLayoutChange = (layout) => {
|
|
27
|
+
const currentLayout = layout.map((item) => {
|
|
28
|
+
if (item.i in this.originalLayouts) {
|
|
29
|
+
return Object.assign(Object.assign({}, this.originalLayouts[item.i]), { w: item.w, x: item.x, y: item.y });
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
return Object.assign({}, item);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
// [experimental] if the _prevent Double Compact is enabled, then skip recalculate layout with auto height
|
|
36
|
+
// после того, как у виждета активировали автовысоту и его параметр "h" изменился, это приведёт, также, и к
|
|
37
|
+
// изменению параметра (координаты) "y" у элементов расположенных под ним, поэтому, после того, как
|
|
38
|
+
// значения параметра "h" виджетов с активированной автовысотой были изменены, необходимо изменить и
|
|
39
|
+
// координату "y" виджетов расположенных ниже
|
|
40
|
+
const compactedLayout = this.props._EXPERIMENTAL_preventDoubleCompact
|
|
41
|
+
? currentLayout
|
|
42
|
+
: gridLayoutUtils.compact(currentLayout, LAYOUT_COMPACTING_TYPE, this.props.registerManager.gridLayout.cols);
|
|
43
|
+
const newConfig = UpdateManager.updateLayout({
|
|
44
|
+
layout: compactedLayout,
|
|
45
|
+
config: this.props.config,
|
|
46
|
+
});
|
|
47
|
+
if (!isEqual(newConfig.layout, this.props.config.layout)) {
|
|
48
|
+
this._onChange({
|
|
49
|
+
config: newConfig,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
this._onItemRemove = (id) => {
|
|
54
|
+
const { config, itemsStateAndParams } = this.props;
|
|
55
|
+
this._onChange(UpdateManager.removeItem({ id, config, itemsStateAndParams }));
|
|
56
|
+
};
|
|
57
|
+
this._onItemEdit = (configItem) => {
|
|
58
|
+
this.props.onItemEdit(configItem);
|
|
59
|
+
};
|
|
60
|
+
this._onItemStateAndParamsChange = (id, stateAndParams) => {
|
|
61
|
+
const { config, itemsStateAndParams } = this.props;
|
|
62
|
+
this._onChange({
|
|
63
|
+
itemsStateAndParams: UpdateManager.changeStateAndParams({
|
|
64
|
+
id,
|
|
65
|
+
config,
|
|
66
|
+
stateAndParams,
|
|
67
|
+
itemsStateAndParams,
|
|
68
|
+
}),
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
this._memorizeOriginalLayout = (widgetId, preAutoHeightLayout, postAutoHeightLayout) => {
|
|
72
|
+
if (!(widgetId in this.originalLayouts)) {
|
|
73
|
+
this.originalLayouts[widgetId] = preAutoHeightLayout;
|
|
74
|
+
}
|
|
75
|
+
this.adjustedLayouts[widgetId] = postAutoHeightLayout;
|
|
76
|
+
this.setState({
|
|
77
|
+
currentLayout: this.props.layout.map((item) => {
|
|
78
|
+
if (item.i in this.adjustedLayouts) {
|
|
79
|
+
return Object.assign(Object.assign({}, this.adjustedLayouts[item.i]), { w: item.w, x: item.x, y: item.y });
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
return Object.assign({}, item);
|
|
83
|
+
}
|
|
84
|
+
}),
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
this._revertToOriginalLayout = (widgetId) => {
|
|
88
|
+
this.setState({
|
|
89
|
+
currentLayout: this.state.currentLayout.map((item) => {
|
|
90
|
+
if (item.i === widgetId) {
|
|
91
|
+
return Object.assign(Object.assign({}, this.originalLayouts[item.i]), { w: item.w, x: item.x, y: item.y });
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
return Object.assign({}, item);
|
|
95
|
+
}
|
|
96
|
+
}),
|
|
97
|
+
});
|
|
98
|
+
delete this.adjustedLayouts[widgetId];
|
|
99
|
+
delete this.originalLayouts[widgetId];
|
|
100
|
+
};
|
|
101
|
+
this._getItemsMeta = (pluginsRefs) => {
|
|
102
|
+
return pluginsRefs
|
|
103
|
+
.map((ref) => {
|
|
104
|
+
if (!(ref && typeof ref.getMeta === 'function')) {
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
return ref.getMeta();
|
|
108
|
+
})
|
|
109
|
+
.filter(Boolean);
|
|
110
|
+
};
|
|
111
|
+
this._getLayout = () => {
|
|
112
|
+
return this.props.layout.map((item) => {
|
|
113
|
+
if (item.i in this.adjustedLayouts) {
|
|
114
|
+
return Object.assign(Object.assign({}, this.adjustedLayouts[item.i]), { w: item.w, x: item.x, y: item.y });
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
return Object.assign({}, item);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
};
|
|
121
|
+
this._reloadItems = (pluginsRefs, data) => {
|
|
122
|
+
pluginsRefs.forEach((ref) => ref && ref.reload && ref.reload(data));
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
_onChange({ config = this.props.config, itemsStateAndParams = this.props.itemsStateAndParams, }) {
|
|
126
|
+
if (!(isEqual(config, this.props.config) &&
|
|
127
|
+
isEqual(itemsStateAndParams, this.props.itemsStateAndParams))) {
|
|
128
|
+
this.props.onChange({
|
|
129
|
+
config,
|
|
130
|
+
itemsStateAndParams,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
get _itemsParams() {
|
|
135
|
+
const { config, itemsStateAndParams, globalParams, defaultGlobalParams, registerManager, } = this.props;
|
|
136
|
+
return getItemsParams({
|
|
137
|
+
defaultGlobalParams,
|
|
138
|
+
globalParams,
|
|
139
|
+
config,
|
|
140
|
+
itemsStateAndParams,
|
|
141
|
+
plugins: registerManager.getPlugins(),
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
get _itemsState() {
|
|
145
|
+
const { config, itemsStateAndParams } = this.props;
|
|
146
|
+
return getItemsState({ config, itemsStateAndParams });
|
|
147
|
+
}
|
|
148
|
+
get _contextValue() {
|
|
149
|
+
return {
|
|
150
|
+
getLayout: this._getLayout,
|
|
151
|
+
config: this.props.config,
|
|
152
|
+
context: this.props.context,
|
|
153
|
+
overlayControls: this.props.overlayControls,
|
|
154
|
+
noOverlay: this.props.noOverlay,
|
|
155
|
+
defaultGlobalParams: this.props.globalParams,
|
|
156
|
+
globalParams: this.props.globalParams,
|
|
157
|
+
editMode: this.props.editMode,
|
|
158
|
+
settings: this.props.settings,
|
|
159
|
+
itemsState: this._itemsState,
|
|
160
|
+
itemsParams: this._itemsParams,
|
|
161
|
+
registerManager: this.props.registerManager,
|
|
162
|
+
onItemStateAndParamsChange: this._onItemStateAndParamsChange,
|
|
163
|
+
removeItem: this._onItemRemove,
|
|
164
|
+
editItem: this._onItemEdit,
|
|
165
|
+
layoutChange: this._onLayoutChange,
|
|
166
|
+
getItemsMeta: this._getItemsMeta,
|
|
167
|
+
reloadItems: this._reloadItems,
|
|
168
|
+
memorizeOriginalLayout: this._memorizeOriginalLayout,
|
|
169
|
+
revertToOriginalLayout: this._revertToOriginalLayout,
|
|
170
|
+
forwardedMetaRef: this.props.forwardedMetaRef,
|
|
171
|
+
draggableHandleClassName: this.props.draggableHandleClassName,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
render() {
|
|
175
|
+
return (React.createElement(DashKitContext.Provider, { value: this._contextValue },
|
|
176
|
+
React.createElement(Component, null)));
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
_a.propTypes = {
|
|
180
|
+
editMode: PropTypes.bool,
|
|
181
|
+
context: PropTypes.object,
|
|
182
|
+
overlayControls: PropTypes.object,
|
|
183
|
+
config: PropTypes.object,
|
|
184
|
+
onItemEdit: PropTypes.func,
|
|
185
|
+
onChange: PropTypes.func,
|
|
186
|
+
defaultGlobalParams: PropTypes.object,
|
|
187
|
+
globalParams: PropTypes.object,
|
|
188
|
+
itemsStateAndParams: PropTypes.object,
|
|
189
|
+
registerManager: PropTypes.object,
|
|
190
|
+
layout: PropTypes.array,
|
|
191
|
+
settings: PropTypes.object,
|
|
192
|
+
forwardedMetaRef: PropTypes.object,
|
|
193
|
+
noOverlay: PropTypes.bool,
|
|
194
|
+
draggableHandleClassName: PropTypes.string,
|
|
195
|
+
_EXPERIMENTAL_preventDoubleCompact: PropTypes.bool,
|
|
196
|
+
},
|
|
197
|
+
_a;
|
|
198
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Config } from '../shared';
|
|
2
|
+
import { RegisterManager } from '../utils';
|
|
3
|
+
export declare const useCalcPropsLayout: (config: Config, registerManager: RegisterManager) => {
|
|
4
|
+
i: string;
|
|
5
|
+
h: number;
|
|
6
|
+
w: number;
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
minW: number;
|
|
10
|
+
minH: number;
|
|
11
|
+
maxW?: number | undefined;
|
|
12
|
+
maxH?: number | undefined;
|
|
13
|
+
}[];
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import isEqual from 'lodash/isEqual';
|
|
3
|
+
function onUpdatePropsConfig(config, registerManager) {
|
|
4
|
+
return config.layout.map((itemLayout, i) => {
|
|
5
|
+
const { type } = config.items[i];
|
|
6
|
+
return Object.assign(Object.assign({}, registerManager.getItem(type).defaultLayout), itemLayout);
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
export const useCalcPropsLayout = (config, registerManager) => {
|
|
10
|
+
const [prevConfig, setPrevConfig] = React.useState(config);
|
|
11
|
+
const [layout, updateLayout] = React.useState(onUpdatePropsConfig(config, registerManager));
|
|
12
|
+
if (!isEqual(prevConfig.layout, config.layout)) {
|
|
13
|
+
setPrevConfig(config);
|
|
14
|
+
updateLayout(onUpdatePropsConfig(config, registerManager));
|
|
15
|
+
}
|
|
16
|
+
return layout;
|
|
17
|
+
};
|
|
18
|
+
// export const useManageLayout = (config: Config, registerManager: RegisterManager) => {
|
|
19
|
+
// const propsLayout = useCalcPropsLayout(config, registerManager);
|
|
20
|
+
// // так как мы не хотим хранить параметры виджета с активированной автовысотой в сторе и на сервере, актуальный
|
|
21
|
+
// // (видимый юзером в конкретный момент времени) лэйаут (массив объектов с данными о ширине, высоте,
|
|
22
|
+
// // расположении конкретного виджета на сетке) будет храниться в стейте, но, для того, чтобы в стор попадал
|
|
23
|
+
// // лэйаут без учета вижетов с активированной автовысотой, в момент "подстройки" высоты виджета значение h
|
|
24
|
+
// // (высота) из конфига будет запоминаться в originalLayouts, новое значение высоты в adjustedLayouts
|
|
25
|
+
// const [currentLayout, setCurrentLayout] = React.useState(propsLayout);
|
|
26
|
+
// };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { I18N } from '@gravity-ui/i18n';
|
|
2
|
+
import { getConfig, subscribeConfigure } from '../utils/configure';
|
|
3
|
+
import en from './en.json';
|
|
4
|
+
import ru from './ru.json';
|
|
5
|
+
export const i18n = new I18N();
|
|
6
|
+
const COMPONENT = 'dashkit';
|
|
7
|
+
i18n.registerKeyset('en', COMPONENT, en);
|
|
8
|
+
i18n.registerKeyset('ru', COMPONENT, ru);
|
|
9
|
+
i18n.setLang(getConfig().lang || 'en');
|
|
10
|
+
subscribeConfigure((config) => {
|
|
11
|
+
if (config.lang) {
|
|
12
|
+
i18n.setLang(config.lang);
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
export default i18n.keyset(COMPONENT);
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export function CloseIcon(props) {
|
|
3
|
+
return (React.createElement("svg", Object.assign({ xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 10 10", width: "10", height: "10", fill: "currentColor" }, props),
|
|
4
|
+
React.createElement("path", { d: "M9.75592 8.57741C10.0814 8.90285 10.0814 9.43049 9.75592 9.75592C9.43049 10.0814 8.90285 10.0814 8.57741 9.75592L5 6.17851L1.42259 9.75592C1.09715 10.0814 0.569515 10.0814 0.244078 9.75592C-0.0813592 9.43049 -0.0813592 8.90285 0.244078 8.57741L3.82149 5L0.244078 1.42259C-0.0813592 1.09715 -0.0813592 0.569515 0.244078 0.244078C0.569515 -0.0813592 1.09715 -0.0813592 1.42259 0.244078L5 3.82149L8.57741 0.244078C8.90285 -0.0813592 9.43049 -0.0813592 9.75592 0.244078C10.0814 0.569515 10.0814 1.09715 9.75592 1.42259L6.17851 5L9.75592 8.57741Z" })));
|
|
5
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export function CogIcon(props) {
|
|
3
|
+
return (React.createElement("svg", Object.assign({ xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", width: "24", height: "24", fill: "currentColor" }, props),
|
|
4
|
+
React.createElement("path", { d: "M11.844 16.156a4 4 0 1 1 0-8 4 4 0 0 1 0 8m6-4c0-.029-.004-.058-.004-.087l1.848-.34-.362-1.968-1.852.342a5.992 5.992 0 0 0-1.454-2.246l1.068-1.55-1.646-1.134-1.07 1.55a5.95 5.95 0 0 0-2.528-.567c-.03 0-.058.004-.087.004l-.341-1.848-1.967.363.34 1.851A5.996 5.996 0 0 0 7.546 7.98l-1.55-1.068L4.86 8.558l1.55 1.07a5.95 5.95 0 0 0-.567 2.528c0 .03.004.058.004.087L4 12.584l.362 1.967 1.852-.342a5.992 5.992 0 0 0 1.454 2.246L6.6 18.005l1.646 1.134 1.069-1.55a5.95 5.95 0 0 0 2.529.567c.029 0 .058-.004.087-.004L12.27 20l1.968-.363-.341-1.85a5.996 5.996 0 0 0 2.245-1.455l1.55 1.068 1.134-1.646-1.55-1.069a5.95 5.95 0 0 0 .567-2.529" })));
|
|
5
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export function CopyIcon(props) {
|
|
3
|
+
return (React.createElement("svg", Object.assign({ xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 16 16", width: "16", height: "16", fill: "currentColor" }, props),
|
|
4
|
+
React.createElement("path", { d: "M7 14h7V7H7v7zM5 5h11v11H5V5zm4-2v1-1zm1-3H0v10V0h10zM0 10v1h4-4v-1zM10 0h1v4-4h-1zM3 9h1-1zM0 0h11v4H9V2H2v7h2v2H0V0z" })));
|
|
5
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export function DeleteIcon(props) {
|
|
3
|
+
return (React.createElement("svg", Object.assign({ xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 16 16", width: "16", height: "16", fill: "currentColor" }, props),
|
|
4
|
+
React.createElement("g", null,
|
|
5
|
+
React.createElement("path", { d: "M13.29 1.605h-2.857V.522A.522.522 0 0 0 9.91 0H6.089a.522.522 0 0 0-.522.522v1.083H2.71a.522.522 0 0 0-.521.522v1.605a.52.52 0 0 0 .521.521h.159L3.345 15.5c.012.28.242.5.521.5h8.268c.28 0 .51-.22.521-.5l.477-11.247h.159a.522.522 0 0 0 .521-.521V2.127a.522.522 0 0 0-.521-.522zm-6.679-.562h2.778v.562H6.611v-.562zm5.023 13.914H4.366L3.912 4.253h8.176l-.454 10.704zM12.769 3.21H3.23v-.562h9.538v.562z" }),
|
|
6
|
+
React.createElement("path", { d: "M5.901 5.853a.522.522 0 0 0-.522.522v6.46a.522.522 0 0 0 1.044 0v-6.46a.522.522 0 0 0-.522-.522zm2.099 0a.522.522 0 0 0-.522.522v6.46a.522.522 0 1 0 1.044 0v-6.46A.522.522 0 0 0 8 5.853zm2.099 0a.522.522 0 0 0-.522.522v6.46a.522.522 0 0 0 1.044 0v-6.46a.522.522 0 0 0-.522-.522z" }))));
|
|
7
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export function DotsIcon(props) {
|
|
3
|
+
return (React.createElement("svg", Object.assign({ xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 16 16", width: "16", height: "16", fill: "currentColor" }, props),
|
|
4
|
+
React.createElement("path", { d: "M14 6.125a1.874 1.874 0 1 1 .001 3.749A1.874 1.874 0 0 1 14 6.125zm-5.906 0a1.874 1.874 0 1 1 0 3.749 1.874 1.874 0 0 1 0-3.749zM2 6.125a1.874 1.874 0 1 1 .001 3.749A1.874 1.874 0 0 1 2 6.125z" })));
|
|
5
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export function TickIcon(props) {
|
|
3
|
+
return (React.createElement("svg", Object.assign({ xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 16 16", width: "16", height: "16", fill: "currentColor" }, props),
|
|
4
|
+
React.createElement("path", { fillRule: "evenodd", d: "M5.95 11.008L1.863 6.572.392 7.927l5.533 6.003 9.67-10.114-1.444-1.381z" })));
|
|
5
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export function WarningIcon(props) {
|
|
3
|
+
return (React.createElement("svg", Object.assign({ xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 16 16", width: "16", height: "16", fill: "currentColor" }, props),
|
|
4
|
+
React.createElement("path", { fillRule: "evenodd", d: "M8 16A8 8 0 118 0a8 8 0 010 16zm0-7a1 1 0 001-1V4a1 1 0 10-2 0v4a1 1 0 001 1zm0 1a1 1 0 100 2 1 1 0 000-2z" })));
|
|
5
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
.dashkit-plugin-text {
|
|
2
|
+
--rc-loader-active-color: var(--yc-color-base-special);
|
|
3
|
+
--rc-loader-off-color: var(--yc-color-base-selection-hover);
|
|
4
|
+
white-space: pre-wrap;
|
|
5
|
+
overflow: auto;
|
|
6
|
+
height: 100%;
|
|
7
|
+
padding-right: 5px;
|
|
8
|
+
}
|
|
9
|
+
.dashkit-plugin-text_withMarkdown {
|
|
10
|
+
white-space: normal;
|
|
11
|
+
}
|
|
12
|
+
.dashkit-plugin-text_loading {
|
|
13
|
+
display: flex;
|
|
14
|
+
align-items: center;
|
|
15
|
+
justify-content: center;
|
|
16
|
+
}
|
|
17
|
+
.dashkit-plugin-text_error {
|
|
18
|
+
padding: 10px;
|
|
19
|
+
}
|
|
20
|
+
.dashkit-plugin-text__error {
|
|
21
|
+
color: var(--yc-color-text-danger);
|
|
22
|
+
}
|
|
23
|
+
.dashkit-plugin-text__loader {
|
|
24
|
+
display: flex;
|
|
25
|
+
align-items: center;
|
|
26
|
+
justify-content: center;
|
|
27
|
+
}
|
|
28
|
+
.dashkit-plugin-text__loader-view {
|
|
29
|
+
padding: 0 14px;
|
|
30
|
+
margin-right: 14px;
|
|
31
|
+
}
|
|
32
|
+
.dashkit-plugin-text__loader-text {
|
|
33
|
+
font-size: 20px;
|
|
34
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { PluginWidgetProps, Plugin } from '../../typings';
|
|
3
|
+
import './Text.css';
|
|
4
|
+
declare enum LoadStatus {
|
|
5
|
+
Pending = "pending",
|
|
6
|
+
Success = "success",
|
|
7
|
+
Fail = "fail"
|
|
8
|
+
}
|
|
9
|
+
export declare type PluginTextApiHandler = (data: {
|
|
10
|
+
text: string;
|
|
11
|
+
}) => Promise<{
|
|
12
|
+
result: string;
|
|
13
|
+
}>;
|
|
14
|
+
export interface PluginTextProps extends PluginWidgetProps {
|
|
15
|
+
apiHandler?: PluginTextApiHandler;
|
|
16
|
+
data: {
|
|
17
|
+
text: string;
|
|
18
|
+
} & PluginWidgetProps['data'];
|
|
19
|
+
}
|
|
20
|
+
interface PluginTextState {
|
|
21
|
+
htmlText: string;
|
|
22
|
+
status: LoadStatus;
|
|
23
|
+
needUpdate?: boolean;
|
|
24
|
+
text?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare class PluginText extends React.PureComponent<PluginTextProps, PluginTextState> {
|
|
27
|
+
static getDerivedStateFromProps(props: PluginTextProps, state: PluginTextState): {
|
|
28
|
+
text: string;
|
|
29
|
+
needUpdate: boolean;
|
|
30
|
+
};
|
|
31
|
+
state: PluginTextState;
|
|
32
|
+
private _isUnmounted;
|
|
33
|
+
componentDidMount(): void;
|
|
34
|
+
componentDidUpdate(): void;
|
|
35
|
+
componentWillUnmount(): void;
|
|
36
|
+
render(): JSX.Element;
|
|
37
|
+
private renderLoader;
|
|
38
|
+
private renderError;
|
|
39
|
+
private renderText;
|
|
40
|
+
private getMarkdown;
|
|
41
|
+
private onRetryClick;
|
|
42
|
+
get withMarkdown(): boolean;
|
|
43
|
+
}
|
|
44
|
+
declare type PluginDataProps = Omit<PluginTextProps, 'apiHandler'>;
|
|
45
|
+
export declare type PluginObjectSettings = {
|
|
46
|
+
apiHandler?: PluginTextApiHandler;
|
|
47
|
+
};
|
|
48
|
+
export declare type PluginObject = Plugin<PluginDataProps> & {
|
|
49
|
+
setSettings: (settings: PluginObjectSettings) => PluginObject;
|
|
50
|
+
_apiHandler?: PluginTextApiHandler;
|
|
51
|
+
};
|
|
52
|
+
declare const plugin: PluginObject;
|
|
53
|
+
export default plugin;
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import block from 'bem-cn-lite';
|
|
3
|
+
import { Loader, Button } from '@gravity-ui/uikit';
|
|
4
|
+
import i18n from '../../i18n';
|
|
5
|
+
import './Text.css';
|
|
6
|
+
// need to set markdown styles separately
|
|
7
|
+
// for instance can use yfm-transform
|
|
8
|
+
const b = block('dashkit-plugin-text');
|
|
9
|
+
var LoadStatus;
|
|
10
|
+
(function (LoadStatus) {
|
|
11
|
+
LoadStatus["Pending"] = "pending";
|
|
12
|
+
LoadStatus["Success"] = "success";
|
|
13
|
+
LoadStatus["Fail"] = "fail";
|
|
14
|
+
})(LoadStatus || (LoadStatus = {}));
|
|
15
|
+
export class PluginText extends React.PureComponent {
|
|
16
|
+
constructor() {
|
|
17
|
+
super(...arguments);
|
|
18
|
+
this.state = {
|
|
19
|
+
htmlText: '',
|
|
20
|
+
status: this.withMarkdown ? LoadStatus.Pending : LoadStatus.Success,
|
|
21
|
+
};
|
|
22
|
+
this._isUnmounted = false;
|
|
23
|
+
this.onRetryClick = () => {
|
|
24
|
+
this.getMarkdown();
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
static getDerivedStateFromProps(props, state) {
|
|
28
|
+
const { data: { text }, } = props;
|
|
29
|
+
const needUpdate = text !== state.text;
|
|
30
|
+
return {
|
|
31
|
+
text,
|
|
32
|
+
needUpdate,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
componentDidMount() {
|
|
36
|
+
this.getMarkdown();
|
|
37
|
+
}
|
|
38
|
+
componentDidUpdate() {
|
|
39
|
+
if (this.state.needUpdate) {
|
|
40
|
+
this.getMarkdown();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
componentWillUnmount() {
|
|
44
|
+
this._isUnmounted = true;
|
|
45
|
+
}
|
|
46
|
+
render() {
|
|
47
|
+
switch (this.state.status) {
|
|
48
|
+
case LoadStatus.Success:
|
|
49
|
+
return this.renderText();
|
|
50
|
+
case LoadStatus.Pending:
|
|
51
|
+
return this.renderLoader();
|
|
52
|
+
default:
|
|
53
|
+
return this.renderError();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
renderLoader() {
|
|
57
|
+
return (React.createElement("div", { className: b({ loading: true }) },
|
|
58
|
+
React.createElement("div", { className: b('loader') },
|
|
59
|
+
React.createElement("div", { className: b('loader-view') },
|
|
60
|
+
React.createElement(Loader, { size: "m" })))));
|
|
61
|
+
}
|
|
62
|
+
renderError() {
|
|
63
|
+
return (React.createElement("div", { className: b({ error: true }) },
|
|
64
|
+
React.createElement("div", { className: b('error') }, i18n('label_render-markdown-error')),
|
|
65
|
+
React.createElement("br", null),
|
|
66
|
+
React.createElement(Button, { view: "action", size: "m", onClick: this.onRetryClick }, i18n('button_retry')),
|
|
67
|
+
React.createElement("br", null)));
|
|
68
|
+
}
|
|
69
|
+
renderText() {
|
|
70
|
+
return (React.createElement("div", { className: b({ withMarkdown: this.withMarkdown }) }, this.withMarkdown ? (React.createElement("div", { className: "yfm" // className из стилей для markdown
|
|
71
|
+
, dangerouslySetInnerHTML: { __html: this.state.htmlText } })) : (this.state.text)));
|
|
72
|
+
}
|
|
73
|
+
async getMarkdown() {
|
|
74
|
+
if (typeof this.props.apiHandler !== 'function') {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
this.setState({ status: LoadStatus.Pending });
|
|
78
|
+
try {
|
|
79
|
+
let htmlText = '';
|
|
80
|
+
if (this.state.text && this.state.text.trim()) {
|
|
81
|
+
const loadedData = await this.props.apiHandler({ text: this.state.text });
|
|
82
|
+
htmlText = loadedData.result;
|
|
83
|
+
}
|
|
84
|
+
if (this._isUnmounted) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
this.setState({
|
|
88
|
+
htmlText,
|
|
89
|
+
status: LoadStatus.Success,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
if (this._isUnmounted) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
this.setState({ status: LoadStatus.Fail });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
get withMarkdown() {
|
|
100
|
+
return typeof this.props.apiHandler === 'function';
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const plugin = {
|
|
104
|
+
type: 'text',
|
|
105
|
+
defaultLayout: { w: 12, h: 6 },
|
|
106
|
+
setSettings(settings) {
|
|
107
|
+
const { apiHandler } = settings;
|
|
108
|
+
plugin._apiHandler = apiHandler;
|
|
109
|
+
return plugin;
|
|
110
|
+
},
|
|
111
|
+
renderer(props, forwardedRef) {
|
|
112
|
+
return React.createElement(PluginText, Object.assign({}, props, { apiHandler: plugin._apiHandler, ref: forwardedRef }));
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
export default plugin;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
.dashkit-plugin-title {
|
|
2
|
+
display: flex;
|
|
3
|
+
align-items: flex-start;
|
|
4
|
+
height: 100%;
|
|
5
|
+
font-weight: 500;
|
|
6
|
+
padding-bottom: 5px;
|
|
7
|
+
padding-right: 5px;
|
|
8
|
+
}
|
|
9
|
+
.dashkit-plugin-title_size_l {
|
|
10
|
+
font-size: 24px;
|
|
11
|
+
line-height: 28px;
|
|
12
|
+
}
|
|
13
|
+
.dashkit-plugin-title_size_m {
|
|
14
|
+
font-size: 20px;
|
|
15
|
+
line-height: 24px;
|
|
16
|
+
}
|
|
17
|
+
.dashkit-plugin-title_size_s {
|
|
18
|
+
font-size: var(--yc-text-body-3-font-size);
|
|
19
|
+
line-height: 24px;
|
|
20
|
+
}
|
|
21
|
+
.dashkit-plugin-title_size_xs {
|
|
22
|
+
font-size: 15px;
|
|
23
|
+
line-height: 20px;
|
|
24
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { PluginWidgetProps, Plugin } from '../../typings';
|
|
3
|
+
import './Title.css';
|
|
4
|
+
export interface PluginTitleProps extends PluginWidgetProps {
|
|
5
|
+
data: {
|
|
6
|
+
size: 'l' | 'm' | 's' | 'xs';
|
|
7
|
+
text: string;
|
|
8
|
+
showInTOC: boolean;
|
|
9
|
+
} & PluginWidgetProps['data'];
|
|
10
|
+
}
|
|
11
|
+
export declare class PluginTitle extends React.Component<PluginTitleProps> {
|
|
12
|
+
render(): JSX.Element;
|
|
13
|
+
}
|
|
14
|
+
declare const plugin: Plugin<PluginTitleProps>;
|
|
15
|
+
export default plugin;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import block from 'bem-cn-lite';
|
|
3
|
+
import './Title.css';
|
|
4
|
+
const b = block('dashkit-plugin-title');
|
|
5
|
+
export class PluginTitle extends React.Component {
|
|
6
|
+
render() {
|
|
7
|
+
const { data } = this.props;
|
|
8
|
+
const text = data.text ? data.text : '';
|
|
9
|
+
const size = data.size ? data.size : false;
|
|
10
|
+
const id = data.showInTOC && text ? encodeURIComponent(text) : undefined;
|
|
11
|
+
return (React.createElement("div", { id: id, className: b({ size }) }, text));
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
const plugin = {
|
|
15
|
+
type: 'title',
|
|
16
|
+
defaultLayout: { w: 36, h: 2 },
|
|
17
|
+
renderer(props, forwardedRef) {
|
|
18
|
+
return React.createElement(PluginTitle, Object.assign({}, props, { ref: forwardedRef }));
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
export default plugin;
|