@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.
Files changed (232) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/LICENSE +21 -0
  3. package/README.md +364 -0
  4. package/build/cjs/components/DashKit/DashKit.d.ts +50 -0
  5. package/build/cjs/components/DashKit/DashKit.js +70 -0
  6. package/build/cjs/components/DashKit/index.d.ts +1 -0
  7. package/build/cjs/components/DashKit/index.js +4 -0
  8. package/build/cjs/components/DashKitView/DashKitView.css +4 -0
  9. package/build/cjs/components/DashKitView/DashKitView.d.ts +3 -0
  10. package/build/cjs/components/DashKitView/DashKitView.js +23 -0
  11. package/build/cjs/components/GridItem/GridItem.css +83 -0
  12. package/build/cjs/components/GridItem/GridItem.d.ts +3 -0
  13. package/build/cjs/components/GridItem/GridItem.js +70 -0
  14. package/build/cjs/components/GridLayout/GridLayout.d.ts +25 -0
  15. package/build/cjs/components/GridLayout/GridLayout.js +89 -0
  16. package/build/cjs/components/Item/Item.css +19 -0
  17. package/build/cjs/components/Item/Item.d.ts +67 -0
  18. package/build/cjs/components/Item/Item.js +23 -0
  19. package/build/cjs/components/MobileLayout/MobileLayout.css +10 -0
  20. package/build/cjs/components/MobileLayout/MobileLayout.d.ts +16 -0
  21. package/build/cjs/components/MobileLayout/MobileLayout.js +54 -0
  22. package/build/cjs/components/MobileLayout/helpers.d.ts +3 -0
  23. package/build/cjs/components/MobileLayout/helpers.js +32 -0
  24. package/build/cjs/components/OverlayControls/OverlayControls.css +28 -0
  25. package/build/cjs/components/OverlayControls/OverlayControls.d.ts +54 -0
  26. package/build/cjs/components/OverlayControls/OverlayControls.js +212 -0
  27. package/build/cjs/components/index.d.ts +1 -0
  28. package/build/cjs/components/index.js +4 -0
  29. package/build/cjs/constants/common.d.ts +7 -0
  30. package/build/cjs/constants/common.js +10 -0
  31. package/build/cjs/constants/index.d.ts +1 -0
  32. package/build/cjs/constants/index.js +4 -0
  33. package/build/cjs/context/DashKitContext.d.ts +2 -0
  34. package/build/cjs/context/DashKitContext.js +7 -0
  35. package/build/cjs/hocs/prepareItem.d.ts +66 -0
  36. package/build/cjs/hocs/prepareItem.js +66 -0
  37. package/build/cjs/hocs/withContext.d.ts +165 -0
  38. package/build/cjs/hocs/withContext.js +203 -0
  39. package/build/cjs/hooks/useCalcLayout.d.ts +13 -0
  40. package/build/cjs/hooks/useCalcLayout.js +31 -0
  41. package/build/cjs/i18n/en.json +8 -0
  42. package/build/cjs/i18n/index.d.ts +4 -0
  43. package/build/cjs/i18n/index.js +19 -0
  44. package/build/cjs/i18n/ru.json +8 -0
  45. package/build/cjs/icons/CloseIcon.d.ts +2 -0
  46. package/build/cjs/icons/CloseIcon.js +10 -0
  47. package/build/cjs/icons/CogIcon.d.ts +2 -0
  48. package/build/cjs/icons/CogIcon.js +10 -0
  49. package/build/cjs/icons/CopyIcon.d.ts +2 -0
  50. package/build/cjs/icons/CopyIcon.js +10 -0
  51. package/build/cjs/icons/DeleteIcon.d.ts +2 -0
  52. package/build/cjs/icons/DeleteIcon.js +12 -0
  53. package/build/cjs/icons/DotsIcon.d.ts +2 -0
  54. package/build/cjs/icons/DotsIcon.js +10 -0
  55. package/build/cjs/icons/TickIcon.d.ts +2 -0
  56. package/build/cjs/icons/TickIcon.js +10 -0
  57. package/build/cjs/icons/WarningIcon.d.ts +2 -0
  58. package/build/cjs/icons/WarningIcon.js +10 -0
  59. package/build/cjs/index.d.ts +5 -0
  60. package/build/cjs/index.js +8 -0
  61. package/build/cjs/plugins/Text/Text.css +34 -0
  62. package/build/cjs/plugins/Text/Text.d.ts +52 -0
  63. package/build/cjs/plugins/Text/Text.js +119 -0
  64. package/build/cjs/plugins/Title/Title.css +24 -0
  65. package/build/cjs/plugins/Title/Title.d.ts +14 -0
  66. package/build/cjs/plugins/Title/Title.js +25 -0
  67. package/build/cjs/shared/constants/common.d.ts +2 -0
  68. package/build/cjs/shared/constants/common.js +5 -0
  69. package/build/cjs/shared/constants/index.d.ts +1 -0
  70. package/build/cjs/shared/constants/index.js +4 -0
  71. package/build/cjs/shared/index.d.ts +4 -0
  72. package/build/cjs/shared/index.js +7 -0
  73. package/build/cjs/shared/modules/__tests__/helpers.test.d.ts +1 -0
  74. package/build/cjs/shared/modules/__tests__/helpers.test.js +217 -0
  75. package/build/cjs/shared/modules/helpers.d.ts +42 -0
  76. package/build/cjs/shared/modules/helpers.js +172 -0
  77. package/build/cjs/shared/modules/index.d.ts +2 -0
  78. package/build/cjs/shared/modules/index.js +5 -0
  79. package/build/cjs/shared/modules/state-and-params.d.ts +16 -0
  80. package/build/cjs/shared/modules/state-and-params.js +94 -0
  81. package/build/cjs/shared/types/common.d.ts +5 -0
  82. package/build/cjs/shared/types/common.js +2 -0
  83. package/build/cjs/shared/types/config.d.ts +49 -0
  84. package/build/cjs/shared/types/config.js +2 -0
  85. package/build/cjs/shared/types/index.d.ts +4 -0
  86. package/build/cjs/shared/types/index.js +7 -0
  87. package/build/cjs/shared/types/plugin.d.ts +8 -0
  88. package/build/cjs/shared/types/plugin.js +2 -0
  89. package/build/cjs/shared/types/state-and-params.d.ts +22 -0
  90. package/build/cjs/shared/types/state-and-params.js +3 -0
  91. package/build/cjs/shared/units/__tests__/state-and-params.test.d.ts +241 -0
  92. package/build/cjs/shared/units/__tests__/state-and-params.test.js +299 -0
  93. package/build/cjs/shared/units/datalens/index.d.ts +5 -0
  94. package/build/cjs/shared/units/datalens/index.js +25 -0
  95. package/build/cjs/shared/units/index.d.ts +1 -0
  96. package/build/cjs/shared/units/index.js +4 -0
  97. package/build/cjs/typings/common.d.ts +32 -0
  98. package/build/cjs/typings/common.js +2 -0
  99. package/build/cjs/typings/config.d.ts +7 -0
  100. package/build/cjs/typings/config.js +2 -0
  101. package/build/cjs/typings/global.d.ts +7 -0
  102. package/build/cjs/typings/index.d.ts +3 -0
  103. package/build/cjs/typings/index.js +6 -0
  104. package/build/cjs/typings/plugin.d.ts +39 -0
  105. package/build/cjs/typings/plugin.js +2 -0
  106. package/build/cjs/utils/__tests__/mock.test.d.ts +1 -0
  107. package/build/cjs/utils/__tests__/mock.test.js +8 -0
  108. package/build/cjs/utils/configure.d.ts +9 -0
  109. package/build/cjs/utils/configure.js +21 -0
  110. package/build/cjs/utils/i18n.d.ts +7 -0
  111. package/build/cjs/utils/i18n.js +13 -0
  112. package/build/cjs/utils/index.d.ts +3 -0
  113. package/build/cjs/utils/index.js +6 -0
  114. package/build/cjs/utils/register-manager.d.ts +46 -0
  115. package/build/cjs/utils/register-manager.js +58 -0
  116. package/build/cjs/utils/update-manager.d.ts +37 -0
  117. package/build/cjs/utils/update-manager.js +274 -0
  118. package/build/esm/components/DashKit/DashKit.d.ts +50 -0
  119. package/build/esm/components/DashKit/DashKit.js +65 -0
  120. package/build/esm/components/DashKit/index.d.ts +1 -0
  121. package/build/esm/components/DashKit/index.js +1 -0
  122. package/build/esm/components/DashKitView/DashKitView.css +4 -0
  123. package/build/esm/components/DashKitView/DashKitView.d.ts +3 -0
  124. package/build/esm/components/DashKitView/DashKitView.js +21 -0
  125. package/build/esm/components/GridItem/GridItem.css +83 -0
  126. package/build/esm/components/GridItem/GridItem.d.ts +3 -0
  127. package/build/esm/components/GridItem/GridItem.js +68 -0
  128. package/build/esm/components/GridLayout/GridLayout.d.ts +25 -0
  129. package/build/esm/components/GridLayout/GridLayout.js +85 -0
  130. package/build/esm/components/Item/Item.css +19 -0
  131. package/build/esm/components/Item/Item.d.ts +67 -0
  132. package/build/esm/components/Item/Item.js +21 -0
  133. package/build/esm/components/MobileLayout/MobileLayout.css +10 -0
  134. package/build/esm/components/MobileLayout/MobileLayout.d.ts +16 -0
  135. package/build/esm/components/MobileLayout/MobileLayout.js +51 -0
  136. package/build/esm/components/MobileLayout/helpers.d.ts +3 -0
  137. package/build/esm/components/MobileLayout/helpers.js +28 -0
  138. package/build/esm/components/OverlayControls/OverlayControls.css +28 -0
  139. package/build/esm/components/OverlayControls/OverlayControls.d.ts +55 -0
  140. package/build/esm/components/OverlayControls/OverlayControls.js +209 -0
  141. package/build/esm/components/index.d.ts +1 -0
  142. package/build/esm/components/index.js +1 -0
  143. package/build/esm/constants/common.d.ts +7 -0
  144. package/build/esm/constants/common.js +7 -0
  145. package/build/esm/constants/index.d.ts +1 -0
  146. package/build/esm/constants/index.js +1 -0
  147. package/build/esm/context/DashKitContext.d.ts +2 -0
  148. package/build/esm/context/DashKitContext.js +3 -0
  149. package/build/esm/hocs/prepareItem.d.ts +66 -0
  150. package/build/esm/hocs/prepareItem.js +61 -0
  151. package/build/esm/hocs/withContext.d.ts +165 -0
  152. package/build/esm/hocs/withContext.js +198 -0
  153. package/build/esm/hooks/useCalcLayout.d.ts +13 -0
  154. package/build/esm/hooks/useCalcLayout.js +26 -0
  155. package/build/esm/i18n/en.json +8 -0
  156. package/build/esm/i18n/index.d.ts +4 -0
  157. package/build/esm/i18n/index.js +15 -0
  158. package/build/esm/i18n/ru.json +8 -0
  159. package/build/esm/icons/CloseIcon.d.ts +2 -0
  160. package/build/esm/icons/CloseIcon.js +5 -0
  161. package/build/esm/icons/CogIcon.d.ts +2 -0
  162. package/build/esm/icons/CogIcon.js +5 -0
  163. package/build/esm/icons/CopyIcon.d.ts +2 -0
  164. package/build/esm/icons/CopyIcon.js +5 -0
  165. package/build/esm/icons/DeleteIcon.d.ts +2 -0
  166. package/build/esm/icons/DeleteIcon.js +7 -0
  167. package/build/esm/icons/DotsIcon.d.ts +2 -0
  168. package/build/esm/icons/DotsIcon.js +5 -0
  169. package/build/esm/icons/TickIcon.d.ts +2 -0
  170. package/build/esm/icons/TickIcon.js +5 -0
  171. package/build/esm/icons/WarningIcon.d.ts +2 -0
  172. package/build/esm/icons/WarningIcon.js +5 -0
  173. package/build/esm/index.d.ts +5 -0
  174. package/build/esm/index.js +5 -0
  175. package/build/esm/plugins/Text/Text.css +34 -0
  176. package/build/esm/plugins/Text/Text.d.ts +53 -0
  177. package/build/esm/plugins/Text/Text.js +115 -0
  178. package/build/esm/plugins/Title/Title.css +24 -0
  179. package/build/esm/plugins/Title/Title.d.ts +15 -0
  180. package/build/esm/plugins/Title/Title.js +21 -0
  181. package/build/esm/shared/constants/common.d.ts +2 -0
  182. package/build/esm/shared/constants/common.js +2 -0
  183. package/build/esm/shared/constants/index.d.ts +1 -0
  184. package/build/esm/shared/constants/index.js +1 -0
  185. package/build/esm/shared/index.d.ts +4 -0
  186. package/build/esm/shared/index.js +4 -0
  187. package/build/esm/shared/modules/__tests__/helpers.test.d.ts +1 -0
  188. package/build/esm/shared/modules/__tests__/helpers.test.js +215 -0
  189. package/build/esm/shared/modules/helpers.d.ts +42 -0
  190. package/build/esm/shared/modules/helpers.js +157 -0
  191. package/build/esm/shared/modules/index.d.ts +2 -0
  192. package/build/esm/shared/modules/index.js +2 -0
  193. package/build/esm/shared/modules/state-and-params.d.ts +16 -0
  194. package/build/esm/shared/modules/state-and-params.js +87 -0
  195. package/build/esm/shared/types/common.d.ts +5 -0
  196. package/build/esm/shared/types/common.js +1 -0
  197. package/build/esm/shared/types/config.d.ts +49 -0
  198. package/build/esm/shared/types/config.js +1 -0
  199. package/build/esm/shared/types/index.d.ts +4 -0
  200. package/build/esm/shared/types/index.js +4 -0
  201. package/build/esm/shared/types/plugin.d.ts +8 -0
  202. package/build/esm/shared/types/plugin.js +1 -0
  203. package/build/esm/shared/types/state-and-params.d.ts +22 -0
  204. package/build/esm/shared/types/state-and-params.js +1 -0
  205. package/build/esm/shared/units/__tests__/state-and-params.test.d.ts +241 -0
  206. package/build/esm/shared/units/__tests__/state-and-params.test.js +295 -0
  207. package/build/esm/shared/units/datalens/index.d.ts +5 -0
  208. package/build/esm/shared/units/datalens/index.js +20 -0
  209. package/build/esm/shared/units/index.d.ts +1 -0
  210. package/build/esm/shared/units/index.js +1 -0
  211. package/build/esm/typings/common.d.ts +32 -0
  212. package/build/esm/typings/common.js +1 -0
  213. package/build/esm/typings/config.d.ts +7 -0
  214. package/build/esm/typings/config.js +1 -0
  215. package/build/esm/typings/global.d.ts +7 -0
  216. package/build/esm/typings/index.d.ts +3 -0
  217. package/build/esm/typings/index.js +3 -0
  218. package/build/esm/typings/plugin.d.ts +39 -0
  219. package/build/esm/typings/plugin.js +1 -0
  220. package/build/esm/utils/__tests__/mock.test.d.ts +1 -0
  221. package/build/esm/utils/__tests__/mock.test.js +8 -0
  222. package/build/esm/utils/configure.d.ts +9 -0
  223. package/build/esm/utils/configure.js +15 -0
  224. package/build/esm/utils/i18n.d.ts +7 -0
  225. package/build/esm/utils/i18n.js +9 -0
  226. package/build/esm/utils/index.d.ts +3 -0
  227. package/build/esm/utils/index.js +3 -0
  228. package/build/esm/utils/register-manager.d.ts +46 -0
  229. package/build/esm/utils/register-manager.js +54 -0
  230. package/build/esm/utils/update-manager.d.ts +37 -0
  231. package/build/esm/utils/update-manager.js +269 -0
  232. package/package.json +107 -0
@@ -0,0 +1,65 @@
1
+ import React from 'react';
2
+ import noop from 'lodash/noop';
3
+ import { RegisterManager, UpdateManager } from '../../utils';
4
+ import DashKitView from '../DashKitView/DashKitView';
5
+ import { DEFAULT_NAMESPACE } from '../../constants';
6
+ const registerManager = new RegisterManager();
7
+ export class DashKit extends React.PureComponent {
8
+ constructor() {
9
+ super(...arguments);
10
+ this.metaRef = React.createRef();
11
+ }
12
+ static registerPlugins(...plugins) {
13
+ plugins.forEach((plugin) => {
14
+ registerManager.registerPlugin(plugin);
15
+ });
16
+ }
17
+ static setSettings(settings) {
18
+ registerManager.setSettings(settings);
19
+ }
20
+ static setItem({ item: setItem, namespace = DEFAULT_NAMESPACE, config, }) {
21
+ if (setItem.id) {
22
+ return UpdateManager.editItem({ item: setItem, namespace, config });
23
+ }
24
+ else {
25
+ const item = setItem;
26
+ const layout = Object.assign({}, registerManager.getItem(item.type).defaultLayout);
27
+ if (item.layout) {
28
+ Object.assign(layout, item.layout);
29
+ }
30
+ return UpdateManager.addItem({
31
+ item,
32
+ namespace,
33
+ config,
34
+ layout,
35
+ });
36
+ }
37
+ }
38
+ static removeItem({ id, config, itemsStateAndParams, }) {
39
+ return UpdateManager.removeItem({ id, config, itemsStateAndParams });
40
+ }
41
+ render() {
42
+ return (React.createElement(DashKitView
43
+ // @ts-ignore
44
+ , Object.assign({
45
+ // @ts-ignore
46
+ registerManager: registerManager, ref: this.metaRef }, this.props)));
47
+ }
48
+ getItemsMeta() {
49
+ var _a;
50
+ return (_a = this.metaRef.current) === null || _a === void 0 ? void 0 : _a.getItemsMeta();
51
+ }
52
+ }
53
+ DashKit.defaultProps = {
54
+ onItemEdit: noop,
55
+ onChange: noop,
56
+ defaultGlobalParams: {},
57
+ globalParams: {},
58
+ itemsStateAndParams: {},
59
+ settings: {
60
+ autoupdateInterval: 0,
61
+ silentLoading: false,
62
+ },
63
+ context: {},
64
+ noOverlay: false,
65
+ };
@@ -0,0 +1 @@
1
+ export * from './DashKit';
@@ -0,0 +1 @@
1
+ export * from './DashKit';
@@ -0,0 +1,4 @@
1
+ .dashkit {
2
+ width: 100%;
3
+ position: relative;
4
+ }
@@ -0,0 +1,3 @@
1
+ export default DashKitViewForwardedMeta;
2
+ declare const DashKitViewForwardedMeta: React.ForwardRefExoticComponent<React.RefAttributes<any>>;
3
+ import React from "react";
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ import block from 'bem-cn-lite';
3
+ import { DashKitContext } from '../../context/DashKitContext';
4
+ import GridLayout from '../GridLayout/GridLayout';
5
+ import MobileLayout from '../MobileLayout/MobileLayout';
6
+ import { withContext } from '../../hocs/withContext';
7
+ import { useCalcPropsLayout } from '../../hooks/useCalcLayout';
8
+ import './DashKitView.css';
9
+ const b = block('dashkit');
10
+ function DashKitView() {
11
+ const context = React.useContext(DashKitContext);
12
+ const { registerManager, forwardedMetaRef } = context;
13
+ return (React.createElement("div", { className: b({ theme: registerManager.settings.theme }) }, registerManager.settings.isMobile ? (React.createElement(MobileLayout, null)) : (React.createElement(GridLayout, { ref: forwardedMetaRef }))));
14
+ }
15
+ const DashKitViewWithContext = withContext(DashKitView);
16
+ const DashKitViewForwardedMeta = React.forwardRef((props, ref) => {
17
+ const layout = useCalcPropsLayout(props.config, props.registerManager);
18
+ return React.createElement(DashKitViewWithContext, Object.assign({}, props, { layout: layout, forwardedMetaRef: ref }));
19
+ });
20
+ DashKitViewForwardedMeta.displayName = 'DashKitViewForwardedMeta';
21
+ export default DashKitViewForwardedMeta;
@@ -0,0 +1,83 @@
1
+ .dashkit-grid-item {
2
+ position: relative;
3
+ }
4
+ .dashkit-grid-item__overlay {
5
+ position: absolute;
6
+ top: 0;
7
+ bottom: 0;
8
+ left: 0;
9
+ right: 0;
10
+ border-radius: 3px;
11
+ background-color: rgba(230, 230, 230, 0.2);
12
+ border: solid 1px rgba(0, 0, 0, 0.1);
13
+ }
14
+ .dashkit-grid-item__item {
15
+ position: absolute;
16
+ top: 0;
17
+ bottom: 0;
18
+ left: 0;
19
+ right: 0;
20
+ border-radius: 3px;
21
+ }
22
+ .dashkit-grid-item__item_editMode {
23
+ opacity: 0.5;
24
+ border-color: transparent;
25
+ pointer-events: none;
26
+ }
27
+
28
+ .react-grid-layout {
29
+ position: relative;
30
+ transition: height 200ms ease;
31
+ }
32
+
33
+ .react-grid-item {
34
+ transition: all 200ms ease;
35
+ transition-property: left, top;
36
+ }
37
+
38
+ .react-grid-item.cssTransforms {
39
+ transition-property: transform;
40
+ }
41
+
42
+ .react-grid-item.resizing {
43
+ z-index: 1;
44
+ will-change: width, height;
45
+ }
46
+
47
+ .react-grid-item.react-draggable:not(.dashkit-grid-item_with-custom-handle) {
48
+ cursor: move;
49
+ }
50
+
51
+ .react-grid-item.react-draggable-dragging {
52
+ transition: none;
53
+ z-index: 3;
54
+ will-change: transform;
55
+ }
56
+
57
+ .react-grid-item.react-grid-placeholder {
58
+ background: #fc0;
59
+ opacity: 0.2;
60
+ transition-duration: 100ms;
61
+ z-index: 2;
62
+ user-select: none;
63
+ }
64
+
65
+ .react-grid-item .react-resizable-handle {
66
+ position: absolute;
67
+ width: 20px;
68
+ height: 20px;
69
+ bottom: 0;
70
+ right: 0;
71
+ cursor: se-resize;
72
+ z-index: 6;
73
+ }
74
+
75
+ .react-grid-item .react-resizable-handle::after {
76
+ content: "";
77
+ position: absolute;
78
+ right: 3px;
79
+ bottom: 3px;
80
+ border: 4px solid transparent;
81
+ border-right-color: rgba(0, 0, 0, 0.4);
82
+ border-bottom-color: rgba(0, 0, 0, 0.4);
83
+ }
@@ -0,0 +1,3 @@
1
+ declare const _default: React.ForwardRefExoticComponent<React.RefAttributes<any>>;
2
+ export default _default;
3
+ import React from "react";
@@ -0,0 +1,68 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import block from 'bem-cn-lite';
4
+ import Item from '../Item/Item';
5
+ import { DashKitContext } from '../../context/DashKitContext';
6
+ import './GridItem.css';
7
+ import OverlayControls from '../OverlayControls/OverlayControls';
8
+ const b = block('dashkit-grid-item');
9
+ class GridItem extends React.PureComponent {
10
+ renderOverlay() {
11
+ const { editMode, overlayControls } = this.context;
12
+ if (!editMode || this.props.item.data._editActive) {
13
+ return null;
14
+ }
15
+ const { item } = this.props;
16
+ const controls = overlayControls && overlayControls[item.type];
17
+ return (React.createElement(React.Fragment, null,
18
+ React.createElement("div", { className: b('overlay') }),
19
+ React.createElement(OverlayControls, { configItem: item, items: controls })));
20
+ }
21
+ render() {
22
+ // из-за бага, что Grid Items unmounts при изменении static, isDraggable, isResaizable
23
+ // https://github.com/STRML/react-grid-layout/issues/721
24
+ const { style, onMouseDown, onMouseUp, onTouchEnd, onTouchStart, children, className, isDragging, noOverlay, withCustomHandle, } = this.props;
25
+ const { editMode } = this.context;
26
+ const width = Number.parseInt(style.width, 10);
27
+ const height = Number.parseInt(style.height, 10);
28
+ const transform = style.transform;
29
+ const preparedClassName = editMode
30
+ ? className
31
+ : className.replace('react-resizable', '').replace('react-draggable', '');
32
+ const preparedChildren = editMode ? children : null;
33
+ const reactGridLayoutProps = editMode
34
+ ? { onMouseDown, onMouseUp, onTouchEnd, onTouchStart }
35
+ : {};
36
+ const { _editActive } = this.props.item.data;
37
+ return (React.createElement("div", Object.assign({ className: b({
38
+ 'is-dragging': isDragging,
39
+ 'with-custom-handle': withCustomHandle,
40
+ }, preparedClassName), "data-qa": "dashkit-grid-item", style: style }, reactGridLayoutProps),
41
+ React.createElement("div", { className: b('item', { editMode: editMode && !_editActive && !noOverlay }) },
42
+ React.createElement(Item, { id: this.props.id, item: this.props.item, shouldItemUpdate: !isDragging, width: width, height: height, transform: transform, adjustWidgetLayout: this.props.adjustWidgetLayout, layout: this.props.layout, forwardedPluginRef: this.props.forwardedPluginRef })),
43
+ !noOverlay && this.renderOverlay(),
44
+ preparedChildren));
45
+ }
46
+ }
47
+ GridItem.propTypes = {
48
+ adjustWidgetLayout: PropTypes.func.isRequired,
49
+ id: PropTypes.string,
50
+ item: PropTypes.object,
51
+ isDragging: PropTypes.bool,
52
+ layout: PropTypes.array,
53
+ forwardedPluginRef: PropTypes.any,
54
+ // from react-grid-layout:
55
+ children: PropTypes.node,
56
+ className: PropTypes.string,
57
+ style: PropTypes.object,
58
+ noOverlay: PropTypes.bool,
59
+ withCustomHandle: PropTypes.bool,
60
+ onMouseDown: PropTypes.func,
61
+ onMouseUp: PropTypes.func,
62
+ onTouchEnd: PropTypes.func,
63
+ onTouchStart: PropTypes.func,
64
+ };
65
+ GridItem.contextType = DashKitContext;
66
+ export default React.forwardRef((props, ref) => {
67
+ return React.createElement(GridItem, Object.assign({}, props, { forwardedPluginRef: ref }));
68
+ });
@@ -0,0 +1,25 @@
1
+ export default class GridLayout extends React.PureComponent<any, any, any> {
2
+ static contextType: React.Context<any>;
3
+ constructor(props: any, context: any);
4
+ pluginsRefs: any[];
5
+ state: {
6
+ isDragging: boolean;
7
+ isPageHidden: boolean;
8
+ };
9
+ componentDidMount(): void;
10
+ componentDidUpdate(): void;
11
+ componentWillUnmount(): void;
12
+ _timeout: any;
13
+ onVisibilityChange: () => void;
14
+ adjustWidgetLayout: ({ widgetId, needSetDefault, adjustedWidgetLayout }: {
15
+ widgetId: any;
16
+ needSetDefault: any;
17
+ adjustedWidgetLayout: any;
18
+ }) => void;
19
+ getItemsMeta: () => any;
20
+ reloadItems(): void;
21
+ _onStart: () => void;
22
+ _onStop: (newLayout: any) => void;
23
+ render(): JSX.Element;
24
+ }
25
+ import React from "react";
@@ -0,0 +1,85 @@
1
+ import React from 'react';
2
+ import ReactGridLayout, { WidthProvider } from 'react-grid-layout';
3
+ import GridItem from '../GridItem/GridItem';
4
+ import { DashKitContext } from '../../context/DashKitContext';
5
+ const Layout = WidthProvider(ReactGridLayout); // eslint-disable-line new-cap
6
+ export default class GridLayout extends React.PureComponent {
7
+ constructor(props, context) {
8
+ super(props, context);
9
+ this.onVisibilityChange = () => {
10
+ this.setState({
11
+ isPageHidden: document.hidden,
12
+ });
13
+ };
14
+ this.adjustWidgetLayout = ({ widgetId, needSetDefault, adjustedWidgetLayout }) => {
15
+ const { getLayout, memorizeOriginalLayout, revertToOriginalLayout } = this.context;
16
+ if (needSetDefault) {
17
+ revertToOriginalLayout(widgetId);
18
+ return;
19
+ }
20
+ if (!adjustedWidgetLayout) {
21
+ return;
22
+ }
23
+ const layout = getLayout();
24
+ const correspondedLayoutItemIndex = layout.findIndex((layoutItem) => layoutItem.i === widgetId);
25
+ memorizeOriginalLayout(widgetId, Object.assign({}, layout[correspondedLayoutItemIndex]), adjustedWidgetLayout);
26
+ };
27
+ this.getItemsMeta = () => {
28
+ const { getItemsMeta } = this.context;
29
+ return getItemsMeta(this.pluginsRefs);
30
+ };
31
+ this._onStart = () => {
32
+ this.setState({ isDragging: true });
33
+ };
34
+ this._onStop = (newLayout) => {
35
+ const { layoutChange } = this.context;
36
+ layoutChange(newLayout);
37
+ this.setState({ isDragging: false });
38
+ };
39
+ this.pluginsRefs = [];
40
+ this.state = {
41
+ isDragging: false,
42
+ isPageHidden: false,
43
+ };
44
+ }
45
+ componentDidMount() {
46
+ this.reloadItems();
47
+ document.addEventListener('visibilitychange', this.onVisibilityChange);
48
+ }
49
+ componentDidUpdate() {
50
+ clearTimeout(this._timeout);
51
+ this.reloadItems();
52
+ }
53
+ componentWillUnmount() {
54
+ clearTimeout(this._timeout);
55
+ document.removeEventListener('visibilitychange', this.onVisibilityChange);
56
+ }
57
+ reloadItems() {
58
+ const { editMode, settings: { autoupdateInterval, silentLoading } = {}, reloadItems, } = this.context;
59
+ const { isPageHidden } = this.state;
60
+ const autoupdateIntervalNumber = Number(autoupdateInterval);
61
+ if (autoupdateIntervalNumber) {
62
+ this._timeout = setTimeout(() => {
63
+ if (!isPageHidden) {
64
+ if (!editMode) {
65
+ reloadItems(this.pluginsRefs, { silentLoading, noVeil: true });
66
+ }
67
+ this.reloadItems();
68
+ }
69
+ }, autoupdateIntervalNumber * 1000);
70
+ }
71
+ }
72
+ render() {
73
+ const { getLayout, config, registerManager, editMode, noOverlay, draggableHandleClassName } = this.context;
74
+ this.pluginsRefs.length = config.items.length;
75
+ const layout = getLayout();
76
+ return (React.createElement(Layout, Object.assign({}, registerManager.gridLayout, { layout: layout, isDraggable: editMode, isResizable: editMode, onDragStart: this._onStart, onDragStop: this._onStop, onResizeStart: this._onStart, onResizeStop: this._onStop }, (draggableHandleClassName
77
+ ? { draggableHandle: `.${draggableHandleClassName}` }
78
+ : null)), config.items.map((item, i) => {
79
+ return (React.createElement(GridItem, { ref: (pluginRef) => {
80
+ this.pluginsRefs[i] = pluginRef;
81
+ }, key: item.id, id: item.id, item: item, layout: layout, adjustWidgetLayout: this.adjustWidgetLayout, isDragging: this.state.isDragging, noOverlay: noOverlay, withCustomHandle: Boolean(draggableHandleClassName) }));
82
+ })));
83
+ }
84
+ }
85
+ GridLayout.contextType = DashKitContext;
@@ -0,0 +1,19 @@
1
+ .dashkit-item__renderer {
2
+ position: absolute;
3
+ top: 0;
4
+ bottom: 0;
5
+ left: 0;
6
+ right: 0;
7
+ }
8
+ .dashkit-item__loader {
9
+ position: absolute;
10
+ top: 0;
11
+ bottom: 0;
12
+ left: 0;
13
+ right: 0;
14
+ display: flex;
15
+ align-items: center;
16
+ justify-content: center;
17
+ border: dashed 1px rgba(0, 0, 0, 0.1);
18
+ z-index: 3;
19
+ }
@@ -0,0 +1,67 @@
1
+ declare const _default: {
2
+ new (props: any): {
3
+ shouldComponentUpdate(nextProps: any): boolean;
4
+ _onStateAndParamsChange: (stateAndParams: any) => void;
5
+ render(): JSX.Element;
6
+ context: any;
7
+ setState<K extends string | number | symbol>(state: any, callback?: (() => void) | undefined): void;
8
+ forceUpdate(callback?: (() => void) | undefined): void;
9
+ readonly props: Readonly<any> & Readonly<{
10
+ children?: React.ReactNode;
11
+ }>;
12
+ state: Readonly<any>;
13
+ refs: {
14
+ [key: string]: React.ReactInstance;
15
+ };
16
+ componentDidMount?(): void;
17
+ componentWillUnmount?(): void;
18
+ componentDidCatch?(error: Error, errorInfo: React.ErrorInfo): void;
19
+ getSnapshotBeforeUpdate?(prevProps: Readonly<any>, prevState: Readonly<any>): any;
20
+ componentDidUpdate?(prevProps: Readonly<any>, prevState: Readonly<any>, snapshot?: any): void;
21
+ componentWillMount?(): void;
22
+ UNSAFE_componentWillMount?(): void;
23
+ componentWillReceiveProps?(nextProps: Readonly<any>, nextContext: any): void;
24
+ UNSAFE_componentWillReceiveProps?(nextProps: Readonly<any>, nextContext: any): void;
25
+ componentWillUpdate?(nextProps: Readonly<any>, nextState: Readonly<any>, nextContext: any): void;
26
+ UNSAFE_componentWillUpdate?(nextProps: Readonly<any>, nextState: Readonly<any>, nextContext: any): void;
27
+ };
28
+ new (props: any, context: any): {
29
+ shouldComponentUpdate(nextProps: any): boolean;
30
+ _onStateAndParamsChange: (stateAndParams: any) => void;
31
+ render(): JSX.Element;
32
+ context: any;
33
+ setState<K extends string | number | symbol>(state: any, callback?: (() => void) | undefined): void;
34
+ forceUpdate(callback?: (() => void) | undefined): void;
35
+ readonly props: Readonly<any> & Readonly<{
36
+ children?: React.ReactNode;
37
+ }>;
38
+ state: Readonly<any>;
39
+ refs: {
40
+ [key: string]: React.ReactInstance;
41
+ };
42
+ componentDidMount?(): void;
43
+ componentWillUnmount?(): void;
44
+ componentDidCatch?(error: Error, errorInfo: React.ErrorInfo): void;
45
+ getSnapshotBeforeUpdate?(prevProps: Readonly<any>, prevState: Readonly<any>): any;
46
+ componentDidUpdate?(prevProps: Readonly<any>, prevState: Readonly<any>, snapshot?: any): void;
47
+ componentWillMount?(): void;
48
+ UNSAFE_componentWillMount?(): void;
49
+ componentWillReceiveProps?(nextProps: Readonly<any>, nextContext: any): void;
50
+ UNSAFE_componentWillReceiveProps?(nextProps: Readonly<any>, nextContext: any): void;
51
+ componentWillUpdate?(nextProps: Readonly<any>, nextState: Readonly<any>, nextContext: any): void;
52
+ UNSAFE_componentWillUpdate?(nextProps: Readonly<any>, nextState: Readonly<any>, nextContext: any): void;
53
+ };
54
+ propTypes: {
55
+ adjustWidgetLayout: PropTypes.Validator<(...args: any[]) => any>;
56
+ layout: PropTypes.Requireable<any[]>;
57
+ id: PropTypes.Requireable<string>;
58
+ item: PropTypes.Requireable<object>;
59
+ shouldItemUpdate: PropTypes.Requireable<boolean>;
60
+ width: PropTypes.Requireable<number>;
61
+ height: PropTypes.Requireable<number>;
62
+ transform: PropTypes.Requireable<string>;
63
+ forwardedPluginRef: PropTypes.Requireable<any>;
64
+ };
65
+ contextType: React.Context<any>;
66
+ };
67
+ export default _default;
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ import block from 'bem-cn-lite';
3
+ import PropTypes from 'prop-types';
4
+ import { prepareItem } from '../../hocs/prepareItem';
5
+ import './Item.css';
6
+ const b = block('dashkit-item');
7
+ // TODO: getDerivedStateFromError и заглушка с ошибкой
8
+ const Item = ({ registerManager, rendererProps, type, forwardedPluginRef }) => {
9
+ if (!registerManager.check(type)) {
10
+ console.warn(`type [${type}] не зарегистрирован`);
11
+ return null;
12
+ }
13
+ return (React.createElement("div", { className: b('renderer') }, registerManager.getItem(type).renderer(rendererProps, forwardedPluginRef)));
14
+ };
15
+ Item.propTypes = {
16
+ forwardedPluginRef: PropTypes.any,
17
+ rendererProps: PropTypes.object,
18
+ registerManager: PropTypes.object,
19
+ type: PropTypes.string,
20
+ };
21
+ export default prepareItem(Item);
@@ -0,0 +1,10 @@
1
+ .dashkit-mobile-layout__item {
2
+ margin-bottom: 20px;
3
+ position: relative;
4
+ }
5
+ .dashkit-mobile-layout .dashkit-item__renderer {
6
+ overflow-y: auto;
7
+ border-radius: 3px;
8
+ position: static;
9
+ user-select: none;
10
+ }
@@ -0,0 +1,16 @@
1
+ export default class MobileLayout extends React.PureComponent<any, any, any> {
2
+ static contextType: React.Context<any>;
3
+ constructor(props: any);
4
+ constructor(props: any, context: any);
5
+ pluginsRefs: any[];
6
+ state: {
7
+ activeTabId: null;
8
+ indexesOfItemsWithActiveAutoheight: {};
9
+ };
10
+ componentDidUpdate(prevProps: any, prevState: any): void;
11
+ adjustWidgetLayout: (index: any, { needSetDefault }: {
12
+ needSetDefault: any;
13
+ }) => void;
14
+ render(): JSX.Element;
15
+ }
16
+ import React from "react";
@@ -0,0 +1,51 @@
1
+ import React from 'react';
2
+ import block from 'bem-cn-lite';
3
+ import Item from '../Item/Item';
4
+ import { DashKitContext } from '../../context/DashKitContext';
5
+ import { getSortedConfigItems } from './helpers';
6
+ import './MobileLayout.css';
7
+ const b = block('dashkit-mobile-layout');
8
+ export default class MobileLayout extends React.PureComponent {
9
+ constructor() {
10
+ super(...arguments);
11
+ this.pluginsRefs = [];
12
+ this.state = {
13
+ activeTabId: null,
14
+ indexesOfItemsWithActiveAutoheight: {},
15
+ };
16
+ this.adjustWidgetLayout = (index, { needSetDefault }) => {
17
+ if (needSetDefault) {
18
+ const indexesOfItemsWithActiveAutoheight = Object.assign({}, this.state.indexesOfItemsWithActiveAutoheight);
19
+ delete indexesOfItemsWithActiveAutoheight[index];
20
+ this.setState({ indexesOfItemsWithActiveAutoheight });
21
+ }
22
+ else {
23
+ this.setState({
24
+ indexesOfItemsWithActiveAutoheight: Object.assign({}, this.state.indexesOfItemsWithActiveAutoheight, { [index]: true }),
25
+ });
26
+ }
27
+ };
28
+ }
29
+ componentDidUpdate(prevProps, prevState) {
30
+ if (prevState.activeTabId !== this.context.config.id) {
31
+ this.setState({
32
+ activeTabId: this.context.config.id,
33
+ indexesOfItemsWithActiveAutoheight: {},
34
+ });
35
+ }
36
+ }
37
+ render() {
38
+ const { config, getLayout } = this.context;
39
+ this.pluginsRefs.length = config.items.length;
40
+ const hasOrderId = Boolean(config.items.find((item) => item.orderId));
41
+ const sortedItems = getSortedConfigItems(config, hasOrderId);
42
+ return (React.createElement("div", { className: b() }, sortedItems.map((item, index) => {
43
+ const isItemWithActiveAutoheight = index in this.state.indexesOfItemsWithActiveAutoheight;
44
+ return (React.createElement("div", { className: b('item', { autoheight: isItemWithActiveAutoheight }), key: item.id },
45
+ React.createElement(Item, { id: item.id, item: item, layout: getLayout(), shouldItemUpdate: false, adjustWidgetLayout: this.adjustWidgetLayout.bind(this, index), forwardedPluginRef: (pluginRef) => {
46
+ this.pluginsRefs[index] = pluginRef;
47
+ } })));
48
+ })));
49
+ }
50
+ }
51
+ MobileLayout.contextType = DashKitContext;
@@ -0,0 +1,3 @@
1
+ import { ConfigItem, ConfigLayout } from '../../shared';
2
+ import { DashKitProps } from '../DashKit';
3
+ export declare const getSortedConfigItems: (config: DashKitProps['config'], hasOrderId: boolean) => (ConfigItem & ConfigLayout)[];
@@ -0,0 +1,28 @@
1
+ const sortByOrderComparator = (prev, next, fieldName) => {
2
+ const prevOrderId = prev[fieldName];
3
+ const nextOrderId = next[fieldName];
4
+ if (prevOrderId === undefined) {
5
+ return 1;
6
+ }
7
+ if (nextOrderId === undefined) {
8
+ return -1;
9
+ }
10
+ if (prevOrderId > nextOrderId) {
11
+ return 1;
12
+ }
13
+ else if (prevOrderId < nextOrderId) {
14
+ return -1;
15
+ }
16
+ return 0;
17
+ };
18
+ const getWidgetsSortComparator = (hasOrderId) => {
19
+ return hasOrderId
20
+ ? (prev, next) => sortByOrderComparator(prev, next, 'orderId')
21
+ : (prev, next) => prev.y === next.y ? prev.x - next.x : prev.y - next.y;
22
+ };
23
+ export const getSortedConfigItems = (config, hasOrderId) => {
24
+ const sortComparator = getWidgetsSortComparator(hasOrderId);
25
+ return config.items
26
+ .map((item, index) => Object.assign({}, item, config.layout[index]))
27
+ .sort(sortComparator);
28
+ };
@@ -0,0 +1,28 @@
1
+ .dashkit-overlay-controls {
2
+ position: absolute;
3
+ display: flex;
4
+ }
5
+ .dashkit-overlay-controls__default-controls {
6
+ display: flex;
7
+ background: var(--yc-color-base-generic-ultralight);
8
+ border-radius: var(--yc-border-radius-m);
9
+ }
10
+ .dashkit-overlay-controls_position_top_right {
11
+ top: 7px;
12
+ right: 7px;
13
+ }
14
+ .dashkit-overlay-controls_position_top_left {
15
+ top: 7px;
16
+ left: 7px;
17
+ }
18
+ .dashkit-overlay-controls_position_bottom_right {
19
+ bottom: 7px;
20
+ right: 7px;
21
+ }
22
+ .dashkit-overlay-controls_position_bottom_left {
23
+ bottom: 7px;
24
+ left: 7px;
25
+ }
26
+ .dashkit-overlay-controls__item_danger {
27
+ color: var(--yc-color-text-danger);
28
+ }