@cqa-lib/cqa-ui 1.1.199 → 1.1.200

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.
Files changed (25) hide show
  1. package/esm2020/lib/test-case-details/condition-step/condition-step.component.mjs +1 -1
  2. package/esm2020/lib/test-case-details/element-list/element-list.component.mjs +67 -5
  3. package/esm2020/lib/test-case-details/element-popup/element-popup-data.mjs +1 -1
  4. package/esm2020/lib/test-case-details/element-popup/element-popup-form-data.mjs +2 -0
  5. package/esm2020/lib/test-case-details/element-popup/element-popup.component.mjs +289 -99
  6. package/esm2020/lib/test-case-details/loop-step/loop-step.component.mjs +1 -1
  7. package/esm2020/lib/test-case-details/normal-step/normal-step.component.mjs +26 -27
  8. package/esm2020/lib/test-case-details/step-group/step-group.component.mjs +1 -1
  9. package/esm2020/lib/test-case-details/test-case-details-renderer/test-case-details-renderer.component.mjs +9 -3
  10. package/esm2020/lib/test-case-details/test-case-step.models.mjs +1 -1
  11. package/esm2020/public-api.mjs +2 -1
  12. package/fesm2015/cqa-lib-cqa-ui.mjs +404 -135
  13. package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
  14. package/fesm2020/cqa-lib-cqa-ui.mjs +390 -133
  15. package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
  16. package/lib/test-case-details/element-list/element-list.component.d.ts +15 -3
  17. package/lib/test-case-details/element-popup/element-popup-data.d.ts +3 -0
  18. package/lib/test-case-details/element-popup/element-popup-form-data.d.ts +22 -0
  19. package/lib/test-case-details/element-popup/element-popup.component.d.ts +72 -19
  20. package/lib/test-case-details/normal-step/normal-step.component.d.ts +1 -0
  21. package/lib/test-case-details/test-case-details-renderer/test-case-details-renderer.component.d.ts +2 -1
  22. package/lib/test-case-details/test-case-step.models.d.ts +7 -0
  23. package/package.json +1 -1
  24. package/public-api.d.ts +1 -0
  25. package/styles.css +1 -1
@@ -1,6 +1,7 @@
1
- import { EventEmitter } from '@angular/core';
1
+ import { EventEmitter, AfterViewInit, OnDestroy, ElementRef, OnChanges, SimpleChanges } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
- export declare class ElementListComponent {
3
+ export declare class ElementListComponent implements AfterViewInit, OnDestroy, OnChanges {
4
+ scrollContainer?: ElementRef<HTMLDivElement>;
4
5
  /** Array of items to display */
5
6
  items: any[];
6
7
  /** Key to access the title property from each item (default: 'title') */
@@ -11,8 +12,15 @@ export declare class ElementListComponent {
11
12
  labelsKey: string;
12
13
  /** Maximum height for the scrollable container (default: '200px') */
13
14
  maxHeight: string;
15
+ /** Whether more items can be loaded */
16
+ hasMore: boolean;
14
17
  /** Emitted when an item is clicked */
15
18
  itemClick: EventEmitter<any>;
19
+ /** Emitted when user scrolls near the bottom and more items should be loaded */
20
+ loadMore: EventEmitter<void>;
21
+ private scrollObserver?;
22
+ /** Skip the first intersection callback (fires immediately when observe() is called) to prevent duplicate API calls on load */
23
+ private skipNextIntersection;
16
24
  /**
17
25
  * Get the value from an item using the specified key
18
26
  */
@@ -21,6 +29,10 @@ export declare class ElementListComponent {
21
29
  * Handle item click
22
30
  */
23
31
  onItemClick(item: any): void;
32
+ ngAfterViewInit(): void;
33
+ ngOnChanges(changes: SimpleChanges): void;
34
+ ngOnDestroy(): void;
35
+ private setupScrollObserver;
24
36
  static ɵfac: i0.ɵɵFactoryDeclaration<ElementListComponent, never>;
25
- static ɵcmp: i0.ɵɵComponentDeclaration<ElementListComponent, "cqa-element-list", never, { "items": "items"; "titleKey": "titleKey"; "selectorKey": "selectorKey"; "labelsKey": "labelsKey"; "maxHeight": "maxHeight"; }, { "itemClick": "itemClick"; }, never, never>;
37
+ static ɵcmp: i0.ɵɵComponentDeclaration<ElementListComponent, "cqa-element-list", never, { "items": "items"; "titleKey": "titleKey"; "selectorKey": "selectorKey"; "labelsKey": "labelsKey"; "maxHeight": "maxHeight"; "hasMore": "hasMore"; }, { "itemClick": "itemClick"; "loadMore": "loadMore"; }, never, never>;
26
38
  }
@@ -10,6 +10,9 @@ export interface ElementPopupDataElements {
10
10
  labels: string[];
11
11
  title: string;
12
12
  selector?: string;
13
+ id?: number;
14
+ screenName?: string;
15
+ screenNameId?: number;
13
16
  }
14
17
  /** Sentinel returned from afterClosed() when user clicked "Edit in depth". */
15
18
  export declare const ELEMENT_POPUP_EDIT_IN_DEPTH: unique symbol;
@@ -0,0 +1,22 @@
1
+ /** Payload emitted when user creates a new element */
2
+ export interface ElementCreatePayload {
3
+ name: string;
4
+ screenNameId?: number;
5
+ screenNameName: string;
6
+ locatorValue: string;
7
+ labels: string[];
8
+ }
9
+ /** Payload emitted when user updates an existing element */
10
+ export interface ElementUpdatePayload {
11
+ elementId: number;
12
+ name: string;
13
+ screenNameId?: number;
14
+ screenNameName: string;
15
+ locatorValue: string;
16
+ labels: string[];
17
+ }
18
+ /** Screen name option for autocomplete */
19
+ export interface ScreenNameOption {
20
+ id?: number;
21
+ name: string;
22
+ }
@@ -1,11 +1,12 @@
1
1
  import { ChangeDetectorRef, EventEmitter, OnChanges, OnInit, SimpleChanges } from '@angular/core';
2
2
  import { ElementPopupData, ElementPopupDataElements } from './element-popup-data';
3
+ import { ElementCreatePayload, ElementUpdatePayload, ScreenNameOption } from './element-popup-form-data';
3
4
  import { ElementPopupRef } from './../element-popup/element-popup-ref';
4
5
  import { FormBuilder, FormGroup, FormControl } from '@angular/forms';
5
6
  import { DynamicSelectFieldConfig } from '../../dynamic-select/dynamic-select-field.component';
6
7
  import * as i0 from "@angular/core";
7
8
  export declare class ElementPopupComponent implements OnInit, OnChanges {
8
- private ref;
9
+ private ref?;
9
10
  private readonly cdr?;
10
11
  value: string;
11
12
  helpUrl: string;
@@ -14,47 +15,99 @@ export declare class ElementPopupComponent implements OnInit, OnChanges {
14
15
  elements: ElementPopupDataElements[];
15
16
  enableForm: boolean;
16
17
  isOnRecord: boolean;
18
+ hasMoreElements: boolean;
19
+ /** Element ID when editing existing element */
20
+ elementId?: number;
21
+ /** Screen name options for autocomplete (from API) */
22
+ screenNameOptions: ScreenNameOption[];
23
+ /** Whether more screen names are available for infinite scroll */
24
+ hasMoreScreenNames: boolean;
25
+ /** True while parent is loading screen names (search or load more) */
26
+ isLoadingScreenNames: boolean;
27
+ /** Suggested tags from API for labels field */
28
+ suggestedTags: string[];
29
+ /** True while parent is fetching latest element data for edit (shows loading state) */
30
+ isElementLoading: boolean;
31
+ /** Recent searched items to display in Recent section */
32
+ recentSearchedItems: string[];
17
33
  apply: EventEmitter<string>;
18
34
  cancel: EventEmitter<void>;
19
35
  editInDepth: EventEmitter<void>;
20
- searchElement: EventEmitter<void>;
36
+ searchElement: EventEmitter<string>;
37
+ /** Emitted when user clicks on a recent searched item */
38
+ recentItemClick: EventEmitter<string>;
39
+ loadMoreElements: EventEmitter<void>;
40
+ /** Emitted when user creates a new element (parent should call API) */
41
+ createElement: EventEmitter<ElementCreatePayload>;
42
+ /** Emitted when user updates an element (parent should call API) */
43
+ updateElement: EventEmitter<ElementUpdatePayload>;
44
+ /** Emitted when user requests to create a new screen name */
45
+ createScreenNameRequest: EventEmitter<string>;
46
+ /** Emitted when user searches screen names (server search) */
47
+ searchScreenName: EventEmitter<string>;
48
+ /** Emitted when user scrolls to load more screen names (passes current search query) */
49
+ loadMoreScreenNames: EventEmitter<string>;
50
+ /** Emitted when Create or Edit form is opened - parent should fetch screen names and (for edit) latest element */
51
+ formOpenRequest: EventEmitter<{
52
+ mode: 'create' | 'edit';
53
+ elementId?: number;
54
+ }>;
55
+ /** Emitted when user selects an element from the list - parent should set element and editingElementId for Edit flow */
56
+ elementSelect: EventEmitter<ElementPopupDataElements>;
57
+ /** Emitted when user clicks Record - parent should check extension and call installPlugin or openSidePanelAndListSteps */
58
+ toggleRecord: EventEmitter<void>;
21
59
  form: FormGroup;
22
- /** Tooltip shown when hovering over the "Need help ?" icon and text */
23
60
  helpTooltipText: string;
24
- /** Whether the help tooltip is visible (custom tooltip for use inside overlay) */
25
61
  showHelpTooltip: boolean;
26
- /** Whether we're in edit mode (true) or create mode (false) */
27
62
  isEditMode: boolean;
63
+ /** Whether we're in create mode (no elementId) */
64
+ isCreateMode: boolean;
65
+ /** Labels (tags) as string array for multi-tag input */
66
+ formLabels: string[];
67
+ /** Current tag input value */
68
+ tagInputValue: string;
69
+ /** Current search input value (bound to search bar) */
70
+ searchValue: string;
71
+ /** Config for screen name dynamic-select (server search, allowCustomValue, infinite scroll) */
72
+ screenNameSelectConfig: DynamicSelectFieldConfig;
73
+ /** Whether we're saving (disable buttons) */
74
+ saving: boolean;
28
75
  private injectedData?;
29
76
  private fb;
30
- /** Cached select options to avoid recomputing on every change detection */
31
- private cachedSelectOptions;
32
- /** Cached select config to avoid recreating on every change detection */
33
- private cachedSelectConfig?;
34
- constructor(ref: ElementPopupRef, data?: ElementPopupData, fb?: FormBuilder, cdr?: ChangeDetectorRef);
77
+ constructor(ref?: ElementPopupRef, data?: ElementPopupData, fb?: FormBuilder, cdr?: ChangeDetectorRef);
35
78
  ngOnChanges(changes: SimpleChanges): void;
36
79
  ngOnInit(): void;
37
80
  private initializeForm;
81
+ private updateScreenNameSelectConfig;
38
82
  private populateFormForEdit;
83
+ private populateFormForCreateWithElement;
39
84
  private resetForm;
85
+ /** Called by parent when a new screen name was created (so we can set the selected value) */
86
+ setCreatedScreenName(opt: {
87
+ id: number;
88
+ name: string;
89
+ }): void;
40
90
  onApply(): void;
91
+ onCreateOrUpdateSuccess(): void;
92
+ onCreateOrUpdateError(): void;
41
93
  toggleForm(): void;
42
- /** Called when "Create New" button is clicked - explicitly sets create mode */
43
94
  openCreateForm(): void;
44
- toggleRecord(): void;
95
+ onToggleRecordClick(): void;
45
96
  onCancel(): void;
46
97
  onClose(): void;
47
98
  onEditInDepth(event: Event): void;
48
- search(event: any): void;
99
+ search(event: string): void;
49
100
  onHelp(event: Event): void;
50
- onVariableValueChange(variableName: string, value: any): void;
51
- /** Update cached select options when labels change */
52
- private updateSelectOptions;
53
- getSelectConfig(): DynamicSelectFieldConfig;
54
101
  getFormControl(controlName: string): FormControl;
55
102
  getFormControlValue(controlName: string): string;
56
103
  onFormControlChange(controlName: string, value: string): void;
104
+ /** Add a tag (label) */
105
+ addTag(tag?: string): void;
106
+ removeTag(tag: string): void;
107
+ onTagInputKeydown(event: KeyboardEvent): void;
57
108
  onElementClick(element: ElementPopupDataElements): void;
58
- static ɵfac: i0.ɵɵFactoryDeclaration<ElementPopupComponent, [null, { optional: true; }, { optional: true; }, { optional: true; }]>;
59
- static ɵcmp: i0.ɵɵComponentDeclaration<ElementPopupComponent, "cqa-element-popup", never, { "value": "value"; "helpUrl": "helpUrl"; "labels": "labels"; "element": "element"; "elements": "elements"; "enableForm": "enableForm"; "isOnRecord": "isOnRecord"; }, { "apply": "apply"; "cancel": "cancel"; "editInDepth": "editInDepth"; "searchElement": "searchElement"; }, never, never>;
109
+ onLoadMoreElements(): void;
110
+ onRecentItemClick(item: string): void;
111
+ static ɵfac: i0.ɵɵFactoryDeclaration<ElementPopupComponent, [{ optional: true; }, { optional: true; }, { optional: true; }, { optional: true; }]>;
112
+ static ɵcmp: i0.ɵɵComponentDeclaration<ElementPopupComponent, "cqa-element-popup", never, { "value": "value"; "helpUrl": "helpUrl"; "labels": "labels"; "element": "element"; "elements": "elements"; "enableForm": "enableForm"; "isOnRecord": "isOnRecord"; "hasMoreElements": "hasMoreElements"; "elementId": "elementId"; "screenNameOptions": "screenNameOptions"; "hasMoreScreenNames": "hasMoreScreenNames"; "isLoadingScreenNames": "isLoadingScreenNames"; "suggestedTags": "suggestedTags"; "isElementLoading": "isElementLoading"; "recentSearchedItems": "recentSearchedItems"; }, { "apply": "apply"; "cancel": "cancel"; "editInDepth": "editInDepth"; "searchElement": "searchElement"; "recentItemClick": "recentItemClick"; "loadMoreElements": "loadMoreElements"; "createElement": "createElement"; "updateElement": "updateElement"; "createScreenNameRequest": "createScreenNameRequest"; "searchScreenName": "searchScreenName"; "loadMoreScreenNames": "loadMoreScreenNames"; "formOpenRequest": "formOpenRequest"; "elementSelect": "elementSelect"; "toggleRecord": "toggleRecord"; }, never, never>;
60
113
  }
@@ -17,6 +17,7 @@ export declare class TestCaseNormalStepComponent implements OnInit {
17
17
  testDataTrigger?: ElementRef<HTMLElement>;
18
18
  editTrigger?: ElementRef<HTMLElement>;
19
19
  elementTrigger?: ElementRef<HTMLElement>;
20
+ clickElementTrigger?: ElementRef<HTMLElement>;
20
21
  config: NormalStepConfig;
21
22
  stepNumber: number | string;
22
23
  action: string;
@@ -15,6 +15,7 @@ export declare class TestCaseDetailsRendererComponent implements OnChanges, Afte
15
15
  /** When true, enables drag-and-drop reordering and shows drag handle icon instead of checkbox */
16
16
  isReorder: boolean;
17
17
  addStepBetween: boolean;
18
+ action?: string;
18
19
  nestedStepChange: EventEmitter<{
19
20
  step: TestCaseStepConfig;
20
21
  index: number;
@@ -102,5 +103,5 @@ export declare class TestCaseDetailsRendererComponent implements OnChanges, Afte
102
103
  private wireOutputs;
103
104
  ngOnDestroy(): void;
104
105
  static ɵfac: i0.ɵɵFactoryDeclaration<TestCaseDetailsRendererComponent, never>;
105
- static ɵcmp: i0.ɵɵComponentDeclaration<TestCaseDetailsRendererComponent, "cqa-test-case-details-renderer", never, { "step": "step"; "index": "index"; "isNested": "isNested"; "isInsideLoop": "isInsideLoop"; "branch": "branch"; "isReorder": "isReorder"; "addStepBetween": "addStepBetween"; "dataProfileOptions": "dataProfileOptions"; "hasMoreDataProfiles": "hasMoreDataProfiles"; "isLoadingDataProfiles": "isLoadingDataProfiles"; "naturalTextActionsOptions": "naturalTextActionsOptions"; "setConditionTemplateVariables": "setConditionTemplateVariables"; }, { "nestedStepChange": "nestedStepChange"; "addStep": "addStep"; "deleteStep": "deleteStep"; "toggleExpanded": "toggleExpanded"; "groupNameChange": "groupNameChange"; "descriptionChange": "descriptionChange"; "reusableChange": "reusableChange"; "openExternal": "openExternal"; "edit": "edit"; "link": "link"; "duplicate": "duplicate"; "delete": "delete"; "viewDetails": "viewDetails"; "selectionChange": "selectionChange"; "conditionChange": "conditionChange"; "branchStepChange": "branchStepChange"; "addStepForBranch": "addStepForBranch"; "deleteStepWithBranch": "deleteStepWithBranch"; "addBranch": "addBranch"; "addElse": "addElse"; "deleteBranch": "deleteBranch"; "testDataProfileChange": "testDataProfileChange"; "startStepChange": "startStepChange"; "endStepChange": "endStepChange"; "maxIterationsChange": "maxIterationsChange"; "eventTypeChange": "eventTypeChange"; "parameterChange": "parameterChange"; "clickAction": "clickAction"; "dndDropInZone": "dndDropInZone"; "loadMoreDataProfiles": "loadMoreDataProfiles"; "searchDataProfiles": "searchDataProfiles"; "stepUpdate": "stepUpdate"; "addStepBetweenClick": "addStepBetweenClick"; }, never, never>;
106
+ static ɵcmp: i0.ɵɵComponentDeclaration<TestCaseDetailsRendererComponent, "cqa-test-case-details-renderer", never, { "step": "step"; "index": "index"; "isNested": "isNested"; "isInsideLoop": "isInsideLoop"; "branch": "branch"; "isReorder": "isReorder"; "addStepBetween": "addStepBetween"; "action": "action"; "dataProfileOptions": "dataProfileOptions"; "hasMoreDataProfiles": "hasMoreDataProfiles"; "isLoadingDataProfiles": "isLoadingDataProfiles"; "naturalTextActionsOptions": "naturalTextActionsOptions"; "setConditionTemplateVariables": "setConditionTemplateVariables"; }, { "nestedStepChange": "nestedStepChange"; "addStep": "addStep"; "deleteStep": "deleteStep"; "toggleExpanded": "toggleExpanded"; "groupNameChange": "groupNameChange"; "descriptionChange": "descriptionChange"; "reusableChange": "reusableChange"; "openExternal": "openExternal"; "edit": "edit"; "link": "link"; "duplicate": "duplicate"; "delete": "delete"; "viewDetails": "viewDetails"; "selectionChange": "selectionChange"; "conditionChange": "conditionChange"; "branchStepChange": "branchStepChange"; "addStepForBranch": "addStepForBranch"; "deleteStepWithBranch": "deleteStepWithBranch"; "addBranch": "addBranch"; "addElse": "addElse"; "deleteBranch": "deleteBranch"; "testDataProfileChange": "testDataProfileChange"; "startStepChange": "startStepChange"; "endStepChange": "endStepChange"; "maxIterationsChange": "maxIterationsChange"; "eventTypeChange": "eventTypeChange"; "parameterChange": "parameterChange"; "clickAction": "clickAction"; "dndDropInZone": "dndDropInZone"; "loadMoreDataProfiles": "loadMoreDataProfiles"; "searchDataProfiles": "searchDataProfiles"; "stepUpdate": "stepUpdate"; "addStepBetweenClick": "addStepBetweenClick"; }, never, never>;
106
107
  }
@@ -43,11 +43,18 @@ export interface BaseStepConfig {
43
43
  selected?: boolean;
44
44
  disabled?: boolean;
45
45
  expanded?: boolean;
46
+ event?: Record<string, unknown>;
46
47
  }
47
48
  export interface NormalStepConfig extends BaseStepConfig {
48
49
  stepType: StepTypes.NORMAL;
49
50
  eventType: TestCaseEventType;
50
51
  parameters: StepParameter[];
52
+ elementData?: {
53
+ label?: string;
54
+ selector?: string;
55
+ pwLocator?: string[];
56
+ labels?: string[];
57
+ };
51
58
  }
52
59
  /** API Step Configuration */
53
60
  export interface ApiStepConfig extends BaseStepConfig {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cqa-lib/cqa-ui",
3
- "version": "1.1.199",
3
+ "version": "1.1.200",
4
4
  "description": "UI Kit library for Angular 13.4",
5
5
  "keywords": [
6
6
  "angular",
package/public-api.d.ts CHANGED
@@ -122,6 +122,7 @@ export * from './lib/step-builder/step-builder-loop/step-builder-loop.component'
122
122
  export * from './lib/test-case-details/element-popup/element-popup.component';
123
123
  export * from './lib/test-case-details/element-popup/element-popup-ref';
124
124
  export * from './lib/test-case-details/element-popup/element-popup-data';
125
+ export * from './lib/test-case-details/element-popup/element-popup-form-data';
125
126
  export * from './lib/test-case-details/element-popup/element-popup.service';
126
127
  export * from './lib/step-builder/step-builder-condition/step-builder-condition.component';
127
128
  export * from './lib/step-builder/step-builder-database/step-builder-database.component';