complexqa_frontend_core 1.1.1 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "complexqa_frontend_core",
3
- "version": "1.1.1",
3
+ "version": "1.3.1",
4
4
  "description": "core of web ",
5
5
  "type": "module",
6
6
  "exports": {
@@ -4,6 +4,7 @@ import { ServiceApi } from "./service_api";
4
4
  import { TestCaseApi } from "./test_case_api";
5
5
  import { TestSuiteApi } from "./test_suite_api";
6
6
  import { TestCaseStepApi } from "./test_case_step_api.js";
7
+ import { TeamManagementApi } from "./team_management_api.js";
7
8
 
8
9
  /**
9
10
  * Обертка над axios
@@ -106,11 +107,12 @@ export class Api
106
107
 
107
108
  //echo({payload});
108
109
 
109
- this.test_plan = new TestPlanApi(payload);
110
- this.project = new ProjectApi(payload);
111
- this.service = new ServiceApi(payload);
112
- this.test_case = new TestCaseApi(payload);
113
- this.test_case_step = new TestCaseStepApi(payload);
114
- this.test_suite = new TestSuiteApi(payload);
110
+ this.test_plan = new TestPlanApi(payload);
111
+ this.project = new ProjectApi(payload);
112
+ this.service = new ServiceApi(payload);
113
+ this.test_case = new TestCaseApi(payload);
114
+ this.test_case_step = new TestCaseStepApi(payload);
115
+ this.test_suite = new TestSuiteApi(payload);
116
+ this.team_management = new TeamManagementApi(payload);
115
117
  }
116
118
  }
@@ -0,0 +1,18 @@
1
+ import { ApiAbstractElementClass } from "./api_abstract_element_class";
2
+ import { typeTeam } from "../types/family_elements/typeTeam.js";
3
+
4
+
5
+ /**
6
+ *
7
+ * @version v.0.1 (27/07/2025)
8
+ */
9
+ export class TeamManagementApi extends ApiAbstractElementClass
10
+ {
11
+ module_prefix = 'team_management';
12
+
13
+ constructor(options)
14
+ {
15
+ super(options);
16
+ this.set_element_class_instance(typeTeam);
17
+ }
18
+ }
@@ -0,0 +1,267 @@
1
+ export const LOCALE_AG_GRID_RU = {
2
+ // Выбор фильтра
3
+ selectAll: '(Выделить все)',
4
+ selectAllSearchResults: '(Выделить все результаты поиска)',
5
+ searchOoo: 'Поиск...',
6
+ blanks: '(Пусто)',
7
+ noMatches: 'Нет совпадений',
8
+
9
+ // Числовой фильтр & текстовый фильтр
10
+ filterOoo: 'Фильтрация...',
11
+ equals: 'Равно',
12
+ notEqual: 'Не равно',
13
+ empty: 'Выберите один',
14
+
15
+ // Числовой фильтр
16
+ lessThan: 'Меньше, чем',
17
+ greaterThan: 'Больше, чем',
18
+ lessThanOrEqual: 'Меньше или равно',
19
+ greaterThanOrEqual: 'Больше или равно',
20
+ inRange: 'В промежутке',
21
+ inRangeStart: 'от',
22
+ inRangeEnd: 'до',
23
+
24
+ // Текстовый фильтр
25
+ contains: 'Содержит',
26
+ notContains: 'Не содержит',
27
+ startsWith: 'Начинается с',
28
+ endsWith: 'Кончается на',
29
+
30
+ // Фильтр даты
31
+ dateFormatOoo: 'dd-mm-yyyy',
32
+
33
+ // Условия фильтрации
34
+ andCondition: 'И',
35
+ orCondition: 'ИЛИ',
36
+
37
+ // Кнопки фильтра
38
+ applyFilter: 'Применить',
39
+ resetFilter: 'Сбросить',
40
+ clearFilter: 'Очистить',
41
+ cancelFilter: 'Отменить',
42
+
43
+ // Заголовки фильтра
44
+ textFilter: 'Текстовый фильтр',
45
+ numberFilter: 'Числовой фильтр',
46
+ dateFilter: 'Фильтр по дате',
47
+ setFilter: 'Выбрать фильтр',
48
+
49
+ // Боковая панель
50
+ columns: 'Столбцы',
51
+ filters: 'Фильтры',
52
+
53
+ // Панель инструментов столбцов
54
+ pivotMode: 'Режим сводной таблицы',
55
+ groups: 'Группы строк',
56
+ rowGroupColumnsEmptyMessage: 'Перетащите сюда для группировки по строкам',
57
+ values: 'Значения',
58
+ valueColumnsEmptyMessage: 'Перетащите сюда для агрегации',
59
+ pivots: 'Заголовки столбцов',
60
+ pivotColumnsEmptyMessage: 'Перетащите сюда для задания заголовков столбцам',
61
+
62
+ // Заголовок группы столбцов по умолчанию
63
+ group: 'Группа',
64
+
65
+ // Другое
66
+ loadingOoo: 'Загрузка...',
67
+ noRowsToShow: 'Нет данных',
68
+ enabled: 'Включено',
69
+
70
+ // Меню
71
+ pinColumn: 'Закрепить столбец',
72
+ pinLeft: 'Закрепить слева',
73
+ pinRight: 'Закрепить справа',
74
+ noPin: 'Не закреплять',
75
+ valueAggregation: 'Агрегация по значению',
76
+ autosizeThiscolumn: 'Автоматически задавать размер этого столбца',
77
+ autosizeAllColumns: 'Автоматически задавать размер всем столбцам',
78
+ groupBy: 'Группировать по',
79
+ ungroupBy: 'Разгруппировать по',
80
+ resetColumns: 'Сбросить столбцы',
81
+ expandAll: 'Развернуть все',
82
+ collapseAll: 'Свернуть все',
83
+ copy: 'Копировать',
84
+ ctrlC: 'Ctrl+C',
85
+ copyWithHeaders: 'Копировать с заголовками',
86
+ paste: 'Вставить',
87
+ ctrlV: 'Ctrl+V',
88
+ export: 'Экспорт',
89
+ csvExport: 'Экспорт в CSV (.csv)',
90
+ excelExport: 'Экспорт в Excel (.xlsx)',
91
+ excelXmlExport: 'Экспорт в XML (.xml)',
92
+
93
+ // Агрегирование корпоративного меню и строки состояния
94
+ sum: 'Сумма',
95
+ min: 'Минимум',
96
+ max: 'Максимум',
97
+ none: 'Пусто',
98
+ count: 'Количество',
99
+ avg: 'Среднее значение',
100
+ filteredRows: 'Отфильтровано',
101
+ selectedRows: 'Выбрано',
102
+ totalRows: 'Всего строк',
103
+ totalAndFilteredRows: 'Строки',
104
+ more: 'многих',
105
+ to: 'из',
106
+ of: 'по',
107
+ page: 'Страница',
108
+ nextPage: 'Следующая страница',
109
+ lastPage: 'Последняя страница',
110
+ firstPage: 'Первая страница',
111
+ previousPage: 'Предыдущая страница',
112
+
113
+ // Корпоративное меню (графики)
114
+ pivotChartAndPivotMode: 'Сводная диаграмма & режим сведения',
115
+ pivotChart: 'Сводная диаграмма',
116
+ chartRange: 'Диапазон диаграммы',
117
+
118
+ columnChart: 'Столбиковая диаграмма',
119
+ groupedColumn: 'Сгруппированная',
120
+ stackedColumn: 'Сложенная',
121
+ normalizedColumn: '100% Сложенная',
122
+
123
+ barChart: 'Панель',
124
+ groupedBar: 'Сгруппированная',
125
+ stackedBar: 'Сложенная',
126
+ normalizedBar: '100% Сложенная',
127
+
128
+ pieChart: 'Круговая диаграмма',
129
+ pie: 'Круговая диаграмма',
130
+ doughnut: 'Кольцевая диаграмма',
131
+
132
+ line: 'Линия',
133
+
134
+ xyChart: 'X Y (Разброс)',
135
+ scatter: 'Диаграмма рассеяния',
136
+ bubble: 'Пузырьковая диаграмма',
137
+
138
+ areaChart: 'Область',
139
+ area: 'Диаграмма с областями',
140
+ stackedArea: 'Сложенная',
141
+ normalizedArea: '100% Сложенная',
142
+
143
+ histogramChart: 'Гистограмма',
144
+
145
+ // Графики
146
+ pivotChartTitle: 'Сводная диаграмма',
147
+ rangeChartTitle: 'График диапазона',
148
+ settings: 'Настройки',
149
+ data: 'Данные',
150
+ format: 'Формат',
151
+ categories: 'Категории',
152
+ defaultCategory: '(Пусто)',
153
+ series: 'Серии',
154
+ xyValues: 'X Y Значения',
155
+ paired: 'Парный режим',
156
+ axis: 'Ось',
157
+ navigator: 'Навигация',
158
+ color: 'Цвет',
159
+ thickness: 'Толщина',
160
+ xType: 'X Тип',
161
+ automatic: 'Автоматически',
162
+ category: 'Категория',
163
+ number: 'Число',
164
+ time: 'Время',
165
+ xRotation: 'X Поворот',
166
+ yRotation: 'Y Поворот',
167
+ ticks: 'Отметки',
168
+ width: 'Ширина',
169
+ height: 'Высота',
170
+ length: 'Длина',
171
+ padding: 'Внутренний отступ',
172
+ spacing: 'Отступ',
173
+ chart: 'Диаграмма',
174
+ title: 'Заголовок',
175
+ titlePlaceholder: 'Заголовок диаграммы - двойной щелчок для редактирования',
176
+ background: 'Фон',
177
+ font: 'Шрифт',
178
+ top: 'Верх',
179
+ right: 'Право',
180
+ bottom: 'Низ',
181
+ left: 'Лево',
182
+ labels: 'Метки',
183
+ size: 'Размер',
184
+ minSize: 'Минимальный размер',
185
+ maxSize: 'Максимальный размер',
186
+ legend: 'Легенда',
187
+ position: 'Позиция',
188
+ markerSize: 'Размер маркера',
189
+ markerStroke: 'Обводка маркера',
190
+ markerPadding: 'Внутренний отступ маркера',
191
+ itemSpacing: 'Расстояние между предметами',
192
+ itemPaddingX: 'Внутренний отступ предмета по X',
193
+ itemPaddingY: 'Внутренний отступ предмета по Y',
194
+ layoutHorizontalSpacing: 'Горизонтальный отступ',
195
+ layoutVerticalSpacing: 'Вертикальный отступ',
196
+ strokeWidth: 'Ширина обводки',
197
+ offset: 'Смещение',
198
+ offsets: 'Смещения',
199
+ tooltips: 'Всплывающие подсказки',
200
+ callout: 'Вызов',
201
+ markers: 'Маркеры',
202
+ shadow: 'Тень',
203
+ blur: 'Размытие',
204
+ xOffset: 'Смещение по X',
205
+ yOffset: 'Смещение по Y',
206
+ lineWidth: 'Ширина линии',
207
+ normal: 'Нормальный',
208
+ bold: 'Жирный',
209
+ italic: 'Наклоненный',
210
+ boldItalic: 'Жирный наклоненный',
211
+ predefined: 'Предопределенный',
212
+ fillOpacity: 'Непрозрачность заливки',
213
+ strokeOpacity: 'Непрозрачность линии',
214
+ histogramBinCount: 'Количество сегментов',
215
+ columnGroup: 'Столбец',
216
+ barGroup: 'Панель',
217
+ pieGroup: 'Круговая',
218
+ lineGroup: 'Линейная',
219
+ scatterGroup: 'X Y (Разброс)',
220
+ areaGroup: 'Зональная',
221
+ histogramGroup: 'Гистограмма',
222
+ groupedColumnTooltip: 'Сгруппированная',
223
+ stackedColumnTooltip: 'Сложенная',
224
+ normalizedColumnTooltip: '100% Сложенная',
225
+ groupedBarTooltip: 'Сгруппированная',
226
+ stackedBarTooltip: 'Сложенная',
227
+ normalizedBarTooltip: '100% Сложенная',
228
+ pieTooltip: 'Круговая',
229
+ doughnutTooltip: 'Кольцевая',
230
+ lineTooltip: 'Линейная',
231
+ groupedAreaTooltip: 'Зональная',
232
+ stackedAreaTooltip: 'Сложенная',
233
+ normalizedAreaTooltip: '100% Сложенная',
234
+ scatterTooltip: 'Рассеяния',
235
+ bubbleTooltip: 'Пузырьковая',
236
+ histogramTooltip: 'Гистограмма',
237
+ noDataToChart: 'Нет данных для представления в виде диаграммы.',
238
+ pivotChartRequiresPivotMode: 'Для сводной диаграммы необходимо включить режим сводной диаграммы.',
239
+ chartSettingsToolbarTooltip: 'Меню',
240
+ chartLinkToolbarTooltip: 'Связать с сеткой',
241
+ chartUnlinkToolbarTooltip: 'Не связывать с сеткой',
242
+ chartDownloadToolbarTooltip: 'Загрузить диаграмму',
243
+
244
+ // ARIA
245
+ ariaHidden: 'скрытый',
246
+ ariaVisible: 'видимый',
247
+ ariaChecked: 'проверенный',
248
+ ariaUnchecked: 'непроверенный',
249
+ ariaIndeterminate: 'неопределенный',
250
+ ariaColumnSelectAll: 'Переключить на выделение всех столбцов',
251
+ ariaInputEditor: 'Редактор ввода',
252
+ ariaDateFilterInput: 'Ввод фильтра даты',
253
+ ariaFilterInput: 'Ввод фильтра',
254
+ ariaFilterColumnsInput: 'Ввод фильтра столбцов',
255
+ ariaFilterValue: 'Значение фильтра',
256
+ ariaFilterFromValue: 'Фильтровать от значения',
257
+ ariaFilterToValue: 'Фильтровать до значения',
258
+ ariaFilteringOperator: 'Оператор фильтрации',
259
+ ariaColumnToggleVisibility: 'переключить видимость столбца',
260
+ ariaColumnGroupToggleVisibility: 'переключить видимость группы столбцов',
261
+ ariaRowSelect: 'Нажмите ПРОБЕЛ для выделения данной строки',
262
+ ariaRowDeselect: 'Нажмите ПРОБЕЛ для снятия выделения данной строки',
263
+ ariaRowToggleSelection: 'Нажмите ПРОБЕЛ, чтобы переключить выделение строки',
264
+ ariaRowSelectAll: 'Нажмите ПРОБЕЛ, чтобы переключить выделение всех строк',
265
+ ariaSearch: 'Поиск',
266
+ ariaSearchFilterValues: 'Поиск значений по фильтру',
267
+ }
@@ -0,0 +1,124 @@
1
+ import { LOCALE_AG_GRID_RU } from "./locale_table_ru.js";
2
+ import { LOCALE_AG_GRID_EG } from "./table_locale_ar.js";
3
+ import { typeTestCase } from "../types/family_elements/typeTestCase.js";
4
+ import { typeProject } from "../types/family_elements/typeProject.js";
5
+
6
+ /**
7
+ *
8
+ * @version v.0.1 (17/08/2025)
9
+ */
10
+ export class TableBaseConfig
11
+ {
12
+
13
+
14
+ /**
15
+ *
16
+ * @version v.0.1 (17/08/2025)
17
+ * @param {string} element_type
18
+ * @param {string} section
19
+ * @param {string} lang
20
+ *
21
+ * @todo - header_name модифицируем под локаль
22
+ */
23
+ static get_config(element_type, section, lang)
24
+ {
25
+ let response = this.config;
26
+
27
+ response.getRowNodeId = this.#getRowNodeId(element_type);
28
+
29
+ if (lang !== 'en')
30
+ {
31
+ response.localeText = TableBaseConfig.#localeText(lang);
32
+ }
33
+
34
+ return response;
35
+ }
36
+
37
+
38
+ /**
39
+ *
40
+ * @param lang
41
+ * @returns {{}}
42
+ */
43
+ static #localeText(lang)
44
+ {
45
+ let response = {};
46
+ switch (lang)
47
+ {
48
+ case 'ru':
49
+ response = LOCALE_AG_GRID_RU
50
+ break;
51
+ case 'ar':
52
+ response = LOCALE_AG_GRID_EG
53
+ break;
54
+ }
55
+
56
+ return response;
57
+ }
58
+
59
+
60
+ /**
61
+ *
62
+ * @version v.0.1 (17/08/2025)
63
+ * @param element_type
64
+ * @returns {function(*): number}
65
+ *
66
+ */
67
+ static #getRowNodeId(element_type)
68
+ {
69
+ return function (data)
70
+ {
71
+ let id = 0;
72
+ let model = false;
73
+
74
+ switch (element_type)
75
+ {
76
+ case 'test_case':
77
+ model = new typeTestCase();
78
+ break;
79
+ case 'project':
80
+ model = new typeProject();
81
+ break;
82
+ }
83
+
84
+ if (model)
85
+ {
86
+ let key = model.get_primary_key();
87
+ if (data?.[key])
88
+ {
89
+ id= data?.[key];
90
+ }
91
+ }
92
+
93
+ return id;
94
+ }
95
+ }
96
+
97
+
98
+ /**
99
+ *
100
+ * @version v.0.1 (17/08/2025)
101
+ */
102
+ static config = {
103
+ defaultColDef: {
104
+ filter : true,
105
+ sortable : true,
106
+ resizable: true,
107
+ editable : false,
108
+ },
109
+ suppressMenuHide : true,
110
+ columnHoverHighlight : false,
111
+ enableBrowserTooltips : false,
112
+ rowSelection : 'multiple',
113
+ rowMultiSelectWithClick : false,
114
+ suppressRowClickSelection: true,
115
+ enableRangeSelection : true,
116
+ headerHeight: '44',
117
+ rowHeight : '44',
118
+ groupIncludeFooter : false,
119
+ groupIncludeTotalFooter: false,
120
+ overlayLoadingTemplate : '<span class="ag-overlay-loading-center">wait</span>',
121
+ overlayNoRowsTemplate : '<span class="ag-overlay-loading-center">no data</span>',
122
+ suppressNoRowsOverlay : false,
123
+ };
124
+ }
@@ -0,0 +1,196 @@
1
+ import { typeTableConfiguration } from "../types/family_service/typeTableConfiguration.js";
2
+ import { typeTableColumn } from "../types/family_service/typeTableColumn.js";
3
+
4
+ /**
5
+ *
6
+ * @version v.0.1 (17/08/2025)
7
+ */
8
+ export class TableConfiguration
9
+ {
10
+
11
+ static init_options = false;
12
+
13
+ static config = {};
14
+
15
+ static state = {
16
+ loaded: false
17
+ }
18
+
19
+ /**
20
+ *
21
+ * @param init_options
22
+ */
23
+ constructor(init_options = false)
24
+ {
25
+ if (this.constructor._instance)
26
+ {
27
+ return this.constructor._instance;
28
+ }
29
+
30
+ this.init_options = init_options;
31
+
32
+ this.constructor._instance = this;
33
+
34
+ this.#bootstrap();
35
+ }
36
+
37
+
38
+ /**
39
+ *
40
+ * @version v.0.1 (17/08/2025)
41
+ * @param {string} element_type
42
+ * @param {string} section
43
+ * @param {string} lang
44
+ *
45
+ * @todo - header_name модифицируем под локаль
46
+ */
47
+ static get_config(element_type, section, lang)
48
+ {
49
+ if (!this.state.loaded)
50
+ {
51
+ this.#bootstrap();
52
+ }
53
+
54
+ if (this.config?.[ element_type ]?.[ section ])
55
+ {
56
+ return this.config?.[ element_type ]?.[ section ];
57
+ }
58
+ else
59
+ {
60
+ return false;
61
+ }
62
+ }
63
+
64
+
65
+ /****************************************************************************************/
66
+ /****************************************************************************************/
67
+
68
+ /****************************************************************************************/
69
+
70
+
71
+ /**
72
+ * Не понятно пока как лучше организовать
73
+ * @version v.0.1 (17/08/2025)
74
+ */
75
+ static #bootstrap()
76
+ {
77
+ if (this.state.loaded)
78
+ {
79
+ return;
80
+ }
81
+
82
+ this.#bootstrap_test_case();
83
+
84
+ this.state.loaded = true;
85
+ }
86
+
87
+
88
+ /**
89
+ *
90
+ * @version v.0.1 (17/08/2025)
91
+ */
92
+ static #bootstrap_test_case()
93
+ {
94
+ let payload_listing = {};
95
+
96
+ let columns = this.#bootstrap_test_case_columns();
97
+
98
+ payload_listing.config = new typeTableConfiguration({
99
+ columns: columns
100
+ });
101
+
102
+ this.config.test_case = {
103
+ listing: payload_listing
104
+ }
105
+ }
106
+
107
+
108
+ /**
109
+ *
110
+ * @version v.0.1 (17/08/2025)
111
+ */
112
+ static #bootstrap_test_case_columns()
113
+ {
114
+ let response = [];
115
+
116
+ response.push(new typeTableColumn({
117
+ header_name : 'ID',
118
+ field : 'test_case_id',
119
+ width : '120',
120
+ sort_order : '1',
121
+ cell_classes: 'bg-secondary',
122
+ default_sort: 'asc',
123
+ is_sortable : true,
124
+ is_filter : true,
125
+ is_hide : true,
126
+ is_editable : false,
127
+ }));
128
+
129
+ response.push(new typeTableColumn({
130
+ header_name : 'Name',
131
+ field : 'test_case_title',
132
+ width : '480',
133
+ sort_order : '1',
134
+ cell_classes: '',
135
+ default_sort: '',
136
+ is_sortable : true,
137
+ is_filter : true,
138
+ is_hide : false,
139
+ is_editable : true,
140
+ }));
141
+
142
+ response.push(new typeTableColumn({
143
+ header_name : 'Time',
144
+ field : 'test_case_time_to_execute',
145
+ width : '120',
146
+ sort_order : '2',
147
+ cell_classes: '',
148
+ default_sort: '',
149
+ is_sortable : true,
150
+ is_filter : true,
151
+ is_hide : false,
152
+ is_editable : true,
153
+ }));
154
+
155
+ response.push(new typeTableColumn({
156
+ header_name : 'Complexity',
157
+ field : 'test_case_complexity',
158
+ width : '120',
159
+ sort_order : '2',
160
+ cell_classes: '',
161
+ default_sort: '',
162
+ is_sortable : true,
163
+ is_filter : true,
164
+ is_hide : false,
165
+ is_editable : true,
166
+ }));
167
+
168
+ response.push(new typeTableColumn({
169
+ header_name : 'Importance',
170
+ field : 'test_case_importance',
171
+ width : '120',
172
+ sort_order : '2',
173
+ cell_classes: '',
174
+ default_sort: '',
175
+ is_sortable : true,
176
+ is_filter : true,
177
+ is_hide : false,
178
+ is_editable : true,
179
+ }));
180
+
181
+ response.push(new typeTableColumn({
182
+ header_name : 'updated at',
183
+ field : 'updated_at',
184
+ width : '120',
185
+ sort_order : '2',
186
+ cell_classes: 'bg-secondary',
187
+ default_sort: '',
188
+ is_sortable : true,
189
+ is_filter : true,
190
+ is_hide : true,
191
+ is_editable : false,
192
+ }));
193
+
194
+ return response;
195
+ }
196
+ }