plmt-constructor-sdk 0.13.5 → 0.13.7

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/README.md ADDED
@@ -0,0 +1,291 @@
1
+ # Constructor SDK
2
+
3
+ - [Конфигурация виджета](#config)
4
+ - [Настройка получения виджетом данных dataSettings](#data-settings)
5
+ - [Метод группировки данных DataQueryMethod](#data-query-method)
6
+ - [Код виджета](#widget)
7
+ - [SingleData и MultiData](#single-multy-data))
8
+ - [Life cycle](#life-cycle)
9
+ - [CSS переменные](#css-var)
10
+ - [Настройки виджета (установка параметров при создании)](#view-settings)
11
+
12
+ <a name="config"></a>
13
+
14
+ ## Конфигурация виджета
15
+
16
+ Конфигурацию описывает интерфейс `Config`. Рассмотрим пример:
17
+
18
+ ```ts
19
+ import {
20
+ block,
21
+ colorize,
22
+ Config,
23
+ DataQueryFunction,
24
+ DataQueryMethod,
25
+ filter,
26
+ sort,
27
+ } from 'plmt-constructor-sdk/config';
28
+
29
+ export const config: Config = {
30
+ // Имя виджета. Отображается в списке загруженых выджетов
31
+ label: {
32
+ ru: 'Имя на русском',
33
+ en: 'И на английском',
34
+ },
35
+ // Иконка виджета. Отображается в списке загруженых выджетов
36
+ icon: 'icon.svg',
37
+
38
+ // метаданные для формирования документации виджета
39
+ documentation: {
40
+ // путь до файла в формате markdown с документацией
41
+ readme: 'widget/README.md',
42
+ // путь до папки и контентом для документации
43
+ assetsDirectory: 'widget/documentation-assets',
44
+ // пути к файлам превью виджета
45
+ images: [
46
+ 'widget/documentation-assets/preview-1',
47
+ 'widget/documentation-assets/preview-2',
48
+ ],
49
+ },
50
+
51
+ // см. Настройка получения виджетом данных
52
+ dataSettings: {
53
+ // см. Метод группировки данных
54
+ method: DataQueryMethod.Aggregate,
55
+
56
+ //
57
+ blocks: [
58
+ block({
59
+ // По данному ключу можно получить колонки в виджете
60
+ // this.dataSettings.columnsByBlock['uniq-key']
61
+ key: 'uniq-key',
62
+ label: { ru: 'Columns', en: '' },
63
+ // Влияет на агрегацию данных
64
+ // см. Метод группировки данных
65
+ dataQueryFunction: DataQueryFunction.Sum,
66
+ }),
67
+
68
+ // Добавляет блок для колонок, по которым будет осуществляться фильтрация
69
+ // Доступны в виджете через this.dataSettings.filters
70
+ filter(),
71
+
72
+ // Добавляет блок для колонок, по которым будет осуществляться сортировка
73
+ // Доступны в виджете через this.dataSettings.sort
74
+ sort(),
75
+
76
+ // Добавляет блок для колонок, по которым будет осуществляться раскраска
77
+ // Настройки раскраски доступна через
78
+ // this.dataSettings.colorize
79
+ colorize(),
80
+ ],
81
+ },
82
+ };
83
+ ```
84
+
85
+ <a name="data-settings"></a>
86
+
87
+ ### Настройка получения виджетом данных dataSettings
88
+
89
+ Параметр конфигурации `dataSettings` описывает, из каких колонок датасета требуются данные, способ их фильтрации,
90
+ сортировку, а также способ агрегации данных. Чаще всего виджет использует один датасет, но если требуется несколько
91
+ датасетов, в конфигурации необходимо указать описание каждого в массиве, указав для каждого уникальный ключ:
92
+
93
+ ```ts
94
+ // ...
95
+ dataSettings: [
96
+ {
97
+ key: 'dataset-1',
98
+ label: { ru: 'Первый источник', en: '' },
99
+
100
+ method: DataQueryMethod.Table,
101
+ blocks: [
102
+ // ...
103
+ ],
104
+ },
105
+ {
106
+ key: 'dataset-2',
107
+ label: { ru: 'Второй источник', en: '' },
108
+
109
+ method: DataQueryMethod.Aggregate,
110
+ blocks: [
111
+ // ...
112
+ ],
113
+ },
114
+ ],
115
+ // ...
116
+ ```
117
+
118
+ По значению ключей в виджете будут доступны данные и настройки (см. [SingleData и MultiData](#single-multy-data))
119
+
120
+ <a name="data-query-method"></a>
121
+
122
+ ### Метод группировки данных DataQueryMethod
123
+
124
+ Этот параметр может менять данные из датасета. Для примера рассмотрим исходную таблицу
125
+
126
+ ```
127
+ ╔═══╤═══╤═══╗
128
+ ║ A │ C │ 1 ║
129
+ ╟───┼───┼───╢
130
+ ║ A │ C │ 2 ║
131
+ ╟───┼───┼───╢
132
+ ║ B │ C │ 7 ║
133
+ ╚═══╧═══╧═══╝
134
+ ```
135
+
136
+ Для `DataQueryMethod.Table` данные вернуться в исходном виде, тогда как для параметра
137
+ `DataQueryMethod.Aggregate` будет произведена агрегация в зависимоти от параметра `dataQueryFunction`
138
+ у блока. Например, при `DataQueryFunction.Sum` происходит суммирование числовых столбцов и
139
+ группировка по значением в столбцах других типов. При этом данные в виджет попадут в таком виде:
140
+
141
+ ```
142
+ ╔═══╤═══╤═══╗
143
+ ║ A │ C │ 3 ║
144
+ ╟───┼───┼───╢
145
+ ║ B │ C │ 7 ║
146
+ ╚═══╧═══╧═══╝
147
+ ```
148
+
149
+ <a name="widget"></a>
150
+
151
+ ## Код виджета
152
+
153
+ Рассмотрим виджет
154
+
155
+ ```ts
156
+ import { Declare, SingleData, Widget } from 'plmt-constructor-sdk';
157
+
158
+ @Declare()
159
+ export class Example extends Widget implements SingleData {
160
+ readonly data!: SingleData['data'];
161
+ readonly dataSettings!: SingleData['dataSettings'];
162
+
163
+ onChange(): void {
164
+ // ...
165
+
166
+ // ВАЖНО! Метод ready необходимо вызывать после каждого вызова onChange
167
+ this.ready();
168
+ }
169
+ }
170
+ ```
171
+
172
+ Чтобы класс стал виджетом, его необходимо декорировать `@Declare()`. Также, благодаря наследованию
173
+ от базового класса `Widget`, будут доступны для автокомплика методы (например, `onThemeChange`) и свойства (например, `lang`).
174
+
175
+ <a name="single-multy-data"></a>
176
+
177
+ ### SingleData и MultiData
178
+
179
+ При конфигурировании можно указать [как один, так и несколько](#data-settings) источников данных.
180
+ В зависимости от этого виджет будет реализовывать один из этих интерфейсов. Например, для нескольких датасетов, данные
181
+ для каждого из них будут доступны через `key`, указанный в конфигурации:
182
+
183
+ ```ts
184
+ import { Declare, MultiData, Widget } from 'plmt-constructor-sdk';
185
+
186
+ @Declare()
187
+ export class WidgetFilters extends Widget implements MultiData {
188
+ readonly data!: MultiData['data'];
189
+ readonly dataSettings!: MultiData['dataSettings'];
190
+
191
+ onChange(): void {
192
+ this.dataSettings['dataset-key'].dataset.name;
193
+ }
194
+ ```
195
+
196
+ <a name="life-cycle"></a>
197
+
198
+ ### Life cycle
199
+
200
+ Порядок срабатывания хуков виджета:
201
+
202
+ - `onThemeChange` при инициализации и при смене темы
203
+ - `onLangChange` при инициализации и при смене языка
204
+ - `onInit` при инициализации
205
+ - `onChange` при инициализации и при смене данных
206
+
207
+ <a name="css-var"></a>
208
+
209
+ ### CSS переменные
210
+
211
+ По умолчанию, css переменные не объявляются. Для их инициализации необходимо указать параметр
212
+ `provideCssVariables` у декоратора `Declare`:
213
+
214
+ ```ts
215
+ @Declare({
216
+ provideCssVariables: true,
217
+ })
218
+ ```
219
+
220
+ При этом будут объявлены все переменные, доступные для виджета через `this.theme`, но в kebab-case:
221
+
222
+ ```css
223
+ /* this.theme.text → --text */
224
+ color: var(--text);
225
+ /* this.theme.backgroundBright → --background-bright */
226
+ background: var(--background-bright);
227
+ ```
228
+
229
+ <a name="view-settings"></a>
230
+
231
+ ## Настройки виджета (установка параметров при создании)
232
+
233
+ При создании виджета, пользователь может установить параметры следующих типов:
234
+
235
+ - input
236
+ - checkbox
237
+ - radio
238
+ - select
239
+ - colorPicker
240
+ - title (заголовок блока настроек, используется для разделения параметров на блоки)
241
+
242
+ Эти параметры получаются динамически из вызова функции `createViewSettings` в файле `src/view-settings.ts`.
243
+ Рассмотрим пример. Здесь выводится текстовое поле, в которое можно ввести число от 1 до количества колонок
244
+ в блоке с ключом `blocke-key`:
245
+
246
+ ```ts
247
+ import { DataSettings } from 'plmt-constructor-sdk';
248
+ import {
249
+ CreateViewSettings,
250
+ input,
251
+ ViewSettingsValidation,
252
+ } from 'plmt-constructor-sdk/config';
253
+
254
+ let max = 0;
255
+
256
+ export const createViewSettings: CreateViewSettings<DataSettings> = ({
257
+ dataSettings,
258
+ }) => {
259
+ max = dataSettings.columnsByBlock['blocke-key'].length;
260
+
261
+ return [
262
+ input({
263
+ key: 'number-key',
264
+ label: {
265
+ ru: `Число от 1 до ${max}`,
266
+ en: `Range 1 to ${max}`,
267
+ },
268
+ }),
269
+ ];
270
+ };
271
+
272
+ export const validation: ViewSettingsValidation = {
273
+ ['number-key']: (value: any) => {
274
+ const number = parseInt(value);
275
+
276
+ if (isNaN(number))
277
+ return {
278
+ ru: 'Значение должно быть числом',
279
+ en: 'Not a number',
280
+ };
281
+
282
+ if (number < 1 || number > max)
283
+ return {
284
+ ru: `Значение должно быть в диапозоне от 1 до ${max}`,
285
+ en: `Not in range 1 до ${max}`,
286
+ };
287
+
288
+ return null;
289
+ },
290
+ };
291
+ ```
@@ -1,54 +1,60 @@
1
- import { Text, DataQueryMethod, DataQueryFunction } from '../config';
2
- import { ColumnType } from '../data';
3
- import { DatasetColumnType_Server } from './dataset';
4
- export declare enum ConfigDataBlockType_Server {
5
- Column = "column",
6
- Filter = "filter",
7
- Sort = "sort",
8
- Colorizer = "colorizer",
9
- Drilldown = "drilldown"
10
- }
11
- export interface Config_Server {
12
- label: Text;
13
- icon: string;
14
- data_options: ConfigDataOption_Server[];
15
- doc: {
16
- info: string;
17
- assets: string;
18
- images: string[];
19
- };
20
- sdk_version: string;
21
- type?: string;
22
- version: string;
23
- }
24
- export interface ConfigDataOption_Server {
25
- key: string;
26
- method: DataQueryMethod;
27
- label?: Text;
28
- min?: number;
29
- max?: number;
30
- validation?: {
31
- required_some?: string[];
32
- required_every?: string[];
33
- };
34
- blocks: ConfigDataOptionBlock_Server[];
35
- }
36
- export interface ConfigDataOptionBlock_Server {
37
- type: ConfigDataBlockType_Server;
38
- key: string;
39
- label: Text;
40
- icon?: string;
41
- data_type?: DatasetColumnType_Server;
42
- field_type?: ColumnType;
43
- max?: number;
44
- function?: DataQueryFunction;
45
- }
46
- export declare const configDataBlock_Server = "8316067a-d04b-4b21-bd4d-35529846617b";
47
- export declare const blockFilterKey = "34642664-dbd1-4e35-b0ea-2eaabe796b48";
48
- export declare const blockSortKey = "2c849ed6-6105-4aa2-a961-9f95135dfe3b";
49
- export declare const blockColorizeKey = "badd51f7-82ce-45b2-a67e-37d52df88c5c";
50
- export declare function decodeDrilldownData(source: string, additionalFilterSources: string[]): string;
51
- export declare function encodeDrilldownData(key: string): {
52
- source: string;
53
- additionalFilterSources: string[];
54
- };
1
+ import { Text, DataQueryMethod, DataQueryFunction } from '../config';
2
+ import { ColumnType } from '../data';
3
+ import { DatasetColumnType_Server } from './dataset';
4
+ export declare enum ConfigDataBlockType_Server {
5
+ Column = "column",
6
+ Filter = "filter",
7
+ Sort = "sort",
8
+ Colorizer = "colorizer",
9
+ Drilldown = "drilldown"
10
+ }
11
+ export interface Config_Server {
12
+ label: Text;
13
+ icon: string;
14
+ data_options: ConfigDataOption_Server[];
15
+ doc: {
16
+ info: string;
17
+ assets: string;
18
+ images: string[];
19
+ };
20
+ sdk_version: string;
21
+ type?: string;
22
+ repeatable?: true | {
23
+ min?: number;
24
+ max?: number;
25
+ };
26
+ version: string;
27
+ }
28
+ export interface ConfigDataOption_Server {
29
+ key: string;
30
+ method: DataQueryMethod;
31
+ label?: Text;
32
+ min?: number;
33
+ max?: number;
34
+ hideSort?: boolean;
35
+ hideCounter?: boolean;
36
+ validation?: {
37
+ required_some?: string[];
38
+ required_every?: string[];
39
+ };
40
+ blocks: ConfigDataOptionBlock_Server[];
41
+ }
42
+ export interface ConfigDataOptionBlock_Server {
43
+ type: ConfigDataBlockType_Server;
44
+ key: string;
45
+ label: Text;
46
+ icon?: string;
47
+ data_type?: DatasetColumnType_Server;
48
+ field_type?: ColumnType;
49
+ max?: number;
50
+ function?: DataQueryFunction;
51
+ }
52
+ export declare const configDataBlock_Server = "8316067a-d04b-4b21-bd4d-35529846617b";
53
+ export declare const blockFilterKey = "34642664-dbd1-4e35-b0ea-2eaabe796b48";
54
+ export declare const blockSortKey = "2c849ed6-6105-4aa2-a961-9f95135dfe3b";
55
+ export declare const blockColorizeKey = "badd51f7-82ce-45b2-a67e-37d52df88c5c";
56
+ export declare function decodeDrilldownData(source: string, additionalFilterSources: string[]): string;
57
+ export declare function encodeDrilldownData(key: string): {
58
+ source: string;
59
+ additionalFilterSources: string[];
60
+ };
@@ -1,46 +1,46 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.encodeDrilldownData = exports.decodeDrilldownData = exports.blockColorizeKey = exports.blockSortKey = exports.blockFilterKey = exports.configDataBlock_Server = exports.ConfigDataBlockType_Server = void 0;
4
- // enums
5
- var ConfigDataBlockType_Server;
6
- (function (ConfigDataBlockType_Server) {
7
- ConfigDataBlockType_Server["Column"] = "column";
8
- ConfigDataBlockType_Server["Filter"] = "filter";
9
- ConfigDataBlockType_Server["Sort"] = "sort";
10
- ConfigDataBlockType_Server["Colorizer"] = "colorizer";
11
- ConfigDataBlockType_Server["Drilldown"] = "drilldown";
12
- })(ConfigDataBlockType_Server = exports.ConfigDataBlockType_Server || (exports.ConfigDataBlockType_Server = {}));
13
- exports.configDataBlock_Server = '8316067a-d04b-4b21-bd4d-35529846617b';
14
- exports.blockFilterKey = '34642664-dbd1-4e35-b0ea-2eaabe796b48';
15
- exports.blockSortKey = '2c849ed6-6105-4aa2-a961-9f95135dfe3b';
16
- exports.blockColorizeKey = 'badd51f7-82ce-45b2-a67e-37d52df88c5c';
17
- function decodeDrilldownData(source, additionalFilterSources) {
18
- const keyParts = [length(source.length), source];
19
- additionalFilterSources.forEach((item) => keyParts.push(length(item.length), item));
20
- return keyParts.join('');
21
- function length(value) {
22
- if (value > 0xff)
23
- throw new RangeError();
24
- return value > 0xf
25
- ? `0x${value.toString(16)}`
26
- : `0x0${value.toString(16)}`;
27
- }
28
- }
29
- exports.decodeDrilldownData = decodeDrilldownData;
30
- function encodeDrilldownData(key) {
31
- const parts = [];
32
- parse();
33
- const [source, ...additionalFilterSources] = parts;
34
- return {
35
- source,
36
- additionalFilterSources,
37
- };
38
- function parse(offset = 0) {
39
- const start = offset + 4;
40
- const end = start + parseInt(key.slice(offset, start));
41
- parts.push(key.slice(start, end));
42
- if (end < key.length)
43
- parse(end);
44
- }
45
- }
46
- exports.encodeDrilldownData = encodeDrilldownData;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.encodeDrilldownData = exports.decodeDrilldownData = exports.blockColorizeKey = exports.blockSortKey = exports.blockFilterKey = exports.configDataBlock_Server = exports.ConfigDataBlockType_Server = void 0;
4
+ // enums
5
+ var ConfigDataBlockType_Server;
6
+ (function (ConfigDataBlockType_Server) {
7
+ ConfigDataBlockType_Server["Column"] = "column";
8
+ ConfigDataBlockType_Server["Filter"] = "filter";
9
+ ConfigDataBlockType_Server["Sort"] = "sort";
10
+ ConfigDataBlockType_Server["Colorizer"] = "colorizer";
11
+ ConfigDataBlockType_Server["Drilldown"] = "drilldown";
12
+ })(ConfigDataBlockType_Server = exports.ConfigDataBlockType_Server || (exports.ConfigDataBlockType_Server = {}));
13
+ exports.configDataBlock_Server = '8316067a-d04b-4b21-bd4d-35529846617b';
14
+ exports.blockFilterKey = '34642664-dbd1-4e35-b0ea-2eaabe796b48';
15
+ exports.blockSortKey = '2c849ed6-6105-4aa2-a961-9f95135dfe3b';
16
+ exports.blockColorizeKey = 'badd51f7-82ce-45b2-a67e-37d52df88c5c';
17
+ function decodeDrilldownData(source, additionalFilterSources) {
18
+ const keyParts = [length(source.length), source];
19
+ additionalFilterSources.forEach((item) => keyParts.push(length(item.length), item));
20
+ return keyParts.join('');
21
+ function length(value) {
22
+ if (value > 0xff)
23
+ throw new RangeError();
24
+ return value > 0xf
25
+ ? `0x${value.toString(16)}`
26
+ : `0x0${value.toString(16)}`;
27
+ }
28
+ }
29
+ exports.decodeDrilldownData = decodeDrilldownData;
30
+ function encodeDrilldownData(key) {
31
+ const parts = [];
32
+ parse();
33
+ const [source, ...additionalFilterSources] = parts;
34
+ return {
35
+ source,
36
+ additionalFilterSources,
37
+ };
38
+ function parse(offset = 0) {
39
+ const start = offset + 4;
40
+ const end = start + parseInt(key.slice(offset, start));
41
+ parts.push(key.slice(start, end));
42
+ if (end < key.length)
43
+ parse(end);
44
+ }
45
+ }
46
+ exports.encodeDrilldownData = encodeDrilldownData;
@@ -1,19 +1,19 @@
1
- import { ColumnType } from '../data';
2
- export { ColumnType as ColumnFieldType_Server } from '../data';
3
- export declare enum DatasetColumnType_Server {
4
- Dimension = "dimension",
5
- Fact = "fact",
6
- Any = "any"
7
- }
8
- export interface Dataset_Server {
9
- id: number;
10
- name: string;
11
- columns_id: Column_Server[];
12
- }
13
- export interface Column_Server {
14
- id: number;
15
- name: string;
16
- path: string;
17
- base_type: ColumnType;
18
- data_type?: DatasetColumnType_Server;
19
- }
1
+ import { ColumnType } from '../data';
2
+ export { ColumnType as ColumnFieldType_Server } from '../data';
3
+ export declare enum DatasetColumnType_Server {
4
+ Dimension = "dimension",
5
+ Fact = "fact",
6
+ Any = "any"
7
+ }
8
+ export interface Dataset_Server {
9
+ id: number;
10
+ name: string;
11
+ columns_id: Column_Server[];
12
+ }
13
+ export interface Column_Server {
14
+ id: number;
15
+ name: string;
16
+ path: string;
17
+ base_type: ColumnType;
18
+ data_type?: DatasetColumnType_Server;
19
+ }
@@ -1,12 +1,12 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DatasetColumnType_Server = exports.ColumnFieldType_Server = void 0;
4
- // enums
5
- var data_1 = require("../data");
6
- Object.defineProperty(exports, "ColumnFieldType_Server", { enumerable: true, get: function () { return data_1.ColumnType; } });
7
- var DatasetColumnType_Server;
8
- (function (DatasetColumnType_Server) {
9
- DatasetColumnType_Server["Dimension"] = "dimension";
10
- DatasetColumnType_Server["Fact"] = "fact";
11
- DatasetColumnType_Server["Any"] = "any";
12
- })(DatasetColumnType_Server = exports.DatasetColumnType_Server || (exports.DatasetColumnType_Server = {}));
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DatasetColumnType_Server = exports.ColumnFieldType_Server = void 0;
4
+ // enums
5
+ var data_1 = require("../data");
6
+ Object.defineProperty(exports, "ColumnFieldType_Server", { enumerable: true, get: function () { return data_1.ColumnType; } });
7
+ var DatasetColumnType_Server;
8
+ (function (DatasetColumnType_Server) {
9
+ DatasetColumnType_Server["Dimension"] = "dimension";
10
+ DatasetColumnType_Server["Fact"] = "fact";
11
+ DatasetColumnType_Server["Any"] = "any";
12
+ })(DatasetColumnType_Server = exports.DatasetColumnType_Server || (exports.DatasetColumnType_Server = {}));
@@ -1,13 +1,13 @@
1
- import { Theme } from '../theme';
2
- export interface ThemeProvide {
3
- theme: Theme;
4
- themeKey: string;
5
- themeProjectKey: string;
6
- }
7
- export declare type ThemeKey = keyof Pick<Theme, 'background' | 'backgroundBright' | 'backgroundTint' | 'text' | 'textTint'>;
8
- export declare type ThemeProjectKey = keyof Pick<Theme, 'colors'>;
9
- export declare const themeKeys: ThemeKey[];
10
- export declare const themeProjectKeys: ThemeProjectKey[];
11
- export declare function provideCssVariables({ theme, themeKey, themeProjectKey, }: ThemeProvide): void;
12
- export declare function colorizeClassName(i: number, j: number): string;
13
- export declare function createColorizeColors(source: string[]): string[][];
1
+ import { Theme } from '../theme';
2
+ export interface ThemeProvide {
3
+ theme: Theme;
4
+ themeKey: string;
5
+ themeProjectKey: string;
6
+ }
7
+ export declare type ThemeKey = keyof Pick<Theme, 'background' | 'backgroundBright' | 'backgroundTint' | 'text' | 'textTint'>;
8
+ export declare type ThemeProjectKey = keyof Pick<Theme, 'colors'>;
9
+ export declare const themeKeys: ThemeKey[];
10
+ export declare const themeProjectKeys: ThemeProjectKey[];
11
+ export declare function provideCssVariables({ theme, themeKey, themeProjectKey, }: ThemeProvide): void;
12
+ export declare function colorizeClassName(i: number, j: number): string;
13
+ export declare function createColorizeColors(source: string[]): string[][];