complexqa_frontend_core 1.2.1 → 1.3.2
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 +1 -1
- package/publish/api/api_abstract_element_class.js +7 -3
- package/publish/app_configuration/abstract_app_configuration.js +33 -0
- package/publish/app_configuration/locale_table_ru.js +267 -0
- package/publish/app_configuration/menu_configuration_main.js +119 -0
- package/publish/app_configuration/menu_configuration_secondary.js +140 -0
- package/publish/app_configuration/table_base_config.js +124 -0
- package/publish/app_configuration/table_configuration.js +195 -0
- package/publish/app_configuration/table_locale_ar.js +676 -0
- package/publish/services/serviceTranslate.js +1 -0
- package/publish/types/family_service/typeMenuElement.js +32 -0
package/package.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { clone_object, echo, is_array } from "../utils/utils";
|
|
1
|
+
import { clone_object, echo, is_array, is_object } from "../utils/utils";
|
|
2
2
|
import axios from "axios";
|
|
3
3
|
import * as qs from "query-string";
|
|
4
4
|
import { ApiException } from "../exceptions/ApiException";
|
|
@@ -379,15 +379,19 @@ export class ApiAbstractElementClass
|
|
|
379
379
|
|
|
380
380
|
if (( api_code >= 200 ) && ( api_code <= 299 ))
|
|
381
381
|
{
|
|
382
|
-
if (is_array(api_response?.data) && this.element_class_instance)
|
|
382
|
+
if (is_array(api_response?.data?.api_result) && this.element_class_instance)
|
|
383
383
|
{
|
|
384
|
-
let result = api_response?.data.map((row) =>
|
|
384
|
+
let result = api_response?.data.api_result.map((row) =>
|
|
385
385
|
{
|
|
386
386
|
return new this.element_class_instance(row);
|
|
387
387
|
});
|
|
388
388
|
|
|
389
389
|
return result;
|
|
390
390
|
}
|
|
391
|
+
else if (is_object(api_response?.data?.api_result))
|
|
392
|
+
{
|
|
393
|
+
return api_response?.data?.api_result;
|
|
394
|
+
}
|
|
391
395
|
else
|
|
392
396
|
{
|
|
393
397
|
return api_response?.data;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* @version v.0.1 (19/08/2025)
|
|
4
|
+
*/
|
|
5
|
+
export class abstractAppConfiguration
|
|
6
|
+
{
|
|
7
|
+
static init_options = false;
|
|
8
|
+
|
|
9
|
+
static config = {};
|
|
10
|
+
|
|
11
|
+
static state = {
|
|
12
|
+
loaded: false
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
*
|
|
18
|
+
* @version v.0.1 (19/08/2025)
|
|
19
|
+
* @param init_options - надо ли?
|
|
20
|
+
*/
|
|
21
|
+
constructor(init_options = false)
|
|
22
|
+
{}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
*
|
|
26
|
+
* @version v.0.1 (19/08/2025)
|
|
27
|
+
* @param element_type
|
|
28
|
+
* @param section
|
|
29
|
+
* @param lang ???
|
|
30
|
+
*/
|
|
31
|
+
static get_config(element_type = false, section = false, lang = false)
|
|
32
|
+
{}
|
|
33
|
+
}
|
|
@@ -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,119 @@
|
|
|
1
|
+
import { abstractAppConfiguration } from "./abstract_app_configuration.js";
|
|
2
|
+
import { typeMenuElement } from "../types/family_service/typeMenuElement.js";
|
|
3
|
+
import { UserService } from "../services/UserService.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Основное меню (верхнее)
|
|
7
|
+
*
|
|
8
|
+
* @version v.0.1 (19/08/2025)
|
|
9
|
+
*/
|
|
10
|
+
export class MenuConfigurationMain extends abstractAppConfiguration
|
|
11
|
+
{
|
|
12
|
+
static config = {};
|
|
13
|
+
|
|
14
|
+
static state = {
|
|
15
|
+
loaded: false
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
*
|
|
21
|
+
* @param init_options
|
|
22
|
+
*/
|
|
23
|
+
constructor(init_options = false)
|
|
24
|
+
{
|
|
25
|
+
super();
|
|
26
|
+
if (this.constructor._instance)
|
|
27
|
+
{
|
|
28
|
+
return this.constructor._instance;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
this.init_options = init_options;
|
|
32
|
+
|
|
33
|
+
this.constructor._instance = this;
|
|
34
|
+
|
|
35
|
+
MenuConfigurationMain.bootstrap();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Не понятно пока как лучше организовать
|
|
41
|
+
* @version v.0.1 (17/08/2025)
|
|
42
|
+
*/
|
|
43
|
+
static bootstrap()
|
|
44
|
+
{
|
|
45
|
+
if (this.state.loaded)
|
|
46
|
+
{
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
this.bootstrap_menu();
|
|
51
|
+
|
|
52
|
+
this.state.loaded = true;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
static bootstrap_menu()
|
|
56
|
+
{
|
|
57
|
+
this.config.menu_elements = this.bootstrap_menu_elements();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
*
|
|
63
|
+
* @returns {boolean|*}
|
|
64
|
+
*/
|
|
65
|
+
static get_config()
|
|
66
|
+
{
|
|
67
|
+
if (!this.state.loaded)
|
|
68
|
+
{
|
|
69
|
+
this.bootstrap();
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return this.config;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
*
|
|
78
|
+
* @version v.0.1 (19/08/2025)
|
|
79
|
+
* @returns {[typeMenuElement]}
|
|
80
|
+
*/
|
|
81
|
+
static bootstrap_menu_elements()
|
|
82
|
+
{
|
|
83
|
+
let locale = UserService.get_current_language();
|
|
84
|
+
|
|
85
|
+
// @todo - use serviceTranslate
|
|
86
|
+
|
|
87
|
+
let response = [];
|
|
88
|
+
|
|
89
|
+
response.push(new typeMenuElement({
|
|
90
|
+
link : `/web/${ locale }/project/listing`,
|
|
91
|
+
text : 'Projects',
|
|
92
|
+
icon : '?',
|
|
93
|
+
sort_order: 1,
|
|
94
|
+
}));
|
|
95
|
+
|
|
96
|
+
response.push(new typeMenuElement({
|
|
97
|
+
link : `/web/${ locale }/test_case/listing`,
|
|
98
|
+
text : 'Test Cases',
|
|
99
|
+
icon : '?',
|
|
100
|
+
sort_order: 2,
|
|
101
|
+
}));
|
|
102
|
+
|
|
103
|
+
response.push(new typeMenuElement({
|
|
104
|
+
link : `/web/${ locale }/test_run/listing`,
|
|
105
|
+
text : 'Test Runs',
|
|
106
|
+
icon : '?',
|
|
107
|
+
sort_order: 3,
|
|
108
|
+
}));
|
|
109
|
+
|
|
110
|
+
/*response.push(new typeMenuElement({
|
|
111
|
+
link : `/web/${ locale }/task/listing`,
|
|
112
|
+
text : 'To Do',
|
|
113
|
+
icon : '?',
|
|
114
|
+
sort_order: 4,
|
|
115
|
+
}));*/
|
|
116
|
+
|
|
117
|
+
return response;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { abstractAppConfiguration } from "./abstract_app_configuration.js";
|
|
2
|
+
import { UserService } from "../services/UserService.js";
|
|
3
|
+
import { typeMenuElement } from "../types/family_service/typeMenuElement.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Дополнительное меню (нижнее)
|
|
7
|
+
*
|
|
8
|
+
* @version v.0.1 (19/08/2025)
|
|
9
|
+
*/
|
|
10
|
+
export class MenuConfigurationSecondary extends abstractAppConfiguration
|
|
11
|
+
{
|
|
12
|
+
static config = {};
|
|
13
|
+
|
|
14
|
+
static state = {
|
|
15
|
+
loaded: false
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
*
|
|
22
|
+
* @param init_options
|
|
23
|
+
*/
|
|
24
|
+
constructor(init_options = false)
|
|
25
|
+
{
|
|
26
|
+
super();
|
|
27
|
+
if (this.constructor._instance)
|
|
28
|
+
{
|
|
29
|
+
return this.constructor._instance;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
this.init_options = init_options;
|
|
33
|
+
|
|
34
|
+
this.constructor._instance = this;
|
|
35
|
+
|
|
36
|
+
MenuConfigurationSecondary.bootstrap();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Не понятно пока как лучше организовать
|
|
44
|
+
* @version v.0.1 (17/08/2025)
|
|
45
|
+
*/
|
|
46
|
+
static bootstrap()
|
|
47
|
+
{
|
|
48
|
+
if (this.state.loaded)
|
|
49
|
+
{
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
this.bootstrap_menu();
|
|
54
|
+
|
|
55
|
+
this.state.loaded = true;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
static bootstrap_menu()
|
|
59
|
+
{
|
|
60
|
+
this.config.menu_elements = this.bootstrap_menu_elements();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
*
|
|
66
|
+
* @returns {boolean|*}
|
|
67
|
+
*/
|
|
68
|
+
static get_config()
|
|
69
|
+
{
|
|
70
|
+
if (!this.state.loaded)
|
|
71
|
+
{
|
|
72
|
+
this.bootstrap();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return this.config;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
*
|
|
81
|
+
* @version v.0.1 (19/08/2025)
|
|
82
|
+
* @returns {[typeMenuElement]}
|
|
83
|
+
*/
|
|
84
|
+
static bootstrap_menu_elements()
|
|
85
|
+
{
|
|
86
|
+
let locale = UserService.get_current_language();
|
|
87
|
+
|
|
88
|
+
// @todo - use serviceTranslate
|
|
89
|
+
|
|
90
|
+
let response = [];
|
|
91
|
+
|
|
92
|
+
response.push(new typeMenuElement({
|
|
93
|
+
link : `/web/${ locale }/user_profile`,
|
|
94
|
+
text : 'User Settings',
|
|
95
|
+
icon : '?',
|
|
96
|
+
sort_order: 1,
|
|
97
|
+
}));
|
|
98
|
+
|
|
99
|
+
let lang_sub_menu = [];
|
|
100
|
+
|
|
101
|
+
lang_sub_menu.push(new typeMenuElement({
|
|
102
|
+
link : `/web/en`, // @todo - get current routing and replace $lang
|
|
103
|
+
text : `EN`,
|
|
104
|
+
icon : '?',
|
|
105
|
+
sort_order: 1,
|
|
106
|
+
reload: true,
|
|
107
|
+
}));
|
|
108
|
+
|
|
109
|
+
lang_sub_menu.push(new typeMenuElement({
|
|
110
|
+
link : `/web/ru`, // @todo - get current routing and replace $lang
|
|
111
|
+
text : `RU`,
|
|
112
|
+
icon : '?',
|
|
113
|
+
sort_order: 2,
|
|
114
|
+
reload: true,
|
|
115
|
+
}));
|
|
116
|
+
|
|
117
|
+
response.push(new typeMenuElement({
|
|
118
|
+
link : false,
|
|
119
|
+
text : `Language ${ locale }`,
|
|
120
|
+
icon : '?',
|
|
121
|
+
sort_order: 2,
|
|
122
|
+
sub_menu : lang_sub_menu
|
|
123
|
+
}));
|
|
124
|
+
|
|
125
|
+
response.push(new typeMenuElement({
|
|
126
|
+
link : `/web/${ locale }/team_management/team/listing`,
|
|
127
|
+
text : 'Teams',
|
|
128
|
+
icon : '?',
|
|
129
|
+
sort_order: 3,
|
|
130
|
+
}));
|
|
131
|
+
|
|
132
|
+
/*
|
|
133
|
+
feedback
|
|
134
|
+
docs
|
|
135
|
+
admins
|
|
136
|
+
*/
|
|
137
|
+
|
|
138
|
+
return response;
|
|
139
|
+
}
|
|
140
|
+
}
|