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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "complexqa_frontend_core",
3
- "version": "1.17.12",
3
+ "version": "1.18.1",
4
4
  "description": "core of web ",
5
5
  "type": "module",
6
6
  "exports": {
@@ -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
- * @param {familyGeneralElement} model
21
- * @param {string} locale
22
- * @param {string} field
23
- * @param {object} overrides
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
- * @param {familyGeneralElement} model
43
- * @param {string} locale
44
- * @param {object} overrides
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
- * @param {familyGeneralElement} model
65
- * @param {string} locale
66
- * @param {object} overrides
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
- * @param {familyGeneralElement} model
125
+ * Колонка primary key (часто скрытая в listing, видимая в todo).
126
+ *
127
+ * @param {import('../../../types/core/0_familyGeneralElement.js').familyGeneralElement} model
89
128
  * @param {string} locale
90
- * @param {object} overrides
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
- * @param {familyGeneralElement} model
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 {object} overrides
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
- * @param {{ config: typeTableConfiguration }} section
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
- * @param {object} config
8
- * @param {string} element_type
9
- * @param {string} section
10
- * @param {typeTableColumn[]} columns
11
- * @param {object} options
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
- * @param {string} attribute
35
- * @returns {typeFilter}
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
- * @param {string[]} filter_attributes
49
- * @param {object|false} for_options
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
- * Модели сущностей для таблиц (row id, перевод заголовков колонок).
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 : typeTestAccount,
22
- team_member : typeTeamMember,
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
- * @version v.0.2 (12/06/2026)
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
- * @param {string} element_type
14
- * @param {string} section
15
- * @param {string} lang
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
- * @param lang
37
- * @returns {{}}
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
- * @param element_type
58
- * @returns {function(*): number}
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
- * Реестр конфигураций таблиц (ag-grid).
16
+ * Реестр конфигураций таблиц ag-grid.
16
17
  *
17
- * @version v.0.2 (12/06/2026)
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
- * @param init_options
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
- * @param {string} element_type
48
- * @param {string} section
49
- * @param {string} lang
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
- * @version v.0.1 (26/04/2025)
6
- */
7
- export class typeTableColumn extends familyService
8
- {
9
- header_name;
10
- field;
11
- width;
12
- sort_order;
13
- cell_classes;
14
- default_sort;
15
- is_sortable;
16
- is_filter;
17
- is_hide;
18
- is_editable;
19
-
20
- /**
21
- * Семантический тип колонки для фабрики ColDef (этап 3).
22
- * @type {'data'|'row_select'|'goto'|'sort_action'|'copy'}
23
- */
24
- column_kind = 'data';
25
-
26
- /**
27
- * Обязательное поле при создании/редактировании строки.
28
- */
29
- is_required = false;
30
-
31
- /**
32
- * Поле-заголовок сущности (например test_case_title).
33
- */
34
- is_title = false;
35
-
36
- /**
37
- * Тип сущности для перевода header_name, если отличается от основной.
38
- */
39
- header_element_type = false;
40
-
41
- /**
42
- * Имя атрибута для перевода заголовка (если отличается от field).
43
- */
44
- header_field = false;
45
-
46
-
47
- constructor(data = false)
48
- {
49
- super();
50
- if (data && typeof data === 'object')
51
- {
52
- _.mapObject(data, (value, key) =>
53
- {
54
- if (this.hasOwnProperty(key))
55
- {
56
- this [ key ] = value;
57
- }
58
- });
59
- }
60
-
61
- return this;
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
- * Настройки таблиц (aggrid)
4
+ * Конфигурация одной секции таблицы (набор колонок + поиск).
5
5
  *
6
- * @version v.0.1 (26/04/2025)
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
- * @type {array<typeTableColumn>}
15
+ * Список колонок секции.
16
+ * @type {import('./typeTableColumn.js').typeTableColumn[]|undefined}
12
17
  */
13
18
  columns;
14
19
 
15
20
  /**
16
- * @type {array<typeFOR>}
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
+ }