@cqa-lib/cqa-ui 1.1.269 → 1.1.270

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.
@@ -9238,6 +9238,7 @@ class BasicStepComponent extends BaseStepComponent {
9238
9238
  : (subStep.value ? parseFloat(subStep.value) : 30);
9239
9239
  this.clearCountdownTimer();
9240
9240
  this.waitLocatorGroupEntry = Object.assign(Object.assign({}, subStep), { remainingSeconds: timeoutSeconds, status: 'running' });
9241
+ this.addDurationToWaitLocatorGroupEntry(subStep);
9241
9242
  this.processedSubSteps.push(this.waitLocatorGroupEntry);
9242
9243
  // Tick down every second
9243
9244
  this.countdownIntervalId = setInterval(() => {
@@ -9267,6 +9268,7 @@ class BasicStepComponent extends BaseStepComponent {
9267
9268
  const newText = subStep.description || subStep.text || subStep.title;
9268
9269
  if (newText)
9269
9270
  this.waitLocatorGroupEntry.description = newText;
9271
+ this.addDurationToWaitLocatorGroupEntry(subStep);
9270
9272
  }
9271
9273
  else {
9272
9274
  // No active group – push FIND_LOCATOR normally once countdown is cleared
@@ -9290,6 +9292,7 @@ class BasicStepComponent extends BaseStepComponent {
9290
9292
  if (newText)
9291
9293
  this.waitLocatorGroupEntry.description = newText;
9292
9294
  this.waitLocatorGroupEntry.status = 'success';
9295
+ this.addDurationToWaitLocatorGroupEntry(subStep);
9293
9296
  this.waitLocatorGroupEntry.remainingSeconds = null;
9294
9297
  this.clearCountdownTimer();
9295
9298
  this.waitLocatorGroupEntry = null;
@@ -9366,6 +9369,33 @@ class BasicStepComponent extends BaseStepComponent {
9366
9369
  this.countdownIntervalId = null;
9367
9370
  }
9368
9371
  }
9372
+ addDurationToWaitLocatorGroupEntry(subStep) {
9373
+ if (!this.waitLocatorGroupEntry) {
9374
+ return;
9375
+ }
9376
+ const rawDuration = subStep === null || subStep === void 0 ? void 0 : subStep.duration;
9377
+ let delta = 0;
9378
+ if (typeof rawDuration === 'number') {
9379
+ delta = rawDuration;
9380
+ }
9381
+ else if (typeof rawDuration === 'string' && rawDuration.trim() !== '') {
9382
+ const parsed = parseFloat(rawDuration);
9383
+ delta = Number.isFinite(parsed) ? parsed : 0;
9384
+ }
9385
+ if (delta <= 0) {
9386
+ return;
9387
+ }
9388
+ const currentRaw = this.waitLocatorGroupEntry.duration;
9389
+ let current = 0;
9390
+ if (typeof currentRaw === 'number') {
9391
+ current = currentRaw;
9392
+ }
9393
+ else if (typeof currentRaw === 'string' && currentRaw.trim() !== '') {
9394
+ const parsedCurrent = parseFloat(currentRaw);
9395
+ current = Number.isFinite(parsedCurrent) ? parsedCurrent : 0;
9396
+ }
9397
+ this.waitLocatorGroupEntry.duration = current + delta;
9398
+ }
9369
9399
  processSubStepsForRunResult() {
9370
9400
  var _a, _b, _c, _d, _e, _f, _g, _h;
9371
9401
  const allSubSteps = (this.subSteps || []);
@@ -10801,6 +10831,7 @@ class LoopStepComponent extends BaseStepComponent {
10801
10831
  : (subStep.value ? parseFloat(subStep.value) : 30);
10802
10832
  this.clearCountdownTimer();
10803
10833
  this.waitLocatorGroupEntry = Object.assign(Object.assign({}, subStep), { remainingSeconds: timeoutSeconds, status: 'running' });
10834
+ this.addDurationToWaitLocatorGroupEntry(subStep);
10804
10835
  this.processedSubSteps.push(this.waitLocatorGroupEntry);
10805
10836
  // Tick down every second
10806
10837
  this.countdownIntervalId = setInterval(() => {
@@ -10830,6 +10861,7 @@ class LoopStepComponent extends BaseStepComponent {
10830
10861
  const newText = subStep.description || subStep.text || subStep.title;
10831
10862
  if (newText)
10832
10863
  this.waitLocatorGroupEntry.description = newText;
10864
+ this.addDurationToWaitLocatorGroupEntry(subStep);
10833
10865
  }
10834
10866
  else {
10835
10867
  // No active group – push FIND_LOCATOR normally once countdown is cleared
@@ -10853,6 +10885,7 @@ class LoopStepComponent extends BaseStepComponent {
10853
10885
  if (newText)
10854
10886
  this.waitLocatorGroupEntry.description = newText;
10855
10887
  this.waitLocatorGroupEntry.status = 'success';
10888
+ this.addDurationToWaitLocatorGroupEntry(subStep);
10856
10889
  this.waitLocatorGroupEntry.remainingSeconds = null;
10857
10890
  this.clearCountdownTimer();
10858
10891
  this.waitLocatorGroupEntry = null;
@@ -10929,6 +10962,33 @@ class LoopStepComponent extends BaseStepComponent {
10929
10962
  this.countdownIntervalId = null;
10930
10963
  }
10931
10964
  }
10965
+ addDurationToWaitLocatorGroupEntry(subStep) {
10966
+ if (!this.waitLocatorGroupEntry) {
10967
+ return;
10968
+ }
10969
+ const rawDuration = subStep === null || subStep === void 0 ? void 0 : subStep.duration;
10970
+ let delta = 0;
10971
+ if (typeof rawDuration === 'number') {
10972
+ delta = rawDuration;
10973
+ }
10974
+ else if (typeof rawDuration === 'string' && rawDuration.trim() !== '') {
10975
+ const parsed = parseFloat(rawDuration);
10976
+ delta = Number.isFinite(parsed) ? parsed : 0;
10977
+ }
10978
+ if (delta <= 0) {
10979
+ return;
10980
+ }
10981
+ const currentRaw = this.waitLocatorGroupEntry.duration;
10982
+ let current = 0;
10983
+ if (typeof currentRaw === 'number') {
10984
+ current = currentRaw;
10985
+ }
10986
+ else if (typeof currentRaw === 'string' && currentRaw.trim() !== '') {
10987
+ const parsedCurrent = parseFloat(currentRaw);
10988
+ current = Number.isFinite(parsedCurrent) ? parsedCurrent : 0;
10989
+ }
10990
+ this.waitLocatorGroupEntry.duration = current + delta;
10991
+ }
10932
10992
  processSubStepsForRunResult() {
10933
10993
  var _a, _b, _c, _d, _e, _f, _g, _h;
10934
10994
  if (!this.selectedIteration || !this.selectedIteration.subSteps) {
@@ -12970,6 +13030,7 @@ class ApiStepComponent extends BaseStepComponent {
12970
13030
  : (action.value ? parseFloat(action.value) : 30);
12971
13031
  this.clearCountdownTimer();
12972
13032
  this.waitLocatorGroupEntry = Object.assign(Object.assign({}, action), { remainingSeconds: timeoutSeconds, status: 'running' });
13033
+ this.addDurationToWaitLocatorGroupEntry(action);
12973
13034
  this.processedInitialActions.push(this.waitLocatorGroupEntry);
12974
13035
  // Tick down every second
12975
13036
  this.countdownIntervalId = setInterval(() => {
@@ -12999,6 +13060,7 @@ class ApiStepComponent extends BaseStepComponent {
12999
13060
  const newText = action.description || action.text || action.title;
13000
13061
  if (newText)
13001
13062
  this.waitLocatorGroupEntry.description = newText;
13063
+ this.addDurationToWaitLocatorGroupEntry(action);
13002
13064
  }
13003
13065
  else {
13004
13066
  // No active group – push FIND_LOCATOR normally once countdown is cleared
@@ -13022,6 +13084,7 @@ class ApiStepComponent extends BaseStepComponent {
13022
13084
  if (newText)
13023
13085
  this.waitLocatorGroupEntry.description = newText;
13024
13086
  this.waitLocatorGroupEntry.status = 'success';
13087
+ this.addDurationToWaitLocatorGroupEntry(action);
13025
13088
  this.waitLocatorGroupEntry.remainingSeconds = null;
13026
13089
  this.clearCountdownTimer();
13027
13090
  this.waitLocatorGroupEntry = null;
@@ -13098,6 +13161,33 @@ class ApiStepComponent extends BaseStepComponent {
13098
13161
  this.countdownIntervalId = null;
13099
13162
  }
13100
13163
  }
13164
+ addDurationToWaitLocatorGroupEntry(action) {
13165
+ if (!this.waitLocatorGroupEntry) {
13166
+ return;
13167
+ }
13168
+ const rawDuration = action === null || action === void 0 ? void 0 : action.duration;
13169
+ let delta = 0;
13170
+ if (typeof rawDuration === 'number') {
13171
+ delta = rawDuration;
13172
+ }
13173
+ else if (typeof rawDuration === 'string' && rawDuration.trim() !== '') {
13174
+ const parsed = parseFloat(rawDuration);
13175
+ delta = Number.isFinite(parsed) ? parsed : 0;
13176
+ }
13177
+ if (delta <= 0) {
13178
+ return;
13179
+ }
13180
+ const currentRaw = this.waitLocatorGroupEntry.duration;
13181
+ let current = 0;
13182
+ if (typeof currentRaw === 'number') {
13183
+ current = currentRaw;
13184
+ }
13185
+ else if (typeof currentRaw === 'string' && currentRaw.trim() !== '') {
13186
+ const parsedCurrent = parseFloat(currentRaw);
13187
+ current = Number.isFinite(parsedCurrent) ? parsedCurrent : 0;
13188
+ }
13189
+ this.waitLocatorGroupEntry.duration = current + delta;
13190
+ }
13101
13191
  onJumpToTimestamp(event) {
13102
13192
  var _a, _b, _c, _d, _e;
13103
13193
  event.stopPropagation();
@@ -13741,6 +13831,7 @@ class LiveExecutionStepComponent extends BaseStepComponent {
13741
13831
  : (subStep.value ? parseFloat(subStep.value) : 30);
13742
13832
  this.clearCountdownTimer();
13743
13833
  this.waitLocatorGroupEntry = Object.assign(Object.assign({}, subStep), { isRunning: true, remainingSeconds: timeoutSeconds, status: 'pending' });
13834
+ this.addDurationToWaitLocatorGroupEntry(subStep);
13744
13835
  this.processedSubSteps.push(this.waitLocatorGroupEntry);
13745
13836
  // Tick down every second
13746
13837
  this.countdownIntervalId = setInterval(() => {
@@ -13771,6 +13862,7 @@ class LiveExecutionStepComponent extends BaseStepComponent {
13771
13862
  const newText = subStep.text || subStep.description || subStep.title;
13772
13863
  if (newText)
13773
13864
  this.waitLocatorGroupEntry.text = newText;
13865
+ this.addDurationToWaitLocatorGroupEntry(subStep);
13774
13866
  }
13775
13867
  else {
13776
13868
  // No active group – push FIND_LOCATOR normally once countdown is cleared
@@ -13795,6 +13887,7 @@ class LiveExecutionStepComponent extends BaseStepComponent {
13795
13887
  this.waitLocatorGroupEntry.text = newText;
13796
13888
  this.waitLocatorGroupEntry.isRunning = false;
13797
13889
  this.waitLocatorGroupEntry.status = 'success';
13890
+ this.addDurationToWaitLocatorGroupEntry(subStep);
13798
13891
  this.waitLocatorGroupEntry.remainingSeconds = null;
13799
13892
  this.clearCountdownTimer();
13800
13893
  this.waitLocatorGroupEntry = null;
@@ -13874,6 +13967,33 @@ class LiveExecutionStepComponent extends BaseStepComponent {
13874
13967
  this.countdownIntervalId = null;
13875
13968
  }
13876
13969
  }
13970
+ addDurationToWaitLocatorGroupEntry(subStep) {
13971
+ if (!this.waitLocatorGroupEntry) {
13972
+ return;
13973
+ }
13974
+ const rawDuration = subStep === null || subStep === void 0 ? void 0 : subStep.duration;
13975
+ let delta = 0;
13976
+ if (typeof rawDuration === 'number') {
13977
+ delta = rawDuration;
13978
+ }
13979
+ else if (typeof rawDuration === 'string' && rawDuration.trim() !== '') {
13980
+ const parsed = parseFloat(rawDuration);
13981
+ delta = Number.isFinite(parsed) ? parsed : 0;
13982
+ }
13983
+ if (delta <= 0) {
13984
+ return;
13985
+ }
13986
+ const currentRaw = this.waitLocatorGroupEntry.duration;
13987
+ let current = 0;
13988
+ if (typeof currentRaw === 'number') {
13989
+ current = currentRaw;
13990
+ }
13991
+ else if (typeof currentRaw === 'string' && currentRaw.trim() !== '') {
13992
+ const parsedCurrent = parseFloat(currentRaw);
13993
+ current = Number.isFinite(parsedCurrent) ? parsedCurrent : 0;
13994
+ }
13995
+ this.waitLocatorGroupEntry.duration = current + delta;
13996
+ }
13877
13997
  }
13878
13998
  LiveExecutionStepComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: LiveExecutionStepComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
13879
13999
  LiveExecutionStepComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: LiveExecutionStepComponent, selector: "cqa-live-execution-step", inputs: { id: "id", testStepResultId: "testStepResultId", stepNumber: "stepNumber", title: "title", status: "status", isDebug: "isDebug", debugPointSet: "debugPointSet", addStepMenuOptions: "addStepMenuOptions", stepMoreMenuOptions: "stepMoreMenuOptions", duration: "duration", expanded: "expanded", subSteps: "subSteps", stepDeleted: "stepDeleted" }, outputs: { debugPointChange: "debugPointChange", editStep: "editStep", addStepOptionSelect: "addStepOptionSelect", stepMoreOptionSelect: "stepMoreOptionSelect" }, host: { classAttribute: "cqa-ui-root cqa-w-full" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"cqa-font-inter cqa-w-full\">\n <!-- Header -->\n <div\n class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-p-2 cqa-cursor-pointer\"\n (click)=\"toggle()\"\n style=\"border-bottom: '1px solid #F3F4F6'\"\n >\n <div *ngIf=\"showDebugIcon\" class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <button type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer cqa-rounded-full hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" (click)=\"onDebugPointClick($event)\" [attr.aria-label]=\"debugPointSet ? 'Remove debug point' : 'Set debug point'\">\n <svg *ngIf=\"debugPointSet\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" fill=\"#C63535\"/>\n </svg>\n <svg *ngIf=\"!debugPointSet\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"7\" cy=\"7\" r=\"6\" stroke=\"#C63535\" stroke-width=\"1.5\" fill=\"none\"/>\n </svg>\n </button>\n </div>\n <!-- Status Icon -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-center\">\n <!-- Success -->\n <svg *ngIf=\"status.toLowerCase() === 'success'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10.9005 4.99999C11.1289 6.12064 10.9662 7.28571 10.4395 8.30089C9.91279 9.31608 9.054 10.12 8.00631 10.5787C6.95862 11.0373 5.78536 11.1229 4.6822 10.8212C3.57904 10.5195 2.61265 9.84869 1.94419 8.92071C1.27573 7.99272 0.945611 6.86361 1.00888 5.72169C1.07215 4.57976 1.52499 3.49404 2.29188 2.64558C3.05876 1.79712 4.09334 1.23721 5.22308 1.05922C6.35282 0.881233 7.50944 1.09592 8.50005 1.66749\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4.5 5.5L6 7L11 2\" stroke=\"#22C55E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Failed -->\n <svg *ngIf=\"status.toLowerCase() === 'failure' || status.toLowerCase() === 'failed'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4 4L8 8M8 4L4 8\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Pending -->\n <svg *ngIf=\"status.toLowerCase() === 'pending'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M6 3V6L8 7\" stroke=\"#9CA3AF\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n <!-- Running - Show spinner -->\n <svg *ngIf=\"status.toLowerCase() === 'running'\" class=\"cqa-animate-spin cqa-text-[#3B82F6]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" opacity=\"0.25\"/>\n <path d=\"M6 1A5 5 0 0 1 11 6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\"/>\n </svg>\n <!-- Skipped -->\n <span *ngIf=\"status.toLowerCase() === 'skipped'\" class=\"material-symbols-outlined cqa-text-[#9CA3AF] cqa-text-[12px]\">\n skip_next\n </span>\n </div>\n\n <!-- Step Number and Title -->\n <div class=\"cqa-font-semibold cqa-flex-1 cqa-text-[#334155] cqa-text-[14px] cqa-leading-[18px] cqa-font-inter cqa-flex cqa-items-center cqa-gap-1\" style=\"word-break: break-word;\">\n <span>{{ stepNumber }}. <span [innerHTML]=\"title\"></span></span>\n <span *ngIf=\"config.stepDeleted\" class=\"cqa-px-1.5 cqa-py-[2px] cqa-rounded-[4px] cqa-text-[10px] cqa-leading-[12px] cqa-font-medium cqa-text-[#B42318] cqa-bg-[#FEF3F2] cqa-border cqa-border-[#FEE4E2]\">\n Deleted\n </span>\n </div>\n\n <div class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-font-inter\">\n <div *ngIf=\"isDebug\" class=\"cqa-flex cqa-items-center cqa-gap-0.5 cqa-text-[#9CA3AF]\" (click)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"Edit\" (click)=\"onEditStep($event)\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">edit</mat-icon>\n </button>\n <button type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"Add\" [matMenuTriggerFor]=\"addStepMenu\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">add</mat-icon>\n </button>\n <mat-menu #addStepMenu=\"matMenu\" class=\"cqa-add-step-menu\" xPosition=\"before\" yPosition=\"below\">\n <button mat-menu-item *ngFor=\"let opt of addStepMenuOptions\" (click)=\"onAddStepOptionSelect(opt, $event)\">{{ opt.label }}</button>\n </mat-menu>\n <button type=\"button\" class=\"cqa-p-0 cqa-border-0 cqa-bg-transparent cqa-cursor-pointer hover:cqa-opacity-80 cqa-transition-opacity focus:cqa-outline-none\" aria-label=\"More options\" [matMenuTriggerFor]=\"stepMoreMenu\">\n <mat-icon class=\"!cqa-text-[14px] !cqa-w-[14px] !cqa-h-[14px]\">more_vert</mat-icon>\n </button>\n <mat-menu #stepMoreMenu=\"matMenu\" class=\"cqa-step-more-menu\" xPosition=\"before\" yPosition=\"below\">\n <button mat-menu-item *ngFor=\"let opt of stepMoreMenuOptions\" (click)=\"onStepMoreOptionSelect(opt, $event)\">{{ opt.label }}</button>\n </mat-menu>\n </div>\n <span class=\"cqa-text-[12px] cqa-leading-[15px] cqa-text-[#9CA3AF] cqa-font-medium\">\n {{ formatDuration(duration) }}\n </span>\n <svg *ngIf=\"hasSubSteps\" [class.cqa-rotate-180]=\"isExpanded\" class=\"cqa-transition-transform\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M3.5 5L7 8.5L10.5 5\" stroke=\"#9CA3AF\" stroke-width=\"0.833333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>\n </div>\n </div>\n\n <!-- Expanded Content -->\n <div *ngIf=\"isExpanded && hasSubSteps\">\n <!-- Sub-steps -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1 cqa-pt-1 cqa-pl-9\">\n <!-- Single loop: render all entries in chronological order -->\n <ng-container *ngFor=\"let subStep of processedSubSteps; trackBy: trackBySubStepId\">\n <!-- AI_AUTO_HEAL result entries: render with ai-agent-step style -->\n <cqa-ai-logs-with-reasoning\n *ngIf=\"subStep.isAiAutoHealResult\"\n [status]=\"subStep.status\"\n [text]=\"subStep.text\"\n [description]=\"subStep.description\"\n [reasoning]=\"subStep.reasoning\"\n [duration]=\"subStep.duration\">\n </cqa-ai-logs-with-reasoning>\n\n <!-- Regular sub-steps (non-AI_AUTO_HEAL) -->\n <div\n *ngIf=\"!subStep.isAiAutoHealResult\"\n class=\"cqa-flex cqa-items-center cqa-gap-3 cqa-py-[5.5px] cqa-px-3\">\n \n <!-- Sub-step Status Icon or Loader -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-center cqa-w-3 cqa-h-3\">\n <!-- Loader when running -->\n <svg *ngIf=\"subStep.isRunning\" class=\"cqa-animate-spin cqa-text-[#3B82F6]\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"5\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" opacity=\"0.25\"/>\n <path d=\"M6 1A5 5 0 0 1 11 6\" stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\" stroke-linecap=\"round\"/>\n </svg>\n \n <!-- Success Icon when complete -->\n <svg *ngIf=\"!subStep.isRunning && (subStep?.status?.toLowerCase() === 'passed' || subStep?.status?.toLowerCase() === 'success')\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#00A63E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M4.5 6L5.5 7L7.5 5\" stroke=\"#00A63E\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n <svg *ngIf=\"!subStep.isRunning && subStep?.status?.toLowerCase() === 'failed'\" width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6 11C8.76142 11 11 8.76142 11 6C11 3.23858 8.76142 1 6 1C3.23858 1 1 3.23858 1 6C1 8.76142 3.23858 11 6 11Z\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><path d=\"M4 4L8 8M8 4L4 8\" stroke=\"#EF4444\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n </div>\n\n <!-- Sub-step Description (text from socket) with typing animation -->\n <span class=\"cqa-flex-1 cqa-text-[13px] cqa-leading-[15px] cqa-text-[#364153]\" style=\"word-break: break-word;\">\n <span style=\"display: inline-flex; align-items: baseline; flex-wrap: wrap;\">\n <ngx-typed-js \n *ngIf=\"subStep.isRunning && subStep.text\"\n [strings]=\"[subStep.text]\"\n [typeSpeed]=\"30\"\n [showCursor]=\"false\"\n [fadeOut]=\"false\"\n style=\"display: inline;\">\n <span class=\"typing\"></span>\n </ngx-typed-js>\n <span *ngIf=\"!subStep.isRunning\" style=\"display: inline;\">{{ subStep.text }}</span>\n <!-- Countdown remaining for WAIT_FOR_LOCATOR group -->\n <span *ngIf=\"subStep.remainingSeconds != null\" class=\"cqa-text-[#F97316] cqa-font-medium cqa-ml-1\" style=\"display: inline;\">({{ subStep.remainingSeconds }}s remaining)</span>\n </span>\n </span>\n <span class=\"cqa-text-[10px] cqa-leading-[15px] cqa-text-[#6A7282] cqa-font-medium\" style=\"white-space: pre-line;\">\n {{ formatDuration(subStep.duration || 0) }}\n </span>\n </div>\n </ng-container>\n </div>\n </div>\n</div>\n\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2$1.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: i2$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { type: AiLogsWithReasoningComponent, selector: "cqa-ai-logs-with-reasoning", inputs: ["status", "text", "description", "reasoning", "duration"] }, { type: i4$1.NgxTypedJsComponent, selector: "ngx-typed-js", inputs: ["cursorColor", "strings", "stringsElement", "typeSpeed", "startDelay", "backSpeed", "smartBackspace", "shuffle", "backDelay", "fadeOut", "fadeOutClass", "fadeOutDelay", "loop", "loopCount", "showCursor", "cursorChar", "autoInsertCss", "attr", "bindInputFocusEvents", "contentType"], outputs: ["completed", "preStringTyped", "stringTyped", "lastStringBackspaced", "typingPaused", "typingResumed", "reset", "stopped", "started", "destroyed"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2$1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
@@ -18628,6 +18748,7 @@ class DbVerificationStepComponent extends BaseStepComponent {
18628
18748
  : (subStep.value ? parseFloat(subStep.value) : 30);
18629
18749
  this.clearCountdownTimer();
18630
18750
  this.waitLocatorGroupEntry = Object.assign(Object.assign({}, subStep), { remainingSeconds: timeoutSeconds, status: 'running' });
18751
+ this.addDurationToWaitLocatorGroupEntry(subStep);
18631
18752
  this.processedSubSteps.push(this.waitLocatorGroupEntry);
18632
18753
  this.countdownIntervalId = setInterval(() => {
18633
18754
  if (this.waitLocatorGroupEntry) {
@@ -18654,6 +18775,7 @@ class DbVerificationStepComponent extends BaseStepComponent {
18654
18775
  const newText = subStep.description || subStep.text || subStep.title;
18655
18776
  if (newText)
18656
18777
  this.waitLocatorGroupEntry.description = newText;
18778
+ this.addDurationToWaitLocatorGroupEntry(subStep);
18657
18779
  }
18658
18780
  else {
18659
18781
  this.processedSubSteps.push(Object.assign({}, subStep));
@@ -18674,6 +18796,7 @@ class DbVerificationStepComponent extends BaseStepComponent {
18674
18796
  if (newText)
18675
18797
  this.waitLocatorGroupEntry.description = newText;
18676
18798
  this.waitLocatorGroupEntry.status = 'success';
18799
+ this.addDurationToWaitLocatorGroupEntry(subStep);
18677
18800
  this.waitLocatorGroupEntry.remainingSeconds = null;
18678
18801
  this.clearCountdownTimer();
18679
18802
  this.waitLocatorGroupEntry = null;
@@ -18742,6 +18865,33 @@ class DbVerificationStepComponent extends BaseStepComponent {
18742
18865
  this.countdownIntervalId = null;
18743
18866
  }
18744
18867
  }
18868
+ addDurationToWaitLocatorGroupEntry(subStep) {
18869
+ if (!this.waitLocatorGroupEntry) {
18870
+ return;
18871
+ }
18872
+ const rawDuration = subStep === null || subStep === void 0 ? void 0 : subStep.duration;
18873
+ let delta = 0;
18874
+ if (typeof rawDuration === 'number') {
18875
+ delta = rawDuration;
18876
+ }
18877
+ else if (typeof rawDuration === 'string' && rawDuration.trim() !== '') {
18878
+ const parsed = parseFloat(rawDuration);
18879
+ delta = Number.isFinite(parsed) ? parsed : 0;
18880
+ }
18881
+ if (delta <= 0) {
18882
+ return;
18883
+ }
18884
+ const currentRaw = this.waitLocatorGroupEntry.duration;
18885
+ let current = 0;
18886
+ if (typeof currentRaw === 'number') {
18887
+ current = currentRaw;
18888
+ }
18889
+ else if (typeof currentRaw === 'string' && currentRaw.trim() !== '') {
18890
+ const parsedCurrent = parseFloat(currentRaw);
18891
+ current = Number.isFinite(parsedCurrent) ? parsedCurrent : 0;
18892
+ }
18893
+ this.waitLocatorGroupEntry.duration = current + delta;
18894
+ }
18745
18895
  processSubStepsForRunResult() {
18746
18896
  var _a, _b, _c, _d, _e, _f, _g, _h;
18747
18897
  const allSubSteps = (this.subSteps || []);