complexqa_frontend_core 1.17.12 → 1.18.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 +1 -1
- package/publish/app_configuration/table/helpers/column_factory.js +55 -14
- package/publish/app_configuration/table/helpers/column_locale.js +14 -4
- package/publish/app_configuration/table/helpers/section_registry.js +30 -9
- package/publish/app_configuration/table/helpers/table_element_models.js +13 -3
- package/publish/app_configuration/table/sections/bug.js +6 -0
- package/publish/app_configuration/table/sections/execution_context.js +78 -0
- package/publish/app_configuration/table/sections/project.js +6 -0
- package/publish/app_configuration/table/sections/team.js +6 -0
- package/publish/app_configuration/table/sections/team_member.js +6 -0
- package/publish/app_configuration/table/sections/test_account.js +6 -0
- package/publish/app_configuration/table/sections/test_case.js +6 -0
- package/publish/app_configuration/table/sections/test_case_step.js +6 -0
- package/publish/app_configuration/table/sections/test_run.js +6 -0
- package/publish/app_configuration/table/sections/test_run_result.js +6 -0
- package/publish/app_configuration/table/sections/user.js +6 -0
- package/publish/app_configuration/table/table_base_config.js +30 -9
- package/publish/app_configuration/table/table_configuration.js +38 -6
- package/publish/types/family_context/typeExecutionContext.js +18 -0
- package/publish/types/family_service/typeTableColumn.js +116 -63
- package/publish/types/family_service/typeTableConfiguration.js +18 -8
package/package.json
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { typeTableColumn } from '../../../types/family_service/typeTableColumn.js';
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Значения по умолчанию для data-колонок.
|
|
5
|
+
* @type {Partial<import('../../../types/family_service/typeTableColumn.js').typeTableColumn>}
|
|
6
|
+
*/
|
|
3
7
|
const COLUMN_DEFAULTS = {
|
|
4
8
|
width : '120',
|
|
5
9
|
sort_order : '1',
|
|
@@ -15,13 +19,42 @@ const COLUMN_DEFAULTS = {
|
|
|
15
19
|
header_element_type: false,
|
|
16
20
|
};
|
|
17
21
|
|
|
22
|
+
/**
|
|
23
|
+
* @typedef {Object} ColumnOverrides
|
|
24
|
+
* @property {string} [header_field] Атрибут для перевода заголовка (по умолчанию = `field`).
|
|
25
|
+
* @property {import('../../../types/core/0_familyGeneralElement.js').familyGeneralElement} [header_model]
|
|
26
|
+
* Модель перевода при bootstrap (по умолчанию = `model`). Итоговый заголовок — в `get_config(lang)`.
|
|
27
|
+
* @property {string} [header_name] Явный заголовок; обычно не нужен — достаточно `header_field`.
|
|
28
|
+
* @property {string|false} [header_element_type] Ключ модели перевода, если ≠ element_type секции.
|
|
29
|
+
* @property {string|number} [width]
|
|
30
|
+
* @property {string|number} [sort_order]
|
|
31
|
+
* @property {boolean} [is_sortable]
|
|
32
|
+
* @property {boolean} [is_filter]
|
|
33
|
+
* @property {boolean} [is_hide]
|
|
34
|
+
* @property {boolean} [is_editable]
|
|
35
|
+
* @property {boolean} [is_required]
|
|
36
|
+
* @property {boolean} [is_title]
|
|
37
|
+
* @property {''|'asc'|'desc'} [default_sort]
|
|
38
|
+
* @property {string} [cell_classes]
|
|
39
|
+
*/
|
|
40
|
+
|
|
18
41
|
|
|
19
42
|
/**
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* @param {
|
|
23
|
-
*
|
|
43
|
+
* Data-колонка с переводимым заголовком и сохранённым `header_field`.
|
|
44
|
+
*
|
|
45
|
+
* @param {import('../../../types/core/0_familyGeneralElement.js').familyGeneralElement} model
|
|
46
|
+
* Модель сущности секции.
|
|
47
|
+
* @param {string} locale Локаль bootstrap (для первичного `header_name`; актуальная — в `get_config`).
|
|
48
|
+
* @param {string} field Поле строки (`test_case_status`, `user_id.first_name`, …).
|
|
49
|
+
* @param {ColumnOverrides} [overrides={}]
|
|
24
50
|
* @returns {typeTableColumn}
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* createColumn(model, locale, 'test_case_id.test_case_title', {
|
|
54
|
+
* header_field: 'test_case_title',
|
|
55
|
+
* header_element_type: 'test_case',
|
|
56
|
+
* width: '480',
|
|
57
|
+
* });
|
|
25
58
|
*/
|
|
26
59
|
export function createColumn(model, locale, field, overrides = {})
|
|
27
60
|
{
|
|
@@ -39,9 +72,10 @@ export function createColumn(model, locale, field, overrides = {})
|
|
|
39
72
|
|
|
40
73
|
|
|
41
74
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
75
|
+
* Колонка множественного выбора строк (`column_kind: row_select`).
|
|
76
|
+
* Без `header_field` — не локализуется. В web_app: pinned left, чекбоксы.
|
|
77
|
+
*
|
|
78
|
+
* @param {Partial<typeTableColumn>} [overrides={}]
|
|
45
79
|
* @returns {typeTableColumn}
|
|
46
80
|
*/
|
|
47
81
|
export function createRowSelectColumn(overrides = {})
|
|
@@ -61,9 +95,12 @@ export function createRowSelectColumn(overrides = {})
|
|
|
61
95
|
|
|
62
96
|
|
|
63
97
|
/**
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
98
|
+
* Колонка перехода к деталям (`column_kind: goto`).
|
|
99
|
+
* Заголовок в UI — через `translateGoToHeader` в web_app, не через ядро.
|
|
100
|
+
*
|
|
101
|
+
* @param {import('../../../types/core/0_familyGeneralElement.js').familyGeneralElement} model
|
|
102
|
+
* @param {string} locale Не используется; сохранён для единообразия API фабрик.
|
|
103
|
+
* @param {ColumnOverrides} [overrides={}]
|
|
67
104
|
* @returns {typeTableColumn}
|
|
68
105
|
*/
|
|
69
106
|
export function createGoToColumn(model, locale, overrides = {})
|
|
@@ -85,9 +122,11 @@ export function createGoToColumn(model, locale, overrides = {})
|
|
|
85
122
|
|
|
86
123
|
|
|
87
124
|
/**
|
|
88
|
-
*
|
|
125
|
+
* Колонка primary key (часто скрытая в listing, видимая в todo).
|
|
126
|
+
*
|
|
127
|
+
* @param {import('../../../types/core/0_familyGeneralElement.js').familyGeneralElement} model
|
|
89
128
|
* @param {string} locale
|
|
90
|
-
* @param {
|
|
129
|
+
* @param {ColumnOverrides} [overrides={}]
|
|
91
130
|
* @returns {typeTableColumn}
|
|
92
131
|
*/
|
|
93
132
|
export function createPrimaryKeyColumn(model, locale, overrides = {})
|
|
@@ -104,10 +143,12 @@ export function createPrimaryKeyColumn(model, locale, overrides = {})
|
|
|
104
143
|
|
|
105
144
|
|
|
106
145
|
/**
|
|
107
|
-
*
|
|
146
|
+
* Колонка для таблиц details: без сортировки и фильтра ag-grid.
|
|
147
|
+
*
|
|
148
|
+
* @param {import('../../../types/core/0_familyGeneralElement.js').familyGeneralElement} model
|
|
108
149
|
* @param {string} locale
|
|
109
150
|
* @param {string} field
|
|
110
|
-
* @param {
|
|
151
|
+
* @param {ColumnOverrides} [overrides={}]
|
|
111
152
|
* @returns {typeTableColumn}
|
|
112
153
|
*/
|
|
113
154
|
export function createDetailsColumn(model, locale, field, overrides = {})
|
|
@@ -3,10 +3,15 @@ import { typeTableConfiguration } from '../../../types/family_service/typeTableC
|
|
|
3
3
|
import { TABLE_ELEMENT_MODELS } from './table_element_models.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
+
* Применяет локаль к заголовку одной data-колонки.
|
|
7
|
+
*
|
|
8
|
+
* Колонки без `header_field` (ручные, goto, row_select, copy) возвращаются без изменений.
|
|
9
|
+
* Модель перевода: `TABLE_ELEMENT_MODELS[header_element_type || element_type]`.
|
|
10
|
+
*
|
|
6
11
|
* @param {typeTableColumn} column
|
|
7
|
-
* @param {string} element_type
|
|
8
|
-
* @param {string} lang
|
|
9
|
-
* @returns {typeTableColumn}
|
|
12
|
+
* @param {string} element_type Ключ сущности секции (`test_case`, `bug`, …).
|
|
13
|
+
* @param {string} lang Код локали (`en`, `ru`, …).
|
|
14
|
+
* @returns {typeTableColumn} Новый экземпляр с обновлённым `header_name` или исходная колонка.
|
|
10
15
|
*/
|
|
11
16
|
export function localizeTableColumn(column, element_type, lang)
|
|
12
17
|
{
|
|
@@ -47,9 +52,14 @@ export function localizeTableColumn(column, element_type, lang)
|
|
|
47
52
|
|
|
48
53
|
|
|
49
54
|
/**
|
|
50
|
-
*
|
|
55
|
+
* Возвращает копию секции с локализованными заголовками всех data-колонок.
|
|
56
|
+
*
|
|
57
|
+
* Вызывается из `TableConfiguration.get_config` — не мутирует кеш bootstrap.
|
|
58
|
+
*
|
|
59
|
+
* @param {{ config: typeTableConfiguration }} section Зарегистрированная секция из `static.config`.
|
|
51
60
|
* @param {string} element_type
|
|
52
61
|
* @param {string} lang
|
|
62
|
+
* @returns {{ config: typeTableConfiguration }}
|
|
53
63
|
*/
|
|
54
64
|
export function localizeTableSection(section, element_type, lang)
|
|
55
65
|
{
|
|
@@ -2,13 +2,27 @@ import { typeTableConfiguration } from '../../../types/family_service/typeTableC
|
|
|
2
2
|
import { typeFOR } from '../../../types/family_service/typeFOR.js';
|
|
3
3
|
import { typeFilter } from '../../../types/family_service/typeFilter.js';
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* @typedef {Object} RegisterSectionOptions
|
|
7
|
+
* @property {typeFOR|false} [for=false] Шаблон поиска для листинга.
|
|
8
|
+
* @property {string|false} [contained_element_type=false] Контекст вложенной сущности.
|
|
9
|
+
* @property {{ description: (string|false), link: (string|false) }} [documentation]
|
|
10
|
+
*/
|
|
5
11
|
|
|
6
12
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* @param {string}
|
|
10
|
-
* @param {
|
|
11
|
-
* @param {
|
|
13
|
+
* Регистрирует секцию таблицы в реестре `TableConfiguration.config`.
|
|
14
|
+
*
|
|
15
|
+
* @param {Object<string, Object<string, { config: typeTableConfiguration }>>} config Ссылка на `TableConfiguration.config`.
|
|
16
|
+
* @param {string} element_type Ключ сущности.
|
|
17
|
+
* @param {string} section Имя секции (`listing`, `todo`, `details`, …).
|
|
18
|
+
* @param {import('../../../types/family_service/typeTableColumn.js').typeTableColumn[]} columns
|
|
19
|
+
* @param {RegisterSectionOptions} [options={}]
|
|
20
|
+
* @returns {void}
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* registerSection(config, 'bug', 'listing', build_bug_listing_columns(locale), {
|
|
24
|
+
* for: createListingFor(['project_id']),
|
|
25
|
+
* });
|
|
12
26
|
*/
|
|
13
27
|
export function registerSection(config, element_type, section, columns, options = {})
|
|
14
28
|
{
|
|
@@ -31,8 +45,10 @@ export function registerSection(config, element_type, section, columns, options
|
|
|
31
45
|
|
|
32
46
|
|
|
33
47
|
/**
|
|
34
|
-
*
|
|
35
|
-
*
|
|
48
|
+
* Фильтр-заготовка для runtime-подстановки значения в web_app.
|
|
49
|
+
*
|
|
50
|
+
* @param {string} attribute Имя атрибута (`project_id`, `test_case_id`, …).
|
|
51
|
+
* @returns {typeFilter} `operator: EQUAL`, `value: false` до гидратации.
|
|
36
52
|
*/
|
|
37
53
|
export function createRuntimeFilter(attribute)
|
|
38
54
|
{
|
|
@@ -45,9 +61,14 @@ export function createRuntimeFilter(attribute)
|
|
|
45
61
|
|
|
46
62
|
|
|
47
63
|
/**
|
|
48
|
-
*
|
|
49
|
-
*
|
|
64
|
+
* Строит шаблон `typeFOR` для листинговых таблиц.
|
|
65
|
+
*
|
|
66
|
+
* @param {string[]} [filter_attributes=['project_id']] Атрибуты, которые web_app заполнит из `filterValues`.
|
|
67
|
+
* @param {Object<string, *>|false} [for_options=false] Доп. опции API (`add: ['users']` и т.д.).
|
|
50
68
|
* @returns {typeFOR}
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* createListingFor(['project_id', 'test_case_id'], { add: ['users'] });
|
|
51
72
|
*/
|
|
52
73
|
export function createListingFor(filter_attributes = [ 'project_id' ], for_options = false)
|
|
53
74
|
{
|
|
@@ -4,13 +4,22 @@ import { typeTestRun } from '../../../types/family_elements/typeTestRun.js';
|
|
|
4
4
|
import { typeBug } from '../../../types/family_elements/typeBug.js';
|
|
5
5
|
import { typeTestRunResult } from '../../../types/family_elements/typeTestRunResult.js';
|
|
6
6
|
import { typeTestAccount } from '../../../types/family_elements/typeTestAccount.js';
|
|
7
|
+
import { typeExecutionContext } from '../../../types/family_context/typeExecutionContext.js';
|
|
7
8
|
import { typeTeamMember } from '../../../types/family_elements/typeTeamMember.js';
|
|
8
9
|
import { typeTestCaseStep } from '../../../types/family_elements/typeTestCaseStep.js';
|
|
9
10
|
import { typeUser } from '../../../types/family_elements/typeUser.js';
|
|
10
11
|
import { typeTeam } from '../../../types/family_elements/typeTeam.js';
|
|
11
12
|
|
|
12
13
|
/**
|
|
13
|
-
*
|
|
14
|
+
* Реестр классов моделей по ключу `element_type`.
|
|
15
|
+
*
|
|
16
|
+
* Используется для:
|
|
17
|
+
* - `TableBaseConfig.getRowNodeId` — primary key строки;
|
|
18
|
+
* - `localizeTableColumn` — `get_attribute_name_translate(header_field, lang)`.
|
|
19
|
+
*
|
|
20
|
+
* При добавлении новой таблицы сущности — зарегистрировать класс здесь.
|
|
21
|
+
*
|
|
22
|
+
* @type {Object<string, typeof import('../../../types/core/0_familyGeneralElement.js').familyGeneralElement>}
|
|
14
23
|
*/
|
|
15
24
|
export const TABLE_ELEMENT_MODELS = {
|
|
16
25
|
test_case : typeTestCase,
|
|
@@ -18,8 +27,9 @@ export const TABLE_ELEMENT_MODELS = {
|
|
|
18
27
|
test_run : typeTestRun,
|
|
19
28
|
bug : typeBug,
|
|
20
29
|
test_run_result: typeTestRunResult,
|
|
21
|
-
test_account
|
|
22
|
-
|
|
30
|
+
test_account : typeTestAccount,
|
|
31
|
+
execution_context : typeExecutionContext,
|
|
32
|
+
team_member : typeTeamMember,
|
|
23
33
|
test_case_step : typeTestCaseStep,
|
|
24
34
|
user : typeUser,
|
|
25
35
|
team : typeTeam,
|
|
@@ -85,6 +85,12 @@ function build_bug_details_columns(locale)
|
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
|
|
88
|
+
/**
|
|
89
|
+
* Секции `bug`: `listing`, `todo`, `details`.
|
|
90
|
+
*
|
|
91
|
+
* @param {Object<string, Object<string, { config: import('../../../types/family_service/typeTableConfiguration.js').typeTableConfiguration }>>} config
|
|
92
|
+
* @returns {void}
|
|
93
|
+
*/
|
|
88
94
|
export function bootstrap_bug(config)
|
|
89
95
|
{
|
|
90
96
|
const locale = UserService.get_current_language();
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { typeExecutionContext } from '../../../types/family_context/typeExecutionContext.js';
|
|
2
|
+
import { UserService } from '../../../services/UserService.js';
|
|
3
|
+
import { createColumn, createGoToColumn, createPrimaryKeyColumn } from '../helpers/column_factory.js';
|
|
4
|
+
import { createListingFor, registerSection } from '../helpers/section_registry.js';
|
|
5
|
+
|
|
6
|
+
const FK_FIELDS = [
|
|
7
|
+
'browser_context_id',
|
|
8
|
+
'os_context_id',
|
|
9
|
+
'screen_resolution_context_id',
|
|
10
|
+
'device_context_id',
|
|
11
|
+
'locale_context_id',
|
|
12
|
+
'deployment_target_context_id',
|
|
13
|
+
'test_account_id',
|
|
14
|
+
];
|
|
15
|
+
|
|
16
|
+
function build_execution_context_listing_columns(locale)
|
|
17
|
+
{
|
|
18
|
+
const model = new typeExecutionContext();
|
|
19
|
+
|
|
20
|
+
return [
|
|
21
|
+
createPrimaryKeyColumn(model, locale, { is_editable: false }),
|
|
22
|
+
createColumn(model, locale, 'context_title', { width: '420', is_editable: true, is_required: false }),
|
|
23
|
+
...FK_FIELDS.map((field) => createColumn(model, locale, field, { width: '200', is_editable: false })),
|
|
24
|
+
createColumn(model, locale, 'protocol', { width: '120', is_editable: true }),
|
|
25
|
+
createColumn(model, locale, 'host', { width: '200', is_editable: true }),
|
|
26
|
+
createColumn(model, locale, 'build_version', { width: '160', is_editable: true }),
|
|
27
|
+
createColumn(model, locale, 'created_at', { width: '170' }),
|
|
28
|
+
createGoToColumn(model, locale),
|
|
29
|
+
];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
function build_execution_context_details_columns(locale)
|
|
34
|
+
{
|
|
35
|
+
const model = new typeExecutionContext();
|
|
36
|
+
const fields = [
|
|
37
|
+
'execution_context_id',
|
|
38
|
+
'project_id',
|
|
39
|
+
'team_id',
|
|
40
|
+
'context_title',
|
|
41
|
+
...FK_FIELDS,
|
|
42
|
+
'protocol',
|
|
43
|
+
'host',
|
|
44
|
+
'base_url',
|
|
45
|
+
'build_version',
|
|
46
|
+
'context_snapshot',
|
|
47
|
+
'custom_field_values',
|
|
48
|
+
'created_at',
|
|
49
|
+
'updated_at',
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
const editableFields = new Set([ 'context_title', 'protocol', 'host', 'base_url', 'build_version' ]);
|
|
53
|
+
|
|
54
|
+
return fields.map((field, index) => createColumn(model, locale, field, {
|
|
55
|
+
sort_order : String(index + 1),
|
|
56
|
+
is_editable: editableFields.has(field),
|
|
57
|
+
is_sortable: false,
|
|
58
|
+
is_filter : false,
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Секции `execution_context`: `listing`, `details`.
|
|
65
|
+
*
|
|
66
|
+
* @param {Object<string, Object<string, { config: import('../../../types/family_service/typeTableConfiguration.js').typeTableConfiguration }>>} config
|
|
67
|
+
* @returns {void}
|
|
68
|
+
*/
|
|
69
|
+
export function bootstrap_execution_context(config)
|
|
70
|
+
{
|
|
71
|
+
const locale = UserService.get_current_language();
|
|
72
|
+
|
|
73
|
+
registerSection(config, 'execution_context', 'listing', build_execution_context_listing_columns(locale), {
|
|
74
|
+
for: createListingFor([ 'project_id' ]),
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
registerSection(config, 'execution_context', 'details', build_execution_context_details_columns(locale));
|
|
78
|
+
}
|
|
@@ -50,6 +50,12 @@ function build_project_todo_column(locale)
|
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
|
|
53
|
+
/**
|
|
54
|
+
* Секции `project`: `domains` (ручные колонки без перевода), `todo_column`.
|
|
55
|
+
*
|
|
56
|
+
* @param {Object<string, Object<string, { config: import('../../../types/family_service/typeTableConfiguration.js').typeTableConfiguration }>>} config
|
|
57
|
+
* @returns {void}
|
|
58
|
+
*/
|
|
53
59
|
export function bootstrap_project(config)
|
|
54
60
|
{
|
|
55
61
|
const locale = UserService.get_current_language();
|
|
@@ -33,6 +33,12 @@ function build_team_total_statistic_columns(locale)
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
|
|
36
|
+
/**
|
|
37
|
+
* Секции `team`: `profile`; `team_total_statistic`: `details`.
|
|
38
|
+
*
|
|
39
|
+
* @param {Object<string, Object<string, { config: import('../../../types/family_service/typeTableConfiguration.js').typeTableConfiguration }>>} config
|
|
40
|
+
* @returns {void}
|
|
41
|
+
*/
|
|
36
42
|
export function bootstrap_team(config)
|
|
37
43
|
{
|
|
38
44
|
const locale = UserService.get_current_language();
|
|
@@ -33,6 +33,12 @@ function build_team_member_listing_columns(locale)
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
|
|
36
|
+
/**
|
|
37
|
+
* Секция `team_member`: `listing`.
|
|
38
|
+
*
|
|
39
|
+
* @param {Object<string, Object<string, { config: import('../../../types/family_service/typeTableConfiguration.js').typeTableConfiguration }>>} config
|
|
40
|
+
* @returns {void}
|
|
41
|
+
*/
|
|
36
42
|
export function bootstrap_team_member(config)
|
|
37
43
|
{
|
|
38
44
|
const locale = UserService.get_current_language();
|
|
@@ -56,6 +56,12 @@ function build_test_account_details_columns(locale)
|
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
|
|
59
|
+
/**
|
|
60
|
+
* Секции `test_account`: `listing`, `details` (в details — колонка `copy`).
|
|
61
|
+
*
|
|
62
|
+
* @param {Object<string, Object<string, { config: import('../../../types/family_service/typeTableConfiguration.js').typeTableConfiguration }>>} config
|
|
63
|
+
* @returns {void}
|
|
64
|
+
*/
|
|
59
65
|
export function bootstrap_test_account(config)
|
|
60
66
|
{
|
|
61
67
|
const locale = UserService.get_current_language();
|
|
@@ -48,6 +48,12 @@ function build_test_case_todo_columns(locale)
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
|
|
51
|
+
/**
|
|
52
|
+
* Секции `test_case`: `listing`, `todo`, `picker`.
|
|
53
|
+
*
|
|
54
|
+
* @param {Object<string, Object<string, { config: import('../../../types/family_service/typeTableConfiguration.js').typeTableConfiguration }>>} config
|
|
55
|
+
* @returns {void}
|
|
56
|
+
*/
|
|
51
57
|
export function bootstrap_test_case(config)
|
|
52
58
|
{
|
|
53
59
|
const locale = UserService.get_current_language();
|
|
@@ -45,6 +45,12 @@ function build_test_case_presteps_columns(locale)
|
|
|
45
45
|
return build_test_case_step_shared_columns(locale);
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
+
/**
|
|
49
|
+
* Секции `test_case_step`: `steps`, `presteps` (шаги и престепы тест-кейса).
|
|
50
|
+
*
|
|
51
|
+
* @param {Object<string, Object<string, { config: import('../../../types/family_service/typeTableConfiguration.js').typeTableConfiguration }>>} config
|
|
52
|
+
* @returns {void}
|
|
53
|
+
*/
|
|
48
54
|
export function bootstrap_test_case_step(config)
|
|
49
55
|
{
|
|
50
56
|
const locale = UserService.get_current_language();
|
|
@@ -59,6 +59,12 @@ function build_test_run_todo_columns(locale)
|
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
|
|
62
|
+
/**
|
|
63
|
+
* Секции `test_run`: `listing`, `todo`.
|
|
64
|
+
*
|
|
65
|
+
* @param {Object<string, Object<string, { config: import('../../../types/family_service/typeTableConfiguration.js').typeTableConfiguration }>>} config
|
|
66
|
+
* @returns {void}
|
|
67
|
+
*/
|
|
62
68
|
export function bootstrap_test_run(config)
|
|
63
69
|
{
|
|
64
70
|
const locale = UserService.get_current_language();
|
|
@@ -74,6 +74,12 @@ function build_test_run_result_details_columns(locale)
|
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
|
|
77
|
+
/**
|
|
78
|
+
* Секции `test_run_result`: `listing`, `todo`, `details`.
|
|
79
|
+
*
|
|
80
|
+
* @param {Object<string, Object<string, { config: import('../../../types/family_service/typeTableConfiguration.js').typeTableConfiguration }>>} config
|
|
81
|
+
* @returns {void}
|
|
82
|
+
*/
|
|
77
83
|
export function bootstrap_test_run_result(config)
|
|
78
84
|
{
|
|
79
85
|
const locale = UserService.get_current_language();
|
|
@@ -17,6 +17,12 @@ function build_user_profile_columns(locale)
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
|
|
20
|
+
/**
|
|
21
|
+
* Секция `user`: `profile`.
|
|
22
|
+
*
|
|
23
|
+
* @param {Object<string, Object<string, { config: import('../../../types/family_service/typeTableConfiguration.js').typeTableConfiguration }>>} config
|
|
24
|
+
* @returns {void}
|
|
25
|
+
*/
|
|
20
26
|
export function bootstrap_user(config)
|
|
21
27
|
{
|
|
22
28
|
const locale = UserService.get_current_language();
|
|
@@ -3,16 +3,27 @@ import { LOCALE_AG_GRID_EG } from '../table_locale_ar.js';
|
|
|
3
3
|
import { TABLE_ELEMENT_MODELS } from './helpers/table_element_models.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
* Базовые опции ag-grid, общие для всех
|
|
6
|
+
* Базовые опции ag-grid Community, общие для всех таблиц приложения.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
8
|
+
* Не содержит columnDefs — они строятся в web_app из `TableConfiguration`.
|
|
9
|
+
* Дополняет грид: `defaultColDef`, `rowSelection`, `localeText`, `getRowNodeId`.
|
|
10
|
+
*
|
|
11
|
+
* @see docs/App Configuration/table.MD
|
|
12
|
+
* @version v.0.3 (12/06/2026)
|
|
9
13
|
*/
|
|
10
14
|
export class TableBaseConfig
|
|
11
15
|
{
|
|
12
16
|
/**
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* @param {string}
|
|
17
|
+
* Возвращает копию общих gridOptions для ag-grid.
|
|
18
|
+
*
|
|
19
|
+
* @param {string} element_type Ключ сущности — для `getRowNodeId` (primary key модели).
|
|
20
|
+
* @param {string} section Имя секции (зарезервировано; сейчас не влияет на ответ).
|
|
21
|
+
* @param {string} [lang='en'] Локаль UI ag-grid. Для `ru` и `ar` добавляется `localeText`.
|
|
22
|
+
* @returns {Object} GridOptions-совместимый объект (без привязки к Vue).
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* const { getRowNodeId, localeText, defaultColDef, ...gridOptions } =
|
|
26
|
+
* TableBaseConfig.get_config('bug', 'listing', 'ru');
|
|
16
27
|
*/
|
|
17
28
|
static get_config(element_type, section, lang)
|
|
18
29
|
{
|
|
@@ -33,8 +44,11 @@ export class TableBaseConfig
|
|
|
33
44
|
|
|
34
45
|
|
|
35
46
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
47
|
+
* Словарь ag-grid localeText для меню колонок и системных строк.
|
|
48
|
+
*
|
|
49
|
+
* @private
|
|
50
|
+
* @param {string} lang
|
|
51
|
+
* @returns {Object<string, string>}
|
|
38
52
|
*/
|
|
39
53
|
static #localeText(lang)
|
|
40
54
|
{
|
|
@@ -54,8 +68,11 @@ export class TableBaseConfig
|
|
|
54
68
|
|
|
55
69
|
|
|
56
70
|
/**
|
|
57
|
-
*
|
|
58
|
-
*
|
|
71
|
+
* Фабрика `getRowNodeId`: возвращает id строки по primary key сущности.
|
|
72
|
+
*
|
|
73
|
+
* @private
|
|
74
|
+
* @param {string} element_type
|
|
75
|
+
* @returns {function(Object): number}
|
|
59
76
|
*/
|
|
60
77
|
static #getRowNodeId(element_type)
|
|
61
78
|
{
|
|
@@ -80,6 +97,10 @@ export class TableBaseConfig
|
|
|
80
97
|
}
|
|
81
98
|
|
|
82
99
|
|
|
100
|
+
/**
|
|
101
|
+
* Статические опции ag-grid по умолчанию.
|
|
102
|
+
* @type {Object}
|
|
103
|
+
*/
|
|
83
104
|
static config = {
|
|
84
105
|
defaultColDef : {
|
|
85
106
|
filter : true,
|
|
@@ -5,6 +5,7 @@ import { bootstrap_test_case_step } from './sections/test_case_step.js';
|
|
|
5
5
|
import { bootstrap_test_run } from './sections/test_run.js';
|
|
6
6
|
import { bootstrap_test_run_result } from './sections/test_run_result.js';
|
|
7
7
|
import { bootstrap_test_account } from './sections/test_account.js';
|
|
8
|
+
import { bootstrap_execution_context } from './sections/execution_context.js';
|
|
8
9
|
import { bootstrap_team_member } from './sections/team_member.js';
|
|
9
10
|
import { bootstrap_user } from './sections/user.js';
|
|
10
11
|
import { bootstrap_team } from './sections/team.js';
|
|
@@ -12,21 +13,37 @@ import { bootstrap_project } from './sections/project.js';
|
|
|
12
13
|
import { localizeTableSection } from './helpers/column_locale.js';
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
|
-
* Реестр конфигураций таблиц
|
|
16
|
+
* Реестр конфигураций таблиц ag-grid.
|
|
16
17
|
*
|
|
17
|
-
*
|
|
18
|
+
* Хранит колонки (`typeTableColumn`), шаблон поиска (`for`) и метаданные по парам
|
|
19
|
+
* `element_type` × `section` (например `test_case` × `listing`).
|
|
20
|
+
*
|
|
21
|
+
* Заголовки data-колонок локализуются при каждом вызове `get_config`, а не при bootstrap.
|
|
22
|
+
* Представление ячеек (renderer/editor) — в web_app (`ColumnFactory`).
|
|
23
|
+
*
|
|
24
|
+
* @see docs/App Configuration/table.MD
|
|
25
|
+
* @version v.0.3 (12/06/2026)
|
|
18
26
|
*/
|
|
19
27
|
export class TableConfiguration extends abstractAppConfiguration
|
|
20
28
|
{
|
|
29
|
+
/**
|
|
30
|
+
* Внутренний реестр: `config[element_type][section] → { config: typeTableConfiguration }`.
|
|
31
|
+
* @type {Object<string, Object<string, { config: import('../../types/family_service/typeTableConfiguration.js').typeTableConfiguration }>>}
|
|
32
|
+
*/
|
|
21
33
|
static config = {};
|
|
22
34
|
|
|
35
|
+
/**
|
|
36
|
+
* @type {{ loaded: boolean }}
|
|
37
|
+
*/
|
|
23
38
|
static state = {
|
|
24
39
|
loaded: false
|
|
25
40
|
}
|
|
26
41
|
|
|
27
42
|
|
|
28
43
|
/**
|
|
29
|
-
*
|
|
44
|
+
* Синглтон: при первом создании вызывает `bootstrap()`.
|
|
45
|
+
*
|
|
46
|
+
* @param {boolean|object} [init_options=false]
|
|
30
47
|
*/
|
|
31
48
|
constructor(init_options = false)
|
|
32
49
|
{
|
|
@@ -44,10 +61,18 @@ export class TableConfiguration extends abstractAppConfiguration
|
|
|
44
61
|
|
|
45
62
|
|
|
46
63
|
/**
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
* @param {string}
|
|
64
|
+
* Возвращает конфигурацию секции таблицы с заголовками колонок для запрошенной локали.
|
|
65
|
+
*
|
|
66
|
+
* @param {string} element_type Ключ сущности (`bug`, `test_case`, `test_run`, …).
|
|
67
|
+
* @param {string} section Имя секции (`listing`, `todo`, `details`, `steps`, `presteps`, …).
|
|
68
|
+
* @param {string} [lang='en'] Код локали (`en`, `ru`, `ar`). Передаётся из web_app (`getLocale()`).
|
|
69
|
+
* @returns {{ config: import('../../types/family_service/typeTableConfiguration.js').typeTableConfiguration }|false}
|
|
70
|
+
* Объект с полем `config` или `false`, если секция не зарегистрирована.
|
|
50
71
|
*
|
|
72
|
+
* @example
|
|
73
|
+
* const section = TableConfiguration.get_config('test_case', 'listing', 'ru');
|
|
74
|
+
* const columns = section.config.columns;
|
|
75
|
+
* const forTemplate = section.config.for;
|
|
51
76
|
*/
|
|
52
77
|
static get_config(element_type, section, lang = 'en')
|
|
53
78
|
{
|
|
@@ -67,6 +92,12 @@ export class TableConfiguration extends abstractAppConfiguration
|
|
|
67
92
|
}
|
|
68
93
|
|
|
69
94
|
|
|
95
|
+
/**
|
|
96
|
+
* Однократная загрузка всех секций из `sections/*` в `static.config`.
|
|
97
|
+
* Повторный вызов — no-op.
|
|
98
|
+
*
|
|
99
|
+
* @returns {void}
|
|
100
|
+
*/
|
|
70
101
|
static bootstrap()
|
|
71
102
|
{
|
|
72
103
|
if (this.state.loaded)
|
|
@@ -80,6 +111,7 @@ export class TableConfiguration extends abstractAppConfiguration
|
|
|
80
111
|
bootstrap_test_run(this.config);
|
|
81
112
|
bootstrap_test_run_result(this.config);
|
|
82
113
|
bootstrap_test_account(this.config);
|
|
114
|
+
bootstrap_execution_context(this.config);
|
|
83
115
|
bootstrap_team_member(this.config);
|
|
84
116
|
bootstrap_user(this.config);
|
|
85
117
|
bootstrap_team(this.config);
|
|
@@ -16,6 +16,9 @@ export class typeExecutionContext extends familyGeneralElement
|
|
|
16
16
|
project_id;
|
|
17
17
|
team_id;
|
|
18
18
|
|
|
19
|
+
context_title;
|
|
20
|
+
context_description;
|
|
21
|
+
|
|
19
22
|
browser_context_id;
|
|
20
23
|
os_context_id;
|
|
21
24
|
screen_resolution_context_id;
|
|
@@ -42,6 +45,8 @@ export class typeExecutionContext extends familyGeneralElement
|
|
|
42
45
|
execution_context_id : 'integer | require',
|
|
43
46
|
project_id : 'integer | require',
|
|
44
47
|
team_id : 'integer | require',
|
|
48
|
+
context_title : 'string | optional',
|
|
49
|
+
context_description : 'string | StringHtml | optional',
|
|
45
50
|
browser_context_id : 'integer | optional',
|
|
46
51
|
os_context_id : 'integer | optional',
|
|
47
52
|
screen_resolution_context_id: 'integer | optional',
|
|
@@ -84,6 +89,8 @@ export class typeExecutionContext extends familyGeneralElement
|
|
|
84
89
|
attribute_name_translate_matrix = {
|
|
85
90
|
en: {
|
|
86
91
|
execution_context_id : 'ID',
|
|
92
|
+
context_title : 'Title',
|
|
93
|
+
context_description : 'Description',
|
|
87
94
|
project_id : 'Project',
|
|
88
95
|
team_id : 'Team',
|
|
89
96
|
browser_context_id : 'Browser',
|
|
@@ -104,6 +111,8 @@ export class typeExecutionContext extends familyGeneralElement
|
|
|
104
111
|
},
|
|
105
112
|
ru: {
|
|
106
113
|
execution_context_id : 'ID',
|
|
114
|
+
context_title : 'Название',
|
|
115
|
+
context_description : 'Описание',
|
|
107
116
|
project_id : 'Проект',
|
|
108
117
|
team_id : 'Команда',
|
|
109
118
|
browser_context_id : 'Браузер',
|
|
@@ -145,4 +154,13 @@ export class typeExecutionContext extends familyGeneralElement
|
|
|
145
154
|
|
|
146
155
|
return this;
|
|
147
156
|
}
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* @returns {string}
|
|
161
|
+
*/
|
|
162
|
+
get_element_name()
|
|
163
|
+
{
|
|
164
|
+
return this.context_title || String(this.execution_context_id ?? '');
|
|
165
|
+
}
|
|
148
166
|
}
|
|
@@ -1,63 +1,116 @@
|
|
|
1
|
-
import { familyService } from "./familyService";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
*
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
1
|
+
import { familyService } from "./familyService";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Описание одной колонки таблицы ag-grid.
|
|
5
|
+
*
|
|
6
|
+
* Ядро хранит структуру и флаги; web_app (`ColumnFactory`) маппит в `ColDef`
|
|
7
|
+
* и подбирает cellRenderer / cellEditor по `field` и `column_kind`.
|
|
8
|
+
*
|
|
9
|
+
* @see docs/App Configuration/table.MD
|
|
10
|
+
* @version v.0.2 (12/06/2026)
|
|
11
|
+
*/
|
|
12
|
+
export class typeTableColumn extends familyService
|
|
13
|
+
{
|
|
14
|
+
/**
|
|
15
|
+
* Отображаемый заголовок колонки.
|
|
16
|
+
* Для `column_kind: 'data'` пересчитывается в `TableConfiguration.get_config` по `header_field` и `lang`.
|
|
17
|
+
* @type {string|undefined}
|
|
18
|
+
*/
|
|
19
|
+
header_name;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Имя поля в данных строки (ColDef.field).
|
|
23
|
+
* @type {string|undefined}
|
|
24
|
+
*/
|
|
25
|
+
field;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Ширина колонки в пикселях (строка для совместимости с конфигами).
|
|
29
|
+
* @type {string|number|undefined}
|
|
30
|
+
*/
|
|
31
|
+
width;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Порядок колонки (меньше — левее). Сортируется в ColumnFactory перед сборкой ColDef.
|
|
35
|
+
* @type {string|number|undefined}
|
|
36
|
+
*/
|
|
37
|
+
sort_order;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* CSS-классы ячейки.
|
|
41
|
+
* @type {string|undefined}
|
|
42
|
+
*/
|
|
43
|
+
cell_classes;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Начальная сортировка: `''`, `'asc'` или `'desc'`.
|
|
47
|
+
* @type {''|'asc'|'desc'|string|undefined}
|
|
48
|
+
*/
|
|
49
|
+
default_sort;
|
|
50
|
+
|
|
51
|
+
/** @type {boolean|undefined} */
|
|
52
|
+
is_sortable;
|
|
53
|
+
|
|
54
|
+
/** @type {boolean|undefined} */
|
|
55
|
+
is_filter;
|
|
56
|
+
|
|
57
|
+
/** @type {boolean|undefined} */
|
|
58
|
+
is_hide;
|
|
59
|
+
|
|
60
|
+
/** @type {boolean|undefined} */
|
|
61
|
+
is_editable;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Семантический тип колонки для фабрики ColDef в web_app.
|
|
65
|
+
* @type {'data'|'row_select'|'goto'|'sort_action'|'copy'}
|
|
66
|
+
*/
|
|
67
|
+
column_kind = 'data';
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Обязательное поле при создании/редактировании строки (метаданные для UI).
|
|
71
|
+
* @type {boolean}
|
|
72
|
+
*/
|
|
73
|
+
is_required = false;
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Поле-заголовок сущности в строке (например `test_case_title` в todo).
|
|
77
|
+
* Влияет на multiline / flex в ColumnFactory.
|
|
78
|
+
* @type {boolean}
|
|
79
|
+
*/
|
|
80
|
+
is_title = false;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Ключ модели для перевода заголовка, если отличается от `element_type` секции.
|
|
84
|
+
* Пример: `test_case` для колонки `test_case_id.test_case_title` в `test_run_result`.
|
|
85
|
+
* @type {string|false}
|
|
86
|
+
*/
|
|
87
|
+
header_element_type = false;
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Имя атрибута в `attribute_name_translate_matrix` для заголовка.
|
|
91
|
+
* Задаётся в `createColumn`; если `false` — заголовок не локализуется при `get_config`.
|
|
92
|
+
* @type {string|false}
|
|
93
|
+
*/
|
|
94
|
+
header_field = false;
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* @param {Partial<typeTableColumn>|false} [data=false]
|
|
99
|
+
*/
|
|
100
|
+
constructor(data = false)
|
|
101
|
+
{
|
|
102
|
+
super();
|
|
103
|
+
if (data && typeof data === 'object')
|
|
104
|
+
{
|
|
105
|
+
_.mapObject(data, (value, key) =>
|
|
106
|
+
{
|
|
107
|
+
if (this.hasOwnProperty(key))
|
|
108
|
+
{
|
|
109
|
+
this [ key ] = value;
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return this;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
@@ -1,33 +1,40 @@
|
|
|
1
1
|
import { typeAppConfiguration } from "./typeAppConfiguration";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Конфигурация одной секции таблицы (набор колонок + поиск).
|
|
5
5
|
*
|
|
6
|
-
*
|
|
6
|
+
* Регистрируется через `registerSection` в `sections/*`.
|
|
7
|
+
* Потребляется web_app: `useTableConfig` → `ColumnFactory` + `buildSearchPayload`.
|
|
8
|
+
*
|
|
9
|
+
* @see docs/App Configuration/table.MD
|
|
10
|
+
* @version v.0.2 (12/06/2026)
|
|
7
11
|
*/
|
|
8
12
|
export class typeTableConfiguration extends typeAppConfiguration
|
|
9
13
|
{
|
|
10
14
|
/**
|
|
11
|
-
*
|
|
15
|
+
* Список колонок секции.
|
|
16
|
+
* @type {import('./typeTableColumn.js').typeTableColumn[]|undefined}
|
|
12
17
|
*/
|
|
13
18
|
columns;
|
|
14
19
|
|
|
15
20
|
/**
|
|
16
|
-
*
|
|
21
|
+
* Шаблон объекта поиска (`typeFOR`) для листингов.
|
|
22
|
+
* Фильтры с `value: false` гидратируются в web_app через `buildSearchPayload`.
|
|
23
|
+
* @type {import('./typeFOR.js').typeFOR|false|undefined}
|
|
17
24
|
*/
|
|
18
25
|
for;
|
|
19
26
|
|
|
20
27
|
|
|
21
28
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
29
|
+
* Тип вложенной сущности для контекстных таблиц (например todo внутри project).
|
|
30
|
+
* @type {string|false|undefined}
|
|
24
31
|
*/
|
|
25
32
|
contained_element_type;
|
|
26
33
|
|
|
27
34
|
|
|
28
35
|
|
|
29
36
|
/**
|
|
30
|
-
*
|
|
37
|
+
* Ссылки на внешнюю документацию секции (зарезервировано).
|
|
31
38
|
* @type {{link: false|string, description: false|string}}
|
|
32
39
|
*/
|
|
33
40
|
documentation = {
|
|
@@ -37,6 +44,9 @@ export class typeTableConfiguration extends typeAppConfiguration
|
|
|
37
44
|
|
|
38
45
|
|
|
39
46
|
|
|
47
|
+
/**
|
|
48
|
+
* @param {Partial<typeTableConfiguration>|false} [data=false]
|
|
49
|
+
*/
|
|
40
50
|
constructor(data = false)
|
|
41
51
|
{
|
|
42
52
|
super();
|
|
@@ -53,4 +63,4 @@ export class typeTableConfiguration extends typeAppConfiguration
|
|
|
53
63
|
|
|
54
64
|
return this;
|
|
55
65
|
}
|
|
56
|
-
}
|
|
66
|
+
}
|