complexqa_frontend_core 1.18.1 → 1.18.3

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.18.1",
3
+ "version": "1.18.3",
4
4
  "description": "core of web ",
5
5
  "type": "module",
6
6
  "exports": {
@@ -10,7 +10,6 @@ const FK_FIELDS = [
10
10
  'device_context_id',
11
11
  'locale_context_id',
12
12
  'deployment_target_context_id',
13
- 'test_account_id',
14
13
  ];
15
14
 
16
15
  function build_execution_context_listing_columns(locale)
@@ -43,8 +42,6 @@ function build_execution_context_details_columns(locale)
43
42
  'host',
44
43
  'base_url',
45
44
  'build_version',
46
- 'context_snapshot',
47
- 'custom_field_values',
48
45
  'created_at',
49
46
  'updated_at',
50
47
  ];
@@ -1,4 +1,5 @@
1
1
  import { clone_object, echo, in_array, is_array } from "../../utils/utils.js";
2
+ import { is_type_class_token, resolve_type_class } from "./type_class_resolver.js";
2
3
 
3
4
  /**
4
5
  * Базовый абстрактный класс для всех типов
@@ -156,6 +157,72 @@ export class familyGeneralElement
156
157
  }
157
158
 
158
159
 
160
+ /**
161
+ * Токен целевого типа для FK/reference-атрибута (`typeBrowserContext`, …).
162
+ *
163
+ * @param {string} attribute
164
+ * @returns {string|false}
165
+ */
166
+ get_attribute_reference_type_token(attribute)
167
+ {
168
+ const scheme = this.get_attribute_structure_scheme(attribute);
169
+
170
+ if (!scheme)
171
+ {
172
+ return false;
173
+ }
174
+
175
+ for (const rule of scheme)
176
+ {
177
+ if (!is_type_class_token(rule))
178
+ {
179
+ continue;
180
+ }
181
+
182
+ const TypeClass = resolve_type_class(rule);
183
+ const probe = new TypeClass();
184
+
185
+ if (typeof probe.get_reference_meta === 'function')
186
+ {
187
+ return rule;
188
+ }
189
+ }
190
+
191
+ return false;
192
+ }
193
+
194
+
195
+ /**
196
+ * @param {string} attribute
197
+ * @returns {boolean}
198
+ */
199
+ is_reference_attribute(attribute)
200
+ {
201
+ return Boolean(this.get_attribute_reference_type_token(attribute));
202
+ }
203
+
204
+
205
+ /**
206
+ * Метаданные reference из целевого типа (api, primary_key, search, scope_filters).
207
+ *
208
+ * @param {string} attribute
209
+ * @returns {object|false}
210
+ */
211
+ get_attribute_reference_meta(attribute)
212
+ {
213
+ const token = this.get_attribute_reference_type_token(attribute);
214
+
215
+ if (!token)
216
+ {
217
+ return false;
218
+ }
219
+
220
+ const TypeClass = resolve_type_class(token);
221
+
222
+ return new TypeClass().get_reference_meta();
223
+ }
224
+
225
+
159
226
  /**
160
227
  *
161
228
  * @version v.0.1 (26/05/2024)
@@ -31,6 +31,23 @@ export class familyContext extends familyGeneralElement
31
31
  */
32
32
  context_axis = false;
33
33
 
34
+ /** @type {'reference'} */
35
+ static reference_api_namespace = 'reference';
36
+
37
+ static reference_label_key = 'context_name';
38
+
39
+ static reference_search = {
40
+ attribute: 'context_name',
41
+ operator : 'LIKE',
42
+ };
43
+
44
+ static reference_scope_filters = [ 'project_id' ];
45
+
46
+ reference_api_namespace = familyContext.reference_api_namespace;
47
+ reference_label_key = familyContext.reference_label_key;
48
+ reference_search = familyContext.reference_search;
49
+ reference_scope_filters = familyContext.reference_scope_filters;
50
+
34
51
  available_enum_values = familyContext.get_base_available_enum_values();
35
52
 
36
53
  enum_value_translate_matrix = familyContext.get_base_enum_value_translate_matrix();
@@ -78,6 +95,39 @@ export class familyContext extends familyGeneralElement
78
95
  }
79
96
 
80
97
 
98
+ /**
99
+ * Метаданные для live search / выбора записи справочника как FK.
100
+ *
101
+ * @returns {object|false}
102
+ */
103
+ get_reference_meta()
104
+ {
105
+ if (!this.reference_api_key)
106
+ {
107
+ return false;
108
+ }
109
+
110
+ return {
111
+ type_token : this.constructor.name,
112
+ api_namespace : this.reference_api_namespace,
113
+ api_key : this.reference_api_key,
114
+ primary_key : this.primary_key,
115
+ label_key : this.reference_label_key,
116
+ search : { ...this.reference_search },
117
+ scope_filters : [ ...this.reference_scope_filters ],
118
+ };
119
+ }
120
+
121
+
122
+ /**
123
+ * @returns {string}
124
+ */
125
+ get_element_name()
126
+ {
127
+ return this.context_name || String(this?.[ this.primary_key ] ?? '');
128
+ }
129
+
130
+
81
131
  /**
82
132
  * Общие поля записи справочника (добавляются в structure_scheme наследников).
83
133
  *
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Реестр токен → класс. Заполняется из файлов типов через register_type_class().
3
+ * Метаданные reference живут в классе; здесь только резолв имени.
4
+ *
5
+ * @type {Object<string, typeof import('./0_familyGeneralElement.js').familyGeneralElement>}
6
+ */
7
+ export const TYPE_CLASS_MAP = {};
8
+
9
+
10
+ /**
11
+ * @param {string} token
12
+ * @param {typeof import('./0_familyGeneralElement.js').familyGeneralElement} TypeClass
13
+ * @returns {void}
14
+ */
15
+ export function register_type_class(token, TypeClass)
16
+ {
17
+ TYPE_CLASS_MAP[ token ] = TypeClass;
18
+ }
19
+
20
+
21
+ /**
22
+ * @param {string} token
23
+ * @returns {typeof import('./0_familyGeneralElement.js').familyGeneralElement|false}
24
+ */
25
+ export function resolve_type_class(token)
26
+ {
27
+ return TYPE_CLASS_MAP?.[ token ] || false;
28
+ }
29
+
30
+
31
+ /**
32
+ * @param {string} rule
33
+ * @returns {boolean}
34
+ */
35
+ export function is_type_class_token(rule)
36
+ {
37
+ return typeof rule === 'string' && rule.startsWith('type') && Boolean(TYPE_CLASS_MAP?.[ rule ]);
38
+ }
@@ -1,5 +1,6 @@
1
1
  import { familyContext } from "../core/1_familyContext.js";
2
2
  import { is_object } from "../../utils/utils.js";
3
+ import { register_type_class } from "../core/type_class_resolver.js";
3
4
 
4
5
 
5
6
  /**
@@ -19,6 +20,7 @@ export class typeBrowserContext extends familyContext
19
20
 
20
21
  primary_key = 'browser_context_id';
21
22
  api_key = 'browser_context';
23
+ reference_api_key = 'context_browser';
22
24
 
23
25
  structure_scheme = {
24
26
  browser_context_id: 'integer | require',
@@ -57,3 +59,5 @@ export class typeBrowserContext extends familyContext
57
59
  return this;
58
60
  }
59
61
  }
62
+
63
+ register_type_class('typeBrowserContext', typeBrowserContext);
@@ -1,5 +1,6 @@
1
1
  import { familyContext } from "../core/1_familyContext.js";
2
2
  import { is_object } from "../../utils/utils.js";
3
+ import { register_type_class } from "../core/type_class_resolver.js";
3
4
 
4
5
 
5
6
  /**
@@ -19,6 +20,7 @@ export class typeDeploymentTargetContext extends familyContext
19
20
 
20
21
  primary_key = 'deployment_target_context_id';
21
22
  api_key = 'deployment_target_context';
23
+ reference_api_key = 'context_deployment_target';
22
24
 
23
25
  structure_scheme = {
24
26
  deployment_target_context_id: 'integer | require',
@@ -96,3 +98,5 @@ export class typeDeploymentTargetContext extends familyContext
96
98
  return this;
97
99
  }
98
100
  }
101
+
102
+ register_type_class('typeDeploymentTargetContext', typeDeploymentTargetContext);
@@ -1,5 +1,6 @@
1
1
  import { familyContext } from "../core/1_familyContext.js";
2
2
  import { is_object } from "../../utils/utils.js";
3
+ import { register_type_class } from "../core/type_class_resolver.js";
3
4
 
4
5
 
5
6
  /**
@@ -19,6 +20,7 @@ export class typeDeviceContext extends familyContext
19
20
 
20
21
  primary_key = 'device_context_id';
21
22
  api_key = 'device_context';
23
+ reference_api_key = 'context_devices';
22
24
 
23
25
  structure_scheme = {
24
26
  device_context_id: 'integer | require',
@@ -84,3 +86,5 @@ export class typeDeviceContext extends familyContext
84
86
  return this;
85
87
  }
86
88
  }
89
+
90
+ register_type_class('typeDeviceContext', typeDeviceContext);
@@ -5,8 +5,7 @@ import { is_object } from "../../utils/utils.js";
5
5
  /**
6
6
  * Снимок окружения на момент события (баг, результат прогона, автотест).
7
7
  *
8
- * Ссылается на справочники familyContext по FK; context_snapshotзамороженная
9
- * копия для истории (если справочник переименуют). host/base_url — проектный URL.
8
+ * Ссылается на справочники familyContext по FK. host/base_urlпроектный URL.
10
9
  *
11
10
  * @version v.0.1 (03/06/2026)
12
11
  */
@@ -31,10 +30,6 @@ export class typeExecutionContext extends familyGeneralElement
31
30
  base_url;
32
31
  build_version;
33
32
 
34
- context_snapshot;
35
- custom_field_values;
36
- test_account_id;
37
-
38
33
  created_at;
39
34
  updated_at;
40
35
 
@@ -47,19 +42,16 @@ export class typeExecutionContext extends familyGeneralElement
47
42
  team_id : 'integer | require',
48
43
  context_title : 'string | optional',
49
44
  context_description : 'string | StringHtml | optional',
50
- browser_context_id : 'integer | optional',
51
- os_context_id : 'integer | optional',
52
- screen_resolution_context_id: 'integer | optional',
53
- device_context_id : 'integer | optional',
54
- locale_context_id : 'integer | optional',
55
- deployment_target_context_id: 'integer | optional',
45
+ browser_context_id : 'integer | typeBrowserContext | optional',
46
+ os_context_id : 'integer | typeOsContext | optional',
47
+ screen_resolution_context_id: 'integer | typeScreenResolutionContext | optional',
48
+ device_context_id : 'integer | typeDeviceContext | optional',
49
+ locale_context_id : 'integer | typeLocaleContext | optional',
50
+ deployment_target_context_id: 'integer | typeDeploymentTargetContext | optional',
56
51
  protocol : 'string | enum | optional',
57
52
  host : 'string | max:255 | optional',
58
53
  base_url : 'string | max:2048 | optional',
59
54
  build_version : 'string | max:128 | optional',
60
- context_snapshot : 'object | optional',
61
- custom_field_values : 'object | optional',
62
- test_account_id : 'integer | optional',
63
55
  created_at : 'timestamp | require',
64
56
  updated_at : 'timestamp | optional',
65
57
  };
@@ -103,9 +95,6 @@ export class typeExecutionContext extends familyGeneralElement
103
95
  host : 'Host',
104
96
  base_url : 'Base URL',
105
97
  build_version : 'Build version',
106
- context_snapshot : 'Context snapshot',
107
- custom_field_values : 'Custom fields',
108
- test_account_id : 'Test account',
109
98
  created_at : 'Created at',
110
99
  updated_at : 'Updated at',
111
100
  },
@@ -125,9 +114,6 @@ export class typeExecutionContext extends familyGeneralElement
125
114
  host : 'Хост',
126
115
  base_url : 'Базовый URL',
127
116
  build_version : 'Версия сборки',
128
- context_snapshot : 'Снимок контекста',
129
- custom_field_values : 'Доп. поля',
130
- test_account_id : 'Тестовый аккаунт',
131
117
  created_at : 'Создано',
132
118
  updated_at : 'Обновлено',
133
119
  },
@@ -1,5 +1,6 @@
1
1
  import { familyContext } from "../core/1_familyContext.js";
2
2
  import { is_object } from "../../utils/utils.js";
3
+ import { register_type_class } from "../core/type_class_resolver.js";
3
4
 
4
5
 
5
6
  /**
@@ -21,6 +22,7 @@ export class typeLocaleContext extends familyContext
21
22
 
22
23
  primary_key = 'locale_context_id';
23
24
  api_key = 'locale_context';
25
+ reference_api_key = 'context_locale';
24
26
 
25
27
  structure_scheme = {
26
28
  locale_context_id: 'integer | require',
@@ -73,3 +75,5 @@ export class typeLocaleContext extends familyContext
73
75
  return this;
74
76
  }
75
77
  }
78
+
79
+ register_type_class('typeLocaleContext', typeLocaleContext);
@@ -1,5 +1,6 @@
1
1
  import { familyContext } from "../core/1_familyContext.js";
2
2
  import { is_object } from "../../utils/utils.js";
3
+ import { register_type_class } from "../core/type_class_resolver.js";
3
4
 
4
5
 
5
6
  /**
@@ -19,6 +20,7 @@ export class typeOsContext extends familyContext
19
20
 
20
21
  primary_key = 'os_context_id';
21
22
  api_key = 'os_context';
23
+ reference_api_key = 'context_os';
22
24
 
23
25
  structure_scheme = {
24
26
  os_context_id: 'integer | require',
@@ -84,3 +86,5 @@ export class typeOsContext extends familyContext
84
86
  return this;
85
87
  }
86
88
  }
89
+
90
+ register_type_class('typeOsContext', typeOsContext);
@@ -1,5 +1,6 @@
1
1
  import { familyContext } from "../core/1_familyContext.js";
2
2
  import { is_object } from "../../utils/utils.js";
3
+ import { register_type_class } from "../core/type_class_resolver.js";
3
4
 
4
5
 
5
6
  /**
@@ -23,6 +24,7 @@ export class typeScreenResolutionContext extends familyContext
23
24
 
24
25
  primary_key = 'screen_resolution_context_id';
25
26
  api_key = 'screen_resolution_context';
27
+ reference_api_key = 'context_screen_resolution';
26
28
 
27
29
  structure_scheme = {
28
30
  screen_resolution_context_id: 'integer | require',
@@ -97,3 +99,5 @@ export class typeScreenResolutionContext extends familyContext
97
99
  return this;
98
100
  }
99
101
  }
102
+
103
+ register_type_class('typeScreenResolutionContext', typeScreenResolutionContext);