@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,2 @@
1
+ export const CURRENT_VERSION = 2;
2
+ export const META_KEY = '__meta__';
@@ -0,0 +1 @@
1
+ export * from './common';
@@ -0,0 +1 @@
1
+ export * from './common';
@@ -0,0 +1,4 @@
1
+ export * from './constants';
2
+ export * from './types';
3
+ export * from './modules';
4
+ export * from './units';
@@ -0,0 +1,4 @@
1
+ export * from './constants';
2
+ export * from './types';
3
+ export * from './modules';
4
+ export * from './units';
@@ -0,0 +1,215 @@
1
+ import { META_KEY } from '../../constants';
2
+ import { formQueueData } from '../helpers';
3
+ const DEFAULT_CONTROL_ID = 'controlId';
4
+ const DEFAULT_WIDGET_ID = 'widgetId';
5
+ const DEFAULT_WIDGET_TAB_ID = 'widget_tabId';
6
+ const NAMESPACE = 'default';
7
+ const getMockedControlItem = ({ id = DEFAULT_CONTROL_ID, defaults, }) => ({
8
+ id,
9
+ defaults,
10
+ data: {},
11
+ type: 'control',
12
+ namespace: NAMESPACE,
13
+ });
14
+ const getMockedWidgetItem = ({ id = DEFAULT_WIDGET_ID, tabs }) => ({
15
+ id,
16
+ data: { tabs },
17
+ type: 'widget',
18
+ namespace: NAMESPACE,
19
+ });
20
+ describe('modules.helpers', () => {
21
+ describe('formQueueData', () => {
22
+ it('return correct queue data for control: common', () => {
23
+ const itemsStateAndParams = {
24
+ [DEFAULT_CONTROL_ID]: {
25
+ params: {
26
+ scale: 'd',
27
+ view: 'normal',
28
+ },
29
+ },
30
+ [META_KEY]: {
31
+ queue: [{ id: DEFAULT_CONTROL_ID }],
32
+ version: 2,
33
+ },
34
+ };
35
+ const controlItem1 = getMockedControlItem({ id: 'control-1' });
36
+ expect([]).toEqual(formQueueData({ items: [controlItem1], itemsStateAndParams }));
37
+ const controlItem2 = getMockedControlItem({ id: 'control-2', defaults: { scale: 'm' } });
38
+ expect([]).toEqual(formQueueData({ items: [controlItem2], itemsStateAndParams }));
39
+ const controlItem3 = getMockedControlItem({ defaults: { number: 'one', size: 's' } });
40
+ expect([
41
+ {
42
+ id: DEFAULT_CONTROL_ID,
43
+ namespace: NAMESPACE,
44
+ params: {},
45
+ },
46
+ ]).toEqual(formQueueData({ items: [controlItem3], itemsStateAndParams }));
47
+ const controlItem4 = getMockedControlItem({ defaults: { scale: 'm', size: 's' } });
48
+ expect([
49
+ {
50
+ id: DEFAULT_CONTROL_ID,
51
+ namespace: NAMESPACE,
52
+ params: { scale: 'd' },
53
+ },
54
+ ]).toEqual(formQueueData({ items: [controlItem4], itemsStateAndParams }));
55
+ const controlItem5 = getMockedControlItem({
56
+ defaults: { scale: 'm', size: 's', view: 'contrast' },
57
+ });
58
+ expect([
59
+ {
60
+ id: DEFAULT_CONTROL_ID,
61
+ namespace: NAMESPACE,
62
+ params: {
63
+ scale: 'd',
64
+ view: 'normal',
65
+ },
66
+ },
67
+ ]).toEqual(formQueueData({ items: [controlItem5], itemsStateAndParams }));
68
+ });
69
+ it('return correct queue data for widget: common', () => {
70
+ const itemsStateAndParams = {
71
+ [DEFAULT_WIDGET_ID]: {
72
+ params: {
73
+ scale: 'd',
74
+ view: 'normal',
75
+ },
76
+ },
77
+ [META_KEY]: {
78
+ queue: [{ id: DEFAULT_WIDGET_ID, tabId: DEFAULT_WIDGET_TAB_ID }],
79
+ version: 2,
80
+ },
81
+ };
82
+ const widgetItem1 = getMockedWidgetItem({ id: 'widget-1' });
83
+ expect([]).toEqual(formQueueData({ items: [widgetItem1], itemsStateAndParams }));
84
+ const widgetItem2 = getMockedWidgetItem({
85
+ id: 'widget-2',
86
+ tabs: [{ id: DEFAULT_WIDGET_TAB_ID, params: { scale: 'm' } }],
87
+ });
88
+ expect([]).toEqual(formQueueData({ items: [widgetItem2], itemsStateAndParams }));
89
+ const widgetItem3 = getMockedWidgetItem({
90
+ tabs: [{ id: 'widget-3-tabId', params: { scale: 'm' } }],
91
+ });
92
+ expect([]).toEqual(formQueueData({ items: [widgetItem3], itemsStateAndParams }));
93
+ const widgetItem4 = getMockedWidgetItem({
94
+ tabs: [{ id: DEFAULT_WIDGET_TAB_ID }],
95
+ });
96
+ expect([
97
+ {
98
+ id: DEFAULT_WIDGET_ID,
99
+ namespace: NAMESPACE,
100
+ params: {},
101
+ },
102
+ ]).toEqual(formQueueData({ items: [widgetItem4], itemsStateAndParams }));
103
+ const widgetItem5 = getMockedWidgetItem({
104
+ tabs: [{ id: DEFAULT_WIDGET_TAB_ID, params: { scale: 'm' } }],
105
+ });
106
+ expect([
107
+ {
108
+ id: DEFAULT_WIDGET_ID,
109
+ namespace: NAMESPACE,
110
+ params: { scale: 'd' },
111
+ },
112
+ ]).toEqual(formQueueData({ items: [widgetItem5], itemsStateAndParams }));
113
+ });
114
+ it('return correct queue data for widget: check tabs', () => {
115
+ const TAB_ID = 'default_tab_id';
116
+ const itemsStateAndParams1 = {
117
+ [DEFAULT_WIDGET_ID]: {
118
+ params: { scale: 'd', view: 'normal' },
119
+ state: { tabId: DEFAULT_WIDGET_TAB_ID },
120
+ },
121
+ [META_KEY]: {
122
+ queue: [{ id: DEFAULT_WIDGET_ID, tabId: DEFAULT_WIDGET_TAB_ID }],
123
+ version: 2,
124
+ },
125
+ };
126
+ const itemsStateAndParams2 = {
127
+ [DEFAULT_WIDGET_ID]: {
128
+ params: { scale: 'd', view: 'normal' },
129
+ state: { tabId: TAB_ID },
130
+ },
131
+ [META_KEY]: {
132
+ queue: [{ id: DEFAULT_WIDGET_ID, tabId: TAB_ID }],
133
+ version: 2,
134
+ },
135
+ };
136
+ const itemsStateAndParams3 = {
137
+ [DEFAULT_WIDGET_ID]: {
138
+ params: { scale: 'd', view: 'normal' },
139
+ state: { tabId: 'anyTabId' },
140
+ },
141
+ [META_KEY]: {
142
+ queue: [{ id: DEFAULT_WIDGET_ID, tabId: 'anyTabId' }],
143
+ version: 2,
144
+ },
145
+ };
146
+ const widgetItem = getMockedWidgetItem({
147
+ tabs: [
148
+ { id: DEFAULT_WIDGET_TAB_ID, params: { scale: 'm' } },
149
+ { id: TAB_ID, isDefault: true, params: { view: 'contrast' } },
150
+ ],
151
+ });
152
+ expect([
153
+ {
154
+ id: DEFAULT_WIDGET_ID,
155
+ namespace: NAMESPACE,
156
+ params: { scale: 'd' },
157
+ },
158
+ ]).toEqual(formQueueData({ items: [widgetItem], itemsStateAndParams: itemsStateAndParams1 }));
159
+ expect([
160
+ {
161
+ id: DEFAULT_WIDGET_ID,
162
+ namespace: NAMESPACE,
163
+ params: { view: 'normal' },
164
+ },
165
+ ]).toEqual(formQueueData({ items: [widgetItem], itemsStateAndParams: itemsStateAndParams2 }));
166
+ expect([]).toEqual(formQueueData({ items: [widgetItem], itemsStateAndParams: itemsStateAndParams3 }));
167
+ });
168
+ it('return correct queue data for controls and widgets', () => {
169
+ const itemsStateAndParams = {
170
+ [DEFAULT_CONTROL_ID]: {
171
+ params: {
172
+ scale: 'd',
173
+ },
174
+ },
175
+ [DEFAULT_WIDGET_ID]: {
176
+ params: {
177
+ view: 'normal',
178
+ },
179
+ },
180
+ [META_KEY]: {
181
+ queue: [
182
+ { id: DEFAULT_CONTROL_ID },
183
+ { id: DEFAULT_WIDGET_ID, tabId: DEFAULT_WIDGET_TAB_ID },
184
+ ],
185
+ version: 2,
186
+ },
187
+ };
188
+ const widgetItem1 = getMockedWidgetItem({ id: 'widget-1' });
189
+ const widgetItem2 = getMockedWidgetItem({
190
+ id: 'widget-2',
191
+ tabs: [{ id: 'widget-2-tabId', params: { view: 'contrast' } }],
192
+ });
193
+ const widgetItem3 = getMockedWidgetItem({
194
+ tabs: [{ id: DEFAULT_WIDGET_TAB_ID, params: { view: 'contrast' } }],
195
+ });
196
+ const control1 = getMockedControlItem({ id: 'control-1' });
197
+ const control2 = getMockedControlItem({ defaults: { scale: 'm', view: 'contrast' } });
198
+ expect([
199
+ {
200
+ id: DEFAULT_CONTROL_ID,
201
+ namespace: NAMESPACE,
202
+ params: { scale: 'd' },
203
+ },
204
+ {
205
+ id: DEFAULT_WIDGET_ID,
206
+ namespace: NAMESPACE,
207
+ params: { view: 'normal' },
208
+ },
209
+ ]).toEqual(formQueueData({
210
+ items: [widgetItem2, widgetItem3, control1, widgetItem1, control2],
211
+ itemsStateAndParams,
212
+ }));
213
+ });
214
+ });
215
+ });
@@ -0,0 +1,42 @@
1
+ import { PluginBase, ConfigItem, ItemsStateAndParams, StateAndParamsMetaData, StringParams, ConfigConnection, ConfigAliases, ConfigItemWithTabs, Config } from '../types';
2
+ export declare function prerenderItems({ items, plugins, }: {
3
+ items: ConfigItem[];
4
+ plugins: PluginBase[];
5
+ }): ConfigItem[];
6
+ export declare function getItemsStateAndParamsMeta(itemsStateAndParams: ItemsStateAndParams): StateAndParamsMetaData | undefined;
7
+ export declare function getCurrentVersion(itemsStateAndParams: ItemsStateAndParams): number;
8
+ export declare function isItemWithTabs(item: Pick<ConfigItem, 'data'>): item is Pick<ConfigItemWithTabs, 'data'>;
9
+ export declare type FormedQueueData = {
10
+ id: string;
11
+ namespace: string;
12
+ params: StringParams;
13
+ };
14
+ export declare function formQueueData({ items, itemsStateAndParams, }: {
15
+ items: ConfigItem[];
16
+ itemsStateAndParams: ItemsStateAndParams;
17
+ }): FormedQueueData[];
18
+ export declare function resolveItemInnerId({ item, itemsStateAndParams, }: {
19
+ item: ConfigItem;
20
+ itemsStateAndParams: ItemsStateAndParams;
21
+ }): string;
22
+ export declare function getMapItemsIgnores({ items, ignores, itemsStateAndParams, isFirstVersion, }: {
23
+ items: ConfigItem[];
24
+ ignores: ConfigConnection[];
25
+ itemsStateAndParams: ItemsStateAndParams;
26
+ isFirstVersion: boolean;
27
+ }): Record<string, string[]>;
28
+ export declare function mergeParamsWithAliases({ aliases, namespace, params, }: {
29
+ aliases: ConfigAliases;
30
+ namespace: string;
31
+ params: StringParams;
32
+ }): StringParams;
33
+ export declare function getInitialItemsStateAndParamsMeta(): StateAndParamsMetaData;
34
+ interface ChangeQueueArg {
35
+ id: string;
36
+ tabId?: string;
37
+ config: Config;
38
+ itemsStateAndParams: ItemsStateAndParams;
39
+ }
40
+ export declare function addToQueue({ id, tabId, config, itemsStateAndParams, }: ChangeQueueArg): StateAndParamsMetaData;
41
+ export declare function deleteFromQueue(data: ChangeQueueArg): StateAndParamsMetaData;
42
+ export {};
@@ -0,0 +1,157 @@
1
+ import keyBy from 'lodash/keyBy';
2
+ import get from 'lodash/get';
3
+ import invert from 'lodash/invert';
4
+ import isEmpty from 'lodash/isEmpty';
5
+ import pick from 'lodash/pick';
6
+ import { META_KEY, CURRENT_VERSION } from '../constants';
7
+ function getNormalizedPlugins(plugins) {
8
+ return keyBy(plugins, 'type');
9
+ }
10
+ export function prerenderItems({ items, plugins, }) {
11
+ const normalizedPlugins = getNormalizedPlugins(plugins);
12
+ return items.map((item) => {
13
+ const { type } = item;
14
+ const plugin = normalizedPlugins[type];
15
+ return typeof plugin.prerenderMiddleware === 'function'
16
+ ? plugin.prerenderMiddleware(item)
17
+ : item;
18
+ });
19
+ }
20
+ export function getItemsStateAndParamsMeta(itemsStateAndParams) {
21
+ const meta = itemsStateAndParams === null || itemsStateAndParams === void 0 ? void 0 : itemsStateAndParams[META_KEY];
22
+ return meta;
23
+ }
24
+ export function getCurrentVersion(itemsStateAndParams) {
25
+ if (isEmpty(itemsStateAndParams)) {
26
+ return CURRENT_VERSION;
27
+ }
28
+ const meta = getItemsStateAndParamsMeta(itemsStateAndParams);
29
+ if (!meta) {
30
+ const withParams = Object.keys(itemsStateAndParams).some((id) => {
31
+ return Boolean(itemsStateAndParams[id].params);
32
+ });
33
+ if (withParams) {
34
+ return 1;
35
+ }
36
+ return CURRENT_VERSION;
37
+ }
38
+ return meta.version;
39
+ }
40
+ function nonNullable(value) {
41
+ return value !== null && value !== undefined;
42
+ }
43
+ export function isItemWithTabs(item) {
44
+ var _a;
45
+ return Array.isArray((_a = item === null || item === void 0 ? void 0 : item.data) === null || _a === void 0 ? void 0 : _a.tabs);
46
+ }
47
+ // Массив параметров, которые исходят от виджетов, согласно очереди
48
+ export function formQueueData({ items, itemsStateAndParams, }) {
49
+ var _a;
50
+ const queue = ((_a = getItemsStateAndParamsMeta(itemsStateAndParams)) === null || _a === void 0 ? void 0 : _a.queue) || [];
51
+ const keyById = keyBy(items, 'id');
52
+ return queue
53
+ .map((queueItem) => {
54
+ var _a;
55
+ const { id: queueId, tabId } = queueItem;
56
+ const item = keyById[queueId];
57
+ if (!item) {
58
+ return null;
59
+ }
60
+ let itemDefaultParams;
61
+ if (isItemWithTabs(item)) {
62
+ if (!tabId || resolveItemInnerId({ item, itemsStateAndParams }) !== tabId) {
63
+ return null;
64
+ }
65
+ itemDefaultParams =
66
+ ((_a = item.data.tabs.find((tabData) => tabData.id === tabId)) === null || _a === void 0 ? void 0 : _a.params) || {};
67
+ }
68
+ else {
69
+ itemDefaultParams = item.defaults || {};
70
+ }
71
+ const itemQueueParams = get(itemsStateAndParams, [item.id, 'params'], {});
72
+ return {
73
+ id: item.id,
74
+ namespace: item.namespace,
75
+ params: pick(itemQueueParams, Object.keys(itemDefaultParams)),
76
+ };
77
+ })
78
+ .filter(nonNullable);
79
+ }
80
+ export function resolveItemInnerId({ item, itemsStateAndParams, }) {
81
+ var _a, _b;
82
+ const { id } = item;
83
+ const stateTabId = (_b = (_a = itemsStateAndParams[id]) === null || _a === void 0 ? void 0 : _a.state) === null || _b === void 0 ? void 0 : _b.tabId;
84
+ const { tabs } = item.data;
85
+ if (stateTabId && tabs.some((tab) => tab.id === stateTabId)) {
86
+ return stateTabId;
87
+ }
88
+ const indexIsDefault = tabs.findIndex(({ isDefault }) => isDefault);
89
+ return indexIsDefault === -1 ? tabs[0].id : tabs[indexIsDefault].id;
90
+ }
91
+ // В config.connections в from/to может быть как id item'a (item.id), так и id таба (item.data.tabs[].id)
92
+ // Тут мы нормализуем к виду Record<itemId: ignoredItemId[]>
93
+ export function getMapItemsIgnores({ items, ignores, itemsStateAndParams, isFirstVersion, }) {
94
+ // Record<itemId, innerId (tabId | itemId)>
95
+ const mapIds = items.reduce((acc, item) => {
96
+ return Object.assign(Object.assign({}, acc), { [item.id]: isItemWithTabs(item)
97
+ ? resolveItemInnerId({ item, itemsStateAndParams })
98
+ : item.id });
99
+ }, {});
100
+ // Record<innerId (tabId | itemId), itemId>
101
+ const invertedMapIds = invert(mapIds);
102
+ return items.reduce((acc, item) => {
103
+ return Object.assign(Object.assign({}, acc), { [item.id]: ignores
104
+ .filter(({ from, to }) => {
105
+ if (isFirstVersion) {
106
+ // В первой версии был баг - если есть игнор на один таб, то весь виджет игнорит селектор.
107
+ // Повторяем это неправильное поведение,
108
+ // иначе будут прилетать дефолты селекта в табы, которые не игнорят.
109
+ const fromInTabs = isItemWithTabs(item) && item.data.tabs.some(({ id }) => id === from);
110
+ return (from === item.id || fromInTabs) && invertedMapIds[to];
111
+ }
112
+ return from === mapIds[item.id] && invertedMapIds[to];
113
+ })
114
+ .map(({ to }) => invertedMapIds[to]) });
115
+ }, {});
116
+ }
117
+ export function mergeParamsWithAliases({ aliases, namespace, params, }) {
118
+ const aliasesByNamespace = get(aliases, [namespace], []);
119
+ return Object.keys(params).reduce((matchedParams, paramKey) => {
120
+ const paramValue = params[paramKey];
121
+ const collectAliasesParamsKeys = aliasesByNamespace.reduce((collect, group) => {
122
+ return group.includes(paramKey) ? collect.concat(group) : collect;
123
+ }, [paramKey]);
124
+ return Object.assign(Object.assign({}, matchedParams), collectAliasesParamsKeys.reduce((acc, matchedKey) => {
125
+ return Object.assign(Object.assign({}, acc), { [matchedKey]: paramValue });
126
+ }, {}));
127
+ }, {});
128
+ }
129
+ export function getInitialItemsStateAndParamsMeta() {
130
+ return {
131
+ queue: [],
132
+ version: CURRENT_VERSION,
133
+ };
134
+ }
135
+ export function addToQueue({ id, tabId, config, itemsStateAndParams, }) {
136
+ const queueItem = { id };
137
+ if (tabId) {
138
+ queueItem.tabId = tabId;
139
+ }
140
+ const meta = getItemsStateAndParamsMeta(itemsStateAndParams);
141
+ if (!meta) {
142
+ return { queue: [queueItem], version: CURRENT_VERSION };
143
+ }
144
+ const { items } = config;
145
+ const actualIds = items.map((item) => item.id);
146
+ const metaQueue = meta.queue || [];
147
+ return {
148
+ queue: metaQueue
149
+ .filter((item) => actualIds.includes(item.id) && item.id !== id)
150
+ .concat(queueItem),
151
+ version: meta.version || CURRENT_VERSION,
152
+ };
153
+ }
154
+ export function deleteFromQueue(data) {
155
+ const meta = addToQueue(data);
156
+ return Object.assign(Object.assign({}, meta), { queue: meta.queue.slice(0, -1) });
157
+ }
@@ -0,0 +1,2 @@
1
+ export * from './helpers';
2
+ export * from './state-and-params';
@@ -0,0 +1,2 @@
1
+ export * from './helpers';
2
+ export * from './state-and-params';
@@ -0,0 +1,16 @@
1
+ import { GlobalParams, Config, ItemsStateAndParams, PluginBase, StringParams, ItemState } from '../types';
2
+ export interface GetItemsParamsArg {
3
+ defaultGlobalParams: GlobalParams;
4
+ globalParams: GlobalParams;
5
+ config: Config;
6
+ itemsStateAndParams: ItemsStateAndParams;
7
+ plugins: PluginBase[];
8
+ }
9
+ declare type GetItemsParamsReturn = Record<string, StringParams>;
10
+ export declare function getItemsParams({ defaultGlobalParams, globalParams, config, itemsStateAndParams, plugins, }: GetItemsParamsArg): GetItemsParamsReturn;
11
+ export declare function getItemsState({ config, itemsStateAndParams, }: {
12
+ config: Config;
13
+ itemsStateAndParams: ItemsStateAndParams;
14
+ }): Record<string, ItemState>;
15
+ export declare function getItemsStateAndParams({ defaultGlobalParams, globalParams, config, itemsStateAndParams, plugins, }: GetItemsParamsArg): ItemsStateAndParams;
16
+ export {};
@@ -0,0 +1,87 @@
1
+ import groupBy from 'lodash/groupBy';
2
+ import { prerenderItems, formQueueData, getMapItemsIgnores, mergeParamsWithAliases, getCurrentVersion, } from './helpers';
3
+ import { META_KEY } from '../constants';
4
+ export function getItemsParams({ defaultGlobalParams = {}, globalParams = {}, config, itemsStateAndParams, plugins, }) {
5
+ const { aliases, connections } = config;
6
+ const items = prerenderItems({ items: config.items, plugins });
7
+ const isFirstVersion = getCurrentVersion(itemsStateAndParams) === 1;
8
+ const queueData = isFirstVersion
9
+ ? []
10
+ : formQueueData({ items, itemsStateAndParams });
11
+ // В будущем учитывать не только игноры, когда такой kind появится
12
+ const mapItemsIgnores = getMapItemsIgnores({
13
+ items,
14
+ ignores: connections.filter(({ kind }) => kind === 'ignore'),
15
+ itemsStateAndParams,
16
+ isFirstVersion,
17
+ });
18
+ const groupByNamespace = groupBy(items, 'namespace');
19
+ const itemsWithDefaultsByNamespace = Object.keys(groupByNamespace).reduce((acc, namespace) => {
20
+ return Object.assign(Object.assign({}, acc), {
21
+ // Сейчас дефолты только у Селектов, затем для виджетов нужно доставать из item.data.tabs[].defaults
22
+ // но определиться с порядком их применения
23
+ [namespace]: groupByNamespace[namespace].filter((item) => item.defaults) });
24
+ }, {});
25
+ return items.reduce((itemsParams, item) => {
26
+ var _a;
27
+ const { id, namespace } = item;
28
+ const getMergedParams = (params) => mergeParamsWithAliases({ aliases, namespace, params: params || {} });
29
+ const itemIgnores = mapItemsIgnores[id];
30
+ const affectingItemsWithDefaults = itemsWithDefaultsByNamespace[namespace].filter((itemWithDefaults) => !itemIgnores.includes(itemWithDefaults.id));
31
+ let itemParams = Object.assign({}, getMergedParams(defaultGlobalParams),
32
+ // Стартовые дефолтные параметры
33
+ affectingItemsWithDefaults.reduceRight((defaultParams, itemWithDefaults) => {
34
+ return Object.assign(Object.assign({}, defaultParams), getMergedParams(itemWithDefaults.defaults || {}));
35
+ }, {}), getMergedParams(globalParams));
36
+ if (isFirstVersion) {
37
+ itemParams = Object.assign(itemParams, ((_a = itemsStateAndParams === null || itemsStateAndParams === void 0 ? void 0 : itemsStateAndParams[id]) === null || _a === void 0 ? void 0 : _a.params) || {});
38
+ }
39
+ else {
40
+ itemParams = Object.assign(itemParams,
41
+ // Параметры согласно очереди применения параметров
42
+ queueData.reduce((queueParams, data) => {
43
+ if (data.namespace !== namespace || itemIgnores.includes(data.id)) {
44
+ return queueParams;
45
+ }
46
+ return Object.assign(Object.assign({}, queueParams), getMergedParams(data.params));
47
+ }, {}));
48
+ }
49
+ return Object.assign(Object.assign({}, itemsParams), { [id]: itemParams });
50
+ }, {});
51
+ }
52
+ export function getItemsState({ config, itemsStateAndParams, }) {
53
+ return config.items.reduce((acc, { id }) => {
54
+ var _a;
55
+ acc[id] = ((_a = itemsStateAndParams === null || itemsStateAndParams === void 0 ? void 0 : itemsStateAndParams[id]) === null || _a === void 0 ? void 0 : _a.state) || {};
56
+ return acc;
57
+ }, {});
58
+ }
59
+ export function getItemsStateAndParams({ defaultGlobalParams = {}, globalParams = {}, config, itemsStateAndParams, plugins, }) {
60
+ const params = getItemsParams({
61
+ defaultGlobalParams,
62
+ globalParams,
63
+ config,
64
+ itemsStateAndParams,
65
+ plugins,
66
+ });
67
+ const state = getItemsState({ config, itemsStateAndParams });
68
+ const uniqIds = new Set([...Object.keys(params), ...Object.keys(state)]);
69
+ const result = Array.from(uniqIds).reduce((acc, id) => {
70
+ const data = {};
71
+ if (id in params) {
72
+ data.params = params[id];
73
+ }
74
+ if (id in state) {
75
+ data.state = state[id];
76
+ }
77
+ return Object.assign(Object.assign({}, acc), { [id]: data });
78
+ }, {});
79
+ const version = getCurrentVersion(itemsStateAndParams);
80
+ if (version === 1) {
81
+ return result;
82
+ }
83
+ const meta = {
84
+ [META_KEY]: itemsStateAndParams[META_KEY],
85
+ };
86
+ return Object.assign(Object.assign({}, meta), result);
87
+ }
@@ -0,0 +1,5 @@
1
+ export declare type Dictionary<T = unknown> = Record<string, T>;
2
+ export interface StringParams extends Dictionary<string | string[]> {
3
+ }
4
+ export interface GlobalParams extends StringParams {
5
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,49 @@
1
+ import { StringParams } from './common';
2
+ export interface ConfigLayout {
3
+ i: string;
4
+ h: number;
5
+ w: number;
6
+ x: number;
7
+ y: number;
8
+ }
9
+ export interface ConfigItemData {
10
+ _editActive?: boolean;
11
+ tabs?: {
12
+ id: string;
13
+ isDefault?: boolean;
14
+ params?: StringParams;
15
+ [key: string]: unknown;
16
+ }[];
17
+ [key: string]: unknown;
18
+ }
19
+ export interface ConfigItemDataWithTabs extends Omit<ConfigItemData, 'tabs'> {
20
+ tabs: NonNullable<ConfigItemData['tabs']>;
21
+ }
22
+ export interface ConfigItem {
23
+ id: string;
24
+ data: ConfigItemData;
25
+ type: string;
26
+ namespace: string;
27
+ defaults?: StringParams;
28
+ orderId?: number;
29
+ defaultOrderId?: number;
30
+ }
31
+ export interface ConfigItemWithTabs extends Omit<ConfigItem, 'data'> {
32
+ data: ConfigItemDataWithTabs;
33
+ }
34
+ export interface ConfigAliases {
35
+ [namespace: string]: string[][];
36
+ }
37
+ export interface ConfigConnection {
38
+ from: string;
39
+ to: string;
40
+ kind: 'ignore';
41
+ }
42
+ export interface Config {
43
+ salt: string;
44
+ counter: number;
45
+ items: ConfigItem[];
46
+ layout: ConfigLayout[];
47
+ aliases: ConfigAliases;
48
+ connections: ConfigConnection[];
49
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ export * from './common';
2
+ export * from './config';
3
+ export * from './state-and-params';
4
+ export * from './plugin';
@@ -0,0 +1,4 @@
1
+ export * from './common';
2
+ export * from './config';
3
+ export * from './state-and-params';
4
+ export * from './plugin';
@@ -0,0 +1,8 @@
1
+ import { ConfigItem } from './config';
2
+ interface PluginSpecialFields {
3
+ prerenderMiddleware?: (item: ConfigItem) => ConfigItem;
4
+ }
5
+ export interface PluginBase extends PluginSpecialFields {
6
+ type: string;
7
+ }
8
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,22 @@
1
+ import { META_KEY } from '../constants';
2
+ import { StringParams } from './common';
3
+ export interface ItemState {
4
+ [key: string]: any;
5
+ }
6
+ export interface QueueItem {
7
+ id: string;
8
+ tabId?: string;
9
+ }
10
+ export declare type StateAndParamsMetaData = {
11
+ queue: QueueItem[];
12
+ version: number;
13
+ };
14
+ export declare type StateAndParamsMeta = {
15
+ [META_KEY]: StateAndParamsMetaData;
16
+ };
17
+ export declare type ItemStateAndParams = {
18
+ params?: StringParams;
19
+ state?: ItemState;
20
+ };
21
+ export declare type ItemsStateAndParamsBase = Record<string, ItemStateAndParams>;
22
+ export declare type ItemsStateAndParams = ItemsStateAndParamsBase | StateAndParamsMeta;
@@ -0,0 +1 @@
1
+ import { META_KEY } from '../constants';