tango-app-ui-analyse-trax 4.0.48 → 4.0.49
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/esm2022/lib/components/audit-v2/configure/audit-v2-configure.component.mjs +120 -4
- package/esm2022/lib/components/audit-v2/reports/audit-v2-reports.component.mjs +103 -50
- package/esm2022/lib/components/audit-v2/schedule/audit-v2-schedule-detail.component.mjs +12 -6
- package/esm2022/lib/components/audit-v2/schedule/audit-v2-schedule-editor.component.mjs +14 -6
- package/fesm2022/{tango-app-ui-analyse-trax-audit-v2.module-D2O6kj8t.mjs → tango-app-ui-analyse-trax-audit-v2.module-Bpm0GYMw.mjs} +250 -68
- package/fesm2022/tango-app-ui-analyse-trax-audit-v2.module-Bpm0GYMw.mjs.map +1 -0
- package/fesm2022/{tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-C4oOKSEZ.mjs → tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-Cuk5lK5L.mjs} +2 -2
- package/fesm2022/{tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-C4oOKSEZ.mjs.map → tango-app-ui-analyse-trax-tango-app-ui-analyse-trax-Cuk5lK5L.mjs.map} +1 -1
- package/fesm2022/tango-app-ui-analyse-trax.mjs +1 -1
- package/lib/components/audit-v2/configure/audit-v2-configure.component.d.ts +17 -1
- package/lib/components/audit-v2/reports/audit-v2-reports.component.d.ts +10 -6
- package/lib/components/audit-v2/schedule/audit-v2-schedule-detail.component.d.ts +4 -1
- package/lib/components/audit-v2/schedule/audit-v2-schedule-editor.component.d.ts +3 -1
- package/package.json +1 -1
- package/fesm2022/tango-app-ui-analyse-trax-audit-v2.module-D2O6kj8t.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tango-app-ui-analyse-trax-audit-v2.module-Bpm0GYMw.mjs","sources":["../../../projects/tango-analyse-trax/src/lib/components/audit-v2/audit-v2-access.ts","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/audit-v2-layout/audit-v2-layout.component.ts","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/audit-v2-layout/audit-v2-layout.component.html","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/audit-v2-datepicker.ts","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/tip/audit-v2-tip.directive.ts","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/shimmer/audit-v2-shimmer.component.ts","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/shimmer/audit-v2-shimmer.component.html","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/select/audit-v2-select.component.ts","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/select/audit-v2-select.component.html","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/sort-icon/audit-v2-sort-icon.component.ts","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/dashboard/audit-v2-dashboard.component.ts","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/dashboard/audit-v2-dashboard.component.html","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/action-centre/audit-v2-action-centre.component.ts","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/action-centre/audit-v2-action-centre.component.html","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/flags/audit-v2-flags.component.ts","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/flags/audit-v2-flags.component.html","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/flags/flag-detail/audit-v2-flag-detail.component.ts","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/flags/flag-detail/audit-v2-flag-detail.component.html","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/gallery/audit-v2-gallery.component.ts","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/gallery/audit-v2-gallery.component.html","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/schedule/audit-v2-schedule-editor.component.ts","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/schedule/audit-v2-schedule-editor.component.html","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/schedule/audit-v2-schedule-detail.component.ts","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/schedule/audit-v2-schedule-detail.component.html","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/manage/audit-v2-manage.component.ts","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/manage/audit-v2-manage.component.html","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/reports/audit-v2-reports.component.ts","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/reports/audit-v2-reports.component.html","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/predefined/audit-v2-templates.ts","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/predefined/audit-v2-predefined.component.ts","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/predefined/audit-v2-predefined.component.html","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/configure/audit-v2-configure.component.ts","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/configure/audit-v2-configure.component.html","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/question-editor/bulk-upload/audit-v2-bulk-upload.component.ts","../../../projects/tango-analyse-trax/src/lib/components/add-checklist/checklist-popup/checklist-popup.component.html","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/question-editor/counter/audit-v2-counter.component.ts","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/question-editor/counter/audit-v2-counter.component.html","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/question-editor/audit-v2-question-editor.component.ts","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/question-editor/audit-v2-question-editor.component.html","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/detail/audit-v2-detail.component.ts","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/detail/audit-v2-detail.component.html","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/audit-v2-routing.module.ts","../../../projects/tango-analyse-trax/src/lib/components/audit-v2/audit-v2.module.ts"],"sourcesContent":["import { Observable, map } from 'rxjs';\r\nimport { GlobalStateService } from 'tango-app-ui-global';\r\n\r\n/**\r\n * What the signed-in user may do in the Audit menu, from Manage Users -> Tango Trax: Audit (audits) and Schedules\r\n * (Manage -> Schedules), the same permissions the /trax/audit/* routes check. A user saved before those two rows\r\n * existed has neither, so Checklist decides for them, as it did before (and as the API falls back).\r\n */\r\nexport interface AuditAccess {\r\n /** The signed-in user's permissions have arrived (gs.userAccess starts null): view checks only act after this. */\r\n loaded?: boolean;\r\n /** TangoTrax/Audit add or edit: the Audit menu is shown and opens (sidebar Tango Trax -> Audit). */\r\n canView?: boolean;\r\n /** TangoTrax/Schedules add or edit: Manage -> Schedule Info is shown. */\r\n canViewSchedule?: boolean;\r\n /** TangoTrax/Audit add (else Checklist): create / duplicate audits. */\r\n canAdd: boolean;\r\n /** TangoTrax/Audit edit (else Checklist): edit, configure, publish, delete, approve, review. */\r\n canEdit: boolean;\r\n /** TangoTrax/Schedules add (else Checklist): Create schedule, Schedule, Duplicate schedule. */\r\n canAddSchedule?: boolean;\r\n /** TangoTrax/Schedules edit (else Checklist): edit, publish, delete schedules. */\r\n canEditSchedule?: boolean;\r\n /** TangoTrax/task add: Manage -> Task \"Create Task\" (v1 manage-task). */\r\n canAddTask?: boolean;\r\n /** TangoTrax/task edit: task view / configure / duplicate / delete / publish (v1 manage-task), Create Task from\r\n * a submitted answer and Redo of a task's question (v1 gallery). */\r\n canEditTask?: boolean;\r\n /** A Tango (internal) user: the v1 gallery's Redo / Create Task are for client users only. */\r\n isTango?: boolean;\r\n}\r\n\r\nexport function auditAccess(gs: GlobalStateService): Observable<AuditAccess> {\r\n return gs.userAccess.pipe(map((p: any) => ({\r\n loaded: !!p,\r\n canView: traxModuleOn(p, 'Audit'),\r\n canViewSchedule: traxModuleOn(p, 'Schedules'),\r\n canAdd: !!(p?.TangoTrax_Audit_isAdd ?? p?.TangoTrax_checklist_isAdd),\r\n canEdit: !!(p?.TangoTrax_Audit_isEdit ?? p?.TangoTrax_checklist_isEdit),\r\n canAddSchedule: !!(p?.TangoTrax_Schedules_isAdd ?? p?.TangoTrax_checklist_isAdd),\r\n canEditSchedule: !!(p?.TangoTrax_Schedules_isEdit ?? p?.TangoTrax_checklist_isEdit),\r\n canAddTask: !!p?.TangoTrax_Task_isAdd,\r\n canEditTask: !!p?.TangoTrax_Task_isEdit,\r\n isTango: (p?.userType || storedUserType()) === 'tango',\r\n })));\r\n}\r\n\r\n/**\r\n * Whether the Audit menu / Schedule Info is shown. A Tango (internal) user always sees both. A client user sees a\r\n * module when its Add or Edit key is true (TangoTrax_<module>_isAdd / _isEdit, from Manage Users); without those keys\r\n * (a user saved before the Audit / Schedules rows, on an API that does not fill them in yet) the Checklist keys decide.\r\n */\r\nexport function traxModuleOn(p: any, module: 'Audit' | 'Schedules'): boolean {\r\n if (!p) { return false; }\r\n if (p.userType === 'tango') { return true; }\r\n const add = p['TangoTrax_' + module + '_isAdd'];\r\n const edit = p['TangoTrax_' + module + '_isEdit'];\r\n if (add !== undefined || edit !== undefined) { return !!add || !!edit; }\r\n const cAdd = p.TangoTrax_checklist_isAdd;\r\n const cEdit = p.TangoTrax_checklist_isEdit;\r\n return !!cAdd || !!cEdit;\r\n}\r\n\r\n/** userType of the signed-in user (localStorage user-info, as the question editor reads it); '' when unknown. */\r\nfunction storedUserType(): string {\r\n try {\r\n return JSON.parse(localStorage.getItem('user-info') || '{}')?.userType || '';\r\n } catch {\r\n return '';\r\n }\r\n}\r\n","import { Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { NavigationEnd, Router } from '@angular/router';\r\nimport { Subject } from 'rxjs';\r\nimport { filter, takeUntil } from 'rxjs/operators';\r\nimport { GlobalStateService, PageInfoService } from 'tango-app-ui-global';\r\nimport { auditAccess } from '../audit-v2-access';\r\n\r\n/** Page title per Audit tab (the prototype's pageTitle); detail and sub pages keep their tab's title. */\r\nconst TITLES: [string, string][] = [\r\n ['/actioncenter', 'Action Center'],\r\n ['/dashboard', 'Dashboard'],\r\n ['/flags', 'Flags'],\r\n ['/gallery', 'Gallery'],\r\n ['/manage', 'Manage'],\r\n ['/reports', 'Reports']\r\n];\r\n\r\n/** Pages that set their own title and breadcrumbs (audit question editor, task builder / setup). */\r\nconst OWN_TITLE = ['/manage/editor', '/manage/task', '/manage/task-configure'];\r\n\r\n/**\r\n * Routing shell for the Audit module. The page header and module tabs are\r\n * supplied by the application's trax header banner, so this only hosts the\r\n * routed screens and sets the header title and breadcrumb for each tab:\r\n * \"Tango Trax › Audit › <tab>\", as in the prototype.\r\n */\r\n@Component({\r\n selector: 'lib-audit-v2-layout',\r\n templateUrl: './audit-v2-layout.component.html',\r\n styleUrl: './audit-v2-layout.component.scss'\r\n})\r\nexport class AuditV2LayoutComponent implements OnInit, OnDestroy {\r\n private readonly destroy$ = new Subject<void>();\r\n\r\n constructor(private router: Router, private pageInfo: PageInfoService, private gs: GlobalStateService) { }\r\n\r\n ngOnInit(): void {\r\n // The sidebar hides Audit without the permission (Manage Users -> Tango Trax -> Audit); a bookmarked or typed link\r\n // lands on Tango Trax instead. Waits for the permissions (they start empty).\r\n auditAccess(this.gs).pipe(takeUntil(this.destroy$)).subscribe(access => {\r\n if (access.loaded && !access.canView) {\r\n this.router.navigate(['/manage/trax/dashboard'], { replaceUrl: true });\r\n }\r\n });\r\n this.setPageData(this.router.url);\r\n this.router.events.pipe(filter(e => e instanceof NavigationEnd), takeUntil(this.destroy$))\r\n .subscribe(e => this.setPageData((e as NavigationEnd).urlAfterRedirects));\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n private setPageData(url: string): void {\r\n const path = url.split(/[?#]/)[0].split('/audit-v2')[1] || '';\r\n if (OWN_TITLE.some(p => path === p)) { return; }\r\n const title = TITLES.find(([p]) => path === p || path.startsWith(p + '/'))?.[1] || 'Action Center';\r\n this.pageInfo.setTitle(title);\r\n this.pageInfo.setDescription('');\r\n this.pageInfo.setBreadcrumbs([\r\n { title: 'Tango Trax', path: '/manage/trax/dashboard', isActive: false, isSeparator: false },\r\n { title: 'Tango Trax', path: '/manage/trax/dashboard', isActive: false, isSeparator: true },\r\n { title: 'Audit', path: '/manage/trax/audit-v2/actioncenter', isActive: false, isSeparator: false },\r\n { title: 'Audit', path: '/manage/trax/audit-v2/actioncenter', isActive: false, isSeparator: true }\r\n ]);\r\n }\r\n}\r\n","<router-outlet></router-outlet>\r\n","import dayjs from 'dayjs';\r\nimport dayjsEsm from 'dayjs/esm';\r\nimport utcEsm from 'dayjs/esm/plugin/utc';\r\n\r\n/**\r\n * Audit date fields use the app's ngxDaterangepickerMd picker (as Gallery does), not the native\r\n * <input type=\"date\">. Components keep their dates as YYYY-MM-DD strings for the API; these helpers\r\n * convert to and from the picker's { startDate, endDate } dayjs model.\r\n */\r\nexport interface PickerRange {\r\n startDate: dayjs.Dayjs;\r\n endDate: dayjs.Dayjs;\r\n}\r\n\r\n/**\r\n * What datesUpdated emits. The picker builds its dates with dayjs/esm, whose Dayjs type lacks this app's\r\n * plugin typings (utc, tz), so only the format() call used here is typed.\r\n */\r\nexport interface PickedDates {\r\n startDate?: { format(template: string): string } | null;\r\n endDate?: { format(template: string): string } | null;\r\n}\r\n\r\n/** Same locale as the Gallery range picker. */\r\nexport const PICKER_LOCALE = {\r\n format: 'DD-MM-YYYY',\r\n firstDay: 1,\r\n monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September',\r\n 'October', 'November', 'December']\r\n};\r\n\r\n/** The header date range's quick ranges (left list); \"Custom range\" is added by the picker. */\r\nexport function pickerRanges(): Record<string, [dayjs.Dayjs, dayjs.Dayjs]> {\r\n const today = dayjs();\r\n return {\r\n 'Today': [today, today],\r\n 'Yesterday': [today.subtract(1, 'day'), today.subtract(1, 'day')],\r\n 'This Week': [today.subtract(6, 'day'), today],\r\n 'Last Week': [today.subtract(14, 'day').startOf('day'), today.subtract(8, 'day').endOf('day')]\r\n };\r\n}\r\n\r\n/** Picker model for a YYYY-MM-DD range (pass the same day twice for a single-date picker). */\r\nexport function toPickerRange(from: string, to: string): PickerRange | null {\r\n return from && to ? { startDate: dayjs(from), endDate: dayjs(to) } : null;\r\n}\r\n\r\n/** YYYY-MM-DD ends from a datesUpdated event; null when the picker was cleared. */\r\nexport function fromPickerRange(e: PickedDates | null): { from: string; to: string } | null {\r\n if (!e?.startDate || !e?.endDate) { return null; }\r\n return { from: e.startDate.format('YYYY-MM-DD'), to: e.endDate.format('YYYY-MM-DD') };\r\n}\r\n\r\n/**\r\n * Inline <ngx-daterangepicker-material> takes [startDate]/[endDate] as they are (the input directive converts\r\n * through setStartDate, the inline component does not), so build them with the picker's own dayjs/esm, the way\r\n * setStartDate would (utc(true): the local day, read as UTC).\r\n */\r\ndayjsEsm.extend(utcEsm);\r\n\r\nexport interface InlinePickerRange {\r\n startDate: dayjsEsm.Dayjs;\r\n endDate: dayjsEsm.Dayjs;\r\n}\r\n\r\nexport function toInlinePickerRange(from: string, to: string): InlinePickerRange | null {\r\n return from && to ? { startDate: dayjsEsm(from).utc(true), endDate: dayjsEsm(to).utc(true) } : null;\r\n}\r\n\r\n/** maxDate for the inline picker: no future days. */\r\nexport function inlinePickerToday(): dayjsEsm.Dayjs {\r\n return dayjsEsm();\r\n}\r\n","import { Directive, ElementRef, HostListener, Input, inject } from '@angular/core';\nimport { NgbTooltip } from '@ng-bootstrap/ng-bootstrap';\n\n/**\n * Full text of a cut-off cell, in the audit tooltip (white card, `.av2-tip` in the theme), and only when the\n * text is actually cut off (\"…\"): `<td class=\"av2-ellipsis\" [av2Tip]=\"row.name\">{{ row.name }}</td>`.\n * Replaces the browser's own `title` box, which showed on every cell whether it was cut off or not.\n */\n@Directive({\n selector: '[av2Tip]',\n hostDirectives: [{ directive: NgbTooltip, inputs: ['placement: av2TipPlacement'] }]\n})\nexport class AuditV2TipDirective {\n private readonly tip = inject(NgbTooltip);\n private readonly el = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** The full text; nothing shows when it is empty. */\n @Input() set av2Tip(text: string | null | undefined) {\n this.tip.ngbTooltip = text || '';\n }\n\n constructor() {\n // Opened by hand below, so the tooltip only shows when the text does not fit.\n this.tip.triggers = 'manual';\n this.tip.container = 'body';\n this.tip.tooltipClass = 'av2-tip';\n this.tip.placement = 'top-start';\n }\n\n @HostListener('mouseenter')\n show(): void {\n const e = this.el.nativeElement;\n if (this.tip.ngbTooltip && e.scrollWidth > e.clientWidth + 1) { this.tip.open(); }\n }\n\n @HostListener('mouseleave')\n hide(): void {\n this.tip.close();\n }\n}\n","import { Component, Input } from '@angular/core';\r\n\r\n/**\r\n * The app's list shimmer (the Checklist loader's strokes and sweep), shown in place of\r\n * an audit-v2 table or list while its data is in flight.\r\n */\r\n@Component({\r\n selector: 'lib-audit-v2-shimmer',\r\n templateUrl: './audit-v2-shimmer.component.html',\r\n styleUrl: './audit-v2-shimmer.component.scss'\r\n})\r\nexport class AuditV2ShimmerComponent {\r\n blocks: number[] = [0, 1, 2];\r\n\r\n /** Number of shimmer blocks (default 3). */\r\n @Input() set rows(count: number) {\r\n const n = Math.max(1, Math.floor(Number(count)) || 1);\r\n this.blocks = Array.from({ length: n }, (_, i) => i);\r\n }\r\n}\r\n","<div class=\"loader\" role=\"status\" aria-busy=\"true\" aria-label=\"Loading\">\r\n <div class=\"shimmer\" *ngFor=\"let b of blocks\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n</div>\r\n","import {\r\n ChangeDetectorRef, Component, ElementRef, EventEmitter, HostListener, Input, Output, ViewChild, forwardRef\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\nexport interface AuditSelectOption {\r\n value: any;\r\n label: string;\r\n disabled?: boolean;\r\n}\r\n\r\n/** What `(changed)` emits: shaped like a DOM change event, so handlers that read $event.target.value keep working. */\r\nexport interface AuditSelectChange {\r\n target: { value: any };\r\n}\r\n\r\n/**\r\n * The Audit menu's dropdown, used instead of a native <select>: a field-styled trigger and a panel\r\n * (search box for long lists, check on the chosen option). Works with ngModel, formControlName or a\r\n * plain [value] + (changed). The panel is anchored to the field (absolute, right under it, or above\r\n * it near the bottom of the screen); it closes on outside click, Esc, page scroll and resize.\r\n */\r\n@Component({\r\n selector: 'lib-audit-v2-select',\r\n templateUrl: './audit-v2-select.component.html',\r\n styleUrl: './audit-v2-select.component.scss',\r\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AuditV2SelectComponent), multi: true }]\r\n})\r\nexport class AuditV2SelectComponent implements ControlValueAccessor {\r\n @Input() options: AuditSelectOption[] = [];\r\n @Input() placeholder = 'Select';\r\n /** Search box in the panel: 'auto' shows it for more than 8 options. */\r\n @Input() searchable: boolean | 'auto' = 'auto';\r\n @Input() ariaLabel = '';\r\n @Input() set disabled(v: any) { this.isDisabled = v === '' || !!v; }\r\n /** Value when used without ngModel / formControlName. */\r\n @Input() set value(v: any) { this.current = v; }\r\n @Output() changed = new EventEmitter<AuditSelectChange>();\r\n\r\n @ViewChild('trigger', { static: true }) trigger!: ElementRef<HTMLButtonElement>;\r\n\r\n open = false;\r\n query = '';\r\n active = -1;\r\n isDisabled = false;\r\n /** Panel above the field (little room below it). */\r\n openUp = false;\r\n current: any = null;\r\n\r\n private onChange: (v: any) => void = () => { };\r\n private onTouched: () => void = () => { };\r\n\r\n constructor(private host: ElementRef<HTMLElement>, private cd: ChangeDetectorRef) { }\r\n\r\n // ---- ControlValueAccessor ----\r\n writeValue(v: any): void { this.current = v; this.cd.markForCheck(); }\r\n registerOnChange(fn: (v: any) => void): void { this.onChange = fn; }\r\n registerOnTouched(fn: () => void): void { this.onTouched = fn; }\r\n setDisabledState(d: boolean): void { this.isDisabled = d; this.cd.markForCheck(); }\r\n\r\n /** Same as a native select: values match as strings (\"2\" and 2 are the same option). */\r\n private same(a: any, b: any): boolean {\r\n return a !== null && a !== undefined && b !== null && b !== undefined && String(a) === String(b);\r\n }\r\n\r\n get selected(): AuditSelectOption | undefined {\r\n return this.options.find(o => this.same(o.value, this.current));\r\n }\r\n\r\n get showSearch(): boolean {\r\n return this.searchable === 'auto' ? this.options.length > 8 : !!this.searchable;\r\n }\r\n\r\n get filtered(): AuditSelectOption[] {\r\n const q = this.query.trim().toLowerCase();\r\n return q ? this.options.filter(o => o.label.toLowerCase().includes(q)) : this.options;\r\n }\r\n\r\n /** Stable rows even when the parent rebuilds its option array on every change detection. */\r\n trackByValue(_: number, o: AuditSelectOption): string {\r\n return String(o.value);\r\n }\r\n\r\n isChosen(o: AuditSelectOption): boolean {\r\n return this.same(o.value, this.current);\r\n }\r\n\r\n toggle(): void {\r\n if (this.isDisabled) { return; }\r\n this.open ? this.close() : this.openPanel();\r\n }\r\n\r\n private openPanel(): void {\r\n // Open upward only when there is too little room below the field and more above it.\r\n const r = this.trigger.nativeElement.getBoundingClientRect();\r\n const below = window.innerHeight - r.bottom;\r\n this.openUp = below < 300 && r.top > below;\r\n this.query = '';\r\n this.active = this.filtered.findIndex(o => this.isChosen(o));\r\n this.open = true;\r\n }\r\n\r\n close(): void {\r\n if (!this.open) { return; }\r\n this.open = false;\r\n this.onTouched();\r\n }\r\n\r\n pick(o: AuditSelectOption): void {\r\n if (o.disabled) { return; }\r\n this.close();\r\n this.trigger.nativeElement.focus();\r\n if (this.isChosen(o)) { return; }\r\n this.current = o.value;\r\n this.onChange(o.value);\r\n this.changed.emit({ target: { value: o.value } });\r\n }\r\n\r\n onKey(e: KeyboardEvent): void {\r\n if (this.isDisabled) { return; }\r\n const list = this.filtered;\r\n if (e.key === 'Escape') { this.close(); return; }\r\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\r\n e.preventDefault();\r\n if (!this.open) { this.openPanel(); return; }\r\n if (!list.length) { return; }\r\n const step = e.key === 'ArrowDown' ? 1 : -1;\r\n this.active = (this.active + step + list.length) % list.length;\r\n return;\r\n }\r\n if (e.key === 'Enter') {\r\n e.preventDefault();\r\n if (!this.open) { this.openPanel(); return; }\r\n const o = list[this.active];\r\n if (o) { this.pick(o); }\r\n }\r\n }\r\n\r\n onQuery(): void {\r\n this.active = this.filtered.length ? 0 : -1;\r\n }\r\n\r\n @HostListener('document:mousedown', ['$event'])\r\n onOutside(e: MouseEvent): void {\r\n if (this.open && !this.host.nativeElement.contains(e.target as Node)) { this.close(); }\r\n }\r\n\r\n @HostListener('window:resize')\r\n @HostListener('document:scroll', ['$event'])\r\n onViewportChange(e?: Event): void {\r\n // Scrolling inside the panel list is fine; anything else moves the trigger, so close.\r\n if (this.open && !(e && this.host.nativeElement.contains(e.target as Node))) { this.close(); }\r\n }\r\n}\r\n","<button #trigger type=\"button\" class=\"as-trigger\" [class.is-open]=\"open\" [class.is-placeholder]=\"!selected\"\r\n [disabled]=\"isDisabled\" [attr.aria-label]=\"ariaLabel || null\" aria-haspopup=\"listbox\" [attr.aria-expanded]=\"open\"\r\n (click)=\"toggle()\" (keydown)=\"onKey($event)\">\r\n <span class=\"as-label\">{{ selected?.label ?? placeholder }}</span>\r\n <svg class=\"as-chev\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n</button>\r\n\r\n<div class=\"as-panel\" *ngIf=\"open\" [class.as-panel--up]=\"openUp\" role=\"listbox\" (keydown)=\"onKey($event)\">\r\n <label class=\"as-search\" *ngIf=\"showSearch\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\r\n <input type=\"text\" [(ngModel)]=\"query\" (ngModelChange)=\"onQuery()\" placeholder=\"Search\" autocomplete=\"off\"\r\n [ngModelOptions]=\"{ standalone: true }\">\r\n </label>\r\n <div class=\"as-list\">\r\n <button type=\"button\" class=\"as-option\" *ngFor=\"let o of filtered; let i = index; trackBy: trackByValue\" role=\"option\"\r\n [class.is-chosen]=\"isChosen(o)\" [class.is-active]=\"i === active\" [disabled]=\"o.disabled\"\r\n [attr.aria-selected]=\"isChosen(o)\" (mouseenter)=\"active = i\" (click)=\"pick(o)\">\r\n <span class=\"as-option-label\" [title]=\"o.label\">{{ o.label }}</span>\r\n <svg *ngIf=\"isChosen(o)\" class=\"as-check\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </button>\r\n <div class=\"as-empty\" *ngIf=\"!filtered.length\">No match</div>\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\n\n/**\n * The Checklist tables' sort arrow (v1 Flags / Dashboard headers): grey on every sortable column,\n * blue on the sorted one, pointing down for descending and up for ascending.\n * <th class=\"av2-sortable\" (click)=\"sort('name')\">Name <lib-audit-v2-sort-icon [active]=\"key === 'name'\" [dir]=\"dir\"></lib-audit-v2-sort-icon></th>\n */\n@Component({\n selector: 'lib-audit-v2-sort-icon',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <svg class=\"av2-sort-icon\" [class.is-up]=\"active && dir === 'asc'\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"\n viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\">\n <path d=\"M8.00016 3.33337V12.6667M8.00016 12.6667L12.6668 8.00004M8.00016 12.6667L3.3335 8.00004\"\n [attr.stroke]=\"active ? '#00A3FF' : '#667085'\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>`,\n styles: [`\n :host { display: inline-flex; vertical-align: middle; margin-left: 4px; }\n .av2-sort-icon { flex-shrink: 0; transition: transform 0.15s ease; }\n .av2-sort-icon.is-up { transform: rotate(180deg); }\n `]\n})\nexport class AuditV2SortIconComponent {\n @Input() active = false;\n @Input() dir: 'asc' | 'desc' = 'asc';\n}\n","import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { Subject, debounceTime, forkJoin, of, takeUntil } from 'rxjs';\r\nimport { catchError } from 'rxjs/operators';\r\nimport { GlobalStateService } from 'tango-app-ui-global';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport dayjs from 'dayjs';\r\nimport { TraxService } from '../../../services/trax.service';\r\nimport { AuditAccess, auditAccess } from '../audit-v2-access';\r\nimport { PICKER_LOCALE, PickedDates, PickerRange, fromPickerRange, pickerRanges, toPickerRange } from '../audit-v2-datepicker';\r\n\r\nexport interface AuditBand {\r\n key: string;\r\n label: string;\r\n range: string;\r\n lo: number;\r\n hi: number;\r\n soft: string;\r\n bg: string;\r\n fg: string;\r\n}\r\n\r\nexport interface AuditRow {\r\n date: string;\r\n storeId: string;\r\n circle: string;\r\n zone: string;\r\n aom: string;\r\n score: number | null;\r\n /** 'unscored' = audited, but no question of its audits has compliance scoring on (no score to show). */\r\n status: StoreStatus;\r\n raw?: any;\r\n}\r\n\r\nexport type StoreStatus = 'pass' | 'fail' | 'na' | 'unscored';\r\nexport type StatusFilter = 'all' | StoreStatus;\r\n\r\n/** A sortable column of a Performance table. */\r\nexport interface PerfColumn {\r\n key: string;\r\n label: string;\r\n}\r\n\r\ntype SortValue = string | number | null | undefined;\r\n\r\nexport interface AuditKpi {\r\n label: string;\r\n value: string;\r\n note: string;\r\n noteColor: string;\r\n}\r\n\r\nexport interface FilterCat {\r\n key: string;\r\n label: string;\r\n value: string;\r\n title: string;\r\n sub: string;\r\n dirty: boolean;\r\n}\r\n\r\nexport interface AuditPerfRow {\r\n name: string;\r\n initials: string;\r\n scheduled: string;\r\n assigned: number;\r\n submitted: number;\r\n disputes: number | null;\r\n passMark: string;\r\n score: string;\r\n scorePct: number;\r\n /** '—' when the audit has no compliance scoring (no score, so no result). */\r\n result: 'Pass' | 'Fail' | '—';\r\n raw?: any;\r\n}\r\n\r\nexport interface StorePerfRow {\r\n storeId: string;\r\n store: string;\r\n spoc: string;\r\n assigned: number;\r\n flags: number | null;\r\n completion: string;\r\n compliance: string;\r\n perf: string;\r\n raw?: any;\r\n}\r\n\r\nexport interface UserPerfRow {\r\n name: string;\r\n email: string;\r\n assigned: number;\r\n flags: number;\r\n redo: number;\r\n completion: string;\r\n compliance: string;\r\n perf: string;\r\n raw?: any;\r\n}\r\n\r\nexport interface TaskPerfRow {\r\n name: string;\r\n initials: string;\r\n scheduled: string;\r\n coverage: string;\r\n assigned: number;\r\n submitted: number;\r\n flags: number;\r\n tasks: string;\r\n redo: number;\r\n compliance: string;\r\n compliancePct: number;\r\n raw?: any;\r\n}\r\n\r\n/** Task-mode tiles, as displayed ('—' when the API has no value). */\r\nexport interface TaskStats {\r\n activeTasks: string;\r\n taskInstances: string;\r\n notSubmitted: string;\r\n openTasks: string;\r\n inProgress: string;\r\n submitted: string;\r\n completionScore: string;\r\n complianceScore: string;\r\n totalFlags: string;\r\n completionDelta: string;\r\n complianceDelta: string;\r\n flagsDelta: string;\r\n}\r\n\r\nexport type TaskDeltaKey = 'completion' | 'compliance' | 'flags';\r\n\r\n/** One exported column: header text and the cell value for a row. */\r\ninterface ExportColumn<T> {\r\n header: string;\r\n value: (row: T) => any;\r\n}\r\n\r\nconst EMPTY_TASK_STATS: TaskStats = {\r\n activeTasks: '—',\r\n taskInstances: '—',\r\n notSubmitted: '—',\r\n openTasks: '—',\r\n inProgress: '—',\r\n submitted: '—',\r\n completionScore: '—',\r\n complianceScore: '—',\r\n totalFlags: '—',\r\n completionDelta: '',\r\n complianceDelta: '',\r\n flagsDelta: ''\r\n};\r\n\r\nexport interface TrendBar {\r\n key: string;\r\n label: string;\r\n /** Average of the compliance-scored audits; null when none. */\r\n value: number | null;\r\n /** Compliance-scored audits (the ones the average reads). */\r\n count: number;\r\n /** Every submitted audit, scored or not. */\r\n submitted: number;\r\n}\r\n\r\n/** One financial quarter: April-March year, named by the year it starts in (prototype: Aug 2026 = Q2 FY26). */\r\ninterface FiscalQuarter {\r\n key: string;\r\n from: string;\r\n to: string;\r\n months: string;\r\n}\r\n\r\n/** The last `n` financial quarters, oldest first, ending with the one `today` falls in. */\r\nfunction fiscalQuarters(today = dayjs(), n = 4): FiscalQuarter[] {\r\n const current = today.startOf('month').subtract((today.month() + 9) % 3, 'month');\r\n return Array.from({ length: n }, (_, i) => {\r\n const start = current.subtract(3 * (n - 1 - i), 'month');\r\n const end = start.add(2, 'month').endOf('month');\r\n const fy = start.month() >= 3 ? start.year() : start.year() - 1;\r\n return {\r\n key: 'Q' + (Math.floor(((start.month() + 9) % 12) / 3) + 1) + ' FY' + String(fy).slice(2),\r\n from: start.format('YYYY-MM-DD'),\r\n to: end.format('YYYY-MM-DD'),\r\n months: start.format('MMM') + ' – ' + end.format('MMM YYYY')\r\n };\r\n });\r\n}\r\n\r\n/** Pass mark and critical threshold for the audit programme (no per-audit pass mark in the data yet). */\r\nconst PASS_MARK = 75;\r\nconst CRITICAL_MARK = 60;\r\n\r\nconst BANDS: AuditBand[] = [\r\n { key: 'excellent', label: 'Excellent', range: '90-100%', lo: 90, hi: 100, soft: '#8FBFA5', bg: '#ECFDF3', fg: '#027A48' },\r\n { key: 'good', label: 'Good', range: '75-89%', lo: 75, hi: 89, soft: '#96B4D6', bg: '#EFF8FF', fg: '#175CD3' },\r\n { key: 'fair', label: 'Needs improvement', range: '60-74%', lo: 60, hi: 74, soft: '#DCBE8C', bg: '#FFFAEB', fg: '#B54708' },\r\n { key: 'critical', label: 'Critical', range: 'Below 60%', lo: 0, hi: 59, soft: '#D6A19B', bg: '#FEF3F2', fg: '#B42318' },\r\n { key: 'unscored', label: 'Not scored', range: 'Compliance score off', lo: 0, hi: 100, soft: '#C7D7FE', bg: '#EEF4FF', fg: '#3538CD' },\r\n { key: 'na', label: 'Not audited', range: 'No submission', lo: 0, hi: 100, soft: '#D6DAE0', bg: '#F2F4F7', fg: '#475467' }\r\n];\r\n\r\n/** Bands that hold stores without a score; they filter by status, not by score range. */\r\nconst STATUS_BANDS = ['unscored', 'na'];\r\n\r\nexport interface AuditTypeOption {\r\n key: string;\r\n label: string;\r\n help: string;\r\n}\r\n\r\nconst ALL_AUDITS: AuditTypeOption = { key: 'all', label: 'All Audits', help: 'Blended score across every programme.' };\r\n\r\n/** Store hierarchy picks: circle head / zone manager / AOM names as the dashboard API sends them, store = storeId. */\r\ninterface ScopePick {\r\n circle: string;\r\n zone: string;\r\n aom: string;\r\n store: string;\r\n}\r\n\r\n/**\r\n * Dashboard. Store list, score bands, KPIs and the by-date trend come from the audit API\r\n * (/trax/audit/dashboard); the Audit / User Performance tabs still use the v1 dashboard\r\n * endpoints (checklistPerformance / userPerformance). Task mode (tiles + Task Performance) reads\r\n * /trax/audit/dashboard/tasks: only the tasks raised from this client's audits.\r\n * Scope (client, stores, dates) comes from the global header filter; the period picker can narrow the dates.\r\n * Filters drawer: Store hierarchy narrows the stores and Audit type (checklistId) the audit of every feed (reloaded\r\n * on Apply); Score range and Status only filter the loaded store list in the browser.\r\n *\r\n * Quarterly: the trend shows the last four financial quarters (built from one monthly-bucket call of\r\n * the same API) and the picked quarter becomes the period of every feed. By date: the range picker.\r\n */\r\n@Component({\r\n selector: 'lib-audit-v2-dashboard',\r\n templateUrl: './audit-v2-dashboard.component.html',\r\n styleUrl: './audit-v2-dashboard.component.scss'\r\n})\r\nexport class AuditV2DashboardComponent implements OnInit, OnDestroy {\r\n /** Pass / critical marks come from the audit dashboard API; these are the empty-state defaults. */\r\n passMark = PASS_MARK;\r\n criticalMark = CRITICAL_MARK;\r\n readonly bands = BANDS;\r\n /** \"All Audits\", then the client's audits (POST /trax/audit/list); key = audit id, sent as checklistId. */\r\n auditTypes: AuditTypeOption[] = [ALL_AUDITS];\r\n /** Client the audit list was fetched for. */\r\n private auditTypesClient = '';\r\n\r\n /**\r\n * Period selection. from / to (YYYY-MM-DD) start as the header date range and drive every feed;\r\n * the range picker narrows them, and a header change resets them.\r\n */\r\n grain: 'quarter' | 'date' = 'date';\r\n quarter = '';\r\n readonly fiscal = fiscalQuarters();\r\n readonly quarters = this.fiscal.map(q => q.key);\r\n /** Quarterly trend bars, and the client + stores they were fetched for. */\r\n quarterTrend: TrendBar[] = [];\r\n quarterTrendLoading = false;\r\n private quarterTrendScope = '';\r\n from = '';\r\n to = '';\r\n range: PickerRange | null = null;\r\n readonly pickerLocale = PICKER_LOCALE;\r\n readonly ranges = pickerRanges();\r\n readonly today = dayjs();\r\n\r\n /** Filters. */\r\n auditType = 'all';\r\n status: StatusFilter = 'all';\r\n search = '';\r\n scoreMin = 0;\r\n scoreMax = 100;\r\n\r\n /** Audit / Task switch. */\r\n moduleTab: 'Audit' | 'Task' = 'Audit';\r\n readonly moduleTabs: Array<'Audit' | 'Task'> = ['Audit', 'Task'];\r\n\r\n /** Shown in the page header; stamped on every load. */\r\n lastRefreshed = '—';\r\n\r\n /** Filter drawer. */\r\n filtersOpen = false;\r\n activeCat = 'period';\r\n /**\r\n * The filter drawer's draft (QA 9 Oct): Object.create(this), so every getter the drawer shows works on the draft's\r\n * own values while the page behind keeps the applied ones. Apply copies DRAFT_KEYS onto the page; Cancel drops it.\r\n */\r\n draft: AuditV2DashboardComponent | null = null;\r\n private static readonly DRAFT_KEYS = ['grain', 'quarter', 'from', 'to', 'range', 'auditType', 'circle', 'zone', 'aom', 'store',\r\n 'scoreMin', 'scoreMax', 'status', 'storeListOpen', 'listBandKey'] as const;\r\n\r\n /**\r\n * Store hierarchy picks being edited in the drawer (store = storeId). The lists come from the dashboard\r\n * API's store rows of the header scope; Apply narrows every feed to the stores the pick covers.\r\n */\r\n circle = '';\r\n zone = '';\r\n aom = '';\r\n store = '';\r\n\r\n /** Store rows of the header scope, not narrowed by the hierarchy: the drawer's lists and each pick's stores. */\r\n private scopeRows: AuditRow[] = [];\r\n /** Hierarchy + audit type the feeds were last loaded with; the drawer edits a draft until Apply. */\r\n private applied: ScopePick & { auditType: string } = { circle: '', zone: '', aom: '', store: '', auditType: 'all' };\r\n /** Client + header stores; a change resets the hierarchy picks (their stores may be gone). */\r\n private headerScopeKey = '';\r\n\r\n /** Table state. */\r\n sortKey = 'score';\r\n sortDir: 'asc' | 'desc' = 'asc';\r\n page = 1;\r\n /** Store list pager: 10 rows a page, 10 / 20 / 30, as on every audit list. */\r\n pageSize = 10;\r\n readonly pageSizes = [10, 20, 30];\r\n\r\n headers: Array<{ key: string; label: string }> = [\r\n { key: 'date', label: 'Audit date' },\r\n // The column shows the store's name (row.storeId holds it; see toAuditRow).\r\n { key: 'storeId', label: 'Store Name' },\r\n { key: 'circle', label: 'Circle Head' },\r\n { key: 'zone', label: 'Zone Manager' },\r\n { key: 'aom', label: 'AOM' },\r\n { key: 'score', label: 'Score' },\r\n { key: 'status', label: 'Status' }\r\n ];\r\n\r\n /**\r\n * Task mode: tiles and the Task Performance table for the tasks raised from this client's audits\r\n * (/trax/audit/dashboard/tasks). Loaded when the Task tab is open, and again after a header change.\r\n */\r\n taskStats: TaskStats = { ...EMPTY_TASK_STATS };\r\n taskPerf: TaskPerfRow[] = [];\r\n taskLoading = false;\r\n /** Change vs the previous period (null = nothing to compare); drives the delta arrow and colour. */\r\n private taskDeltaValues: Record<TaskDeltaKey, number | null> = { completion: null, compliance: null, flags: null };\r\n /** True until the task figures are loaded for the current scope. */\r\n private tasksStale = true;\r\n /** Ignores a task response that a newer request has overtaken. */\r\n private taskRequest = 0;\r\n /** PDF downloads in flight, by visit id, so a double click queues one report. */\r\n private readonly pdfQueued = new Set<string>();\r\n\r\n /** Performance section. */\r\n perfTab: 'Audit' | 'Store' | 'User' = 'Audit';\r\n readonly perfTabs: Array<'Audit' | 'Store' | 'User'> = ['Audit', 'Store', 'User'];\r\n perfPeriod = '';\r\n perfSearch = '';\r\n /** Performance tables' pager (shared lib-pagination, as the other audit lists): 10 rows a page, 10 / 20 / 30. */\r\n perfPage = 1;\r\n perfPageSize = 10;\r\n readonly perfPageSizes = [10, 20, 30];\r\n /** Column sort of the active Performance table ('' = the API's order); reset when the tab changes. */\r\n perfSortKey = '';\r\n perfSortDir: 'asc' | 'desc' = 'asc';\r\n\r\n /** Sortable columns of each Performance table, in display order (Action is not sortable). */\r\n readonly auditPerfCols: PerfColumn[] = [\r\n // No Scheduled column (QA 9 Oct).\r\n { key: 'name', label: 'Audit Name' }, { key: 'assigned', label: 'Assigned To' }, { key: 'submitted', label: 'Submitted' },\r\n { key: 'disputes', label: 'Disputes' }, { key: 'passMark', label: 'Pass Mark' },\r\n { key: 'score', label: 'Score' }, { key: 'result', label: 'Result' }\r\n ];\r\n readonly taskPerfCols: PerfColumn[] = [\r\n { key: 'name', label: 'Task Name' }, { key: 'scheduled', label: 'Scheduled' }, { key: 'coverage', label: 'Coverage' },\r\n { key: 'assigned', label: 'Assigned To' }, { key: 'submitted', label: 'Submitted' }, { key: 'flags', label: 'Flags' },\r\n { key: 'tasks', label: 'Tasks' }, { key: 'redo', label: 'ReDo' }, { key: 'compliance', label: 'Question Compliance %' }\r\n ];\r\n readonly storePerfCols: PerfColumn[] = [\r\n { key: 'store', label: 'Store Name' }, { key: 'storeId', label: 'Store ID' }, { key: 'spoc', label: 'Store Spoc' },\r\n { key: 'assigned', label: 'Assigned' },\r\n { key: 'flags', label: 'Flags' }, { key: 'completion', label: 'Completion %' }, { key: 'compliance', label: 'Compliance %' },\r\n { key: 'perf', label: 'Performance %' }\r\n ];\r\n readonly userPerfCols: PerfColumn[] = [\r\n { key: 'name', label: 'User Name' }, { key: 'email', label: 'Email' }, { key: 'assigned', label: 'Assigned' },\r\n { key: 'flags', label: 'Flags' }, { key: 'redo', label: 'ReDo' }, { key: 'completion', label: 'Completion %' },\r\n { key: 'compliance', label: 'Compliance %' }, { key: 'perf', label: 'Performance %' }\r\n ];\r\n\r\n /** What each sortable column sorts on: numbers for counts and percentages, text otherwise; null sorts last. */\r\n private readonly auditSortValue: Record<string, (r: AuditPerfRow) => SortValue> = {\r\n name: r => r.name, assigned: r => r.assigned, submitted: r => r.submitted,\r\n disputes: r => r.disputes, passMark: r => this.num(String(r.passMark).replace('%', '')),\r\n score: r => (r.score === '—' ? null : r.scorePct), result: r => (r.result === '—' ? null : r.result)\r\n };\r\n private readonly taskSortValue: Record<string, (r: TaskPerfRow) => SortValue> = {\r\n name: r => r.name, scheduled: r => r.scheduled, coverage: r => r.coverage, assigned: r => r.assigned,\r\n submitted: r => r.submitted, flags: r => r.flags, tasks: r => this.num(r.raw?.tasks), redo: r => r.redo,\r\n compliance: r => this.num(r.raw?.compliance)\r\n };\r\n private readonly storeSortValue: Record<string, (r: StorePerfRow) => SortValue> = {\r\n store: r => r.store, storeId: r => r.storeId, spoc: r => r.spoc, assigned: r => r.assigned, flags: r => r.flags,\r\n completion: r => this.num(r.raw?.completion), compliance: r => this.num(r.raw?.compliance), perf: r => this.num(r.raw?.performance)\r\n };\r\n private readonly userSortValue: Record<string, (r: UserPerfRow) => SortValue> = {\r\n name: r => r.name, email: r => r.email, assigned: r => r.assigned, flags: r => r.flags, redo: r => r.redo,\r\n completion: r => this.num(r.raw?.completion), compliance: r => this.num(r.raw?.compliance), perf: r => this.num(r.raw?.performance)\r\n };\r\n\r\n auditPerf: AuditPerfRow[] = [];\r\n storePerf: StorePerfRow[] = [];\r\n userPerf: UserPerfRow[] = [];\r\n\r\n rows: AuditRow[] = [];\r\n trend: TrendBar[] = [];\r\n\r\n /** Starts true so the first paint shimmers instead of flashing empty tiles and tables. */\r\n loading = true;\r\n\r\n private headerData: any;\r\n private readonly userEmailes: string[] = JSON.parse(localStorage.getItem('usersEmail-info') || '[]');\r\n /** Create Audit shows only with the Checklist add permission. */\r\n access: AuditAccess = { canAdd: false, canEdit: false };\r\n private readonly destroy$ = new Subject<void>();\r\n\r\n constructor(\r\n private traxService: TraxService,\r\n private gs: GlobalStateService,\r\n private toast: ToastService,\r\n private cd: ChangeDetectorRef\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n auditAccess(this.gs).pipe(takeUntil(this.destroy$)).subscribe(access => {\r\n this.access = access;\r\n this.cd.detectChanges();\r\n });\r\n this.gs.dataRangeValue\r\n .pipe(takeUntil(this.destroy$), debounceTime(300))\r\n .subscribe((data: any) => {\r\n if (!data?.client) { return; }\r\n const clientChanged = data.client !== this.headerData?.client;\r\n this.headerData = data;\r\n this.onHeaderScope(clientChanged);\r\n // A quarter stays picked across header changes (new stores / client); By date follows the header.\r\n if (this.grain === 'quarter') { this.applyQuarter(this.quarter, true); return; }\r\n this.from = data.date?.startDate || '';\r\n this.to = data.date?.endDate || '';\r\n this.range = toPickerRange(this.from, this.to);\r\n this.reloadPeriod();\r\n });\r\n }\r\n\r\n /**\r\n * Header change. New client: the audit type starts over and its list is fetched again. New client or\r\n * stores: the hierarchy picks start over (the next load refills the lists). A date-only change keeps both.\r\n */\r\n private onHeaderScope(clientChanged: boolean): void {\r\n const key = this.headerData.client + '|' + this.headerStoreIds().join(',');\r\n if (key !== this.headerScopeKey) {\r\n this.headerScopeKey = key;\r\n this.circle = this.zone = this.aom = this.store = '';\r\n this.applied = { ...this.applied, circle: '', zone: '', aom: '', store: '' };\r\n }\r\n if (clientChanged) {\r\n this.auditType = 'all';\r\n this.applied.auditType = 'all';\r\n this.auditTypes = [ALL_AUDITS];\r\n this.loadAuditTypes();\r\n }\r\n }\r\n\r\n /** The client's audits for the Audit type filter, newest first as the Manage list. */\r\n private loadAuditTypes(): void {\r\n const clientId = this.headerData?.client;\r\n if (!clientId || clientId === this.auditTypesClient) { return; }\r\n this.auditTypesClient = clientId;\r\n this.traxService.auditList({\r\n clientId, fromDate: this.headerData?.date?.startDate, toDate: this.headerData?.date?.endDate,\r\n limit: 500, offset: 1, search: ''\r\n }).pipe(catchError(() => of(null)), takeUntil(this.destroy$)).subscribe((res: any) => {\r\n if (res?.code !== 200) { this.auditTypesClient = ''; return; }\r\n const list: any[] = res.data?.result || [];\r\n this.auditTypes = [ALL_AUDITS].concat(list.map(a => ({\r\n key: String(a._id),\r\n label: a.checkListName || 'Untitled audit',\r\n help: (a.publish ? 'Published' : 'Draft') + ' · pass mark ' + (this.num(a.passMark) ?? PASS_MARK) + '%'\r\n })));\r\n this.cd.detectChanges();\r\n });\r\n }\r\n\r\n /** By date: one month at most (the pickers' dateLimit, in days after the start; 30 = up to 31 days). */\r\n readonly maxRangeDays = 30;\r\n\r\n /** Range picker: a new period reloads every feed, except inside the filter drawer, where Apply does. */\r\n onRangePicked(e: PickedDates | null): void {\r\n const picked = fromPickerRange(e);\r\n if (!picked || (picked.from === this.from && picked.to === this.to)) { return; }\r\n // A longer range (typed, or a preset) is cut back to a month from its start.\r\n if (dayjs(picked.to).diff(dayjs(picked.from), 'day') > this.maxRangeDays) {\r\n picked.to = dayjs(picked.from).add(this.maxRangeDays, 'day').format('YYYY-MM-DD');\r\n this.range = toPickerRange(picked.from, picked.to);\r\n this.toast.getErrorToast('Pick up to one month — the range ends on ' + dayjs(picked.to).format('DD MMM YYYY'));\r\n }\r\n this.from = picked.from;\r\n this.to = picked.to;\r\n if (!this.filtersOpen) { this.reloadPeriod(); }\r\n }\r\n\r\n private reloadPeriod(): void {\r\n this.perfPeriod = 'Based on ' + this.fmt(this.from) + ' - ' + this.fmt(this.to);\r\n this.page = 1;\r\n this.load();\r\n // Task figures follow the same scope; fetched now in Task mode, else when the tab opens.\r\n this.tasksStale = true;\r\n if (this.isTaskModule) { this.loadTasks(); }\r\n if (this.grain === 'quarter') { this.loadQuarterTrend(); }\r\n }\r\n\r\n /**\r\n * The four quarter bars: one call over the four quarters (more than 120 days, so the API buckets the\r\n * trend by month) rolled up per quarter, weighted by each month's audit count. Fetched again only\r\n * when the client or stores change.\r\n */\r\n private loadQuarterTrend(): void {\r\n const scope = this.basePayload();\r\n const key = scope['clientId'] + '|' + (scope['storeId'] || []).join(',') + '|' + (scope['checklistId'] || '');\r\n if (key === this.quarterTrendScope) { return; }\r\n this.quarterTrendScope = key;\r\n this.quarterTrendLoading = true;\r\n this.traxService.auditDashboard({\r\n clientId: scope['clientId'], fromDate: this.fiscal[0].from, toDate: this.today.format('YYYY-MM-DD'), storeId: scope['storeId'],\r\n ...this.auditFilter()\r\n }).pipe(catchError(() => of(null)), takeUntil(this.destroy$)).subscribe((res: any) => {\r\n const ok = res?.code === 200;\r\n if (!ok) { this.quarterTrendScope = ''; }\r\n const buckets: any[] = ok ? res.data?.trend || [] : [];\r\n this.quarterTrend = this.fiscal.map(q => {\r\n const inQuarter = buckets.filter(b => String(b.key) >= q.from && String(b.key) <= q.to && b.value !== null && b.value !== undefined);\r\n const count = inQuarter.reduce((n, b) => n + (Number(b.count) || 0), 0);\r\n const total = inQuarter.reduce((n, b) => n + Number(b.value) * (Number(b.count) || 0), 0);\r\n const submitted = buckets.filter(b => String(b.key) >= q.from && String(b.key) <= q.to)\r\n .reduce((n, b) => n + (Number(b.submitted ?? b.count) || 0), 0);\r\n return { key: q.key, label: q.key, value: count ? Math.round(total / count) : null, count, submitted };\r\n });\r\n this.quarterTrendLoading = false;\r\n this.cd.detectChanges();\r\n });\r\n }\r\n\r\n /** Make a quarter the period (up to today for the current one); reloads unless the filter drawer is open. */\r\n private applyQuarter(key: string, force = false): void {\r\n const q = this.fiscal.find(x => x.key === key) || this.fiscal[this.fiscal.length - 1];\r\n const today = this.today.format('YYYY-MM-DD');\r\n const to = q.to > today ? today : q.to;\r\n if (!force && q.key === this.quarter && this.from === q.from && this.to === to) { return; }\r\n this.quarter = q.key;\r\n this.from = q.from;\r\n this.to = to;\r\n this.range = toPickerRange(this.from, this.to);\r\n if (!this.filtersOpen) { this.reloadPeriod(); }\r\n }\r\n\r\n /** Quarterly: a bar (or a quarter in the filter drawer) picks that quarter. */\r\n selectQuarter(key: string): void {\r\n if (this.grain !== 'quarter') { return; }\r\n this.applyQuarter(key);\r\n }\r\n\r\n /** The trend card waits for the page feeds, and in Quarterly also for the quarter bars. */\r\n get trendLoading(): boolean {\r\n return this.loading || (this.grain === 'quarter' && this.quarterTrendLoading);\r\n }\r\n\r\n /** Bars the trend chart draws: the four quarters, or the API's by-date buckets. */\r\n get trendBars(): TrendBar[] {\r\n return this.grain === 'quarter' ? this.quarterTrend : this.trend;\r\n }\r\n\r\n /** More bars than fit their labels (a month by date): see showXLabel. */\r\n get denseTrend(): boolean {\r\n return this.trendBars.length > 12;\r\n }\r\n\r\n /** Dense chart: a label on every few bars (about 8 across), always on the first and last; otherwise every bar. */\r\n showXLabel(i: number, last: boolean): boolean {\r\n const n = this.trendBars.length;\r\n if (n <= 12) { return true; }\r\n const step = Math.ceil(n / 8);\r\n // The last label always shows; the regular one just before it is skipped when the two would touch.\r\n return last || (i % step === 0 && n - 1 - i >= step - 1);\r\n }\r\n\r\n /** \"Oct – Dec 2026\" for a quarter key. */\r\n quarterMonths(key: string): string {\r\n return this.fiscal.find(q => q.key === key)?.months || '';\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n /** Stores ticked in the global header. */\r\n private headerStoreIds(): string[] {\r\n return (this.headerData?.stores || []).filter((s: any) => s.checked).map((s: any) => s.storeId);\r\n }\r\n\r\n private get hierarchyApplied(): boolean {\r\n const a = this.applied;\r\n return !!(a.circle || a.zone || a.aom || a.store);\r\n }\r\n\r\n private matchesScope(r: AuditRow, pick: ScopePick): boolean {\r\n return (!pick.circle || r.circle === pick.circle) && (!pick.zone || r.zone === pick.zone)\r\n && (!pick.aom || r.aom === pick.aom) && (!pick.store || String(r.raw?.storeId) === pick.store);\r\n }\r\n\r\n /** The stores every feed reads: the header's, narrowed to the applied hierarchy pick. */\r\n private scopedStoreIds(): string[] {\r\n if (!this.hierarchyApplied) { return this.headerStoreIds(); }\r\n return this.scopeRows.filter(r => this.matchesScope(r, this.applied)).map(r => String(r.raw?.storeId || '')).filter(Boolean);\r\n }\r\n\r\n /** The applied Audit type as the APIs take it (nothing for All Audits). */\r\n private auditFilter(): { checklistId?: string } {\r\n return this.applied.auditType !== 'all' ? { checklistId: this.applied.auditType } : {};\r\n }\r\n\r\n private basePayload(extra: Record<string, any> = {}): Record<string, any> {\r\n return {\r\n fromDate: this.from || this.headerData?.date?.startDate,\r\n toDate: this.to || this.headerData?.date?.endDate,\r\n storeId: this.scopedStoreIds(),\r\n ...this.auditFilter(),\r\n clientId: this.headerData?.client,\r\n userEmailes: this.userEmailes,\r\n limit: 1000,\r\n offset: 0,\r\n sortBy: '',\r\n sortColumnName: '',\r\n searchValue: '',\r\n export: false,\r\n ...extra\r\n };\r\n }\r\n\r\n /** The four feeds load together; a failure in one leaves the others intact. */\r\n private load(): void {\r\n this.loading = true;\r\n const safe = (o: any) => o.pipe(catchError(() => of(null)));\r\n const scope = this.basePayload();\r\n // Rows fetched for the whole header scope refill the hierarchy lists; narrowed ones do not.\r\n const narrowed = this.hierarchyApplied;\r\n forkJoin({\r\n // The audit dashboard API rejects unknown keys, so only the scope is sent.\r\n dash: safe(this.traxService.auditDashboard({\r\n clientId: scope['clientId'], fromDate: scope['fromDate'], toDate: scope['toDate'], storeId: scope['storeId'],\r\n ...this.auditFilter()\r\n })),\r\n // Same tables as the checklist dashboard, limited server-side to this client's audits.\r\n audits: safe(this.traxService.auditChecklistPerformance(this.basePayload({ limit: 200 }))),\r\n stores: safe(this.traxService.auditStorePerformance(this.basePayload({ limit: 1000 }))),\r\n users: safe(this.traxService.auditUserPerformance(this.basePayload({ limit: 500 })))\r\n }).pipe(takeUntil(this.destroy$)).subscribe(({ dash, audits, stores, users }: any) => {\r\n const data = dash?.code === 200 ? (dash.data || {}) : {};\r\n const auditList = audits?.code === 200 ? (audits.data?.checklistPerformance || []) : [];\r\n const storeList = stores?.code === 200 ? (stores.data?.storePerformance || []) : [];\r\n const userList = users?.code === 200 ? (users.data?.userPerformance || []) : [];\r\n\r\n this.passMark = Number(data.summary?.passMark) || PASS_MARK;\r\n this.criticalMark = Number(data.summary?.criticalMark) || CRITICAL_MARK;\r\n this.rows = (data.stores || []).map((s: any) => this.toAuditRow(s));\r\n if (!narrowed && dash?.code === 200) { this.scopeRows = this.rows; }\r\n this.storePerf = storeList.map((r: any) => this.toStorePerf(r));\r\n this.trend = (data.trend || []).map((b: any) => ({\r\n key: String(b.key), label: String(b.label),\r\n value: b.value === null || b.value === undefined ? null : Number(b.value),\r\n count: Number(b.count) || 0,\r\n // Older API builds send only count (every audit was scored then).\r\n submitted: Number(b.submitted ?? b.count) || 0\r\n }));\r\n this.auditPerf = auditList.map((r: any) => this.toAuditPerf(r));\r\n this.userPerf = userList.map((r: any) => this.toUserPerf(r));\r\n this.perfPage = 1;\r\n this.lastRefreshed = dayjs().format('hh:mm:ss A');\r\n this.loading = false;\r\n this.cd.detectChanges();\r\n });\r\n }\r\n\r\n /**\r\n * One store from the audit dashboard API: score is the mean of its compliance-scored audits in the period,\r\n * null when none. A store with submitted audits but no score is 'unscored' (its audits have no question with\r\n * compliance scoring on), not \"Not audited\".\r\n */\r\n private toAuditRow(s: any): AuditRow {\r\n const score = this.num(s?.score);\r\n let status: StoreStatus;\r\n if (score !== null) {\r\n status = score >= this.passMark ? 'pass' : 'fail';\r\n } else {\r\n status = s?.status === 'unscored' || (this.num(s?.audits) ?? 0) > 0 ? 'unscored' : 'na';\r\n }\r\n return {\r\n date: s?.lastAuditDate ? this.fmt(s.lastAuditDate) : '—',\r\n // The store's name (hierarchy, its submissions, or the stores list); \"—\" when it has none, never the id.\r\n storeId: s?.storeName || '—',\r\n circle: s?.circle || '—',\r\n zone: s?.zone || '—',\r\n aom: s?.aom || '—',\r\n score: score === null ? null : Math.round(score),\r\n status,\r\n raw: s\r\n };\r\n }\r\n\r\n /**\r\n * One store from /audit/dashboard/storePerformance (audit copy of the checklist dashboard's table): every audit\r\n * visit in the period, so completion = submitted / assigned and flags count, unlike the score-only store list.\r\n */\r\n private toStorePerf(r: any): StorePerfRow {\r\n return {\r\n storeId: r?.store_id || '',\r\n store: r?.storeName || '—',\r\n spoc: r?.userEmail || '—',\r\n assigned: this.num(r?.checkListCount) ?? 0,\r\n flags: this.num(r?.flaggedCount),\r\n completion: this.pctText(r?.completion),\r\n compliance: this.pctText(r?.compliance),\r\n perf: this.pctText(r?.performance),\r\n raw: r\r\n };\r\n }\r\n\r\n /**\r\n * Bar fill for a percentage (number, or text like \"51%\" / \"-25%\"): kept to 0-100. A negative score (option\r\n * scores can be negative penalties) would otherwise set an invalid negative width, which the browser drops,\r\n * drawing the bar full; it is empty instead, while the number beside it still shows the real score.\r\n */\r\n barWidth(value: number | string | null | undefined): string {\r\n const n = typeof value === 'number' ? value : parseFloat(String(value ?? '').replace('%', ''));\r\n return Number.isFinite(n) ? Math.max(0, Math.min(100, n)) + '%' : '0%';\r\n }\r\n\r\n private toAuditPerf(r: any): AuditPerfRow {\r\n const name = r?.checkListName || '—';\r\n // No question of the audit has compliance scoring on: no score and no result (the API sends null).\r\n const score = r?.complianceEnabled === false ? null : this.num(r?.questionCompliance);\r\n const scorePct = score === null ? 0 : Math.round(score);\r\n // The audit's own pass mark when the API sends it, else the dashboard's (summary.passMark).\r\n const mark = this.num(r?.passMark) ?? this.passMark;\r\n return {\r\n name,\r\n initials: String(r?.checkListChar || name.slice(0, 2)).toUpperCase(),\r\n scheduled: r?.scheduleRepeatedType ? this.titleCase(r.scheduleRepeatedType) : '—',\r\n assigned: this.num(r?.storeCount) ?? 0,\r\n submitted: this.num(r?.submittedChecklist) ?? 0,\r\n // Questions with a store dispute (raised or reviewed) in the period; '—' only when the API sends none.\r\n disputes: this.num(r?.disputes),\r\n passMark: mark + '%',\r\n score: score === null ? '—' : scorePct + '%',\r\n scorePct,\r\n result: score === null ? '—' : (scorePct >= mark ? 'Pass' : 'Fail'),\r\n raw: r\r\n };\r\n }\r\n\r\n private toUserPerf(r: any): UserPerfRow {\r\n return {\r\n name: r?.userName || '—',\r\n email: r?.userEmail || '—',\r\n assigned: this.num(r?.checkListCount) ?? 0,\r\n flags: this.num(r?.flaggedCount) ?? 0,\r\n redo: this.num(r?.redo) ?? 0,\r\n completion: this.pctText(r?.completion),\r\n compliance: this.pctText(r?.compliance),\r\n perf: this.pctText(r?.performance),\r\n raw: r\r\n };\r\n }\r\n\r\n /**\r\n * Task mode: tiles + Task Performance rows for the tasks raised from this client's audits, in the\r\n * current scope. A failed call leaves '—' everywhere and retries the next time the Task tab opens.\r\n */\r\n private loadTasks(): void {\r\n if (!this.headerData) { return; }\r\n this.tasksStale = false;\r\n this.taskLoading = true;\r\n const request = ++this.taskRequest;\r\n const scope = this.basePayload();\r\n // The endpoint rejects unknown keys, so only the scope is sent.\r\n this.traxService.auditDashboardTasks({\r\n clientId: scope['clientId'], fromDate: scope['fromDate'], toDate: scope['toDate'],\r\n storeId: scope['storeId'], userEmailes: scope['userEmailes'], ...this.auditFilter()\r\n }).pipe(catchError(() => of(null)), takeUntil(this.destroy$)).subscribe((res: any) => {\r\n if (request !== this.taskRequest) { return; }\r\n const data = res?.code === 200 ? (res.data || null) : null;\r\n if (!data) { this.tasksStale = true; }\r\n this.taskStats = this.toTaskStats(data);\r\n this.taskPerf = (data?.tasks || []).map((t: any) => this.toTaskPerf(t));\r\n this.lastRefreshed = dayjs().format('hh:mm:ss A');\r\n this.taskLoading = false;\r\n this.cd.detectChanges();\r\n });\r\n }\r\n\r\n private toTaskStats(d: any): TaskStats {\r\n this.taskDeltaValues = {\r\n completion: this.num(d?.deltas?.completion),\r\n compliance: this.num(d?.deltas?.compliance),\r\n flags: this.num(d?.deltas?.flags)\r\n };\r\n if (!d) { return { ...EMPTY_TASK_STATS }; }\r\n const count = (v: any) => {\r\n const n = this.num(v);\r\n return n === null ? '—' : n.toLocaleString('en-US');\r\n };\r\n const days = this.num(d?.period?.previous?.days) ?? 1;\r\n const vs = days === 1 ? 'vs last day' : 'vs previous ' + days + ' days';\r\n const delta = (v: number | null) => (v === null ? '' : Math.abs(v) + '% ' + vs);\r\n return {\r\n activeTasks: count(d.activeTasks),\r\n taskInstances: count(d.taskInstances),\r\n notSubmitted: count(d.notSubmitted),\r\n openTasks: count(d.openTasks),\r\n inProgress: count(d.inProgress),\r\n submitted: count(d.submitted),\r\n completionScore: this.pctText(d.completionScore),\r\n complianceScore: this.pctText(d.complianceScore),\r\n totalFlags: count(d.totalFlags),\r\n completionDelta: delta(this.taskDeltaValues.completion),\r\n complianceDelta: delta(this.taskDeltaValues.compliance),\r\n flagsDelta: delta(this.taskDeltaValues.flags)\r\n };\r\n }\r\n\r\n /** One task raised from an audit; compliance is '—' while task instances carry no score. */\r\n private toTaskPerf(t: any): TaskPerfRow {\r\n const name = t?.taskName || '—';\r\n const compliance = this.num(t?.compliance);\r\n const raised = this.num(t?.tasks);\r\n let scheduled = '—';\r\n if (t?.scheduleRepeatedType) {\r\n scheduled = this.titleCase(t.scheduleRepeatedType);\r\n } else if (t?.dueDate) {\r\n scheduled = 'Due ' + this.fmt(t.dueDate);\r\n }\r\n return {\r\n name,\r\n initials: name.slice(0, 2).toUpperCase(),\r\n scheduled,\r\n coverage: t?.coverage ? this.titleCase(t.coverage) : '—',\r\n assigned: this.num(t?.assigned) ?? 0,\r\n submitted: this.num(t?.submitted) ?? 0,\r\n flags: this.num(t?.flags) ?? 0,\r\n tasks: raised === null ? '—' : String(raised),\r\n redo: this.num(t?.redo) ?? 0,\r\n compliance: this.pctText(compliance),\r\n compliancePct: compliance === null ? 0 : Math.round(compliance),\r\n raw: t\r\n };\r\n }\r\n\r\n /** Delta styling: arrow direction, and colour by whether the move is good (more flags is bad). */\r\n taskDeltaClass(key: TaskDeltaKey): string {\r\n const v = this.taskDeltaValues[key];\r\n if (v === null || v === 0) { return 'is-flat'; }\r\n const up = v > 0;\r\n const good = key === 'flags' ? !up : up;\r\n return (up ? 'is-up' : 'is-down') + ' ' + (good ? 'is-good' : 'is-bad');\r\n }\r\n\r\n private num(v: any): number | null {\r\n if (v === null || v === undefined || v === '') { return null; }\r\n const n = Number(v);\r\n return isNaN(n) ? null : n;\r\n }\r\n\r\n private pctText(v: any): string {\r\n const n = this.num(v);\r\n return n === null ? '—' : Math.round(n) + '%';\r\n }\r\n\r\n private titleCase(v: string): string {\r\n return v.charAt(0).toUpperCase() + v.slice(1).toLowerCase();\r\n }\r\n\r\n private fmt(v: any): string {\r\n return v ? dayjs(v).format('MMM DD, YYYY') : '—';\r\n }\r\n\r\n /** Rows after search, status and score-band filters. */\r\n get filteredRows(): AuditRow[] {\r\n const q = this.search.trim().toLowerCase();\r\n return this.rows\r\n .filter(r => this.status === 'all' || r.status === this.status)\r\n .filter(r => {\r\n if (r.score === null) {\r\n return this.scoreMin === 0 && this.scoreMax === 100;\r\n }\r\n // A lower bound of 0 is open: penalty scores can take a store below 0% (Critical).\r\n return (this.scoreMin <= 0 || r.score >= this.scoreMin) && r.score <= this.scoreMax;\r\n })\r\n .filter(r => !q || [r.storeId, r.circle, r.zone, r.aom, r.raw?.storeName || '', r.raw?.storeId || ''].some(v => String(v).toLowerCase().includes(q)))\r\n .sort((a, b) => this.compare(a, b));\r\n }\r\n\r\n private compare(a: AuditRow, b: AuditRow): number {\r\n const dir = this.sortDir === 'asc' ? 1 : -1;\r\n if (this.sortKey === 'score') {\r\n // Not-audited stores (no score) always come after the audited ones, in either direction,\r\n // so the few audited stores are not buried under thousands of \"Not audited\" rows.\r\n if (a.score === null || b.score === null) {\r\n return a.score === b.score ? 0 : (a.score === null ? 1 : -1);\r\n }\r\n return (a.score - b.score) * dir;\r\n }\r\n const av = String(a[this.sortKey as keyof AuditRow] ?? '');\r\n const bv = String(b[this.sortKey as keyof AuditRow] ?? '');\r\n return av.localeCompare(bv) * dir;\r\n }\r\n\r\n get totalPages(): number {\r\n return Math.max(1, Math.ceil(this.filteredRows.length / this.pageSize));\r\n }\r\n\r\n get pageRows(): AuditRow[] {\r\n const start = (this.page - 1) * this.pageSize;\r\n return this.filteredRows.slice(start, start + this.pageSize);\r\n }\r\n\r\n /** Stores that carry a score in the current period. */\r\n private get evaluated(): AuditRow[] {\r\n return this.rows.filter(r => r.score !== null);\r\n }\r\n\r\n /** Stores with a submitted audit in the period, scored or not. */\r\n private get auditedCount(): number {\r\n return this.rows.filter(r => r.status !== 'na').length;\r\n }\r\n\r\n get averageScore(): number | null {\r\n const ev = this.evaluated;\r\n if (!ev.length) { return null; }\r\n return Math.round(ev.reduce((sum, r) => sum + (r.score as number), 0) / ev.length);\r\n }\r\n\r\n get kpis(): AuditKpi[] {\r\n const ev = this.evaluated;\r\n const avg = this.averageScore;\r\n const passCount = ev.filter(r => (r.score as number) >= this.passMark).length;\r\n const failCount = ev.length - passCount;\r\n const critical = ev.filter(r => (r.score as number) < this.criticalMark).length;\r\n const periodLabel = this.periodLabel;\r\n const audited = this.auditedCount;\r\n let avgNote = 'Across audited stores';\r\n if (avg === null) {\r\n avgNote = audited ? 'Compliance score is off for these audits' : 'No audits in this period';\r\n }\r\n\r\n return [\r\n {\r\n label: 'Average score',\r\n value: avg === null ? '—' : avg + '%',\r\n note: avgNote,\r\n noteColor: avg !== null && avg < this.passMark ? '#D92D20' : '#027A48'\r\n },\r\n {\r\n label: 'Pass rate',\r\n value: ev.length ? Math.round(passCount / ev.length * 100) + '%' : '—',\r\n note: passCount + ' pass, ' + failCount + ' fail',\r\n noteColor: '#667085'\r\n },\r\n {\r\n label: 'Critical stores',\r\n value: String(critical),\r\n note: 'Score below ' + this.criticalMark + '%',\r\n noteColor: critical ? '#D92D20' : '#667085'\r\n },\r\n {\r\n // Submitted audits, as the trend counts them; the note gives the stores they cover.\r\n label: 'Audits completed',\r\n value: String(this.rows.reduce((sum, r) => sum + (Number(r.raw?.audits) || 0), 0)),\r\n note: 'at ' + audited + ' of ' + this.rows.length + ' stores in scope · ' + periodLabel,\r\n noteColor: '#667085'\r\n }\r\n ];\r\n }\r\n\r\n get periodLabel(): string {\r\n if (this.grain === 'quarter' && this.quarter) { return this.quarter + ' (' + this.quarterMonths(this.quarter) + ')'; }\r\n return this.fmt(this.from) + ' to ' + this.fmt(this.to);\r\n }\r\n\r\n /**\r\n * Distribution of stores across score bands. Not scored is left out (QA 9 Oct), and its stores\r\n * with it, so the shares still add up to 100%.\r\n */\r\n get bandRows(): Array<{ band: AuditBand; count: number; share: string; width: string }> {\r\n const total = this.rows.filter(r => r.status !== 'unscored').length || 1;\r\n return this.bands.filter(band => band.key !== 'unscored').map(band => {\r\n const count = STATUS_BANDS.includes(band.key)\r\n ? this.rows.filter(r => r.status === band.key).length\r\n : this.rows.filter(r => r.score !== null && this.inBand(r.score as number, band)).length;\r\n return {\r\n band,\r\n count,\r\n // A few stores out of thousands round to 0%; say \"<1%\" instead of 0% next to a non-zero count.\r\n share: count && count / total * 100 < 1 ? '<1%' : Math.round(count / total * 100) + '%',\r\n width: (count / total * 100) + '%'\r\n };\r\n });\r\n }\r\n\r\n /** Band colours of a store row: by score, or the Not scored / Not audited band when it has none. */\r\n bandFor(row: AuditRow): AuditBand {\r\n const last = this.bands[this.bands.length - 1];\r\n if (row.score === null) { return this.bands.find(b => b.key === row.status) ?? last; }\r\n const score = row.score;\r\n return this.bands.find(b => !STATUS_BANDS.includes(b.key) && this.inBand(score, b)) ?? last;\r\n }\r\n\r\n /** A score band's range; the lowest band (lo 0, Critical) also takes negative scores (penalty options). */\r\n private inBand(score: number, band: AuditBand): boolean {\r\n return (band.lo <= 0 || score >= band.lo) && score <= band.hi;\r\n }\r\n\r\n statusLabel(row: AuditRow): string {\r\n if (row.status === 'pass') { return 'Pass'; }\r\n if (row.status === 'fail') { return 'Fail'; }\r\n return row.status === 'unscored' ? 'Not scored' : 'Not audited';\r\n }\r\n\r\n /** Bar height as a percentage of the chart area. */\r\n barHeight(bar: TrendBar): string {\r\n return (bar.value === null ? 2 : Math.max(3, bar.value)) + '%';\r\n }\r\n\r\n /** Hover card sits just above the bar's value label; capped so a tall bar's card stays inside the chart. */\r\n tipBottom(bar: TrendBar): string {\r\n const h = bar.value === null ? 2 : Math.max(3, bar.value);\r\n return 'calc(' + Math.min(h, 45) + '% + 26px)';\r\n }\r\n\r\n barFill(bar: TrendBar): string {\r\n if (bar.value === null) { return '#F2F4F7'; }\r\n const active = bar.key === this.quarter;\r\n if (bar.value >= this.passMark) { return active ? '#1570EF' : '#B2DDFF'; }\r\n return active ? '#F04438' : '#FECDCA';\r\n }\r\n\r\n setGrain(grain: 'quarter' | 'date'): void {\r\n if (grain === this.grain) { return; }\r\n this.grain = grain;\r\n this.page = 1;\r\n if (grain === 'quarter') {\r\n this.applyQuarter(this.quarters.includes(this.quarter) ? this.quarter : this.quarters[this.quarters.length - 1], true);\r\n return;\r\n }\r\n // Back to By date: the header's range again.\r\n this.from = this.headerData?.date?.startDate || this.from;\r\n this.to = this.headerData?.date?.endDate || this.to;\r\n this.range = toPickerRange(this.from, this.to);\r\n if (!this.filtersOpen) { this.reloadPeriod(); }\r\n }\r\n\r\n setStatus(status: StatusFilter): void {\r\n this.status = status;\r\n this.page = 1;\r\n }\r\n\r\n sortBy(key: string): void {\r\n if (this.sortKey === key) {\r\n this.sortDir = this.sortDir === 'asc' ? 'desc' : 'asc';\r\n } else {\r\n this.sortKey = key;\r\n this.sortDir = 'asc';\r\n }\r\n }\r\n\r\n /**\r\n * Score distribution -> View stores: narrow the store list to that band (Not audited -> the\r\n * stores with no submission) and bring the list into view.\r\n */\r\n applyBand(band: AuditBand): void {\r\n if (STATUS_BANDS.includes(band.key)) {\r\n this.clearBand();\r\n this.status = band.key as StoreStatus;\r\n } else {\r\n this.scoreMin = band.lo;\r\n this.scoreMax = band.hi;\r\n this.status = 'all';\r\n this.page = 1;\r\n }\r\n this.storeListOpen = true;\r\n this.listBandKey = band.key;\r\n // From the drawer, Apply scrolls once it closes.\r\n if (this.filtersOpen) { return; }\r\n setTimeout(() => document.getElementById('ad-store-list')?.scrollIntoView({ behavior: 'smooth', block: 'start' }));\r\n }\r\n\r\n clearBand(): void {\r\n this.scoreMin = 0;\r\n this.scoreMax = 100;\r\n this.page = 1;\r\n }\r\n\r\n /**\r\n * The Store list stays hidden until Score distribution -> View stores opens it (or the Filters\r\n * drawer sets a score range); the chip's x closes it again.\r\n */\r\n storeListOpen = false;\r\n /** Band the list was opened for ('' = all stores). */\r\n listBandKey = '';\r\n\r\n get showStoreList(): boolean {\r\n return this.storeListOpen || this.bandFilterActive || this.status !== 'all';\r\n }\r\n\r\n /** Chip over the list: the band or status it shows, or \"All stores\". */\r\n get listChipLabel(): string {\r\n if (!this.showStoreList) { return ''; }\r\n if (this.bandFilterActive) { return this.bandChipLabel; }\r\n const band = this.bands.find(b => b.key === this.listBandKey);\r\n // A score band the range no longer matches is stale; a status band still holds while the status does.\r\n if (band && band.key === this.status) { return band.label + ' · ' + band.range; }\r\n return this.status !== 'all' ? this.statusFilterLabel : 'All stores';\r\n }\r\n\r\n /** Drawer Score range: the band the current range (or status band) matches. */\r\n isBandOn(band: AuditBand): boolean {\r\n if (STATUS_BANDS.includes(band.key)) { return this.status === band.key; }\r\n return this.scoreMin === band.lo && this.scoreMax === band.hi;\r\n }\r\n\r\n /** Chip \"Show all stores\": keep the list open, without the band. */\r\n showAllStores(): void {\r\n this.clearBand();\r\n this.status = 'all';\r\n this.listBandKey = '';\r\n this.storeListOpen = true;\r\n }\r\n\r\n /** Chip x: hide the list again. */\r\n closeStoreList(): void {\r\n this.clearBand();\r\n this.status = 'all';\r\n this.listBandKey = '';\r\n this.storeListOpen = false;\r\n }\r\n\r\n get bandFilterActive(): boolean {\r\n return this.scoreMin !== 0 || this.scoreMax !== 100;\r\n }\r\n\r\n get bandChipLabel(): string {\r\n const hit = this.bands.find(b => !STATUS_BANDS.includes(b.key) && b.lo === this.scoreMin && b.hi === this.scoreMax);\r\n return hit ? hit.label + ' · ' + hit.range : 'Score ' + this.scoreMin + '–' + this.scoreMax + '%';\r\n }\r\n\r\n onSearch(): void {\r\n this.page = 1;\r\n }\r\n\r\n /** The five filter categories the drawer lists. */\r\n get filterCats(): FilterCat[] {\r\n return [\r\n { key: 'period', label: 'Period', value: this.periodLabel, title: 'Period',\r\n sub: 'Starts as the global header date range; pick a range to narrow it.',\r\n dirty: false },\r\n { key: 'scope', label: 'Store hierarchy', value: this.scopeLabel, title: 'Store hierarchy',\r\n sub: 'Pick the circle, zone, AOM or store the whole dashboard reads.',\r\n dirty: !!this.circle },\r\n { key: 'type', label: 'Audit type', value: this.auditTypeLabel, title: 'Audit type',\r\n sub: 'Which audit programme the scores come from.',\r\n dirty: this.auditType !== 'all' },\r\n { key: 'band', label: 'Score range', value: this.bandChipLabel, title: 'Score range',\r\n sub: 'Tap a band to set the range the summary reads.',\r\n dirty: this.bandFilterActive },\r\n { key: 'status', label: 'Status', value: this.statusFilterLabel, title: 'Status',\r\n sub: 'Show every store, or only the ones that passed or failed.',\r\n dirty: this.status !== 'all' }\r\n ];\r\n }\r\n\r\n get activeCatObj(): FilterCat {\r\n return this.filterCats.find(c => c.key === this.activeCat) || this.filterCats[0];\r\n }\r\n\r\n get filterCount(): number {\r\n return this.filterCats.filter(c => c.dirty).length;\r\n }\r\n\r\n /** Stores the drawer's hierarchy pick covers (what Apply will load). */\r\n get storesInScope(): number {\r\n return this.scopeRows.filter(r => this.matchesScope(r, this)).length;\r\n }\r\n\r\n /** Sorted distinct names, without the \"—\" of stores outside the hierarchy. */\r\n private distinct(values: string[]): string[] {\r\n return Array.from(new Set(values.filter(v => v && v !== '—'))).sort((a, b) => a.localeCompare(b));\r\n }\r\n\r\n get circles(): string[] {\r\n return this.distinct(this.scopeRows.map(r => r.circle));\r\n }\r\n\r\n get zones(): string[] {\r\n return this.distinct(this.scopeRows.filter(r => r.circle === this.circle).map(r => r.zone));\r\n }\r\n\r\n get aoms(): string[] {\r\n return this.distinct(this.scopeRows.filter(r => r.circle === this.circle && r.zone === this.zone).map(r => r.aom));\r\n }\r\n\r\n get scopeReading(): string {\r\n const n = this.storesInScope;\r\n return this.scopeLabel + ' · ' + n + (n === 1 ? ' store' : ' stores');\r\n }\r\n\r\n setModuleTab(tab: 'Audit' | 'Task'): void {\r\n if (tab !== this.moduleTab) {\r\n // The first Performance table changes (Audit / Task), so its sort starts over.\r\n this.perfSortKey = '';\r\n this.perfSortDir = 'asc';\r\n }\r\n this.moduleTab = tab;\r\n if (tab === 'Task' && this.tasksStale) { this.loadTasks(); }\r\n }\r\n\r\n get scopeLabel(): string {\r\n const store = this.store ? this.scopeRows.find(r => String(r.raw?.storeId) === this.store) : undefined;\r\n return (store ? store.raw?.storeName || this.store : this.store) || this.aom || this.zone || this.circle || 'All stores';\r\n }\r\n\r\n get auditTypeLabel(): string {\r\n const t = this.auditTypes.find(x => x.key === this.auditType);\r\n return t ? t.label : 'All Audits';\r\n }\r\n\r\n get statusFilterLabel(): string {\r\n if (this.status === 'all') { return 'All stores'; }\r\n if (this.status === 'pass') { return 'Pass stores'; }\r\n if (this.status === 'unscored') { return 'Not scored'; }\r\n return this.status === 'fail' ? 'Fail stores' : 'Not audited';\r\n }\r\n\r\n openFilters(cat?: string): void {\r\n this.draft = Object.create(this) as AuditV2DashboardComponent;\r\n this.activeCat = cat || this.activeCat;\r\n this.filtersOpen = true;\r\n }\r\n\r\n selectCat(key: string): void {\r\n this.activeCat = key;\r\n }\r\n\r\n applyFilters(): void {\r\n const d = this.draft;\r\n const periodChanged = !!d && (d.from !== this.from || d.to !== this.to);\r\n if (d) {\r\n const self = this as any;\r\n AuditV2DashboardComponent.DRAFT_KEYS.forEach(k => { self[k] = (d as any)[k]; });\r\n }\r\n const scopeChanged = this.commitScope();\r\n this.draft = null;\r\n this.filtersOpen = false;\r\n this.page = 1;\r\n if (periodChanged || scopeChanged) { this.reloadPeriod(); }\r\n // Score range and Status only filter the store list, so show it.\r\n if (this.bandFilterActive || this.status !== 'all') {\r\n setTimeout(() => document.getElementById('ad-store-list')?.scrollIntoView({ behavior: 'smooth', block: 'start' }));\r\n }\r\n }\r\n\r\n /** Make the drawer's hierarchy + audit type the loaded ones; true when they differ from before. */\r\n private commitScope(): boolean {\r\n const a = this.applied;\r\n const changed = a.circle !== this.circle || a.zone !== this.zone || a.aom !== this.aom || a.store !== this.store\r\n || a.auditType !== this.auditType;\r\n this.applied = { circle: this.circle, zone: this.zone, aom: this.aom, store: this.store, auditType: this.auditType };\r\n return changed;\r\n }\r\n\r\n /** Cancel / x / backdrop: the draft is dropped; the page never changed. */\r\n cancelFilters(): void {\r\n this.draft = null;\r\n this.filtersOpen = false;\r\n }\r\n\r\n /** Reset every filter to the documented defaults. */\r\n clearAll(): void {\r\n this.auditType = 'all';\r\n this.grain = 'date';\r\n this.circle = '';\r\n this.zone = '';\r\n this.aom = '';\r\n this.store = '';\r\n this.scoreMin = 0;\r\n this.scoreMax = 100;\r\n this.status = 'all';\r\n this.page = 1;\r\n // The chips' Clear all (drawer closed) reloads now; inside the drawer, Apply does.\r\n if (!this.filtersOpen && this.commitScope()) { this.reloadPeriod(); }\r\n }\r\n\r\n /** Changing a level clears the levels below it. */\r\n onCircleChange(): void {\r\n this.zone = '';\r\n this.aom = '';\r\n this.store = '';\r\n this.page = 1;\r\n }\r\n\r\n onZoneChange(): void {\r\n this.aom = '';\r\n this.store = '';\r\n this.page = 1;\r\n }\r\n\r\n onAomChange(): void {\r\n this.store = '';\r\n this.page = 1;\r\n }\r\n\r\n resetScope(): void {\r\n this.circle = '';\r\n this.zone = '';\r\n this.aom = '';\r\n this.store = '';\r\n this.page = 1;\r\n }\r\n\r\n /** Store dropdown: the stores of the picked AOM, by name (value = storeId). */\r\n get storePickOptions(): Array<{ value: string; label: string }> {\r\n const stores = this.scopeRows\r\n .filter(r => this.matchesScope(r, { circle: this.circle, zone: this.zone, aom: this.aom, store: '' }))\r\n .map(r => ({ value: String(r.raw?.storeId || ''), label: String(r.raw?.storeName || '—') }))\r\n .filter(o => o.value)\r\n .sort((a, b) => a.label.localeCompare(b.label));\r\n return [{ value: '', label: 'All stores' }].concat(stores);\r\n }\r\n\r\n /** Options for the drawer's custom dropdowns (lib-audit-v2-select): \"All …\" first, then the list. */\r\n pickOptions(list: string[], all: string): Array<{ value: string; label: string }> {\r\n return [{ value: '', label: all }].concat((list || []).map(v => ({ value: v, label: v })));\r\n }\r\n\r\n /** The first performance tab is named after the active module. */\r\n get perfTabsForModule(): Array<'Audit' | 'Store' | 'User'> {\r\n return this.perfTabs;\r\n }\r\n\r\n perfTabDisplay(tab: string): string {\r\n return (tab === 'Audit' ? this.moduleTab : tab) + ' Performance';\r\n }\r\n\r\n get perfInfoTitle(): string {\r\n if (this.perfTab === 'Store') { return 'Stores Info'; }\r\n if (this.perfTab === 'User') { return 'User Info'; }\r\n return this.moduleTab + ' Info';\r\n }\r\n\r\n get perfCreateLabel(): string {\r\n return '+ Create ' + this.moduleTab;\r\n }\r\n\r\n get isTaskModule(): boolean {\r\n return this.moduleTab === 'Task';\r\n }\r\n\r\n get filteredTaskPerf(): TaskPerfRow[] {\r\n const q = this.perfSearch.trim().toLowerCase();\r\n return this.sortPerfRows(q ? this.taskPerf.filter(r => r.name.toLowerCase().includes(q)) : this.taskPerf, this.taskSortValue);\r\n }\r\n\r\n trackByPerfTask(_: number, row: TaskPerfRow): string {\r\n return row.raw?.taskId || row.name;\r\n }\r\n\r\n /** The selected trend bucket drives the headline score above the chart. */\r\n private get focusBar(): TrendBar | undefined {\r\n if (this.grain === 'quarter') { return this.quarterTrend.find(b => b.key === this.quarter); }\r\n return this.trend.find(b => b.key === this.quarter) || this.trend[0];\r\n }\r\n\r\n get focusScore(): string {\r\n const b = this.focusBar;\r\n if (b && b.value !== null) { return b.value + '%'; }\r\n // With no trend buckets, the headline is the period average.\r\n const avg = this.averageScore;\r\n return avg === null ? '—' : avg + '%';\r\n }\r\n\r\n get focusPassed(): boolean {\r\n const b = this.focusBar;\r\n if (b && b.value !== null) { return b.value >= this.passMark; }\r\n const avg = this.averageScore;\r\n return avg !== null && avg >= this.passMark;\r\n }\r\n\r\n get focusStatus(): string {\r\n const b = this.focusBar;\r\n const has = (b && b.value !== null) || this.averageScore !== null;\r\n if (!has) { return 'No data'; }\r\n return this.focusPassed ? 'Pass' : 'Below pass mark';\r\n }\r\n\r\n get focusLine(): string {\r\n // Submitted audits, as the bars count them (\"10 audits\"); auditedCount counts audited stores.\r\n const n = this.grain === 'quarter'\r\n ? (this.focusBar?.submitted ?? 0)\r\n : this.trend.reduce((sum, b) => sum + (b.submitted || 0), 0);\r\n return this.periodLabel + ' · ' + n + (n === 1 ? ' audit completed' : ' audits completed')\r\n + ' · pass mark ' + this.passMark + '%';\r\n }\r\n\r\n setPerfTab(tab: 'Audit' | 'Store' | 'User'): void {\r\n this.perfTab = tab;\r\n this.perfSearch = '';\r\n this.perfSortKey = '';\r\n this.perfSortDir = 'asc';\r\n this.perfPage = 1;\r\n }\r\n\r\n /** Rows in the open performance table after search / sort (what the pager counts). */\r\n get perfTotal(): number {\r\n if (this.perfTab === 'Audit') { return this.isTaskModule ? this.filteredTaskPerf.length : this.filteredAuditPerf.length; }\r\n return this.perfTab === 'Store' ? this.filteredStorePerf.length : this.filteredUserPerf.length;\r\n }\r\n\r\n /** The current page of a performance table; a search that shrinks the list pulls the page back into range. */\r\n perfPageOf<T>(list: T[]): T[] {\r\n const pages = Math.max(1, Math.ceil(list.length / this.perfPageSize));\r\n const page = Math.min(this.perfPage, pages);\r\n return list.slice((page - 1) * this.perfPageSize, page * this.perfPageSize);\r\n }\r\n\r\n onPerfPage(page: number): void {\r\n this.perfPage = Number(page) || 1;\r\n }\r\n\r\n onPerfPageSize(size: any): void {\r\n this.perfPageSize = Number(size) || 10;\r\n this.perfPage = 1;\r\n }\r\n\r\n /** A new search starts on page 1. */\r\n onPerfSearch(): void {\r\n this.perfPage = 1;\r\n }\r\n\r\n /** Performance header click: sort by that column, again to reverse (same toggle as the store list). */\r\n sortPerf(key: string): void {\r\n if (this.perfSortKey === key) {\r\n this.perfSortDir = this.perfSortDir === 'asc' ? 'desc' : 'asc';\r\n } else {\r\n this.perfSortKey = key;\r\n this.perfSortDir = 'asc';\r\n }\r\n }\r\n\r\n /**\r\n * Rows in the picked column order (the API's order when none is picked). Numbers compare as numbers, text\r\n * case-insensitively; empty values ('—') stay at the bottom in both directions, as in the store list.\r\n */\r\n private sortPerfRows<T>(rows: T[], values: Record<string, (r: T) => SortValue>): T[] {\r\n const get = values[this.perfSortKey];\r\n if (!get) { return rows; }\r\n const dir = this.perfSortDir === 'asc' ? 1 : -1;\r\n const empty = (v: SortValue) => v === null || v === undefined || v === '' || v === '—';\r\n return [...rows].sort((a, b) => {\r\n const av = get(a);\r\n const bv = get(b);\r\n if (empty(av) || empty(bv)) { return empty(av) === empty(bv) ? 0 : (empty(av) ? 1 : -1); }\r\n if (typeof av === 'number' && typeof bv === 'number') { return (av - bv) * dir; }\r\n return String(av).localeCompare(String(bv), undefined, { numeric: true, sensitivity: 'base' }) * dir;\r\n });\r\n }\r\n\r\n /** Submitted count -> the Gallery on this audit's submissions in the dashboard period. */\r\n submittedParams(row: AuditPerfRow): Record<string, string> {\r\n return {\r\n audit: String(row.raw?.sourceCheckList_id || row.raw?._id || ''),\r\n from: this.from || this.headerData?.date?.startDate || '',\r\n to: this.to || this.headerData?.date?.endDate || ''\r\n };\r\n }\r\n\r\n /** Task Submitted count -> the Gallery with Type Task on this task's submissions in the dashboard period. */\r\n taskSubmittedParams(row: TaskPerfRow): Record<string, string> {\r\n return {\r\n audit: String(row.raw?.taskId || ''),\r\n type: 'task',\r\n from: this.from || this.headerData?.date?.startDate || '',\r\n to: this.to || this.headerData?.date?.endDate || ''\r\n };\r\n }\r\n\r\n /**\r\n * Audit / store / user detail link: the subject plus the dashboard period (from / to), so the detail\r\n * page shows the same days as the row clicked, not the header range (the dashboard keeps its own period).\r\n */\r\n detailParams(subject: Record<string, any>): Record<string, any> {\r\n return {\r\n ...subject,\r\n from: this.from || this.headerData?.date?.startDate || '',\r\n to: this.to || this.headerData?.date?.endDate || ''\r\n };\r\n }\r\n\r\n perfTabLabel(tab: string): string {\r\n return tab + ' Performance';\r\n }\r\n\r\n get perfSearchPlaceholder(): string {\r\n if (this.perfTab === 'Store') { return 'Search by Store Name'; }\r\n if (this.perfTab === 'User') { return 'Search by User Name'; }\r\n return 'Search by ' + this.moduleTab;\r\n }\r\n\r\n get filteredAuditPerf(): AuditPerfRow[] {\r\n const q = this.perfSearch.trim().toLowerCase();\r\n return this.sortPerfRows(q ? this.auditPerf.filter(r => r.name.toLowerCase().includes(q)) : this.auditPerf, this.auditSortValue);\r\n }\r\n\r\n get filteredStorePerf(): StorePerfRow[] {\r\n const q = this.perfSearch.trim().toLowerCase();\r\n return this.sortPerfRows(q ? this.storePerf.filter(r => (r.store + ' ' + r.storeId + ' ' + r.spoc).toLowerCase().includes(q)) : this.storePerf, this.storeSortValue);\r\n }\r\n\r\n get filteredUserPerf(): UserPerfRow[] {\r\n const q = this.perfSearch.trim().toLowerCase();\r\n return this.sortPerfRows(q ? this.userPerf.filter(r => (r.name + ' ' + r.email).toLowerCase().includes(q)) : this.userPerf, this.userSortValue);\r\n }\r\n\r\n trackByPerfAudit(_: number, row: AuditPerfRow): string {\r\n return row.raw?.sourceCheckList_id || row.name;\r\n }\r\n\r\n trackByPerfStore(_: number, row: StorePerfRow): string {\r\n return row.storeId || row.store;\r\n }\r\n\r\n trackByPerfUser(_: number, row: UserPerfRow): string {\r\n return row.email;\r\n }\r\n\r\n onPageChange(page: number): void {\r\n this.page = Number(page) || 1;\r\n }\r\n\r\n onPageSizeChange(size: any): void {\r\n this.pageSize = Number(size) || 10;\r\n this.page = 1;\r\n }\r\n\r\n trackByStore(_: number, row: AuditRow): string {\r\n return row.storeId;\r\n }\r\n\r\n /**\r\n * filterCats / bandRows are getters that build new objects on every change detection. Without a key\r\n * ngFor rebuilds their buttons on each pass, and a pass between mousedown and mouseup (the hierarchy\r\n * dropdown listens to document:mousedown) swallows the click.\r\n */\r\n trackByCat(_: number, c: FilterCat): string {\r\n return c.key;\r\n }\r\n\r\n trackByBand(_: number, b: { band: AuditBand }): string {\r\n return b.band.key;\r\n }\r\n\r\n /** ---- Export (client-side .xlsx of exactly the filtered rows and visible columns) ---- */\r\n\r\n private get exportPeriod(): string {\r\n return this.from + '_' + this.to;\r\n }\r\n\r\n /** Header Export: the store list below the filters, every filtered row (all pages), its visible columns. */\r\n exportStores(): void {\r\n const rows = this.filteredRows;\r\n if (this.loading || !rows.length) { return; }\r\n const columns: ExportColumn<AuditRow>[] = this.headers.map(h => ({\r\n header: h.label,\r\n value: (r: AuditRow) => {\r\n if (h.key === 'score') { return r.score === null ? '—' : r.score + '%'; }\r\n if (h.key === 'status') { return this.statusLabel(r); }\r\n return r[h.key as keyof AuditRow];\r\n }\r\n }));\r\n this.traxService.exportRowsXlsx(rows, columns, 'Audit-Dashboard-Stores-' + this.exportPeriod, 'Store list');\r\n }\r\n\r\n /** Rows of the active performance tab after its search (what the \"Total\" counter shows). */\r\n get perfRowCount(): number {\r\n if (this.perfTab === 'Store') { return this.filteredStorePerf.length; }\r\n if (this.perfTab === 'User') { return this.filteredUserPerf.length; }\r\n return this.isTaskModule ? this.filteredTaskPerf.length : this.filteredAuditPerf.length;\r\n }\r\n\r\n /** The active performance tab is still loading (the Task table has its own feed). */\r\n get perfLoading(): boolean {\r\n return this.perfTab === 'Audit' && this.isTaskModule ? this.taskLoading : this.loading;\r\n }\r\n\r\n /** Performance Export: the active tab's filtered list with its visible column headers (Action left out). */\r\n exportPerformance(): void {\r\n if (this.perfLoading || !this.perfRowCount) { return; }\r\n const period = this.exportPeriod;\r\n if (this.perfTab === 'Store') {\r\n const columns: ExportColumn<StorePerfRow>[] = [\r\n { header: 'Store Name', value: r => r.store },\r\n { header: 'Store ID', value: r => r.storeId },\r\n { header: 'Store Spoc', value: r => r.spoc },\r\n { header: 'Assigned', value: r => r.assigned },\r\n { header: 'Flags', value: r => r.flags ?? '—' },\r\n { header: 'Completion %', value: r => r.completion },\r\n { header: 'Compliance %', value: r => r.compliance },\r\n { header: 'Performance %', value: r => r.perf }\r\n ];\r\n this.traxService.exportRowsXlsx(this.filteredStorePerf, columns, 'Audit-Dashboard-Store-Performance-' + period, 'Store Performance');\r\n return;\r\n }\r\n if (this.perfTab === 'User') {\r\n const columns: ExportColumn<UserPerfRow>[] = [\r\n { header: 'User Name', value: r => r.name },\r\n { header: 'Email', value: r => r.email },\r\n { header: 'Assigned', value: r => r.assigned },\r\n { header: 'Flags', value: r => r.flags },\r\n { header: 'ReDo', value: r => r.redo },\r\n { header: 'Completion %', value: r => r.completion },\r\n { header: 'Compliance %', value: r => r.compliance },\r\n { header: 'Performance %', value: r => r.perf }\r\n ];\r\n this.traxService.exportRowsXlsx(this.filteredUserPerf, columns, 'Audit-Dashboard-User-Performance-' + period, 'User Performance');\r\n return;\r\n }\r\n if (this.isTaskModule) {\r\n const columns: ExportColumn<TaskPerfRow>[] = [\r\n { header: 'Task Name', value: r => r.name },\r\n { header: 'Scheduled', value: r => r.scheduled },\r\n { header: 'Coverage', value: r => r.coverage },\r\n { header: 'Assigned To', value: r => r.assigned },\r\n { header: 'Submitted', value: r => r.submitted },\r\n { header: 'Flags', value: r => r.flags },\r\n { header: 'Tasks', value: r => r.tasks },\r\n { header: 'ReDo', value: r => r.redo },\r\n { header: 'Question Compliance %', value: r => r.compliance }\r\n ];\r\n this.traxService.exportRowsXlsx(this.filteredTaskPerf, columns, 'Audit-Dashboard-Task-Performance-' + period, 'Task Performance');\r\n return;\r\n }\r\n const columns: ExportColumn<AuditPerfRow>[] = [\r\n { header: 'Audit Name', value: r => r.name },\r\n { header: 'Assigned To', value: r => r.assigned },\r\n { header: 'Submitted', value: r => r.submitted },\r\n { header: 'Disputes', value: r => r.disputes ?? '—' },\r\n { header: 'Pass Mark', value: r => r.passMark },\r\n { header: 'Score', value: r => r.score },\r\n { header: 'Result', value: r => r.result }\r\n ];\r\n this.traxService.exportRowsXlsx(this.filteredAuditPerf, columns, 'Audit-Dashboard-Audit-Performance-' + period, 'Audit Performance');\r\n }\r\n\r\n /** ---- Per-store PDF ---- */\r\n\r\n /** The store's latest submitted audit in the period (the dashboard API's lastVisitId), if any. */\r\n pdfVisitId(row: AuditRow): string {\r\n return row.raw?.lastVisitId ? String(row.raw.lastVisitId) : '';\r\n }\r\n\r\n /** The audit of that latest submission (lastVisitAuditId): View opens it in the Gallery. '' without one. */\r\n galleryAuditId(row: AuditRow): string {\r\n return row.raw?.lastVisitAuditId ? String(row.raw.lastVisitAuditId) : '';\r\n }\r\n\r\n /**\r\n * Same PDF download as the detail pages' Download, for the store's latest submitted audit:\r\n * queued, then listed under Notifications > Downloads.\r\n */\r\n downloadPdf(row: AuditRow): void {\r\n const visitId = this.pdfVisitId(row);\r\n if (!visitId || this.pdfQueued.has(visitId)) { return; }\r\n this.pdfQueued.add(visitId);\r\n const user = JSON.parse(localStorage.getItem('user-info') || '{}');\r\n const storeId = row.raw?.storeId || row.storeId;\r\n // The download name is matched as a regular expression server-side, so leave regex characters out.\r\n const name = String(row.raw?.storeName || storeId).replace(/[\\\\^$.*+?()[\\]{}|]/g, ' ').trim() + ' audit';\r\n this.traxService.reportTableExport({\r\n fromDate: this.from || this.headerData?.date?.startDate,\r\n toDate: this.to || this.headerData?.date?.endDate,\r\n checklistId: [visitId],\r\n sourceCheckList_id: '',\r\n checklistName: name,\r\n fileType: 'pdf',\r\n storeIds: [storeId],\r\n userId: user?._id,\r\n clientId: this.headerData?.client,\r\n downloadInsertFrom: 'dashboard',\r\n insertType: 'checklist',\r\n checkListType: 'custom'\r\n }).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (res: any) => {\r\n this.pdfQueued.delete(visitId);\r\n if (res?.code === 200) {\r\n this.toast.getSuccessToast('Downloading your report. Find it under Notifications > Downloads.');\r\n }\r\n },\r\n error: () => {\r\n this.pdfQueued.delete(visitId);\r\n this.toast.getErrorToast('Something went wrong!');\r\n }\r\n });\r\n }\r\n}\r\n","<div class=\"av2-page audit-dash\">\r\n\r\n <!-- Refresh line + module switch -->\r\n <div class=\"db-topline\">\r\n <div class=\"db-refresh\">Last refreshed at {{ lastRefreshed }}</div>\r\n <div class=\"av2-grow\"></div>\r\n <div class=\"moduleswitch\">\r\n <button type=\"button\" class=\"moduletab\" *ngFor=\"let t of moduleTabs\" [class.moduletab-on]=\"moduleTab === t\"\r\n (click)=\"setModuleTab(t)\">{{ t }}</button>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ AUDIT SCORECARD ============ -->\r\n <ng-container *ngIf=\"!isTaskModule\">\r\n\r\n <!-- Crumb, scope title, actions -->\r\n <div class=\"db-scopebar\">\r\n <div class=\"db-scopetext\">\r\n <div class=\"db-crumb\">Audits › Dashboard</div>\r\n <div class=\"db-scope\">{{ scopeLabel }}</div>\r\n </div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"openFilters()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"4\" y1=\"7\" x2=\"20\" y2=\"7\"></line>\r\n <line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"12\"></line>\r\n <line x1=\"10\" y1=\"17\" x2=\"14\" y2=\"17\"></line>\r\n </svg>\r\n Filters\r\n <span class=\"db-countpill\" *ngIf=\"filterCount\">{{ filterCount }}</span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" [disabled]=\"loading || !filteredRows.length\"\r\n title=\"Download the store list below as an Excel file\" (click)=\"exportStores()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n </div>\r\n\r\n <!-- Filter chips -->\r\n <div class=\"db-chips\">\r\n <button type=\"button\" class=\"db-chip\" *ngFor=\"let c of filterCats; trackBy: trackByCat\" [class.is-dirty]=\"c.dirty\"\r\n (click)=\"openFilters(c.key)\">\r\n <span class=\"db-chip-label\">{{ c.label }}</span>\r\n <span class=\"db-chip-value\">{{ c.value }}</span>\r\n </button>\r\n <button type=\"button\" class=\"db-clearall\" *ngIf=\"filterCount\" (click)=\"clearAll()\">Clear all</button>\r\n </div>\r\n\r\n <!-- KPI tiles -->\r\n <div class=\"db-kpis\">\r\n <!-- Old Checklist summary card: figure + label in the gradient strip, note below. -->\r\n <div class=\"av2-ocard\" *ngFor=\"let kpi of kpis\">\r\n <div class=\"av2-ocard-head\">\r\n <div class=\"av2-ocard-count\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!loading\">{{ kpi.value }}</ng-container>\r\n </div>\r\n <div class=\"av2-ocard-text\">{{ kpi.label }}</div>\r\n </div>\r\n <div class=\"av2-ocard-body\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--note\"></span>\r\n <div *ngIf=\"!loading\" class=\"av2-ocard-note\" [style.color]=\"kpi.noteColor\">{{ kpi.note }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Trend + distribution -->\r\n <div class=\"db-duo\">\r\n <!-- Trend -->\r\n <section class=\"db-card\">\r\n <div class=\"db-card-head db-card-head--wrap\">\r\n <div class=\"db-card-title db-card-title--grow\">Audit score trend</div>\r\n <div class=\"db-seg\">\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'quarter'\" (click)=\"setGrain('quarter')\">Quarterly</button>\r\n <button type=\"button\" class=\"db-seg-tab\" [class.is-on]=\"grain === 'date'\" (click)=\"setGrain('date')\">By date</button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-daterow\" *ngIf=\"grain === 'date'\">\r\n <div class=\"av2-datepick\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange\" ngxDaterangepickerMd readonly autocomplete=\"off\"\r\n placeholder=\"Select date range\" [(ngModel)]=\"range\" [locale]=\"pickerLocale\" [maxDate]=\"today\"\r\n [dateLimit]=\"maxRangeDays\" [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [alwaysShowCalendars]=\"false\"\r\n [keepCalendarOpeningWithRange]=\"true\" [autoApply]=\"true\" [showCancel]=\"false\" [drops]=\"'down'\" [opens]=\"'right'\"\r\n (datesUpdated)=\"onRangePicked($event)\">\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"trendLoading\">\r\n <span class=\"av2-sk av2-sk--title\"></span>\r\n <span class=\"av2-sk av2-sk--block db-sk-chart\"></span>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!trendLoading\">\r\n <div class=\"db-focus\">\r\n <span class=\"db-focus-score\" [class.is-fail]=\"!focusPassed\">{{ focusScore }}</span>\r\n <span class=\"db-focus-pill\" [class.is-pass]=\"focusPassed\" [class.is-fail]=\"!focusPassed\">{{ focusStatus }}</span>\r\n <span class=\"db-focus-line\">{{ focusLine }}</span>\r\n </div>\r\n\r\n <div class=\"db-legend\">\r\n <span class=\"db-legend-dash\"></span>Pass mark {{ passMark }}%\r\n </div>\r\n\r\n <div class=\"db-chart\">\r\n <div class=\"db-chart-y\">\r\n <span style=\"top:0\">100%</span>\r\n <span style=\"top:50%\">50%</span>\r\n <span style=\"top:100%\">0%</span>\r\n </div>\r\n <div class=\"db-chart-area\">\r\n <span class=\"db-gridline\" style=\"top:0\"></span>\r\n <span class=\"db-gridline\" style=\"top:50%\"></span>\r\n <span class=\"db-gridline\" style=\"top:100%\"></span>\r\n <span class=\"db-passline\" [style.top.%]=\"100 - passMark\"></span>\r\n <div class=\"db-bars\">\r\n <div class=\"db-bar-col\" *ngFor=\"let bar of trendBars; let first = first; let last = last\"\r\n [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-bar-value\" *ngIf=\"!denseTrend\" [class.is-active]=\"bar.key === quarter\" [style.bottom]=\"barHeight(bar)\">\r\n {{ bar.value === null ? '—' : bar.value + '%' }}\r\n </span>\r\n <span class=\"db-bar\" [style.height]=\"barHeight(bar)\" [style.background]=\"barFill(bar)\"></span>\r\n\r\n <div class=\"db-tip\" [class.is-start]=\"first && !last\" [class.is-end]=\"last && !first\" [style.bottom]=\"tipBottom(bar)\">\r\n <div class=\"db-tip-head\">\r\n {{ bar.label }}<span class=\"db-tip-sub\" *ngIf=\"grain === 'quarter'\"> · {{ quarterMonths(bar.key) }}</span>\r\n </div>\r\n <div class=\"db-tip-score\" *ngIf=\"bar.value !== null\">\r\n <span class=\"db-tip-dot\" [class.is-fail]=\"bar.value < passMark\"></span>\r\n <span class=\"db-tip-value\">{{ bar.value }}%</span>\r\n <span class=\"db-tip-status\" [class.is-fail]=\"bar.value < passMark\">\r\n {{ bar.value >= passMark ? 'Pass' : 'Below pass mark' }}\r\n </span>\r\n </div>\r\n <div class=\"db-tip-empty\" *ngIf=\"bar.value === null\">No scored audits</div>\r\n <div class=\"db-tip-row\"><span>Audits completed</span><b>{{ bar.submitted }}</b></div>\r\n <div class=\"db-tip-row\" *ngIf=\"bar.count !== bar.submitted\"><span>Scored audits</span><b>{{ bar.count }}</b></div>\r\n <div class=\"db-tip-row\"><span>Pass mark</span><b>{{ passMark }}%</b></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- A month by date has ~30 bars: every few days get a label (first and last always), and the audit counts\r\n move to the bar tooltip, so the labels never run into each other. -->\r\n <div class=\"db-chart-x\" [class.is-dense]=\"denseTrend\">\r\n <span class=\"db-chart-xcol\" *ngFor=\"let bar of trendBars; let i = index; let last = last\" [class.is-pickable]=\"grain === 'quarter'\" (click)=\"selectQuarter(bar.key)\">\r\n <span class=\"db-chart-xlabel\" [class.is-active]=\"bar.key === quarter\" [style.visibility]=\"showXLabel(i, last) ? 'visible' : 'hidden'\">{{ bar.label }}</span>\r\n <span class=\"db-chart-xcount\" *ngIf=\"!denseTrend\">{{ bar.submitted ? bar.submitted + ' audits' : 'no audits' }}</span>\r\n </span>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- Score bands -->\r\n <section class=\"db-card db-card--tight\">\r\n <div class=\"db-card-head db-card-head--baseline\">\r\n <div class=\"db-card-title db-card-title--grow\">Score distribution</div>\r\n <div class=\"db-card-sub\">{{ storesInScope }} in scope</div>\r\n </div>\r\n <div class=\"db-card-sub\">Stores by score band, {{ periodLabel }}</div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\" [rows]=\"2\"></lib-audit-v2-shimmer>\r\n\r\n <div class=\"db-bandbar\" *ngIf=\"!loading\">\r\n <!-- A band with stores keeps a visible sliver (2 of 3576 stores is under a pixel); the largest band gives way. -->\r\n <span class=\"db-bandseg\" *ngFor=\"let b of bandRows; trackBy: trackByBand\" [style.width]=\"b.width\" [style.background]=\"b.band.soft\"\r\n [class.has-stores]=\"b.count > 0\" [title]=\"b.band.label + ': ' + b.count\"></span>\r\n </div>\r\n\r\n <div class=\"db-bandrows\" *ngIf=\"!loading\">\r\n <div class=\"db-bandrow\" *ngFor=\"let b of bandRows; trackBy: trackByBand\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"db-bandlabel\">{{ b.band.label }}</span>\r\n <span class=\"db-bandrange\">{{ b.band.range }}</span>\r\n <span class=\"db-bandcount\">{{ b.count }} {{ b.count === 1 ? 'store' : 'stores' }}</span>\r\n <span class=\"db-bandshare\">{{ b.share }}</span>\r\n <a class=\"db-bandlink\" [class.is-active]=\"storeListOpen && listBandKey === b.band.key\" (click)=\"applyBand(b.band)\">View stores</a>\r\n </div>\r\n </div>\r\n <div class=\"db-bandhint\" *ngIf=\"!loading && !showStoreList\">Click <b>View stores</b> on a band to list its stores.</div>\r\n </section>\r\n </div>\r\n\r\n <!-- Store ledger: opened from Score distribution -> View stores (or a Filters score range) -->\r\n <section class=\"db-card db-card--table\" id=\"ad-store-list\" *ngIf=\"showStoreList\">\r\n <div class=\"db-ledger-head\">\r\n <div class=\"db-ledger-text\">\r\n <div class=\"db-card-title\">Store list</div>\r\n <div class=\"db-card-sub\">\r\n {{ filteredRows.length }} {{ filteredRows.length === 1 ? 'store' : 'stores' }} · {{ periodLabel }}\r\n </div>\r\n <div class=\"db-bandfilter\" *ngIf=\"listChipLabel\">\r\n <span class=\"db-bandchip\">\r\n {{ listChipLabel }}\r\n <span class=\"db-bandchip-x\" title=\"Close the store list\" (click)=\"closeStoreList()\">\r\n <svg width=\"9\" height=\"9\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </span>\r\n </span>\r\n <a class=\"db-bandlink\" (click)=\"showAllStores()\">Show all stores</a>\r\n </div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input [(ngModel)]=\"search\" (ngModelChange)=\"onSearch()\" type=\"text\" placeholder=\"Search store or owner\"\r\n autocomplete=\"off\" />\r\n </label>\r\n <div class=\"segmented\">\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'all'\" (click)=\"setStatus('all')\">All</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'fail'\" (click)=\"setStatus('fail')\">Fail</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'pass'\" (click)=\"setStatus('pass')\">Pass</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'unscored'\" (click)=\"setStatus('unscored')\"\r\n title=\"Audited, but compliance score is off for the audits\">Not scored</button>\r\n <button type=\"button\" class=\"segtab\" [class.segtab-on]=\"status === 'na'\" (click)=\"setStatus('na')\">Not audited</button>\r\n </div>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n <div class=\"av2-table-wrap\">\r\n <table class=\"db-table\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let h of headers\" class=\"is-sortable\" [class.is-sorted]=\"sortKey === h.key\" (click)=\"sortBy(h.key)\">\r\n {{ h.label }} <lib-audit-v2-sort-icon [active]=\"sortKey === h.key\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon>\r\n </th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of pageRows; trackBy: trackByStore\">\r\n <td class=\"db-nowrap\">{{ row.date }}</td>\r\n <td>\r\n <a class=\"db-storeid\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\">{{ row.storeId }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis\">{{ row.circle }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.zone }}</td>\r\n <td class=\"av2-ellipsis\">{{ row.aom }}</td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ row.score === null ? '—' : row.score + '%' }}\r\n </span>\r\n </td>\r\n <td>\r\n <span class=\"db-pill\" [style.background]=\"bandFor(row).bg\" [style.color]=\"bandFor(row).fg\">\r\n {{ statusLabel(row) }}\r\n </span>\r\n </td>\r\n <td>\r\n <div class=\"db-actions\">\r\n <!-- View opens the Gallery on the store's latest submitted audit in the period (QA 11 Oct); a store\r\n with no submission there opens its audit detail instead (same as the store link). -->\r\n <a class=\"db-viewbtn\" *ngIf=\"galleryAuditId(row) as auditId\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"detailParams({ audit: auditId, store: row.raw?.storeId || row.storeId })\" title=\"View this store's submissions in the Gallery\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n View\r\n </a>\r\n <a class=\"db-viewbtn\" *ngIf=\"!galleryAuditId(row)\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.raw?.storeId || row.storeId })\" title=\"View this store's audits\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n View\r\n </a>\r\n <!-- PDF of the store's latest submitted audit in the period (queued, then under Notifications > Downloads). -->\r\n <a class=\"db-pdfbtn\" role=\"button\" [class.is-disabled]=\"!pdfVisitId(row)\"\r\n [attr.aria-disabled]=\"!pdfVisitId(row)\" (click)=\"downloadPdf(row)\"\r\n [title]=\"pdfVisitId(row) ? 'Download the PDF report of the latest submitted audit for this store' : 'No submitted audit for this store in this period'\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 4v12\"></path>\r\n <polyline points=\"7 11 12 16 17 11\"></polyline>\r\n <path d=\"M4 20h16\"></path>\r\n </svg>\r\n </a>\r\n </div>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!pageRows.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No stores match the current filters.</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"filteredRows.length\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [pageSize]=\"pageSize\" [paginationSizes]=\"pageSizes\"\r\n [currentPage]=\"page\" [totalItems]=\"filteredRows.length\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n </ng-container>\r\n\r\n <!-- ============ TASK SUMMARY ============ -->\r\n <!-- Tasks raised from this client's audits, in the header scope (shimmer values while loading). -->\r\n <div class=\"db-stats\" *ngIf=\"isTaskModule\">\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.activeTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Active {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.taskInstances }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">{{ moduleTab }} Instances</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.notSubmitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Not Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--2\">\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.openTasks }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Open {{ moduleTab }}s</div>\r\n </div>\r\n <div>\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.inProgress }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">In Progress {{ moduleTab }}s</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"db-stat\">\r\n <div class=\"db-stat-head\">\r\n <div class=\"db-stat-big\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk av2-sk--value db-sk-value\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.submitted }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-label\">Submitted {{ moduleTab }}s</div>\r\n </div>\r\n <div class=\"db-stat-body db-stat-body--3\">\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.completionScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Completion Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.completionDelta\" [ngClass]=\"taskDeltaClass('completion')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.completionDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.complianceScore }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Compliance Score</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.complianceDelta\" [ngClass]=\"taskDeltaClass('compliance')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.complianceDelta }}\r\n </div>\r\n </div>\r\n <div class=\"db-stat-cell\">\r\n <div class=\"db-stat-mid is-underline\">\r\n <span *ngIf=\"taskLoading\" class=\"av2-sk db-sk-mid\"></span>\r\n <ng-container *ngIf=\"!taskLoading\">{{ taskStats.totalFlags }}</ng-container>\r\n </div>\r\n <div class=\"db-stat-sub\">Total Flags</div>\r\n <div class=\"db-stat-delta\" *ngIf=\"!taskLoading && taskStats.flagsDelta\" [ngClass]=\"taskDeltaClass('flags')\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 6 10 12 14 8 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n {{ taskStats.flagsDelta }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- ============ PERFORMANCE ============ -->\r\n <section class=\"db-perf\">\r\n <div class=\"db-perftabs\">\r\n <button type=\"button\" class=\"db-perftab\" *ngFor=\"let t of perfTabs\" [class.is-on]=\"perfTab === t\"\r\n (click)=\"setPerfTab(t)\">{{ perfTabDisplay(t) }}</button>\r\n </div>\r\n\r\n <div class=\"db-perf-head\">\r\n <div class=\"db-perf-text\">\r\n <div class=\"db-perf-title\">\r\n {{ perfInfoTitle }}\r\n <span class=\"db-total\">\r\n {{ perfTab === 'Audit' ? (isTaskModule ? filteredTaskPerf.length : filteredAuditPerf.length) : (perfTab === 'Store' ? filteredStorePerf.length : filteredUserPerf.length) }} Total\r\n </span>\r\n </div>\r\n <div class=\"db-card-sub\">{{ perfPeriod }}</div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <label class=\"av2-search db-perf-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"perfSearchPlaceholder\" [(ngModel)]=\"perfSearch\" (ngModelChange)=\"onPerfSearch()\">\r\n </label>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" [disabled]=\"perfLoading || !perfRowCount\"\r\n title=\"Download this table as an Excel file\" (click)=\"exportPerformance()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n Export\r\n </button>\r\n <button type=\"button\" class=\"av2-btn db-create\" *ngIf=\"perfTab === 'Audit' && access.canAdd\" routerLink=\"/manage/trax/audit-v2/manage\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\"><path d=\"M12 5v14M5 12h14\"></path></svg>\r\n {{ perfCreateLabel }}\r\n </button>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"perfLoading\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!perfLoading\">\r\n <!-- Audit Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && !isTaskModule\">\r\n <table class=\"db-perftable db-perftable--audit\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of auditPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredAuditPerf); trackBy: trackByPerfAudit\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the audit's detail page (as the eye does) on its submitted visits, as the v1 Checklist dashboard did. -->\r\n <a *ngIf=\"row.submitted\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id, status: 'submit' })\"\r\n title=\"View the submitted visits\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted\">0</span>\r\n </td>\r\n <!-- Store disputes (questions) in the period, as a plain count (QA 10 Oct: no link). -->\r\n <td>\r\n <span *ngIf=\"row.disputes === null\" class=\"av2-faint\">—</span>\r\n <span *ngIf=\"row.disputes !== null\">{{ row.disputes }}</span>\r\n </td>\r\n <td>{{ row.passMark }}</td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.score === '—'\"\r\n [title]=\"row.score === '—' ? 'Compliance score is off for this audit' : ''\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.scorePct)\"\r\n [style.background]=\"row.result === 'Pass' ? '#12B76A' : '#F04438'\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.score }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <span *ngIf=\"row.result !== '—'\" class=\"db-pill db-pill--strong\" [style.background]=\"row.result === 'Pass' ? '#ECFDF3' : '#FEF3F2'\"\r\n [style.color]=\"row.result === 'Pass' ? '#027A48' : '#B42318'\">{{ row.result }}</span>\r\n <span *ngIf=\"row.result === '—'\" class=\"av2-faint\" title=\"Compliance score is off for this audit\">—</span>\r\n </td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View audit\" routerLink=\"/manage/trax/audit-v2/dashboard/audit\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.sourceCheckList_id || row.raw?._id })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredAuditPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No audit matches this search.' : 'There is no result for Audit Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Task Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Audit' && isTaskModule\">\r\n <table class=\"db-perftable db-perftable--task\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of taskPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredTaskPerf); trackBy: trackByPerfTask\">\r\n <td>\r\n <div class=\"db-name\">\r\n <span class=\"db-avatar\">{{ row.initials }}</span>\r\n <a class=\"db-link\" [title]=\"row.raw?.auditName ? 'Raised from ' + row.raw.auditName : ''\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.scheduled }}</td>\r\n <td class=\"db-medium\">{{ row.coverage }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>\r\n <!-- Opens the Gallery (Type Task) on this task's submissions in the dashboard period. -->\r\n <a *ngIf=\"row.submitted && row.raw?.taskId\" class=\"db-ulink\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"taskSubmittedParams(row)\" title=\"View the submitted tasks in the Gallery\">{{ row.submitted }}</a>\r\n <span *ngIf=\"!row.submitted || !row.raw?.taskId\">{{ row.submitted }}</span>\r\n </td>\r\n <td><a class=\"db-ulink\">{{ row.flags }}</a></td>\r\n <td class=\"av2-faint\">{{ row.tasks }}</td>\r\n <td><a class=\"db-ulink\">{{ row.redo }}</a></td>\r\n <td>\r\n <div class=\"db-score\" [class.is-empty]=\"row.compliance === '—'\">\r\n <span class=\"db-track db-track--6\"><span [style.width]=\"barWidth(row.compliancePct)\"></span></span>\r\n <span class=\"db-scoretext\">{{ row.compliance }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <!-- Opens the audit the task was raised from. -->\r\n <a class=\"db-eye\" title=\"View the audit this task was raised from\"\r\n [routerLink]=\"row.raw?.auditId ? '/manage/trax/audit-v2/dashboard/audit' : null\"\r\n [queryParams]=\"detailParams({ checklistId: row.raw?.auditId })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredTaskPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">No tasks raised from audits in this period.</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Store Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'Store'\">\r\n <table class=\"db-perftable db-perftable--store\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of storePerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredStorePerf); trackBy: trackByPerfStore\">\r\n <td>\r\n <a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">{{ row.store }}</a>\r\n </td>\r\n <td class=\"av2-ellipsis av2-dim\" [av2Tip]=\"row.storeId\">{{ row.storeId || '—' }}</td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.spoc }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags ?? '—' }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '—'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '—'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '—'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View store\" routerLink=\"/manage/trax/audit-v2/dashboard/store\" [queryParams]=\"detailParams({ store: row.storeId || row.store })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredStorePerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No store matches this search.' : 'There is no result for Store Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- User Performance -->\r\n <div class=\"av2-table-wrap\" *ngIf=\"perfTab === 'User'\">\r\n <table class=\"db-perftable db-perftable--user\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let c of userPerfCols\" class=\"is-sortable\" [class.is-sorted]=\"perfSortKey === c.key\"\r\n (click)=\"sortPerf(c.key)\">{{ c.label }} <lib-audit-v2-sort-icon [active]=\"perfSortKey === c.key\" [dir]=\"perfSortDir\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of perfPageOf(filteredUserPerf); trackBy: trackByPerfUser\">\r\n <td class=\"av2-ellipsis\"><a class=\"db-link\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">{{ row.name }}</a></td>\r\n <td class=\"av2-ellipsis av2-dim\">{{ row.email }}</td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flags }}</td>\r\n <td>{{ row.redo }}</td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.completion === '—'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.completion)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.completion }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.compliance === '—'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.compliance)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.compliance }}</span></div></td>\r\n <td><div class=\"db-score\" [class.is-empty]=\"row.perf === '—'\"><span class=\"db-track\"><span [style.width]=\"barWidth(row.perf)\"></span></span><span class=\"db-scoretext db-scoretext--sm\">{{ row.perf }}</span></div></td>\r\n <td>\r\n <a class=\"db-eye\" title=\"View user\" routerLink=\"/manage/trax/audit-v2/dashboard/user\" [queryParams]=\"detailParams({ email: row.email })\">\r\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\r\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\r\n </svg>\r\n </a>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div *ngIf=\"!filteredUserPerf.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ perfSearch.trim() ? 'No user matches this search.' : 'There is no result for User Performance in this period.' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\r\n <div class=\"db-perf-pager\" *ngIf=\"perfTotal\">\r\n <lib-pagination [itemsPerPage]=\"perfPageSize\" [pageSize]=\"perfPageSize\" [paginationSizes]=\"perfPageSizes\"\r\n [currentPage]=\"perfPage\" [totalItems]=\"perfTotal\" (pageChange)=\"onPerfPage($event)\"\r\n (pageSizeChange)=\"onPerfPageSize($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n\r\n <!-- ============ FILTER DRAWER ============ -->\r\n <div class=\"filter-backdrop\" *ngIf=\"filtersOpen\" (click)=\"cancelFilters()\"></div>\r\n\r\n <div class=\"filter-drawer\" *ngIf=\"filtersOpen && draft as dr\">\r\n <div class=\"drawer-head\">\r\n <span class=\"drawer-title\">Filters</span>\r\n <span class=\"db-countpill\" *ngIf=\"dr.filterCount\">{{ dr.filterCount }}</span>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"closebtn\" (click)=\"cancelFilters()\" title=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-body\">\r\n <div class=\"drawer-nav\">\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let c of dr.filterCats; trackBy: trackByCat\" [class.navitem-active]=\"activeCat === c.key\"\r\n (click)=\"selectCat(c.key)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ c.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"c.dirty\">{{ c.value }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"c.dirty\"></span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-pane\">\r\n <div class=\"panetitle\">{{ dr.activeCatObj.title }}</div>\r\n <div class=\"panehint\">{{ dr.activeCatObj.sub }}</div>\r\n\r\n <!-- Period -->\r\n <ng-container *ngIf=\"activeCat === 'period'\">\r\n <div class=\"pane-options\">\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'quarter'\" (click)=\"dr.setGrain('quarter')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'quarter'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">Quarterly</span>\r\n <span class=\"pane-option-help\">Read one financial quarter (April–March year) at a time.</span>\r\n </span>\r\n </div>\r\n <div class=\"pane-option\" [class.is-on]=\"dr.grain === 'date'\" (click)=\"dr.setGrain('date')\">\r\n <span class=\"pane-radio\" [class.is-on]=\"dr.grain === 'date'\"><span></span></span>\r\n <span class=\"pane-option-text\">\r\n <span class=\"pane-option-label\">By date</span>\r\n <span class=\"pane-option-help\">Pick a custom start and end date.</span>\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"pane-list\" *ngIf=\"dr.grain === 'quarter'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let q of dr.quarters\" [class.option-selected]=\"dr.quarter === q\"\r\n (click)=\"dr.selectQuarter(q)\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.quarter === q\">\r\n <svg *ngIf=\"dr.quarter === q\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">{{ q }} · {{ quarterMonths(q) }}</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"pane-fields\" *ngIf=\"dr.grain === 'date'\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">Date range</span>\r\n <div class=\"av2-datepick av2-datepick--compact\">\r\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n <input type=\"text\" class=\"av2-datepick-input db-daterange db-daterange--field\" ngxDaterangepickerMd readonly\r\n autocomplete=\"off\" placeholder=\"Select date range\" [(ngModel)]=\"dr.range\" [locale]=\"pickerLocale\"\r\n [maxDate]=\"today\" [dateLimit]=\"maxRangeDays\" [autoApply]=\"true\" [alwaysShowCalendars]=\"true\" [showCancel]=\"false\"\r\n [drops]=\"'down'\" [opens]=\"'right'\" (datesUpdated)=\"dr.onRangePicked($event)\">\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Scope -->\r\n <ng-container *ngIf=\"activeCat === 'scope'\">\r\n <div class=\"pane-stack\">\r\n <div class=\"field field--full\">\r\n <span class=\"field-label\">Circle Head <span class=\"field-meta\">{{ dr.circles.length }} users</span></span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.circle\" (ngModelChange)=\"dr.onCircleChange()\" [options]=\"dr.pickOptions(dr.circles, 'All Circles')\" ariaLabel=\"Circle\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.circle\">\r\n <span class=\"field-label\">Zone Manager</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.zone\" (ngModelChange)=\"dr.onZoneChange()\" [options]=\"dr.pickOptions(dr.zones, 'All zones')\" ariaLabel=\"Zone\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.zone\">\r\n <span class=\"field-label\">AOM</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.aom\" (ngModelChange)=\"dr.onAomChange()\" [options]=\"dr.pickOptions(dr.aoms, 'All AOMs')\" ariaLabel=\"AOM\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"field field--full\" *ngIf=\"dr.aom\">\r\n <span class=\"field-label\">Store</span>\r\n <lib-audit-v2-select class=\"field-select\" [(ngModel)]=\"dr.store\" [options]=\"dr.storePickOptions\" ariaLabel=\"Store\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"readingrow\">\r\n <span class=\"readinglabel\">Reading</span>\r\n <span class=\"readingvalue\">{{ dr.scopeReading }}</span>\r\n <span class=\"av2-grow\"></span>\r\n <a class=\"db-bandlink\" (click)=\"dr.resetScope()\">Reset to all circles</a>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Audit type -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'type'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let t of auditTypes\" [class.option-selected]=\"dr.auditType === t.key\"\r\n (click)=\"dr.auditType = t.key\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.auditType === t.key\">\r\n <svg *ngIf=\"dr.auditType === t.key\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ t.label }}</span>\r\n <span class=\"optmeta\">{{ t.help }}</span>\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <!-- Score band -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'band'\">\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let b of dr.bandRows; trackBy: trackByBand\" [class.option-selected]=\"dr.isBandOn(b.band)\"\r\n (click)=\"dr.applyBand(b.band)\">\r\n <span class=\"db-banddot\" [style.background]=\"b.band.soft\"></span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ b.band.label }}</span>\r\n <span class=\"optmeta\">{{ b.band.range }} · {{ b.count }} stores</span>\r\n </span>\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm pane-resetbtn\" (click)=\"dr.clearBand()\">All scores</button>\r\n </div>\r\n\r\n <!-- Status -->\r\n <div class=\"pane-list\" *ngIf=\"activeCat === 'status'\">\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'all'\" (click)=\"dr.setStatus('all')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'all'\">\r\n <svg *ngIf=\"dr.status === 'all'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">All stores</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'fail'\" (click)=\"dr.setStatus('fail')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'fail'\">\r\n <svg *ngIf=\"dr.status === 'fail'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Fail</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'pass'\" (click)=\"dr.setStatus('pass')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'pass'\">\r\n <svg *ngIf=\"dr.status === 'pass'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Pass</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'unscored'\" (click)=\"dr.setStatus('unscored')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'unscored'\">\r\n <svg *ngIf=\"dr.status === 'unscored'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Not scored</span>\r\n </button>\r\n <button type=\"button\" class=\"optionrow\" [class.option-selected]=\"dr.status === 'na'\" (click)=\"dr.setStatus('na')\">\r\n <span class=\"optionmark\" [class.mark-on]=\"dr.status === 'na'\">\r\n <svg *ngIf=\"dr.status === 'na'\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"optlabel\">Not audited</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"drawer-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"dr.clearAll()\">Clear all</button>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"cancelFilters()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--wide\" (click)=\"applyFilters()\">Apply filters</button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n","import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { Subject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';\r\nimport { GlobalStateService } from 'tango-app-ui-global';\r\nimport dayjs from 'dayjs';\r\nimport utc from 'dayjs/plugin/utc';\r\nimport { TraxService } from '../../../services/trax.service';\r\n\r\ndayjs.extend(utc);\r\n\r\nexport interface ActivityRow {\r\n name: string;\r\n /** Second line under the name: the schedule (\"Schedule: X\") and / or the copy a duplicate made (\"Copy: X\"). */\r\n detail: string;\r\n /**\r\n * Short action label: \"Started by\" / \"Submitted by\" for a visit, or a logged audit / schedule action such as\r\n * \"Audit created by\", \"Duplicated by\", \"Schedule published by\". Names stay out of the badge (see detail).\r\n */\r\n action: string;\r\n /** Badge colour for the action, following the old Activity Log (see ACTION_BADGE). */\r\n tone: ActionTone;\r\n by: string;\r\n store: string;\r\n day: string;\r\n time: string;\r\n /** Submitted entries can be opened; started ones cannot. */\r\n viewable: boolean;\r\n raw?: any;\r\n}\r\n\r\nexport interface ApprovalCard {\r\n name: string;\r\n store: string;\r\n by: string;\r\n when: string;\r\n /** \"Audit\" or \"Task\", from the API's module field. */\r\n typeLabel: string;\r\n /** \"Submitted x / y\" (submitted instances / assigned stores), or '' when unknown. */\r\n submittedLabel: string;\r\n /** \"Approved x / y\" (approved / submitted), or '' when nothing is submitted yet. */\r\n approvedLabel: string;\r\n redo: boolean;\r\n /** Gallery deep link (audit / store / day / approval status), or null when there is nothing to review there. */\r\n link: Record<string, string> | null;\r\n /** Tooltip: what a click opens, or why the card cannot be opened. */\r\n hint: string;\r\n raw?: any;\r\n}\r\n\r\nexport interface ApprovalColumn {\r\n key: 'open' | 'inprogress' | 'approved';\r\n title: string;\r\n empty: string;\r\n cards: ApprovalCard[];\r\n}\r\n\r\ntype ActionTab = 'Audit' | 'Task';\r\n\r\ntype ActionTone = 'primary' | 'gray' | 'warning' | 'error';\r\n\r\n/**\r\n * Activity Log badge per action: a short label like the old Checklist Activity Log's (getActionLabel), with\r\n * the schedule / copy names moved to the name column, and its colour (getActionBadgeClass): start / submit /\r\n * publish / config changes blue, created / duplicated grey, edited amber, deleted red.\r\n * Keys are start / submit for visit events and the stored activityType for logged audit / schedule actions.\r\n */\r\nconst ACTION_BADGE: Record<string, { label: string; tone: ActionTone }> = {\r\n start: { label: 'Started by', tone: 'primary' },\r\n submit: { label: 'Submitted by', tone: 'primary' },\r\n created: { label: 'Audit created by', tone: 'gray' },\r\n edited: { label: 'Edited by', tone: 'warning' },\r\n configured: { label: 'Configured by', tone: 'primary' },\r\n published: { label: 'Published by', tone: 'primary' },\r\n unpublished: { label: 'Unpublished by', tone: 'primary' },\r\n duplicated: { label: 'Duplicated by', tone: 'gray' },\r\n deleted: { label: 'Deleted by', tone: 'error' },\r\n scheduled: { label: 'Schedule created by', tone: 'gray' },\r\n scheduleEdited: { label: 'Schedule edited by', tone: 'warning' },\r\n schedulePublished: { label: 'Schedule published by', tone: 'primary' },\r\n scheduleUnpublished: { label: 'Schedule unpublished by', tone: 'primary' },\r\n scheduleDuplicated: { label: 'Schedule duplicated by', tone: 'gray' },\r\n scheduleDeleted: { label: 'Schedule deleted by', tone: 'error' },\r\n};\r\n\r\n/** Activity Log \"Actions\" filter; ids match the API's action filter. */\r\nconst VISIT_ACTIONS = [\r\n { text: 'Started by', id: 'start' },\r\n { text: 'Submitted by', id: 'submit' },\r\n];\r\n\r\n/**\r\n * Audit Action Center, served by /trax/audit/actionCenter/* (retail-trax-api-v2):\r\n * cards -> audits / tasks waiting for approval\r\n * approvals -> open / inprogress / done, one row per audit per day\r\n * activityLog -> start + submit events from the instances, plus (Audit tab) the logged audit / schedule\r\n * actions: created, edited, configured, published, unpublished, duplicated, deleted; server-paged\r\n * Every call is scoped by the global header filter (client, checked stores, dates).\r\n */\r\n@Component({\r\n selector: 'lib-audit-v2-action-centre',\r\n templateUrl: './audit-v2-action-centre.component.html',\r\n styleUrl: './audit-v2-action-centre.component.scss'\r\n})\r\nexport class AuditV2ActionCentreComponent implements OnInit, OnDestroy {\r\n /** Tab inside the activity log. */\r\n tab: ActionTab = 'Audit';\r\n readonly tabs: ActionTab[] = ['Audit', 'Task'];\r\n\r\n /** Approval panel controls. */\r\n approvalSearch = '';\r\n approvalScope = 'All';\r\n readonly approvalScopes = ['All', 'Audit', 'Task'];\r\n readonly approvalScopeItems = this.approvalScopes.map((s) => ({ id: s, label: s }));\r\n approvalScopeSelected: { id: string; label: string } = this.approvalScopeItems[0];\r\n\r\n /** Activity Log's own date range (defaults to the header range, changed by its picker). */\r\n activityRange: { startDate: string; endDate: string } | null = null;\r\n /** Activity Log action filter applied on each tab; ids match the API's action filter. Empty = all. */\r\n private readonly actionsByTab: Record<ActionTab, string[]> = { Audit: [], Task: [] };\r\n /**\r\n * Filter options per tab. Logged audit / schedule actions only exist on the Audit tab ('schedule' = every\r\n * schedule action); the Task tab has start / submit events only. lib-filters reads its options once, so the\r\n * template keeps one instance per tab.\r\n */\r\n readonly activityFilterData: Record<ActionTab, any[]> = {\r\n Audit: [{\r\n Description: 'Actions',\r\n Issues: [\r\n ...VISIT_ACTIONS.map((a) => ({ ...a })),\r\n { text: 'Audit created by', id: 'created' },\r\n { text: 'Edited by', id: 'edited' },\r\n { text: 'Configured by', id: 'configured' },\r\n { text: 'Published by', id: 'published' },\r\n { text: 'Unpublished by', id: 'unpublished' },\r\n { text: 'Duplicated by', id: 'duplicated' },\r\n { text: 'Deleted by', id: 'deleted' },\r\n { text: 'Schedule changes', id: 'schedule' },\r\n ],\r\n }],\r\n Task: [{ Description: 'Actions', Issues: VISIT_ACTIONS.map((a) => ({ ...a })) }],\r\n };\r\n\r\n /** Activity log controls. */\r\n search = '';\r\n dateRange = '';\r\n itemsPerPage = 10;\r\n currentPage = 1;\r\n readonly pageSizes = [10, 20, 30];\r\n /** Total activity rows reported by the API (server-side pagination). */\r\n totalItems = 0;\r\n\r\n auditWaiting = 0;\r\n taskWaiting = 0;\r\n\r\n rows: ActivityRow[] = [];\r\n columns: ApprovalColumn[] = this.buildColumns();\r\n\r\n cardsLoading = true;\r\n approvalsLoading = true;\r\n logLoading = true;\r\n\r\n private headerData: any;\r\n private readonly userEmailes: string[] = JSON.parse(localStorage.getItem('usersEmail-info') || '[]');\r\n private readonly approvalSearch$ = new Subject<string>();\r\n private readonly search$ = new Subject<string>();\r\n private readonly destroy$ = new Subject<void>();\r\n\r\n constructor(\r\n private traxService: TraxService,\r\n private gs: GlobalStateService,\r\n private cd: ChangeDetectorRef,\r\n private router: Router\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.gs.dataRangeValue\r\n .pipe(takeUntil(this.destroy$), debounceTime(300))\r\n .subscribe((data: any) => {\r\n if (!data?.client) { return; }\r\n this.headerData = data;\r\n this.dateRange = this.fmt(data.date?.startDate, 'DD-MM-YYYY') + ' - ' + this.fmt(data.date?.endDate, 'DD-MM-YYYY');\r\n this.activityRange = this.defaultActivityRange(data.date);\r\n this.currentPage = 1;\r\n this.loadCards();\r\n this.loadApprovals();\r\n this.loadActivity();\r\n });\r\n\r\n this.approvalSearch$\r\n .pipe(takeUntil(this.destroy$), debounceTime(400), distinctUntilChanged())\r\n .subscribe(() => this.loadApprovals());\r\n\r\n this.search$\r\n .pipe(takeUntil(this.destroy$), debounceTime(400), distinctUntilChanged())\r\n .subscribe(() => {\r\n this.currentPage = 1;\r\n this.loadActivity();\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n /**\r\n * Activity Log's starting range: the header range, except that one ending yesterday runs on to today.\r\n * The header's presets (and its default) stop at yesterday because analytics land a day late, but the\r\n * log is live: without this, what was started or submitted today never shows until the range is changed.\r\n */\r\n private defaultActivityRange(date: any): { startDate: string; endDate: string } | null {\r\n if (!date?.startDate || !date?.endDate) { return null; }\r\n const yesterday = dayjs().subtract(1, 'day').format('YYYY-MM-DD');\r\n const endDate = date.endDate === yesterday ? dayjs().format('YYYY-MM-DD') : date.endDate;\r\n return { startDate: date.startDate, endDate };\r\n }\r\n\r\n /** Common header-filter scope every action-center call carries. */\r\n private basePayload(): Record<string, any> {\r\n return {\r\n clientId: this.headerData?.client,\r\n fromDate: this.headerData?.date?.startDate,\r\n toDate: this.headerData?.date?.endDate,\r\n storeId: (this.headerData?.stores || []).filter((s: any) => s.checked).map((s: any) => s.storeId),\r\n userEmailes: this.userEmailes\r\n };\r\n }\r\n\r\n private loadCards(): void {\r\n this.cardsLoading = true;\r\n this.traxService.auditActionCenterCards(this.basePayload())\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe({\r\n next: (res: any) => {\r\n const card = res?.code === 200 ? (res.data?.cardData || {}) : {};\r\n this.auditWaiting = Number(card.auditApproval) || 0;\r\n this.taskWaiting = Number(card.taskApproval) || 0;\r\n this.cardsLoading = false;\r\n this.cd.detectChanges();\r\n },\r\n error: () => {\r\n this.auditWaiting = 0;\r\n this.taskWaiting = 0;\r\n this.cardsLoading = false;\r\n this.cd.detectChanges();\r\n }\r\n });\r\n }\r\n\r\n private loadApprovals(): void {\r\n this.approvalsLoading = true;\r\n const type = this.approvalScope === 'All' ? 'all' : this.approvalScope === 'Task' ? 'task' : 'audit';\r\n this.traxService.auditActionCenterApprovals({\r\n ...this.basePayload(),\r\n searchValue: this.approvalSearch.trim(),\r\n type\r\n }).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (res: any) => {\r\n const data = res?.code === 200 ? (res.data || {}) : {};\r\n this.columns = this.buildColumns();\r\n this.columns[0].cards = (data.open || []).map((x: any) => this.toCard(x, 'open'));\r\n this.columns[1].cards = (data.inprogress || []).map((x: any) => this.toCard(x, 'inprogress'));\r\n this.columns[2].cards = (data.done || []).map((x: any) => this.toCard(x, 'approved'));\r\n this.approvalsLoading = false;\r\n this.cd.detectChanges();\r\n },\r\n error: () => {\r\n this.columns = this.buildColumns();\r\n this.approvalsLoading = false;\r\n this.cd.detectChanges();\r\n }\r\n });\r\n }\r\n\r\n private toCard(x: any, column: ApprovalColumn['key']): ApprovalCard {\r\n const stores = Number(x?.storeCount) || 0;\r\n const store = x?.coverage === 'user'\r\n ? (x?.userName || '—')\r\n : (stores > 1 ? stores + ' stores' : (x?.storeName || (stores === 1 ? '1 store' : '—')));\r\n const pending = Number(x?.pending) || 0;\r\n const submitted = Number(x?.submitCount) || 0;\r\n const approved = Number(x?.approveCount) || 0;\r\n return {\r\n name: x?.checkListName || '—',\r\n store,\r\n by: pending ? pending + ' awaiting approval' : (x?.userName || x?.createdByName || '—'),\r\n when: x?.publishDate ? this.fmt(x.publishDate, 'DD MMM YYYY') : '—',\r\n typeLabel: x?.module === 'task' ? 'Task' : 'Audit',\r\n submittedLabel: stores ? `Submitted ${submitted} / ${stores}` : '',\r\n approvedLabel: submitted ? `Approved ${approved} / ${submitted}` : '',\r\n redo: !!x?.redo,\r\n ...this.cardLink(x, column, submitted),\r\n raw: x\r\n };\r\n }\r\n\r\n /**\r\n * Where a card lands: the Gallery on that audit and day (and store, when the card is one store),\r\n * narrowed to what the column means. Open = awaiting approval, Approved = approved; Inprogress\r\n * shows every submission. The Gallery lists submitted (or sent-back) visits only, so a card with\r\n * none stays closed. Task cards open the Gallery with Type Task (type=task; audit= is the task id).\r\n */\r\n private cardLink(x: any, column: ApprovalColumn['key'], submitted: number): Pick<ApprovalCard, 'link' | 'hint'> {\r\n const task = x?.module === 'task';\r\n const audit = String(x?.sourceChecklistId || '');\r\n const date = this.isoDay(x?.publishDate);\r\n if (!audit || !date) {\r\n return { link: null, hint: '' };\r\n }\r\n if (!submitted && !x?.redo) {\r\n return { link: null, hint: 'Nothing submitted yet, so there is nothing to review in the Gallery' };\r\n }\r\n const status = column === 'open' ? 'Not-Approved' : column === 'approved' ? 'Approved' : '';\r\n const single = Number(x?.storeCount) === 1 && x?.storeId;\r\n return {\r\n link: {\r\n audit, date,\r\n ...(single ? { store: String(x.storeId) } : {}),\r\n ...(status ? { status } : {}),\r\n ...(task ? { type: 'task' } : {})\r\n },\r\n hint: column === 'open' ? 'Review the submissions awaiting approval in the Gallery'\r\n : column === 'approved' ? 'View the approved submissions in the Gallery'\r\n : 'View the submissions in the Gallery'\r\n };\r\n }\r\n\r\n /** date_iso is the visit day at UTC midnight; read its date part so no time zone shifts the day. */\r\n private isoDay(value: any): string {\r\n if (!value) { return ''; }\r\n const m = /^(\\d{4}-\\d{2}-\\d{2})/.exec(String(value));\r\n return m ? m[1] : dayjs(value).format('YYYY-MM-DD');\r\n }\r\n\r\n openCard(card: ApprovalCard): void {\r\n if (!card.link) { return; }\r\n this.router.navigate(['/manage/trax/audit-v2/gallery'], { queryParams: card.link });\r\n }\r\n\r\n /**\r\n * Activity log column sort, done by the API (the log is paged there). '' = newest first, which the\r\n * Date & Time arrow shows as its descending state.\r\n */\r\n logSortColumn = '';\r\n logSortBy: 1 | -1 = -1;\r\n\r\n get logSortKey(): string {\r\n return this.logSortColumn || 'date';\r\n }\r\n\r\n sortLog(column: string): void {\r\n const current = this.logSortKey;\r\n // Date starts newest first (the default); the other columns start A-Z / lowest first.\r\n this.logSortBy = current === column ? (this.logSortBy === 1 ? -1 : 1) : (column === 'date' ? -1 : 1);\r\n this.logSortColumn = column === 'date' && this.logSortBy === -1 ? '' : column;\r\n this.currentPage = 1;\r\n this.loadActivity();\r\n }\r\n\r\n private loadActivity(): void {\r\n // Not before the header has a client: the API refuses it (\"clientId is required\"); the header's load comes next.\r\n if (!this.headerData?.client) { return; }\r\n this.logLoading = true;\r\n const actions = this.actionsByTab[this.tab];\r\n this.traxService.auditActionCenterActivity({\r\n ...this.basePayload(),\r\n ...(this.activityRange ? { fromDate: this.activityRange.startDate, toDate: this.activityRange.endDate } : {}),\r\n type: this.tab === 'Task' ? 'task' : 'audit',\r\n limit: this.itemsPerPage,\r\n offset: this.currentPage,\r\n searchValue: this.search.trim(),\r\n // Logged audit / schedule actions come back on this browser's clock, stamped as UTC like the visit times.\r\n tzOffset: new Date().getTimezoneOffset(),\r\n // Only sent when narrowed, so an API without the filter still serves the unfiltered log.\r\n ...(actions.length ? { action: actions } : {}),\r\n // Likewise the column sort: only once a header other than the default newest-first is picked.\r\n ...(this.logSortColumn ? { sortColumn: this.logSortColumn, sortBy: this.logSortBy } : {})\r\n }).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (res: any) => {\r\n const data = res?.code === 200 ? (res.data || {}) : {};\r\n this.rows = (data.activityLogData || []).map((log: any) => this.toRow(log));\r\n this.totalItems = Number(data.count) || 0;\r\n this.logLoading = false;\r\n this.cd.detectChanges();\r\n },\r\n error: () => {\r\n this.rows = [];\r\n this.totalItems = 0;\r\n this.logLoading = false;\r\n this.cd.detectChanges();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * startTime / submitTime are the store's wall clock stamped as UTC (the mobile submit), so they are read\r\n * as UTC: a local read would add the browser's offset (+5:30 in IST) and push evening events into the next day.\r\n * Logged audit / schedule actions (kind 'log') arrive already moved to this browser's clock (tzOffset), so the\r\n * same UTC read shows them in local time.\r\n */\r\n private eventTime(log: any): dayjs.Dayjs | null {\r\n return log?.at ? dayjs.utc(log.at) : null;\r\n }\r\n\r\n private toRow(log: any): ActivityRow {\r\n const at = this.eventTime(log);\r\n const badge = ACTION_BADGE[this.actionKey(log)];\r\n return {\r\n name: log?.checkListName || '—',\r\n detail: this.actionDetail(log),\r\n // Unknown logged actions keep the API's own text.\r\n action: badge?.label || String(log?.action || '—'),\r\n tone: badge?.tone || 'gray',\r\n by: log?.userEmail || log?.userName || '—',\r\n store: log?.storeName || '—',\r\n day: at ? (at.format('YYYY-MM-DD') === dayjs().format('YYYY-MM-DD') ? 'Today' : at.format('DD MMM YYYY')) : '—',\r\n time: at ? at.format('hh : mm A') : '—',\r\n // View opens a submitted audit (Audit tab) or task (Task tab, Gallery Type Task) in the Gallery; a logged\r\n // audit / schedule action has no submission (the API sends viewable false for those).\r\n viewable: !!log?.viewable && log?.kind !== 'log',\r\n raw: log\r\n };\r\n }\r\n\r\n /** Logged rows carry their stored key in activityType; visit rows only have the label. */\r\n private actionKey(log: any): string {\r\n if (log?.kind === 'log') { return String(log?.activityType || ''); }\r\n return log?.action === 'Submitted by' ? 'submit' : 'start';\r\n }\r\n\r\n /**\r\n * What the API used to fold into the label: the schedule a schedule action was on, and the copy a duplicate\r\n * made (audit and schedule duplicates both store details.copyName).\r\n */\r\n private actionDetail(log: any): string {\r\n if (log?.kind !== 'log') { return ''; }\r\n const parts: string[] = [];\r\n if (String(log?.activityType || '').startsWith('schedule') && log?.scheduleName) {\r\n parts.push('Schedule: ' + log.scheduleName);\r\n }\r\n if (log?.details?.copyName) {\r\n parts.push('Copy: ' + log.details.copyName);\r\n }\r\n // Edited: what the edit changed (older edit rows carry no details and show none).\r\n if (log?.activityType === 'edited' && log?.details) {\r\n const d = log.details;\r\n const n = (v: any) => Number(v) || 0;\r\n const q = (v: any) => n(v) + (n(v) === 1 ? ' question' : ' questions');\r\n const what: string[] = [];\r\n if (n(d.questionsAdded)) { what.push(q(d.questionsAdded) + ' added'); }\r\n if (n(d.questionsEdited)) { what.push(q(d.questionsEdited) + ' edited'); }\r\n if (n(d.questionsRemoved)) { what.push(q(d.questionsRemoved) + ' removed'); }\r\n if (n(d.sectionsRenamed)) { what.push(n(d.sectionsRenamed) + (n(d.sectionsRenamed) === 1 ? ' section' : ' sections') + ' renamed'); }\r\n if (d.renamedFrom) { what.push('renamed from \"' + d.renamedFrom + '\"'); }\r\n if (d.descriptionChanged) { what.push('description changed'); }\r\n parts.push(what.length ? 'Edit: ' + what.join(', ') : 'Edit: saved with no question changes');\r\n }\r\n return parts.join(' · ');\r\n }\r\n\r\n /**\r\n * Deep link for \"View\": the Gallery pre-selects this audit, store and visit day. The Gallery lists visits by\r\n * their own date, which can be earlier than the submit day, so the visit's date_string wins when the API sends it.\r\n */\r\n galleryParams(row: ActivityRow): Record<string, string> {\r\n const log = row.raw || {};\r\n const at = this.eventTime(log);\r\n return {\r\n audit: String(log.sourceCheckList_id || ''),\r\n store: String(log.storeId || ''),\r\n date: log.date_string ? String(log.date_string) : (at ? at.format('YYYY-MM-DD') : ''),\r\n // Task tab rows are task submissions: the Gallery opens with Type Task.\r\n ...(this.tab === 'Task' ? { type: 'task' } : {})\r\n };\r\n }\r\n\r\n private fmt(value: any, pattern: string): string {\r\n return value ? dayjs(value).format(pattern) : '—';\r\n }\r\n\r\n private buildColumns(): ApprovalColumn[] {\r\n const noun = this.approvalScope === 'Task' ? 'Task' : 'Audit';\r\n return [\r\n { key: 'open', title: 'Open', empty: 'There is no result for Open ' + noun, cards: [] },\r\n { key: 'inprogress', title: 'Inprogress', empty: 'There is no result for Inprogress ' + noun, cards: [] },\r\n { key: 'approved', title: 'Approved', empty: 'There is no result for Approved ' + noun, cards: [] }\r\n ];\r\n }\r\n\r\n setTab(tab: ActionTab): void {\r\n if (this.tab === tab) { return; }\r\n this.tab = tab;\r\n this.currentPage = 1;\r\n this.loadActivity();\r\n }\r\n\r\n onApprovalScope(): void {\r\n this.loadApprovals();\r\n }\r\n\r\n onApprovalScopeSelect(item: { id: string } | undefined): void {\r\n const next = item?.id;\r\n if (!next || next === this.approvalScope) { return; }\r\n this.approvalScope = next;\r\n this.approvalScopeSelected = this.approvalScopeItems.find((i) => i.id === next) || this.approvalScopeItems[0];\r\n this.loadApprovals();\r\n }\r\n\r\n onActivityDateChange(event: { startDate?: string; endDate?: string }): void {\r\n if (!event?.startDate || !event?.endDate) { return; }\r\n this.activityRange = { startDate: event.startDate, endDate: event.endDate };\r\n this.currentPage = 1;\r\n this.loadActivity();\r\n }\r\n\r\n onActivityFilters(event: any[]): void {\r\n const actions = (event || []).find((f: any) => f?.Description === 'Actions');\r\n this.actionsByTab[this.tab] = (actions?.Issues || []).map((i: any) => i.id);\r\n this.currentPage = 1;\r\n this.loadActivity();\r\n }\r\n\r\n onApprovalSearch(): void {\r\n this.approvalSearch$.next(this.approvalSearch);\r\n }\r\n\r\n onSearch(): void {\r\n this.search$.next(this.search);\r\n }\r\n\r\n get nameLabel(): string {\r\n return this.tab === 'Task' ? 'Task Name' : 'Audit Name';\r\n }\r\n\r\n get searchHint(): string {\r\n return this.tab === 'Task' ? 'Search with Store, Email, Task' : 'Search with Store, Email, Audit';\r\n }\r\n\r\n /** Search and paging are server-side; the page we hold is the page we show. */\r\n get filteredRows(): ActivityRow[] {\r\n return this.rows;\r\n }\r\n\r\n get pageRows(): ActivityRow[] {\r\n return this.rows;\r\n }\r\n\r\n onPageChange(page: number): void {\r\n this.currentPage = page;\r\n this.loadActivity();\r\n }\r\n\r\n /** Rows per page (10 / 20 / 30) from the pager's size dropdown; back to page 1. */\r\n onPageSizeChange(size: any): void {\r\n this.itemsPerPage = Number(size) || 10;\r\n this.currentPage = 1;\r\n this.loadActivity();\r\n }\r\n\r\n trackByRow(index: number, row: ActivityRow): string {\r\n return (row.raw?.processedChecklistId || row.raw?.logId || row.store) + row.action + index;\r\n }\r\n\r\n trackByColumn(_: number, col: ApprovalColumn): string {\r\n return col.key;\r\n }\r\n}\r\n","<div class=\"av2-page\">\r\n\r\n <!-- Waiting for approval -->\r\n <div class=\"av2-grid-2\">\r\n <div class=\"av2-stat-card\">\r\n <div class=\"av2-stat\">\r\n <span class=\"av2-sk av2-sk--value ac-sk-value\" *ngIf=\"cardsLoading\"></span>\r\n <span class=\"av2-stat-value\" *ngIf=\"!cardsLoading\">{{ auditWaiting }}</span>\r\n <span class=\"av2-stat-label\">Audit waiting for approval</span>\r\n </div>\r\n </div>\r\n <div class=\"av2-stat-card\">\r\n <div class=\"av2-stat\">\r\n <span class=\"av2-sk av2-sk--value ac-sk-value\" *ngIf=\"cardsLoading\"></span>\r\n <span class=\"av2-stat-value\" *ngIf=\"!cardsLoading\">{{ taskWaiting }}</span>\r\n <span class=\"av2-stat-label\">Task waiting for approval</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Approval -->\r\n <section class=\"av2-card\">\r\n <div class=\"av2-card-head\">\r\n <div class=\"av2-title-block\">\r\n <div class=\"av2-card-title\">Approval</div>\r\n <div class=\"av2-card-sub\">A summary of all the audits awaiting approval</div>\r\n </div>\r\n\r\n <label class=\"av2-search av2-search--md\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input [(ngModel)]=\"approvalSearch\" (ngModelChange)=\"onApprovalSearch()\" type=\"text\" placeholder=\"Search\" autocomplete=\"off\" />\r\n </label>\r\n\r\n <div class=\"approval-scope-select\">\r\n <lib-select [items]=\"approvalScopeItems\" [multi]=\"false\" [searchField]=\"'label'\" [idField]=\"'id'\"\r\n [selectedValues]=\"[approvalScopeSelected]\" (selected)=\"onApprovalScopeSelect($event)\"></lib-select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"av2-grid-3\">\r\n <div class=\"approval-col\" *ngFor=\"let col of columns; trackBy: trackByColumn\">\r\n <div class=\"av2-col-head\">\r\n {{ col.title }}\r\n <span *ngIf=\"!approvalsLoading && col.cards.length\" class=\"av2-badge av2-badge--count\">{{ col.cards.length }}</span>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"approvalsLoading\" [rows]=\"2\"></lib-audit-v2-shimmer>\r\n\r\n <div *ngIf=\"!approvalsLoading && col.cards.length\" class=\"approval-cards\">\r\n <div *ngFor=\"let card of col.cards\" class=\"approval-card\" [class.approval-card--off]=\"!card.link\"\r\n [attr.role]=\"card.link ? 'link' : null\" [attr.tabindex]=\"card.link ? 0 : null\" [attr.title]=\"card.hint || null\"\r\n (click)=\"openCard(card)\" (keydown.enter)=\"openCard(card)\">\r\n <div class=\"approval-card-badges\">\r\n <span class=\"av2-badge av2-badge--purple av2-badge--count\">{{ card.typeLabel }}</span>\r\n <span *ngIf=\"card.redo\" class=\"av2-badge av2-badge--warning av2-badge--count\">Redo</span>\r\n </div>\r\n <div class=\"approval-card-name\">{{ card.name }}</div>\r\n <div class=\"approval-card-meta\">\r\n <span>{{ card.store }}</span>\r\n <span *ngIf=\"card.submittedLabel\">{{ card.submittedLabel }}</span>\r\n <span>{{ card.by }}</span>\r\n </div>\r\n <div class=\"approval-card-foot\">\r\n <span class=\"approval-card-date\">{{ card.when }}</span>\r\n <span *ngIf=\"card.approvedLabel\" class=\"av2-badge av2-badge--success av2-badge--count\">{{ card.approvedLabel }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"!approvalsLoading && !col.cards.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ col.empty }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- Activity Log -->\r\n <section class=\"av2-card av2-card--log\">\r\n <div class=\"av2-card-head av2-card-head--center\">\r\n <div class=\"av2-card-title av2-card-title--grow\">Activity Log</div>\r\n\r\n <label class=\"av2-search av2-search--lg\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input [(ngModel)]=\"search\" (ngModelChange)=\"onSearch()\" type=\"text\" [placeholder]=\"searchHint\" autocomplete=\"off\" />\r\n </label>\r\n\r\n <div class=\"log-date-picker\">\r\n <lib-date-range-picker [range]=\"activityRange\" (dateChange)=\"onActivityDateChange($event)\"></lib-date-range-picker>\r\n </div>\r\n\r\n <!-- One filter per tab (lib-filters reads its options once); each keeps its own selection. -->\r\n <lib-filters *ngIf=\"tab === 'Audit'\" [dataObject]=\"activityFilterData.Audit\" (appliedFilters)=\"onActivityFilters($event)\"></lib-filters>\r\n <lib-filters *ngIf=\"tab === 'Task'\" [dataObject]=\"activityFilterData.Task\" (appliedFilters)=\"onActivityFilters($event)\"></lib-filters>\r\n </div>\r\n\r\n <!-- Audit / Task -->\r\n <div class=\"av2-tabs\">\r\n <button *ngFor=\"let t of tabs\" type=\"button\" class=\"av2-tab\" [class.is-active]=\"tab === t\"\r\n (click)=\"setTab(t)\">{{ t }}</button>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"logLoading\"></lib-audit-v2-shimmer>\r\n\r\n <div class=\"av2-table-wrap\" *ngIf=\"!logLoading\">\r\n <table class=\"av2-table log-table\">\r\n <thead>\r\n <tr>\r\n <th class=\"av2-sortable\" (click)=\"sortLog('date')\">Date & Time <lib-audit-v2-sort-icon [active]=\"logSortKey === 'date'\" [dir]=\"logSortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortLog('name')\">{{ nameLabel }} <lib-audit-v2-sort-icon [active]=\"logSortKey === 'name'\" [dir]=\"logSortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortLog('action')\">Action Performed <lib-audit-v2-sort-icon [active]=\"logSortKey === 'action'\" [dir]=\"logSortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortLog('by')\">Performed by <lib-audit-v2-sort-icon [active]=\"logSortKey === 'by'\" [dir]=\"logSortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortLog('store')\">Name <lib-audit-v2-sort-icon [active]=\"logSortKey === 'store'\" [dir]=\"logSortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th>Actions</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of pageRows; trackBy: trackByRow\">\r\n <td>\r\n <div class=\"av2-cell-stack\">\r\n <span>{{ row.day }}</span>\r\n <span class=\"av2-muted\">{{ row.time }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"av2-cell-stack log-name\">\r\n <span class=\"av2-ellipsis\" [av2Tip]=\"row.name\">{{ row.name }}</span>\r\n <span *ngIf=\"row.detail\" class=\"av2-muted av2-ellipsis\" [av2Tip]=\"row.detail\">{{ row.detail }}</span>\r\n </div>\r\n </td>\r\n <td><span class=\"av2-badge activity-action\" [ngClass]=\"row.tone === 'primary' ? '' : 'av2-badge--' + row.tone\"\r\n [title]=\"row.action + ' ' + row.by\">{{ row.action }}</span></td>\r\n <td>\r\n <div class=\"av2-cell-icon av2-dim\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <circle cx=\"12\" cy=\"8\" r=\"3.4\"></circle>\r\n <path d=\"M5 20c0-3.6 3.1-5.6 7-5.6s7 2 7 5.6\"></path>\r\n </svg>\r\n <span>{{ row.by }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"av2-cell-icon store-cell\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M3 9l1.6-4.5h14.8L21 9\"></path>\r\n <path d=\"M4 9v11h16V9\"></path>\r\n <path d=\"M9 20v-6h6v6\"></path>\r\n </svg>\r\n <span>{{ row.store }}</span>\r\n </div>\r\n </td>\r\n <td>\r\n <a *ngIf=\"row.viewable\" class=\"av2-link\" routerLink=\"/manage/trax/audit-v2/gallery\"\r\n [queryParams]=\"galleryParams(row)\" title=\"Open this submission in the Gallery\">View</a>\r\n <span *ngIf=\"!row.viewable\" class=\"av2-faint\">-</span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!logLoading && !filteredRows.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">There is no result for {{ tab }}</div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"!logLoading && filteredRows.length\" class=\"log-pagination\">\r\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [pageSize]=\"itemsPerPage\" [paginationSizes]=\"pageSizes\" [currentPage]=\"currentPage\" [totalItems]=\"totalItems\"\r\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </section>\r\n\r\n</div>\r\n","import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { Subject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';\r\nimport { GlobalStateService } from 'tango-app-ui-global';\r\nimport dayjs from 'dayjs';\r\nimport { TraxService } from '../../../services/trax.service';\r\n\r\nexport interface FlagCard {\r\n title: string;\r\n value: string;\r\n delta: string;\r\n note: string;\r\n highlight: boolean;\r\n}\r\n\r\nexport interface FlagRow {\r\n name: string;\r\n initials: string;\r\n assigned: string;\r\n flagged: string;\r\n qFlags: string;\r\n nsFlags: string;\r\n runAI: string;\r\n tasks: string;\r\n raw?: any;\r\n}\r\n\r\n/**\r\n * Flags, served by the audit API (POST /trax/audit/flags): one call returns the summary\r\n * cards (total / open / not-submitted / repeat) and the per-audit table, searched and\r\n * paginated server-side. A flag is a non-compliant answer (sopFlag) in a submitted audit;\r\n * \"not submitted\" is an audit past its schedule end with no submission.\r\n */\r\n@Component({\r\n selector: 'lib-audit-v2-flags',\r\n templateUrl: './audit-v2-flags.component.html',\r\n styleUrl: './audit-v2-flags.component.scss'\r\n})\r\nexport class AuditV2FlagsComponent implements OnInit, OnDestroy {\r\n search = '';\r\n /** Titled but empty until the first load, so the tiles can shimmer in place. */\r\n cards: FlagCard[] = this.toCards({});\r\n rows: FlagRow[] = [];\r\n\r\n /** Pagination (shared <lib-pagination>), driven by the API's totalCount. */\r\n /** An audit in scope has Run AI questions: the Run AI Flags card and column show. */\r\n runAIActive = false;\r\n itemsPerPage = 10;\r\n currentPage = 1;\r\n readonly pageSizes = [10, 20, 30];\r\n totalItems = 0;\r\n\r\n /** Period the flag figures are read from (the global header date range). */\r\n period = '';\r\n\r\n cardsLoading = true;\r\n tableLoading = true;\r\n exporting = false;\r\n\r\n private headerData: any;\r\n private readonly userEmailes: string[] = JSON.parse(localStorage.getItem('usersEmail-info') || '[]');\r\n private readonly search$ = new Subject<string>();\r\n private readonly destroy$ = new Subject<void>();\r\n\r\n constructor(\r\n private traxService: TraxService,\r\n private gs: GlobalStateService,\r\n private cd: ChangeDetectorRef,\r\n private router: Router\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.gs.dataRangeValue\r\n .pipe(takeUntil(this.destroy$), debounceTime(300))\r\n .subscribe((data: any) => {\r\n if (!data?.client) { return; }\r\n this.headerData = data;\r\n this.period = 'Based on ' + this.fmt(data.date?.startDate) + ' - ' + this.fmt(data.date?.endDate);\r\n this.currentPage = 1;\r\n this.load();\r\n });\r\n\r\n this.search$\r\n .pipe(takeUntil(this.destroy$), debounceTime(400), distinctUntilChanged())\r\n .subscribe(() => {\r\n this.currentPage = 1;\r\n this.load();\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n private basePayload(): Record<string, any> {\r\n return {\r\n clientId: this.headerData?.client,\r\n fromDate: this.headerData?.date?.startDate,\r\n toDate: this.headerData?.date?.endDate,\r\n // Checked header stores only, like Dashboard and Reports.\r\n storeId: (this.headerData?.stores || []).filter((s: any) => s.checked).map((s: any) => s.storeId),\r\n userEmailes: this.userEmailes\r\n };\r\n }\r\n\r\n /**\r\n * Column sort, done by the API (the table is paged there); '' = by audit name. Sent only once a\r\n * column is picked, so an API without sorting still serves the default order.\r\n */\r\n sortColumn = '';\r\n sortBy: 1 | -1 = 1;\r\n\r\n sortTable(column: string): void {\r\n this.sortBy = this.sortColumn === column && this.sortBy === 1 ? -1 : 1;\r\n this.sortColumn = column;\r\n this.currentPage = 1;\r\n this.load();\r\n }\r\n\r\n private get sortPayload(): Record<string, string | number> {\r\n return this.sortColumn ? { sortColumn: this.sortColumn, sortBy: this.sortBy } : {};\r\n }\r\n\r\n /** Cards and the current table page come from one call; the API rejects unknown keys. */\r\n private load(): void {\r\n this.cardsLoading = true;\r\n this.tableLoading = true;\r\n const scope = this.basePayload();\r\n this.traxService.auditFlags({\r\n clientId: scope['clientId'],\r\n fromDate: scope['fromDate'],\r\n toDate: scope['toDate'],\r\n storeId: scope['storeId'],\r\n // Assigned users, as the v1 Flags: user-coverage audits are scoped by them.\r\n userEmailes: scope['userEmailes'],\r\n limit: this.itemsPerPage,\r\n offset: this.currentPage > 0 ? this.currentPage : 1,\r\n searchValue: this.search.trim(),\r\n ...this.sortPayload\r\n }).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (res: any) => {\r\n const data = res?.code === 200 ? (res.data || {}) : {};\r\n this.runAIActive = !!data.cards?.runAIActive;\r\n this.cards = this.toCards(data.cards || {});\r\n this.totalItems = Number(data.totalCount) || 0;\r\n this.rows = (data.rows || []).map((r: any) => this.toRow(r));\r\n this.cardsLoading = false;\r\n this.tableLoading = false;\r\n this.cd.detectChanges();\r\n },\r\n error: () => {\r\n this.runAIActive = false;\r\n this.cards = this.toCards({});\r\n this.rows = [];\r\n this.totalItems = 0;\r\n this.cardsLoading = false;\r\n this.tableLoading = false;\r\n this.cd.detectChanges();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Cards: Total, Question, Not Submitted (QA 9 Oct: no Open / Repeat Flags; QA 10 Oct: no compliance card, and no\r\n * Compliance % column in the table or its export).\r\n * Run AI Flags shows only when an audit in scope has Run AI questions (cards.runAIActive).\r\n */\r\n private toCards(c: any): FlagCard[] {\r\n const n = (v: any) => (v === null || v === undefined || v === '') ? '—' : Number(v).toLocaleString('en-IN');\r\n return [\r\n {\r\n title: 'Total Flags', value: n(c.totalFlags), delta: '—', highlight: true,\r\n note: this.runAIActive ? 'question + not submitted + Run AI, in the period' : 'question + not submitted, in the period'\r\n },\r\n { title: 'Question Flags', value: n(c.questionFlags), delta: '—', note: 'question-level failures', highlight: false },\r\n { title: 'Not Submitted Flags', value: n(c.notSubmitted), delta: '—', note: 'audits past their schedule end', highlight: false },\r\n ...(this.runAIActive\r\n ? [{ title: 'Run AI Flags', value: n(c.runAIFlags), delta: '—', note: 'flagged by Run AI checks', highlight: false }]\r\n : [])\r\n ];\r\n }\r\n\r\n private toRow(r: any): FlagRow {\r\n const name = r?.checkListName || '—';\r\n const num = (v: any) => (v === null || v === undefined) ? '0' : Number(v).toLocaleString('en-IN');\r\n return {\r\n name,\r\n initials: String(r?.checkListChar || name.slice(0, 2)).toUpperCase(),\r\n assigned: num(r?.assignedStores),\r\n flagged: num(r?.flaggedStores),\r\n qFlags: num(r?.questionFlags),\r\n nsFlags: num(r?.notSubmitted),\r\n runAI: num(r?.runAIFlags),\r\n tasks: num(r?.tasksRaised),\r\n raw: r\r\n };\r\n }\r\n\r\n private fmt(value: any): string {\r\n return value ? dayjs(value).format('MMM DD, YYYY') : '—';\r\n }\r\n\r\n /** Search is server-side; the current page is what we hold. */\r\n get filteredRows(): FlagRow[] {\r\n return this.rows;\r\n }\r\n\r\n get pageRows(): FlagRow[] {\r\n return this.rows;\r\n }\r\n\r\n onSearch(): void {\r\n this.search$.next(this.search);\r\n }\r\n\r\n onPageChange(page: number): void {\r\n this.currentPage = page;\r\n this.load();\r\n }\r\n\r\n /** Rows per page (10 / 20 / 30) from the pager's size dropdown; back to page 1. */\r\n onPageSizeChange(size: any): void {\r\n this.itemsPerPage = Number(size) || 10;\r\n this.currentPage = 1;\r\n this.load();\r\n }\r\n\r\n /** Audit name: that audit's dashboard detail (same page as Dashboard -> Audit Performance). */\r\n openAudit(row: FlagRow): void {\r\n const id = row.raw?.sourceCheckList_id;\r\n if (!id) { return; }\r\n this.router.navigate(['/manage/trax/audit-v2/dashboard/audit'], { queryParams: { checklistId: id } });\r\n }\r\n\r\n /** View: this audit's flag details for the header period (v1 Flags -> Flags Info); its visits open in the Gallery. */\r\n viewFlags(row: FlagRow): void {\r\n const id = row.raw?.sourceCheckList_id;\r\n if (!id) { return; }\r\n this.router.navigate(['/manage/trax/audit-v2/flags/detail'], {\r\n queryParams: { audit: id, from: this.headerData?.date?.startDate, to: this.headerData?.date?.endDate }\r\n });\r\n }\r\n\r\n /** Every row of the current scope and search (fetched page by page), as one .xlsx sheet. */\r\n exportFlags(): void {\r\n if (this.exporting || !this.totalItems) { return; }\r\n const scope = this.basePayload();\r\n const PAGE = 200;\r\n const pages = Math.ceil(this.totalItems / PAGE);\r\n const rows: FlagRow[] = [];\r\n this.exporting = true;\r\n const fetch = (page: number) => {\r\n this.traxService.auditFlags({\r\n clientId: scope['clientId'], fromDate: scope['fromDate'], toDate: scope['toDate'], storeId: scope['storeId'], userEmailes: scope['userEmailes'],\r\n limit: PAGE, offset: page, searchValue: this.search.trim(), ...this.sortPayload\r\n }).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (res: any) => {\r\n rows.push(...((res?.code === 200 ? res.data?.rows : []) || []).map((r: any) => this.toRow(r)));\r\n if (page < pages) { fetch(page + 1); return; }\r\n this.exporting = false;\r\n const period = (scope['fromDate'] || '') + '_' + (scope['toDate'] || '');\r\n this.traxService.exportRowsXlsx(rows, [\r\n { header: 'Audit Name', value: r => r.name },\r\n { header: 'Assigned Stores', value: r => Number(r.raw?.assignedStores) || 0 },\r\n { header: 'Flagged Stores', value: r => Number(r.raw?.flaggedStores) || 0 },\r\n { header: 'Question Flags', value: r => Number(r.raw?.questionFlags) || 0 },\r\n { header: 'Not Submitted Flags', value: r => Number(r.raw?.notSubmitted) || 0 },\r\n ...(this.runAIActive ? [{ header: 'Run AI Flags', value: (r: FlagRow) => Number(r.raw?.runAIFlags) || 0 }] : []),\r\n { header: 'Tasks Raised', value: r => Number(r.raw?.tasksRaised) || 0 }\r\n ], 'Audit-Flags-' + period, 'Flags');\r\n this.cd.detectChanges();\r\n },\r\n error: () => {\r\n this.exporting = false;\r\n this.cd.detectChanges();\r\n }\r\n });\r\n };\r\n fetch(1);\r\n }\r\n\r\n trackByName(_: number, row: FlagRow): string {\r\n return row.raw?.sourceCheckList_id || row.name;\r\n }\r\n}\r\n","<div class=\"av2-page\">\r\n\r\n <!-- Flag summary -->\r\n <div class=\"av2-grid-4\">\r\n <!-- Old Checklist Flags cards: count + label in the gradient strip, change and note below. -->\r\n <div class=\"av2-ocard\" *ngFor=\"let card of cards\">\r\n <div class=\"av2-ocard-head av2-ocard-head--row\">\r\n <div class=\"av2-ocard-count\">\r\n <span *ngIf=\"cardsLoading\" class=\"av2-sk av2-sk--value\"></span>\r\n <ng-container *ngIf=\"!cardsLoading\">{{ card.value }}</ng-container>\r\n </div>\r\n <div class=\"av2-ocard-text\">{{ card.title }}</div>\r\n </div>\r\n <div class=\"av2-ocard-body\">\r\n <span *ngIf=\"cardsLoading\" class=\"av2-sk av2-sk--note\"></span>\r\n <div class=\"av2-ocard-cell\" *ngIf=\"!cardsLoading\">\r\n <div class=\"av2-ocard-note\">{{ card.note }}</div>\r\n <div class=\"av2-ocard-delta\" *ngIf=\"card.delta && card.delta !== '—'\">\r\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"4 18 10 12 14 16 20 8\"></polyline>\r\n <polyline points=\"15 8 20 8 20 13\"></polyline>\r\n </svg>\r\n <b>{{ card.delta }}</b>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Flags by audit -->\r\n <section class=\"av2-card av2-card--table\">\r\n <div class=\"av2-card-head\">\r\n <div class=\"av2-title-block\">\r\n <div class=\"av2-card-title\">\r\n Total Flags\r\n <!-- Rows are audits; the flag total is the first card. -->\r\n <span class=\"av2-badge av2-badge--count\">{{ totalItems }} {{ totalItems === 1 ? 'audit' : 'audits' }}</span>\r\n </div>\r\n <div class=\"av2-card-sub\">{{ period }}</div>\r\n </div>\r\n\r\n <label class=\"av2-search av2-search--sm\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input [(ngModel)]=\"search\" (ngModelChange)=\"onSearch()\" type=\"text\" placeholder=\"Search\"\r\n autocomplete=\"off\" />\r\n </label>\r\n\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--wide\" [disabled]=\"exporting || !totalItems\" (click)=\"exportFlags()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 16V4\"></path>\r\n <polyline points=\"7 9 12 4 17 9\"></polyline>\r\n <path d=\"M4 16v4h16v-4\"></path>\r\n </svg>\r\n {{ exporting ? 'Exporting…' : 'Export' }}\r\n </button>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"tableLoading\"></lib-audit-v2-shimmer>\r\n\r\n <div class=\"av2-table-wrap\" *ngIf=\"!tableLoading\">\r\n <table class=\"av2-table av2-table--lined flags-table\" [class.flags-table--ai]=\"runAIActive\">\r\n <thead>\r\n <tr>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('checkListName')\">Audit Name <lib-audit-v2-sort-icon [active]=\"sortColumn === 'checkListName'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('assignedStores')\">Assigned Stores <lib-audit-v2-sort-icon [active]=\"sortColumn === 'assignedStores'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('flaggedStores')\">Flagged Stores <lib-audit-v2-sort-icon [active]=\"sortColumn === 'flaggedStores'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('questionFlags')\">Question Flags <lib-audit-v2-sort-icon [active]=\"sortColumn === 'questionFlags'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('notSubmitted')\">Not Submitted Flags <lib-audit-v2-sort-icon [active]=\"sortColumn === 'notSubmitted'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th *ngIf=\"runAIActive\" class=\"av2-sortable\" (click)=\"sortTable('runAIFlags')\">Run AI Flags <lib-audit-v2-sort-icon [active]=\"sortColumn === 'runAIFlags'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('tasksRaised')\">Tasks Raised <lib-audit-v2-sort-icon [active]=\"sortColumn === 'tasksRaised'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th>Actions</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of pageRows; trackBy: trackByName\">\r\n <td>\r\n <div class=\"name-cell\">\r\n <span class=\"av2-avatar\">{{ row.initials }}</span>\r\n <a class=\"av2-link av2-ellipsis\" (click)=\"openAudit(row)\" [av2Tip]=\"row.name\">{{ row.name }}</a>\r\n </div>\r\n </td>\r\n <td>{{ row.assigned }}</td>\r\n <td>{{ row.flagged }}</td>\r\n <td>{{ row.qFlags }}</td>\r\n <td>{{ row.nsFlags }}</td>\r\n <td *ngIf=\"runAIActive\">{{ row.runAI }}</td>\r\n <td>{{ row.tasks }}</td>\r\n <td><a class=\"av2-link\" (click)=\"viewFlags(row)\" title=\"Flag details of this audit\">View</a></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!tableLoading && !filteredRows.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">There is no result for this search</div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"!tableLoading && filteredRows.length\" class=\"flags-pagination\">\r\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [pageSize]=\"itemsPerPage\" [paginationSizes]=\"pageSizes\" [currentPage]=\"currentPage\" [totalItems]=\"totalItems\"\r\n (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </section>\r\n\r\n</div>\r\n","import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { Subject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';\r\nimport { GlobalStateService } from 'tango-app-ui-global';\r\nimport dayjs from 'dayjs';\r\nimport { TraxService } from '../../../../services/trax.service';\r\n\r\nexport interface FlagDetailCard {\r\n title: string;\r\n value: string;\r\n note: string;\r\n}\r\n\r\nexport interface FlagDetailRow {\r\n date: string;\r\n store: string;\r\n user: string;\r\n flags: number;\r\n questionFlags: number;\r\n timeFlags: number;\r\n runAIFlags: number;\r\n /** Submitted visits open in the Gallery; open / in-progress ones have nothing to show there yet. */\r\n viewable: boolean;\r\n raw: any;\r\n}\r\n\r\n/**\r\n * Flags -> View: one audit's flags in the period (the audit copy of the v1 Flags Info page for custom\r\n * checklists). POST /trax/audit/flags/detail returns the audit's Flags-list figures (cards) and its visits\r\n * with a flag: question flags (SOP-flagged answers) and a time flag (not submitted by the end of its window).\r\n * View on a submitted visit opens it in the Gallery, flagged only.\r\n * Route: /manage/trax/audit-v2/flags/detail?audit=&from=&to= (from / to default to the header range).\r\n */\r\n@Component({\r\n selector: 'lib-audit-v2-flag-detail',\r\n templateUrl: './audit-v2-flag-detail.component.html',\r\n styleUrl: './audit-v2-flag-detail.component.scss'\r\n})\r\nexport class AuditV2FlagDetailComponent implements OnInit, OnDestroy {\r\n auditId = '';\r\n auditName = '';\r\n coverage = 'store';\r\n /** The audit has Run AI questions: the Run AI card and column show (set before the cards are built). */\r\n runAIActive = false;\r\n cards: FlagDetailCard[] = this.toCards(null);\r\n rows: FlagDetailRow[] = [];\r\n search = '';\r\n period = '';\r\n\r\n itemsPerPage = 10;\r\n currentPage = 1;\r\n readonly pageSizes = [10, 20, 30];\r\n totalItems = 0;\r\n\r\n loading = true;\r\n /** The audit id is not one of this client's live audits. */\r\n notFound = false;\r\n\r\n private headerData: any;\r\n /** Assigned users (header), as the v1 Flags Info sends them: user-coverage audits are scoped by them. */\r\n private readonly userEmailes: string[] = JSON.parse(localStorage.getItem('usersEmail-info') || '[]');\r\n /** The period: the Flags page's (from / to in the link) until the header range changes. */\r\n private from = '';\r\n private to = '';\r\n private readonly search$ = new Subject<string>();\r\n private readonly destroy$ = new Subject<void>();\r\n\r\n constructor(\r\n private traxService: TraxService,\r\n private gs: GlobalStateService,\r\n private route: ActivatedRoute,\r\n private router: Router,\r\n private cd: ChangeDetectorRef\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n const qp = this.route.snapshot.queryParamMap;\r\n this.auditId = qp.get('audit') || '';\r\n this.from = qp.get('from') || '';\r\n this.to = qp.get('to') || '';\r\n let first = true;\r\n this.gs.dataRangeValue\r\n .pipe(takeUntil(this.destroy$), debounceTime(300))\r\n .subscribe((data: any) => {\r\n if (!data?.client) { return; }\r\n this.headerData = data;\r\n // A later header change wins over the link's period.\r\n if (!first || !this.from) {\r\n this.from = data.date?.startDate || '';\r\n this.to = data.date?.endDate || this.from;\r\n }\r\n first = false;\r\n this.period = 'Based on ' + this.fmt(this.from) + ' - ' + this.fmt(this.to);\r\n this.currentPage = 1;\r\n this.load();\r\n });\r\n\r\n this.search$\r\n .pipe(takeUntil(this.destroy$), debounceTime(400), distinctUntilChanged())\r\n .subscribe(() => {\r\n this.currentPage = 1;\r\n this.load();\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n private load(): void {\r\n if (!this.auditId) {\r\n this.loading = false;\r\n this.notFound = true;\r\n this.cd.detectChanges();\r\n return;\r\n }\r\n this.loading = true;\r\n this.traxService.auditFlagsDetail({\r\n clientId: this.headerData?.client,\r\n fromDate: this.from,\r\n toDate: this.to || this.from,\r\n // Checked header stores only, like the Flags list.\r\n storeId: (this.headerData?.stores || []).filter((s: any) => s.checked).map((s: any) => s.storeId),\r\n userEmailes: this.userEmailes,\r\n checklistId: this.auditId,\r\n limit: this.itemsPerPage,\r\n offset: this.currentPage,\r\n searchValue: this.search.trim(),\r\n // Sent only once a column is picked, so an API without sorting still serves newest first.\r\n ...(this.sortColumn ? { sortColumn: this.sortColumn, sortBy: this.sortBy } : {})\r\n }).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (res: any) => {\r\n const data = res?.code === 200 ? (res.data || {}) : null;\r\n this.notFound = !data;\r\n this.auditName = data?.audit?.checkListName || this.auditName;\r\n this.coverage = data?.audit?.coverage || 'store';\r\n this.runAIActive = !!data?.audit?.runAIActive;\r\n this.cards = this.toCards(data?.summary || null);\r\n this.totalItems = Number(data?.totalCount) || 0;\r\n this.rows = (data?.rows || []).map((r: any) => this.toRow(r));\r\n this.loading = false;\r\n this.cd.detectChanges();\r\n },\r\n error: (e: any) => {\r\n this.notFound = e?.status === 404;\r\n this.rows = [];\r\n this.totalItems = 0;\r\n this.runAIActive = false;\r\n this.cards = this.toCards(null);\r\n this.loading = false;\r\n this.cd.detectChanges();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * The v1 Flags Info cards for a custom checklist, from the audit's row in the Flags list. Run AI flags count\r\n * in the incidents and get their own card when the audit has Run AI questions (audit.runAIActive).\r\n */\r\n private toCards(s: any): FlagDetailCard[] {\r\n const n = (v: any) => (v === undefined || v === null ? '—' : Number(v).toLocaleString('en-IN'));\r\n const runAI = this.runAIActive ? Number(s?.runAIFlags) || 0 : 0;\r\n const incidents = s ? (Number(s.questionFlags) || 0) + (Number(s.notSubmitted) || 0) + runAI : null;\r\n return [\r\n { title: 'Total Assigned Stores', value: n(s?.assignedStores), note: 'With this audit in the period' },\r\n { title: 'Total Flagged Stores', value: n(s?.flaggedStores), note: 'With a flagged answer' },\r\n {\r\n title: 'Flag Incidents', value: n(incidents),\r\n note: s\r\n ? `${n(s.questionFlags)} question · ${n(s.notSubmitted)} not submitted` + (this.runAIActive ? ` · ${n(runAI)} Run AI` : '')\r\n : 'Question and time flags'\r\n },\r\n // No Compliance Rate card (QA 10 Oct).\r\n ...(this.runAIActive ? [{ title: 'Run AI Flags', value: n(s ? runAI : null), note: 'Flagged by Run AI checks' }] : [])\r\n ];\r\n }\r\n\r\n private toRow(r: any): FlagDetailRow {\r\n return {\r\n date: r?.date || '—',\r\n store: r?.storeName || '—',\r\n user: r?.userName || r?.userEmail || '—',\r\n flags: Number(r?.flags) || 0,\r\n questionFlags: Number(r?.questionFlags) || 0,\r\n timeFlags: Number(r?.timeFlags) || 0,\r\n runAIFlags: Number(r?.runAIFlags) || 0,\r\n viewable: r?.checklistStatus === 'submit',\r\n raw: r\r\n };\r\n }\r\n\r\n /** View: this visit (audit, store, day) in the Gallery, flagged submissions only. */\r\n view(row: FlagDetailRow): void {\r\n if (!row.viewable) { return; }\r\n this.router.navigate(['/manage/trax/audit-v2/gallery'], {\r\n queryParams: { audit: this.auditId, store: row.raw?.storeId, date: row.raw?.date_string, flag: 1 }\r\n });\r\n }\r\n\r\n onSearch(): void {\r\n this.search$.next(this.search);\r\n }\r\n\r\n /** Column sort, done by the API (the table is paged there); '' = newest first. */\r\n sortColumn = '';\r\n sortBy: 1 | -1 = 1;\r\n\r\n sortTable(column: string): void {\r\n this.sortBy = this.sortColumn === column && this.sortBy === 1 ? -1 : 1;\r\n this.sortColumn = column;\r\n this.currentPage = 1;\r\n this.load();\r\n }\r\n\r\n onPageChange(page: number): void {\r\n this.currentPage = page;\r\n this.load();\r\n }\r\n\r\n onPageSizeChange(size: any): void {\r\n this.itemsPerPage = Number(size) || 10;\r\n this.currentPage = 1;\r\n this.load();\r\n }\r\n\r\n trackByRow(_: number, row: FlagDetailRow): string {\r\n return row.raw?.processedId || row.date + row.store;\r\n }\r\n\r\n private fmt(value: any): string {\r\n return value ? dayjs(value).format('DD MMM YYYY') : '—';\r\n }\r\n}\r\n","<div class=\"av2-page\">\r\n <!-- Back + audit name -->\r\n <div class=\"fd-head\">\r\n <a class=\"fd-back\" routerLink=\"/manage/trax/audit-v2/flags\" title=\"Back to Flags\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"19\" y1=\"12\" x2=\"5\" y2=\"12\"></line>\r\n <polyline points=\"12 19 5 12 12 5\"></polyline>\r\n </svg>\r\n </a>\r\n <div class=\"fd-head-text\">\r\n <span *ngIf=\"loading && !auditName\" class=\"av2-sk av2-sk--title\"></span>\r\n <div class=\"fd-title\" *ngIf=\"!loading || auditName\">{{ auditName || 'Audit flags' }}</div>\r\n <div class=\"fd-sub\">{{ period }}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"av2-empty\" *ngIf=\"!loading && notFound\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">Audit not found</div>\r\n <div class=\"av2-empty-sub\">It may have been deleted. Go back to Flags and pick another audit.</div>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!notFound\">\r\n <!-- v1 Flags Info cards -->\r\n <div class=\"av2-grid-4\">\r\n <div class=\"av2-ocard\" *ngFor=\"let card of cards\">\r\n <div class=\"av2-ocard-head av2-ocard-head--row\">\r\n <div class=\"av2-ocard-count\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span>\r\n <ng-container *ngIf=\"!loading\">{{ card.value }}</ng-container>\r\n </div>\r\n <div class=\"av2-ocard-text\">{{ card.title }}</div>\r\n </div>\r\n <div class=\"av2-ocard-body\">\r\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--note\"></span>\r\n <div *ngIf=\"!loading\" class=\"av2-ocard-note\">{{ card.note }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Flagged visits -->\r\n <section class=\"av2-card av2-card--table\">\r\n <div class=\"av2-card-head\">\r\n <div class=\"av2-title-block\">\r\n <div class=\"av2-card-title\">\r\n Flagged visits\r\n <span class=\"av2-badge av2-badge--count\">{{ totalItems }}</span>\r\n </div>\r\n <div class=\"av2-card-sub\">Question flags on submitted audits, time flags on audits not submitted in their window</div>\r\n </div>\r\n <label class=\"av2-search av2-search--sm\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input [(ngModel)]=\"search\" (ngModelChange)=\"onSearch()\" type=\"text\"\r\n [placeholder]=\"coverage === 'user' ? 'Search user' : 'Search store or user'\" autocomplete=\"off\" />\r\n </label>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"loading\"></lib-audit-v2-shimmer>\r\n\r\n <div class=\"av2-table-wrap\" *ngIf=\"!loading && rows.length\">\r\n <table class=\"av2-table av2-table--lined fd-table\">\r\n <thead>\r\n <tr>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('date')\">Date <lib-audit-v2-sort-icon [active]=\"sortColumn === 'date'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable(coverage === 'user' ? 'user' : 'store')\">{{ coverage === 'user' ? 'User Name' : 'Store Name' }} <lib-audit-v2-sort-icon\r\n [active]=\"sortColumn === (coverage === 'user' ? 'user' : 'store')\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th *ngIf=\"coverage !== 'user'\" class=\"av2-sortable\" (click)=\"sortTable('user')\">User <lib-audit-v2-sort-icon [active]=\"sortColumn === 'user'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('flags')\">No. of flags <lib-audit-v2-sort-icon [active]=\"sortColumn === 'flags'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th *ngIf=\"runAIActive\" class=\"av2-sortable\" (click)=\"sortTable('runAI')\">Run AI Flags <lib-audit-v2-sort-icon [active]=\"sortColumn === 'runAI'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of rows; trackBy: trackByRow\">\r\n <td>{{ row.date }}</td>\r\n <td class=\"av2-ellipsis\" [av2Tip]=\"coverage === 'user' ? row.user : row.store\">{{ coverage === 'user' ? row.user : row.store }}</td>\r\n <td *ngIf=\"coverage !== 'user'\" class=\"av2-ellipsis av2-dim\" [av2Tip]=\"row.user\">{{ row.user }}</td>\r\n <td>\r\n <div class=\"fd-flags\">\r\n <span class=\"fd-flag-total\">{{ row.flags }}</span>\r\n <span class=\"av2-badge av2-badge--error av2-badge--count\" *ngIf=\"row.questionFlags\">{{ row.questionFlags }} Question</span>\r\n <span class=\"av2-badge av2-badge--warning av2-badge--count\" *ngIf=\"row.timeFlags\">Not submitted</span>\r\n </div>\r\n </td>\r\n <td *ngIf=\"runAIActive\">{{ row.runAIFlags }}</td>\r\n <td>\r\n <a class=\"av2-link\" *ngIf=\"row.viewable\" (click)=\"view(row)\" title=\"Open this visit's flagged answers in the Gallery\">View</a>\r\n <span class=\"av2-faint\" *ngIf=\"!row.viewable\" title=\"Not submitted yet: nothing to open in the Gallery\">—</span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!loading && !rows.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ search.trim() ? 'There is no result for this search' : 'No flags for this audit in the period' }}</div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"!loading && rows.length\" class=\"fd-pagination\">\r\n <lib-pagination [itemsPerPage]=\"itemsPerPage\" [pageSize]=\"itemsPerPage\" [paginationSizes]=\"pageSizes\" [currentPage]=\"currentPage\"\r\n [totalItems]=\"totalItems\" (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </section>\r\n </ng-container>\r\n</div>\r\n","import { ChangeDetectorRef, Component, HostListener, OnDestroy, OnInit } from '@angular/core';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { Observable, Subject, debounceTime, forkJoin, of, takeUntil } from 'rxjs';\r\nimport { catchError, map } from 'rxjs/operators';\r\nimport { AuditAccess, auditAccess } from '../audit-v2-access';\r\nimport { InlinePickerRange, PICKER_LOCALE, PickedDates, fromPickerRange, inlinePickerToday, toInlinePickerRange } from '../audit-v2-datepicker';\r\nimport { GlobalStateService } from 'tango-app-ui-global';\r\nimport { AuthService, ToastService } from 'tango-app-ui-shared';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport dayjs from 'dayjs';\r\nimport { TraxService } from '../../../services/trax.service';\r\nimport { ExportGalleryComponent } from '../../export-gallery/export-gallery.component';\r\nimport { AddTaskComponent } from '../../add-task/add-task.component';\r\n\r\n/** A question in the left panel, from /audit/gallery/questions. */\r\nexport interface AuditQuestion {\r\n /** section + question text; qno is not unique across sections. */\r\n key: string;\r\n qno: string;\r\n text: string;\r\n section: string;\r\n /** Sent with the selected questions to the download service (as the v1 gallery does). */\r\n answerType: string;\r\n}\r\n\r\n/** One left-panel accordion group. */\r\nexport interface AuditSection {\r\n name: string;\r\n questions: AuditQuestion[];\r\n}\r\n\r\n/** A configured option of a single-choice question - what an edit can switch the answer to. */\r\nexport interface AnswerOption {\r\n label: string;\r\n /** null for a question without compliance scoring. */\r\n score: number | null;\r\n flag: boolean;\r\n}\r\n\r\n/** A photo or video captured with an answer. */\r\nexport interface AnswerMedia {\r\n src: string;\r\n video: boolean;\r\n /** Per-image description (Capture Multiple Image, \"description per image\"); '' when none. */\r\n caption: string;\r\n /** \"YYYY-MM-DD hh:mm AM\" read from the upload key (v1 getUploadTime); '' when the key has no time. */\r\n uploaded: string;\r\n /** Run AI detection of this capture: 'matched' / 'notmatched', '' when none was run. */\r\n detection: '' | 'matched' | 'notmatched';\r\n}\r\n\r\n/** A Run AI result line (\"Employee Count : 03\"), as the v1 gallery lists them under the answer. */\r\nexport interface AiResult {\r\n label: string;\r\n value: string;\r\n}\r\n\r\n/** A dispute the store raised on an answer from mobile (question.dispute), and the approver's decision. */\r\nexport interface AnswerDispute {\r\n /** raised = waiting for the approver; approved = reviewed (answer kept, or revised to `answer`); rejected. */\r\n status: 'raised' | 'approved' | 'rejected';\r\n description: string;\r\n /** Photo the store attached, as a URL; '' when none. */\r\n image: string;\r\n raisedBy: string;\r\n /** The option the approver revised the answer to; '' when the recorded answer was kept. */\r\n answer: string;\r\n rejectReason: string;\r\n reviewedBy: string;\r\n}\r\n\r\n/** One answered question of the submission on the right, from /audit/gallery/answers. */\r\nexport interface AnswerRow {\r\n key: string;\r\n section: string;\r\n qno: string;\r\n text: string;\r\n answerType: string;\r\n /** Grey line under the question (qdescription, minus the legacy auto-task copy). */\r\n description: string;\r\n /** Question-level reference images (multiQuestionReferenceImage[].imageURL, else questionReferenceImage). */\r\n questionRefs: string[];\r\n /** Reference images of the chosen options (choice types) or of the capture (image / video types). */\r\n optionRefs: string[];\r\n answers: string[];\r\n /** \"%\" / \"°C\" after a linear scale answer; '' otherwise. */\r\n unit: string;\r\n /** The answer's own captures (Uploaded Image / Video). */\r\n media: AnswerMedia[];\r\n /** Validation proof the chosen option asked for (Capture Image / Video / Multiple Image). */\r\n proof: AnswerMedia[];\r\n /** Every photo / video of the answer and its proof (Excel export). */\r\n images: string[];\r\n videos: string[];\r\n /** Text typed as validation proof of the chosen answer (joined, for the Excel export). */\r\n validationText: string;\r\n /** The same validation answers one by one, as the page lists them. */\r\n validationTexts: string[];\r\n /** Run AI result lines of the first answer (detection status excluded), or the Employee Count fallback. */\r\n aiResults: AiResult[];\r\n remark: string;\r\n /** Second remark field (storeManagerRemark). */\r\n extraRemark: string;\r\n /** Score of the submitted answer; null for a question without compliance scoring. */\r\n actualScore: number | null;\r\n /** Score in force - the revision's when there is one. */\r\n score: number | null;\r\n /** The answer in force carries an SOP flag - the same flag the audit dashboard scores on. */\r\n flagged: boolean;\r\n redo: boolean;\r\n /** Set once a reviewer (or an approved dispute) changed the submitted answer. */\r\n revised: { answer: string; reason: string; score: number | null; by: string } | null;\r\n options: AnswerOption[];\r\n /** Single-choice with configured options, so a reviewer can revise it. */\r\n editable: boolean;\r\n /** A task was already raised from this question (question.task / taskId): no second Create Task (v1). */\r\n hasTask: boolean;\r\n /** An option raises its task automatically on submit (answers[].autoTask.enabled): no manual Create Task (v1). */\r\n autoTask: boolean;\r\n dispute: AnswerDispute | null;\r\n}\r\n\r\n/** Header facts of the submission on the right. */\r\nexport interface SubmissionDetail {\r\n /** processedchecklist id - what revise / approve act on. */\r\n submissionId: string;\r\n storeId: string;\r\n storeName: string;\r\n /** \"State, Country\" of the store. */\r\n region: string;\r\n auditName: string;\r\n subtitle: string;\r\n questionCount: number;\r\n /** Flagged answers after revisions. */\r\n questionFlag: number;\r\n /** A question has \"Configure Compliance Score\" on; without one the submission has no Compliance Score. */\r\n complianceEnabled: boolean;\r\n /**\r\n * Compliance Score (0-100) from the API: compliance points (option scores) of the questions with Configure\r\n * Compliance Score on, after revisions - the same rule as the audit dashboard. null = none sent.\r\n */\r\n complianceScore: number | null;\r\n submittedBy: string;\r\n email: string;\r\n duration: string;\r\n date: string;\r\n /** YYYY-MM-DD of the submission. */\r\n dateIso: string;\r\n time: string;\r\n status: string;\r\n approvalEnable: boolean;\r\n approvalStatus: boolean;\r\n approvedBy: string;\r\n approvedAt: string;\r\n /** Name typed to acknowledge the submission (userSignature); '' when none. */\r\n acknowledgedBy: string;\r\n /** Photo captured with the acknowledgement (userImage) as a URL; '' when none. */\r\n proofImage: string;\r\n}\r\n\r\nexport interface FilterOption {\r\n label: string;\r\n meta?: string;\r\n /** What is stored and sent when it differs from the label (store id, audit id, answer type code). */\r\n value?: string;\r\n /** Present on a \"select all\" option; holds every value it stands for. */\r\n allOf?: string[];\r\n}\r\n\r\nexport interface FilterDef {\r\n id: string;\r\n label: string;\r\n hint: string;\r\n options: FilterOption[];\r\n multi: boolean;\r\n /** Date and score panes render their own controls. */\r\n kind: 'list' | 'date' | 'score';\r\n /** Drawer grouping. */\r\n group: 'primary' | 'secondary';\r\n searchable?: boolean;\r\n hide?: boolean;\r\n}\r\n\r\n/** Audit rows as /audit/list returns them. */\r\ninterface AuditOption {\r\n _id: string;\r\n checkListName: string;\r\n checkListDescription?: string;\r\n checkListType?: string;\r\n coverage?: string;\r\n passMark?: number | null;\r\n /** Submissions in the header period. */\r\n visits?: number;\r\n /** Published (audits; tasks leave it unset). */\r\n publish?: boolean;\r\n}\r\n\r\n/** Pass mark when an audit has none configured - the audit dashboard's default. */\r\nconst PASS_MARK = 75;\r\n\r\n/** Drawer labels and the answerType codes the gallery API takes. */\r\nconst ANSWER_TYPES: FilterOption[] = [\r\n { label: 'All Answer Type', value: 'all' },\r\n { label: 'Descriptive Answer', value: 'descriptive' },\r\n { label: 'A/B Question', value: 'yes/no' },\r\n { label: 'Multiple Choice Question - Single Answer', value: 'multiplechoicesingle' },\r\n { label: 'Multiple Choice Question - Multiple Answer', value: 'multiplechoicemultiple' },\r\n { label: 'Capture Image as answer', value: 'image' },\r\n { label: 'Capture Image with Description', value: 'descriptiveImage' },\r\n { label: 'Capture video as answer', value: 'video' },\r\n { label: 'Capture Multiple Image', value: 'multipleImage' },\r\n { label: 'Date As Answer', value: 'date' },\r\n { label: 'Time As Answer', value: 'time' },\r\n { label: 'Linear Scale', value: 'linearscale' },\r\n { label: 'Dropdown as an answer', value: 'dropdown' },\r\n { label: 'Capture Image/Video as Answer', value: 'image/video' }\r\n];\r\n\r\nconst APPROVE_FILTER: Record<string, string> = { 'All': 'all', 'Approved': 'Approved', 'Not-Approved': 'notapproved' };\r\n\r\n/** Answer types whose answer is a media path rather than text. */\r\nconst IMAGE_TYPES = ['image', 'descriptiveImage', 'multipleImage'];\r\nconst VIDEO_TYPES = ['video'];\r\nconst VIDEO_FILE = /\\.(mp4|webm|mov|ogg|m4v|avi|wmv)$/i;\r\n/** Option questions: their reference images sit on each chosen userAnswer (v1 gallery). */\r\nconst CHOICE_TYPES = ['dropdown', 'yes/no', 'multiplechoicesingle', 'multiplechoicemultiple'];\r\n\r\n/** Revisions are one configured option, so only single-choice answers can be edited (as the API enforces). */\r\nconst REVISABLE_TYPES = ['yes/no', 'multiplechoicesingle', 'dropdown'];\r\n\r\n/** \"Reason for change\" choices, from the prototype's edit flow. */\r\nconst CHANGE_REASONS = [\r\n 'Incorrect Response Submitted By The Auditor',\r\n 'Evidence Does Not Support The Answer',\r\n 'Corrected After Re-Verification With Store',\r\n 'Other'\r\n];\r\n\r\n/** \"Reason for rejection\" of a store dispute (prototype); the store sees it on mobile. */\r\nconst DISPUTE_REJECT_REASONS = [\r\n 'Evidence Supports The Actual Answer',\r\n 'Dispute Not Justified With Valid Proof',\r\n 'Verified With Store - Actual Answer Stands',\r\n 'Other'\r\n];\r\n\r\n/** Export pages through the answers API this many submissions at a time, up to EXPORT_MAX. */\r\n/** userEmail filter value no real user has (see resolveScope). */\r\nconst NO_MATCH_EMAIL = 'no-team-user@invalid';\r\nconst EXPORT_PAGE = 100;\r\nconst EXPORT_MAX = 3000;\r\n\r\nconst DEFAULTS = {\r\n type: 'Audit',\r\n answer: 'All Answer Type',\r\n scope: 'Clusters',\r\n status: 'All',\r\n result: 'All',\r\n scoreMin: 0,\r\n scoreMax: 100\r\n};\r\n\r\n@Component({\r\n selector: 'lib-audit-v2-gallery',\r\n templateUrl: './audit-v2-gallery.component.html',\r\n styleUrl: './audit-v2-gallery.component.scss'\r\n})\r\nexport class AuditV2GalleryComponent implements OnInit, OnDestroy {\r\n /** Left panel, from the questions API. */\r\n questionSections: AuditSection[] = [];\r\n /** Submission on the right, from the answers API. */\r\n rows: AnswerRow[] = [];\r\n\r\n /** Index of the expanded left-panel section; null = all collapsed. First open by default. */\r\n openSection: number | null = 0;\r\n\r\n /** Question keys ticked in the left panel; empty = show every answer. */\r\n selectedIds = new Set<string>();\r\n\r\n /** Drawer state. */\r\n filtersOpen = false;\r\n activeFilter = 'type';\r\n optionQuery = '';\r\n\r\n /** Filter values. fStores holds store ids, fClusters holds cluster or team names. */\r\n fStart = '';\r\n fEnd = '';\r\n /** Drawer's inline range picker dates for fStart / fEnd; set when the drawer opens or is cleared. */\r\n fRange: InlinePickerRange | null = null;\r\n readonly pickerLocale = PICKER_LOCALE;\r\n readonly today = inlinePickerToday();\r\n fType = DEFAULTS.type;\r\n fAuditId = '';\r\n fName = '';\r\n fAnswer = DEFAULTS.answer;\r\n fScope = DEFAULTS.scope;\r\n fClusters: string[] = [];\r\n fStores: string[] = [];\r\n fStatus = DEFAULTS.status;\r\n fResult = DEFAULTS.result;\r\n fFlags: string[] = [];\r\n fScoreMin = DEFAULTS.scoreMin;\r\n fScoreMax = DEFAULTS.scoreMax;\r\n\r\n /** Filter sources. */\r\n /** Name filter lists per Type: the client's audits, and the Audit menu's tasks (Manage -> Task tab). */\r\n private auditOptions: AuditOption[] = [];\r\n private taskOptions: AuditOption[] = [];\r\n\r\n /** Type filter = Task: the gallery lists submissions of one of the Audit menu's tasks. */\r\n get isTask(): boolean {\r\n return this.fType === 'Task';\r\n }\r\n\r\n /**\r\n * The submissions on screen are a task's (the applied filters, not the drawer's pending Type). Answer editing and\r\n * Approve are audit actions (/audit/gallery/revise, /approve), so a task's submissions are view-only here.\r\n */\r\n get shownTask(): boolean {\r\n return this.scopePayload?.['type'] === 'task';\r\n }\r\n\r\n /** `type` the gallery API takes for the chosen Type. */\r\n get galleryType(): 'audit' | 'task' {\r\n return this.isTask ? 'task' : 'audit';\r\n }\r\n\r\n /** The Name filter's list for the chosen Type. */\r\n get audits(): AuditOption[] {\r\n return this.isTask ? this.taskOptions : this.auditOptions;\r\n }\r\n\r\n /**\r\n * The Name filter's list (QA 10 Oct): only the audits (tasks) with a submission in the drawer's dates\r\n * (`visits`, re-read when those dates change), plus the one in view so it stays selectable.\r\n */\r\n get listedAudits(): AuditOption[] {\r\n // Published audits only (QA 10 Oct); a task has no publish flag here, so tasks are not narrowed by it.\r\n return this.audits.filter(a => (Number(a.visits) > 0 && a.publish !== false) || a._id === this.fAuditId);\r\n }\r\n\r\n /** Dates the audit / task lists' submission counts were read for. */\r\n private auditCountsKey = '';\r\n storeOptions: Array<{ storeId: string; storeName: string }> = [];\r\n /**\r\n * Stores with submissions of the chosen audit in the chosen dates (as the v1 gallery's storesDetails):\r\n * the Stores filter offers only these. null = no audit chosen yet, or not loaded: every store.\r\n */\r\n auditStoreIds: Set<string> | null = null;\r\n auditStoresLoading = false;\r\n /** Audit and dates auditStoreIds was loaded for. */\r\n private auditStoresKey = '';\r\n clusterNames: string[] = [];\r\n teamNames: string[] = [];\r\n\r\n /** Submission shown on the right. */\r\n detail: SubmissionDetail = this.emptyDetail();\r\n\r\n /** Paging: one submission per page, pageIndex is 0-based as the answers API reads offset. */\r\n pageIndex = 0;\r\n total = 0;\r\n\r\n /** Start true: the filter sources load before the first answers page, and that wait shimmers too. */\r\n loading = true;\r\n /** Question navigation is in flight (sources, then the questions call). */\r\n navLoading = true;\r\n loadError = '';\r\n\r\n /** Pass mark and edit permission of the audit in view, sent with every answers page. */\r\n passMark: number | null = null;\r\n access = { canEdit: false, reason: '' };\r\n /** Approve / Reject on store disputes: only the audit's Edit Submitted Audit users (no Tango users), from the API. */\r\n disputeAccess = { canReview: false, reason: '' };\r\n /** Approve: the audit's approvers and the Super Admin only (QA 10 Oct), from the API. */\r\n approveAccess = { canApprove: false, reason: '' };\r\n /** Days after submission that Redo stays available (Configure -> Redo extension); 0 = submission day only. */\r\n redoExtension = 0;\r\n /** Client-level outcome / remark labels (Manage > Settings > Trax Configuration). */\r\n labels = { pass: 'Pass', fail: 'Fail', remarks: 'Remarks', additional: 'Additional Remarks' };\r\n\r\n /** Client brand shown above the submission facts. */\r\n clientLogo = '';\r\n clientName = '';\r\n logoFailed = false;\r\n /** Media URLs that failed to load, shown as an \"unavailable\" tile instead of a broken image. */\r\n brokenMedia = new Set<string>();\r\n\r\n /** Answer edit (one question at a time). */\r\n readonly changeReasons = CHANGE_REASONS;\r\n /** Reason for change dropdown (lib-audit-v2-select). */\r\n readonly reasonOptions = CHANGE_REASONS.map(r => ({ value: r, label: r }));\r\n editKey: string | null = null;\r\n draftAnswer = '';\r\n draftReason = '';\r\n draftOther = '';\r\n saving = false;\r\n\r\n /** Dispute review (one question at a time): Approve picks the answer in force, Reject needs a reason. */\r\n readonly disputeReasonOptions = DISPUTE_REJECT_REASONS.map(r => ({ value: r, label: r }));\r\n disputeKey: string | null = null;\r\n disputeMode: 'approve' | 'reject' | null = null;\r\n disputeAnswer = '';\r\n disputeReason = '';\r\n disputeOther = '';\r\n disputeSaving = false;\r\n\r\n /** Approve bar: a second click confirms, since approval closes editing. */\r\n approveConfirm = false;\r\n approving = false;\r\n\r\n exportOpen = false;\r\n /** Excel group (This submission / All submissions) in the Export menu; hidden for now, set true to bring it back. */\r\n readonly showExcelExport = false;\r\n exporting = false;\r\n\r\n /** Snapshot taken when the drawer opens, restored on cancel. */\r\n private snapshot: Record<string, unknown> | null = null;\r\n\r\n private headerData: any;\r\n private headerStart = '';\r\n private headerEnd = '';\r\n private answerCdn = '';\r\n private runAiCdn = '';\r\n /** Raw record on the right, for the single-submission export. */\r\n private record: any = null;\r\n /** Scope sent with every answers page, fixed when filters are applied. */\r\n private scopePayload: Record<string, any> | null = null;\r\n /** Drops responses from a load that a newer one replaced. */\r\n private loadSeq = 0;\r\n /** ?audit=&store=&date=&status= from Action Center (View / approval cards); applied once on the first load. */\r\n private deepLink: { audit: string; store: string; date: string; from: string; to: string; flag: boolean; disputed: boolean; status: string; task: boolean } | null = null;\r\n /** Audit id from that link, until the audit list confirms it; an unknown id is not swapped for another audit. */\r\n private linkedAuditId = '';\r\n /** The linked id is not one of this client's live audits (deleted, or not an audit). */\r\n linkMissing = false;\r\n /** Approve needs the Checklist edit permission (POST /trax/audit/gallery/approve checks it too). Answer editing\r\n * follows the server's own `access` below. */\r\n menuAccess: AuditAccess = { canAdd: false, canEdit: false };\r\n private readonly destroy$ = new Subject<void>();\r\n\r\n constructor(\r\n private traxService: TraxService,\r\n private gs: GlobalStateService,\r\n private cd: ChangeDetectorRef,\r\n private route: ActivatedRoute,\r\n private toast: ToastService,\r\n private auth: AuthService,\r\n private modal: NgbModal\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n auditAccess(this.gs).pipe(takeUntil(this.destroy$)).subscribe(access => {\r\n this.menuAccess = access;\r\n this.cd.detectChanges();\r\n });\r\n const qp = this.route.snapshot.queryParamMap;\r\n if (qp.get('audit')) {\r\n this.deepLink = {\r\n audit: qp.get('audit') || '', store: qp.get('store') || '', date: qp.get('date') || '',\r\n from: qp.get('from') || '', to: qp.get('to') || '',\r\n // Flags -> View: only flagged submissions.\r\n flag: qp.get('flag') === '1',\r\n // Dashboard Disputes count: only submissions with a store dispute or a revised answer.\r\n disputed: qp.get('disputed') === '1',\r\n // Action Center approval cards: Open -> Not-Approved, Approved -> Approved.\r\n status: APPROVE_FILTER[qp.get('status') || ''] ? (qp.get('status') || '') : '',\r\n // Action Center task cards / Task-tab View: ?audit= is then a task id.\r\n task: qp.get('type') === 'task'\r\n };\r\n }\r\n this.gs.environment.pipe(takeUntil(this.destroy$)).subscribe((env: any) => {\r\n this.answerCdn = env?.TraxAnswerCDN || '';\r\n this.runAiCdn = env?.traxRunAiCDN || this.answerCdn;\r\n });\r\n this.gs.dataRangeValue\r\n .pipe(takeUntil(this.destroy$), debounceTime(300))\r\n .subscribe((data: any) => {\r\n if (!data?.client) { return; }\r\n const clientChanged = this.headerData?.client !== data.client;\r\n this.headerData = data;\r\n this.headerStart = data.date?.startDate || '';\r\n this.headerEnd = data.date?.endDate || this.headerStart;\r\n this.fStart = this.headerStart;\r\n this.fEnd = this.headerEnd;\r\n if (clientChanged) {\r\n this.fClusters = [];\r\n this.fStores = [];\r\n this.loadLabels();\r\n this.loadClient();\r\n }\r\n // Arriving from Action Center (audit / store / day) or Manage (audit, schedule date range)\r\n // instead of the header range.\r\n if (this.deepLink) {\r\n this.fAuditId = this.deepLink.audit;\r\n this.linkedAuditId = this.deepLink.audit;\r\n if (this.deepLink.store) { this.fStores = [this.deepLink.store]; }\r\n if (this.deepLink.date) { this.fStart = this.deepLink.date; this.fEnd = this.deepLink.date; }\r\n else if (this.deepLink.from) { this.fStart = this.deepLink.from; this.fEnd = this.deepLink.to || this.deepLink.from; }\r\n if (this.deepLink.flag && !this.fFlags.includes('Flag')) { this.fFlags = [...this.fFlags, 'Flag']; }\r\n if (this.deepLink.disputed && !this.fFlags.includes('Disputed Submissions')) { this.fFlags = [...this.fFlags, 'Disputed Submissions']; }\r\n if (this.deepLink.status) { this.fStatus = this.deepLink.status; }\r\n if (this.deepLink.task) { this.fType = 'Task'; }\r\n this.deepLink = null;\r\n }\r\n this.loadSources();\r\n });\r\n }\r\n\r\n /** Never leave the page scroll locked if the route changes while the drawer is open. */\r\n ngOnDestroy(): void {\r\n this.setPageScrollLocked(false);\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n /**\r\n * The document is the app's scroller, so while the drawer is open lock <body>.\r\n * Otherwise the page scrolls behind the backdrop and its scrollbar stops the\r\n * fixed drawer short of the viewport's right edge.\r\n */\r\n private setPageScrollLocked(locked: boolean): void {\r\n document.body.style.overflow = locked ? 'hidden' : '';\r\n }\r\n\r\n private get clientId(): string {\r\n return this.headerData?.client;\r\n }\r\n\r\n /** Pass / Fail and remark labels from Trax Configuration; defaults when unset. */\r\n private loadLabels(): void {\r\n this.traxService.auditSettingsGet(this.clientId)\r\n .pipe(takeUntil(this.destroy$), catchError(() => of(null)))\r\n .subscribe((res: any) => {\r\n const d = res?.code === 200 ? res.data : null;\r\n this.labels = {\r\n pass: d?.passLabel || 'Pass',\r\n fail: d?.failLabel || 'Fail',\r\n remarks: d?.remarksLabel || 'Remarks',\r\n additional: d?.additionalRemarksLabel || 'Additional Remarks'\r\n };\r\n this.cd.detectChanges();\r\n });\r\n }\r\n\r\n /** Client logo and name, the same record the header's client badge reads. */\r\n private loadClient(): void {\r\n this.clientLogo = '';\r\n this.clientName = '';\r\n this.logoFailed = false;\r\n this.auth.getClientInfo(this.clientId)\r\n .pipe(takeUntil(this.destroy$), catchError(() => of(null)))\r\n .subscribe((res: any) => {\r\n const client = res?.code === 200 ? res.data?.result : null;\r\n this.clientLogo = client?.logo || '';\r\n this.clientName = client?.clientName || '';\r\n this.cd.detectChanges();\r\n });\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Filter sources: audits, clusters, teams, stores\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Loads every drawer list, then the gallery for the first (or still selected) audit. */\r\n private loadSources(): void {\r\n // loadGallery (via applyFilters) always runs next and clears both flags.\r\n this.loading = true;\r\n this.navLoading = true;\r\n const safe = (o: Observable<any>) => o.pipe(catchError(() => of(null)));\r\n forkJoin({\r\n audits: this.fetchAudits(),\r\n tasks: this.fetchTasks(),\r\n clusters: safe(this.traxService.getclusters({ clientId: this.clientId, group: [], city: [] })),\r\n teams: safe(this.traxService.getAllTeams(this.clientId))\r\n }).pipe(takeUntil(this.destroy$)).subscribe(({ audits, tasks, clusters, teams }: any) => {\r\n this.auditOptions = audits;\r\n this.taskOptions = tasks;\r\n this.auditCountsKey = [this.fStart || this.headerStart, this.fEnd || this.fStart || this.headerStart].join('|');\r\n this.clusterNames = clusters?.code === 200 ? (clusters.data?.groupData || []).map((c: any) => c.groupName).filter(Boolean) : [];\r\n this.teamNames = teams?.code === 200 ? (teams.data || []).map((t: any) => t.teamName).filter(Boolean) : [];\r\n\r\n // Keep the audit in view; otherwise open on the first one with submissions in the period.\r\n // A linked audit that is not in the list shows \"not found\" rather than another audit's data.\r\n const linked = this.linkedAuditId;\r\n this.linkedAuditId = '';\r\n const current = this.audits.find(a => a._id === this.fAuditId)\r\n || (linked ? undefined : this.audits.find(a => Number(a.visits) > 0) || this.audits[0]);\r\n this.linkMissing = !!linked && !current;\r\n if (current) {\r\n this.selectAudit(current);\r\n } else {\r\n this.fAuditId = '';\r\n this.fName = '';\r\n }\r\n this.loadAuditStores();\r\n this.loadStores(() => this.applyFilters());\r\n });\r\n }\r\n\r\n /**\r\n * Loads the stores the chosen audit has submissions at in the chosen dates (the drawer's audit and\r\n * dates, before Apply). While the drawer is open, store picks that are not in the new list are dropped.\r\n */\r\n private loadAuditStores(): void {\r\n const from = this.fStart;\r\n const to = this.fEnd && this.fEnd >= this.fStart ? this.fEnd : this.fStart;\r\n const key = [this.galleryType, this.fAuditId, from, to].join('|');\r\n if (key === this.auditStoresKey) { return; }\r\n this.auditStoresKey = key;\r\n if (!this.fAuditId || !from || !this.clientId) {\r\n this.auditStoreIds = null;\r\n this.auditStoresLoading = false;\r\n return;\r\n }\r\n this.auditStoresLoading = true;\r\n this.traxService.auditGalleryStores({ clientId: this.clientId, checklistId: this.fAuditId, fromDate: from, toDate: to, type: this.galleryType })\r\n .pipe(takeUntil(this.destroy$), catchError(() => of(null)))\r\n .subscribe((res: any) => {\r\n if (key !== this.auditStoresKey) { return; }\r\n this.auditStoresLoading = false;\r\n // A failed call keeps every store rather than an empty list.\r\n this.auditStoreIds = res?.code === 200\r\n ? new Set<string>((res.data?.stores || []).map((s: any) => String(s.storeId)))\r\n : (res === null ? null : new Set<string>());\r\n if (this.filtersOpen && this.auditStoreIds) {\r\n const ids = this.auditStoreIds;\r\n this.fStores = this.fStores.filter(id => ids.has(id));\r\n }\r\n this.cd.detectChanges();\r\n });\r\n }\r\n\r\n /** Stores the Stores filter lists: the client's stores in scope, narrowed to the audit's stores once known. */\r\n get filterStores(): Array<{ storeId: string; storeName: string }> {\r\n const ids = this.auditStoreIds;\r\n return ids ? this.storeOptions.filter(s => ids.has(s.storeId)) : this.storeOptions;\r\n }\r\n\r\n /** Why the option pane is empty. */\r\n get noOptionText(): string {\r\n if (this.activeDef.id === 'stores' && !this.optionQuery.trim()) {\r\n return this.auditStoresLoading ? 'Loading stores…' : 'No store has a submission of this audit in the selected dates.';\r\n }\r\n if (this.activeDef.id === 'name' && !this.optionQuery.trim()) {\r\n return 'No ' + this.fType.toLowerCase() + ' has a submission in the selected dates.';\r\n }\r\n return 'No match for this search.';\r\n }\r\n\r\n /** Audits for the Name filter: the client's audits only (POST /trax/audit/list reads auditchecklist). */\r\n private fetchAudits(from = this.fStart || this.headerStart, to = this.fEnd || from): Observable<AuditOption[]> {\r\n return this.traxService.auditList({\r\n clientId: this.clientId, fromDate: from, toDate: to,\r\n limit: 500, offset: 1, search: ''\r\n }).pipe(\r\n map((res: any) => (res?.code === 200 ? res.data?.result || [] : []) as AuditOption[]),\r\n catchError(() => of([] as AuditOption[]))\r\n );\r\n }\r\n\r\n /**\r\n * Tasks for the Name filter when Type is Task: the Audit menu's tasks (raised from its audits, or created from\r\n * Audit -> Manage -> Task), from POST /trax/audit/task/list, as the Manage -> Task tab lists them.\r\n */\r\n private fetchTasks(from = this.fStart || this.headerStart, to = this.fEnd || from): Observable<AuditOption[]> {\r\n const base = { clientId: this.clientId, limit: 500, offset: 1, sortColumn: '', sortBy: -1, search: '' };\r\n const toOptions = (res: any) => (res?.code === 200 ? res.data?.result || [] : []).map((t: any) => ({\r\n _id: String(t._id),\r\n checkListName: t.checkListName || '',\r\n checkListDescription: t.checkListDescription || '',\r\n checkListType: t.checkListType || 'task',\r\n coverage: t.coverage || 'store',\r\n // Submitted instances in the header range, so the gallery opens on a task with something to show.\r\n visits: t.visits\r\n })) as AuditOption[];\r\n // With the header range the list carries each task's submissions (`visits`, as the audit list); an API\r\n // without that rejects the dates, so the plain list is asked for instead.\r\n return this.traxService.auditTaskList({ ...base, fromDate: from, toDate: to }).pipe(\r\n map(toOptions),\r\n catchError(() => this.traxService.auditTaskList(base).pipe(map(toOptions), catchError(() => of([] as AuditOption[]))))\r\n );\r\n }\r\n\r\n /** Stores for the Stores filter, narrowed to the chosen clusters; prunes picks that fell out of scope. */\r\n private loadStores(done?: () => void): void {\r\n const clusters = this.fScope === 'Clusters' ? this.fClusters : [];\r\n this.traxService.getStoreslist({ clientId: this.clientId, clusters, city: [] })\r\n .pipe(takeUntil(this.destroy$), catchError(() => of(null)))\r\n .subscribe((res: any) => {\r\n this.storeOptions = res?.code === 200 ? (res.data?.storesData || []) : [];\r\n const ids = new Set(this.storeOptions.map(s => s.storeId));\r\n this.fStores = this.fStores.filter(id => ids.has(id));\r\n this.cd.detectChanges();\r\n if (done) { done(); }\r\n });\r\n }\r\n\r\n private selectAudit(audit: AuditOption): void {\r\n this.linkMissing = false;\r\n this.fAuditId = audit._id;\r\n this.fName = audit.checkListName;\r\n // Store-coverage audits are scoped by stores, user-coverage ones by team users.\r\n const scope = audit.coverage === 'user' ? 'Teams' : 'Clusters';\r\n if (scope !== this.fScope) {\r\n this.fScope = scope;\r\n this.fClusters = [];\r\n }\r\n }\r\n\r\n get selectedAudit(): AuditOption | undefined {\r\n return this.audits.find(a => a._id === this.fAuditId);\r\n }\r\n\r\n get passThreshold(): number {\r\n const mark = Number(this.passMark ?? this.selectedAudit?.passMark);\r\n return Number.isFinite(mark) && mark > 0 ? mark : PASS_MARK;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Gallery load\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Teams scope sends the teams' users; Clusters scope sends store ids. */\r\n private resolveScope(): Observable<{ storeId: string[]; userEmail: string[] }> {\r\n if (this.fScope === 'Teams') {\r\n // No team picked = every submission of the audit. Expanding to \"all teams\" would hide\r\n // auditors who are not in any team.\r\n if (!this.fClusters.length) { return of({ storeId: [], userEmail: [] }); }\r\n const teams = this.fClusters;\r\n return this.traxService.getusers({ clientId: this.clientId, teams }).pipe(\r\n map((res: any) => {\r\n const emails = res?.code === 200 ? [...new Set<string>((res.data || []).map((u: any) => u.userEmail).filter(Boolean))] : [];\r\n // The API treats an empty list as \"no filter\", so picked teams without users send an\r\n // email that matches nobody (shows \"No submissions found\", not every submission).\r\n return { storeId: [], userEmail: emails.length ? emails : [NO_MATCH_EMAIL] };\r\n }),\r\n catchError(() => of({ storeId: [], userEmail: [NO_MATCH_EMAIL] }))\r\n );\r\n }\r\n const storeId = this.fStores.length ? this.fStores : this.storeOptions.map(s => s.storeId);\r\n return of({ storeId, userEmail: [] });\r\n }\r\n\r\n private loadGallery(): void {\r\n const audit = this.selectedAudit;\r\n const seq = ++this.loadSeq;\r\n this.pageIndex = 0;\r\n this.selectedIds = new Set<string>();\r\n this.passMark = null;\r\n if (!audit || !this.clientId) {\r\n this.scopePayload = null;\r\n this.questionSections = [];\r\n this.total = 0;\r\n this.navLoading = false;\r\n this.showSubmission(null);\r\n return;\r\n }\r\n this.loading = true;\r\n this.navLoading = true;\r\n this.loadError = '';\r\n this.resolveScope().pipe(takeUntil(this.destroy$)).subscribe(scope => {\r\n if (seq !== this.loadSeq) { return; }\r\n this.scopePayload = {\r\n clientId: this.clientId,\r\n type: this.galleryType,\r\n fromDate: this.fStart,\r\n toDate: this.fEnd || this.fStart,\r\n ChecklistType: audit.checkListType || 'custom',\r\n checklistName: audit.checkListName,\r\n checklistId: audit._id,\r\n filtertype: this.fScope,\r\n storeId: scope.storeId,\r\n userEmail: scope.userEmail,\r\n answerType: ANSWER_TYPES.find(a => a.label === this.fAnswer)?.value || 'all',\r\n viewFlag: this.fFlags.includes('Flag'),\r\n viewRedo: this.fFlags.includes('Re-do'),\r\n // Only submissions with a dispute or a revised answer are paged (the answers inside are narrowed too).\r\n viewDisputed: this.fFlags.includes('Disputed Submissions'),\r\n filter: '',\r\n approveFilter: APPROVE_FILTER[this.fStatus] || 'all',\r\n ...this.scoreFilterPayload\r\n };\r\n this.traxService.auditGalleryQuestions({ ...this.scopePayload, questions: '' })\r\n .pipe(takeUntil(this.destroy$), catchError(() => of(null)))\r\n .subscribe((res: any) => {\r\n if (seq !== this.loadSeq) { return; }\r\n this.navLoading = false;\r\n this.questionSections = this.toSections(res?.code === 200 ? res.data?.checklistQuestions : []);\r\n this.openSection = this.questionSections.length ? 0 : null;\r\n this.cd.detectChanges();\r\n });\r\n this.loadPage(seq);\r\n });\r\n }\r\n\r\n /**\r\n * Pass / Fail Result and Compliance Score, for audits. Sent only when narrowed, so an API without these\r\n * filters still serves the unfiltered gallery.\r\n */\r\n private get scoreFilterPayload(): Record<string, string | number> {\r\n if (this.isTask) { return {}; }\r\n return {\r\n ...(this.fResult !== DEFAULTS.result ? { result: this.fResult } : {}),\r\n ...(this.fScoreMin !== DEFAULTS.scoreMin || this.fScoreMax !== DEFAULTS.scoreMax ? { scoreMin: this.fScoreMin, scoreMax: this.fScoreMax } : {})\r\n };\r\n }\r\n\r\n private answersRequest(offset: number, limit: number): Observable<any> {\r\n return this.traxService.auditGalleryAnswers({\r\n ...this.scopePayload,\r\n sourceCheckList_id: this.scopePayload?.['checklistId'],\r\n questions: [],\r\n offset,\r\n limit\r\n });\r\n }\r\n\r\n /** Fetches the submission at pageIndex. */\r\n private loadPage(seq = this.loadSeq): void {\r\n if (!this.scopePayload) { return; }\r\n this.loading = true;\r\n this.cancelEdit();\r\n this.cancelDispute();\r\n this.approveConfirm = false;\r\n this.answersRequest(this.pageIndex, 1).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (res: any) => {\r\n if (seq !== this.loadSeq) { return; }\r\n // 204 (nothing matched) arrives as an empty body.\r\n const data = res?.code === 200 ? res.data : null;\r\n this.total = Number(data?.total_count) || 0;\r\n if (data) {\r\n this.passMark = this.num(data.passMark);\r\n this.access = { canEdit: !!data.access?.canEdit, reason: data.access?.reason || '' };\r\n this.disputeAccess = { canReview: !!data.disputeAccess?.canReview, reason: data.disputeAccess?.reason || '' };\r\n this.approveAccess = { canApprove: !!data.approveAccess?.canApprove, reason: data.approveAccess?.reason || '' };\r\n this.redoExtension = Number(data.redoExtension) || 0;\r\n }\r\n this.showSubmission(data?.checklistAnswers?.[0] || null);\r\n },\r\n error: () => {\r\n if (seq !== this.loadSeq) { return; }\r\n this.total = 0;\r\n this.loadError = 'Could not load the gallery. Try again.';\r\n this.showSubmission(null);\r\n }\r\n });\r\n }\r\n\r\n retry(): void {\r\n this.loadGallery();\r\n }\r\n\r\n private showSubmission(record: any): void {\r\n this.loading = false;\r\n this.record = record;\r\n if (!record) {\r\n this.rows = [];\r\n this.detail = this.emptyDetail();\r\n this.cd.detectChanges();\r\n return;\r\n }\r\n const info = record.checklistInfo || {};\r\n const store = record.storeProfile || {};\r\n this.rows = (record.questionAnswer || []).flatMap((section: any) =>\r\n (section.questions || []).map((q: any) => this.toRow(section.sectionName, q)));\r\n const flags = this.num(info.questionFlag);\r\n this.detail = {\r\n submissionId: String(info.checklistId || ''),\r\n storeId: store.store_id || '',\r\n storeName: store.storeName || '—',\r\n region: [store.state, store.Country].filter(Boolean).join(', ') || '—',\r\n auditName: info.checklistName || this.fName,\r\n subtitle: this.selectedAudit?.checkListDescription || '',\r\n questionCount: Number(info.noofQuestions) || this.rows.length,\r\n questionFlag: flags ?? this.rows.filter(r => r.flagged).length,\r\n complianceEnabled: this.complianceOn(record),\r\n complianceScore: this.num(info.complianceScore),\r\n submittedBy: info.submittedBy || store.userName || '—',\r\n email: info.userEmail || store.userEmail || '',\r\n duration: info.duration || '—',\r\n date: String(info.date || '').trim() || '—',\r\n dateIso: info.date_string || '',\r\n time: info.time || '—',\r\n status: info.checklistStatus || 'submit',\r\n approvalEnable: !!info.approvalEnable,\r\n approvalStatus: !!info.approvalStatus,\r\n approvedBy: info.approvalByName || '',\r\n approvedAt: info.approvalTime_string || '',\r\n acknowledgedBy: String(info.userSignature || '').trim(),\r\n proofImage: this.mediaUrl(info.userImage, this.answerCdn)\r\n };\r\n this.cd.detectChanges();\r\n }\r\n\r\n private emptyDetail(): SubmissionDetail {\r\n return {\r\n submissionId: '', storeId: '', storeName: '—', region: '—', auditName: this.fName || '—',\r\n subtitle: this.selectedAudit?.checkListDescription || '', questionCount: 0, questionFlag: 0, complianceEnabled: false, complianceScore: null,\r\n submittedBy: '—', email: '', duration: '—', date: '—', dateIso: '', time: '—', status: '',\r\n approvalEnable: false, approvalStatus: false, approvedBy: '', approvedAt: '', acknowledgedBy: '', proofImage: ''\r\n };\r\n }\r\n\r\n /**\r\n * Whether the submission has a Compliance Score at all: the API's checklistInfo.complianceEnabled (read over every\r\n * section), else any question in the record with compliance scoring on. Without it the flag-based score would\r\n * always read 100%, so the page shows no score.\r\n */\r\n private complianceOn(record: any): boolean {\r\n const flag = record?.checklistInfo?.complianceEnabled;\r\n if (typeof flag === 'boolean') { return flag; }\r\n return (record?.questionAnswer || []).some((s: any) => (s?.questions || []).some((q: any) => q?.compliance === true));\r\n }\r\n\r\n private toSections(list: any[]): AuditSection[] {\r\n return (list || []).map((s: any) => ({\r\n name: s.sectionName,\r\n questions: (s.questions || []).map((q: any) => ({\r\n key: this.questionKey(s.sectionName, q.qname),\r\n qno: String(q.qno ?? ''),\r\n text: this.clean(q.qname),\r\n section: s.sectionName,\r\n answerType: String(q.answerType || '')\r\n }))\r\n }));\r\n }\r\n\r\n private toRow(section: string, q: any): AnswerRow {\r\n const given: any[] = q.userAnswer || [];\r\n const answers: string[] = [];\r\n const media: AnswerMedia[] = [];\r\n const proof: AnswerMedia[] = [];\r\n const proofText: string[] = [];\r\n const dateLabel = this.record?.checklistInfo?.date;\r\n // Run AI keeps an annotated copy of a photo; it replaces the original, as in the checklist gallery.\r\n const add = (into: AnswerMedia[], path: any, video: boolean, aiPath?: any, caption?: any, ai?: any) => {\r\n const src = !video && aiPath ? this.mediaUrl(aiPath, this.runAiCdn) : this.mediaUrl(path, this.answerCdn);\r\n if (!src) { return; }\r\n const status = this.detectionStatus(ai);\r\n into.push({\r\n src, video, caption: this.clean(caption), uploaded: this.uploadTime(path, dateLabel),\r\n detection: status === null ? '' : status ? 'matched' : 'notmatched'\r\n });\r\n };\r\n given.forEach((a: any) => {\r\n const kind = q.answerType === 'image/video' ? (this.isVideoAnswer(a) ? 'video' : 'image') : q.answerType;\r\n const captured = IMAGE_TYPES.includes(kind) || VIDEO_TYPES.includes(kind);\r\n if (captured) {\r\n // v1: each multipleImage tile has its own badge; single captures fall back to detectionStatus once AI ran.\r\n const aiData = a.runAIData?.length ? a.runAIData\r\n : (a.runAIAnswer && a.detectionStatus !== undefined ? [{ lableName: 'detectionStatus', value: a.detectionStatus }] : null);\r\n add(media, a.answer, VIDEO_TYPES.includes(kind), a.runAIAnswer, a.description, aiData);\r\n } else if (a.answer !== undefined && a.answer !== null && a.answer !== '') {\r\n answers.push(String(a.answer));\r\n }\r\n // Proof the chosen option asked for (answer validation): a photo, a video, text, or several photos.\r\n if (a.validationAnswer) {\r\n if (a.validationType === 'Capture Image') {\r\n add(proof, a.validationAnswer, false, captured ? '' : a.runAIAnswer, '', captured ? null : (a.runAIData || given[0]?.runAIData));\r\n } else if (a.validationType === 'Capture Video') {\r\n add(proof, a.validationAnswer, true);\r\n } else {\r\n proofText.push(String(a.validationAnswer));\r\n }\r\n }\r\n (a.validationImage || []).forEach((p: string, i: number) =>\r\n add(proof, p, false, a.runAIData?.[i]?.answerImage, '', a.runAIData?.[i]?.results));\r\n (a.validationVideo || []).forEach((p: string) => add(proof, p, true));\r\n });\r\n\r\n // Reference images, as the v1 gallery picks them: the question's own, then the chosen options' (choice\r\n // types, on each userAnswer) or the capture's (image / video types, on the configured answers).\r\n const questionRefs = this.refUrls(q.multiQuestionReferenceImage?.length ? q.multiQuestionReferenceImage : q.questionReferenceImage);\r\n const refsOf = (list: any[]): string[] => {\r\n const out: string[] = [];\r\n (list || []).forEach((x: any) => out.push(...this.refUrls(x?.multiReferenceImage?.length ? x.multiReferenceImage : x?.referenceImage)));\r\n return out;\r\n };\r\n const optionRefs = CHOICE_TYPES.includes(q.answerType)\r\n ? refsOf(given)\r\n : (IMAGE_TYPES.includes(q.answerType) || VIDEO_TYPES.includes(q.answerType) || q.answerType === 'image/video')\r\n ? refsOf(q.answers)\r\n : [];\r\n const linear = q.answers?.[0]?.linearType;\r\n const unit = q.answerType === 'linearscale' ? (linear === 'percentage' ? '%' : linear === 'degree' ? '°C' : '') : '';\r\n\r\n const scored = !!q.compliance;\r\n const options: AnswerOption[] = (q.answers || [])\r\n .map((o: any) => ({ label: String(o?.answer ?? ''), score: scored ? (Number(o?.complianceScore) || 0) : null, flag: !!o?.sopFlag }))\r\n .filter((o: AnswerOption) => o.label);\r\n const optionFor = (label: string) => options.find(o => o.label.trim().toLowerCase() === label.trim().toLowerCase());\r\n\r\n const hasRevision = !!(q.revisedAnswer || q.revisedReason) || (q.revisedScore !== undefined && q.revisedScore !== null);\r\n const revisedAnswer = String(q.revisedAnswer || '');\r\n const revised = hasRevision\r\n ? {\r\n answer: revisedAnswer,\r\n reason: String(q.revisedReason || ''),\r\n score: this.num(q.revisedScore) ?? (revisedAnswer ? optionFor(revisedAnswer)?.score ?? null : null),\r\n by: String(q.revisedBy?.name || '')\r\n }\r\n : null;\r\n // A revised answer is bare option text; its flag comes from the matching configured option.\r\n const flagged = revised?.answer ? !!optionFor(revised.answer)?.flag : given.some((a: any) => a.sopFlag);\r\n // The submitted answer's own complianceScore, else the configured option's (some submissions\r\n // carry only the answer text).\r\n const scores = given.map((a: any) => {\r\n const own = this.num(a.complianceScore);\r\n return own ?? (optionFor(String(a?.answer ?? ''))?.score ?? 0);\r\n });\r\n const actualScore = scored ? (scores.length ? Math.max(...scores) : 0) : null;\r\n\r\n return {\r\n key: this.questionKey(section, q.qname),\r\n section,\r\n qno: String(q.qno ?? ''),\r\n text: this.clean(q.qname),\r\n answerType: q.answerType || '',\r\n description: this.visibleQdescription(q),\r\n questionRefs,\r\n optionRefs,\r\n answers,\r\n unit,\r\n media,\r\n proof,\r\n images: [...media, ...proof].filter(m => !m.video).map(m => m.src),\r\n videos: [...media, ...proof].filter(m => m.video).map(m => m.src),\r\n validationText: proofText.join(', '),\r\n validationTexts: proofText,\r\n aiResults: this.aiResults(q),\r\n remark: q.remarks || '',\r\n extraRemark: q.storeManagerRemark || '',\r\n actualScore,\r\n score: scored ? (revised?.score ?? actualScore) : null,\r\n flagged,\r\n redo: !!q.redo,\r\n revised,\r\n options,\r\n editable: REVISABLE_TYPES.includes(q.answerType) && options.length > 1,\r\n hasTask: !!(q.task || q.taskId),\r\n autoTask: (Array.isArray(q.answers) ? q.answers : [q.answers]).some((o: any) => o?.autoTask?.enabled === true),\r\n dispute: this.toDispute(q.dispute)\r\n };\r\n }\r\n\r\n /** question.dispute (raised from mobile; reviewed here) as the page shows it. */\r\n private toDispute(d: any): AnswerDispute | null {\r\n if (!d || typeof d !== 'object') { return null; }\r\n const status = d.status === 'approved' || d.status === 'rejected' ? d.status : 'raised';\r\n return {\r\n status,\r\n description: this.clean(d.description),\r\n image: this.mediaUrl(d.image, this.answerCdn),\r\n raisedBy: String(d.raisedBy?.userName || d.raisedBy?.userEmail || ''),\r\n answer: String(d.answer || ''),\r\n rejectReason: String(d.rejectReason || ''),\r\n reviewedBy: String(d.reviewedBy?.name || d.reviewedBy?.email || '')\r\n };\r\n }\r\n\r\n /** Stored media is a bucket key; a few older records already hold a full URL. */\r\n private mediaUrl(path: any, cdn: string): string {\r\n const p = String(path ?? '').trim();\r\n if (!p) { return ''; }\r\n return /^https?:\\/\\//i.test(p) ? p : cdn + p.replace(/^\\/+/, '');\r\n }\r\n\r\n /** Reference image field as URLs: a key, a list of keys (tasks), or [{ imageURL }] (multi reference images). */\r\n private refUrls(value: any): string[] {\r\n const list = Array.isArray(value) ? value : [value];\r\n return list\r\n .map((v: any) => this.mediaUrl(typeof v === 'string' ? v : v?.imageURL, this.answerCdn))\r\n .filter(Boolean);\r\n }\r\n\r\n /**\r\n * Run AI detectionStatus ('true' / 'false') at the top level of runAIData or inside an entry's results\r\n * (v1 checkDetectionStatus); null when no detection was run.\r\n */\r\n private detectionStatus(runAIData: any): boolean | null {\r\n if (!Array.isArray(runAIData)) { return null; }\r\n for (const entry of runAIData) {\r\n const hit = entry?.lableName === 'detectionStatus' ? entry\r\n : (entry?.results || []).find((r: any) => r?.lableName === 'detectionStatus');\r\n if (hit) { return String(hit.value).toLowerCase() === 'true'; }\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Upload time from the capture key (…/YYYY-MM-DD/…/HH:mm:ss/file) as \"YYYY-MM-DD hh:mm AM\", the v1 label; the\r\n * submission date stands in for keys without a date segment, and keys without a time give ''.\r\n */\r\n private uploadTime(path: any, submissionDate?: string): string {\r\n if (!path || typeof path !== 'string') { return ''; }\r\n const parts = path.split('/');\r\n const clock = parts[parts.length - 2] || '';\r\n if (!/^\\d{1,2}:\\d{2}:\\d{2}$/.test(clock)) { return ''; }\r\n const [h, m] = clock.split(':');\r\n const hour = parseInt(h, 10);\r\n const time = `${String(hour % 12 || 12).padStart(2, '0')}:${m} ${hour >= 12 ? 'PM' : 'AM'}`;\r\n const day = parts.find(p => /^\\d{4}-\\d{2}-\\d{2}$/.test(p));\r\n if (day) { return `${day} ${time}`; }\r\n // checklistInfo.date is \"DD MMM YYYY\", which Date parses without the customParseFormat plugin.\r\n const d = submissionDate ? dayjs(new Date(submissionDate)) : null;\r\n return d && d.isValid() ? `${d.format('YYYY-MM-DD')} ${time}` : time;\r\n }\r\n\r\n /**\r\n * Run AI result lines of the first answer, as the v1 gallery lists them: each labelled entry (or each entry's\r\n * results) except detectionStatus, values padded to two digits; an image answer without AI data shows its\r\n * Employee Count when it has one.\r\n */\r\n private aiResults(q: any): AiResult[] {\r\n const first = q?.userAnswer?.[0];\r\n const data: any[] = Array.isArray(first?.runAIData) ? first.runAIData : [];\r\n const out: AiResult[] = [];\r\n const push = (e: any) => {\r\n if (e?.lableName && e.lableName !== 'detectionStatus' && e.value !== undefined && e.value !== null) {\r\n out.push({ label: String(e.lableName), value: String(e.value).padStart(2, '0') });\r\n }\r\n };\r\n data.forEach((e: any) => e?.lableName ? push(e) : (e?.results || []).forEach(push));\r\n if (!data.length && q?.answerType === 'image' && first?.employeeCount !== undefined && first?.employeeCount !== null) {\r\n out.push({ label: 'Employee Count', value: String(first.employeeCount) });\r\n }\r\n return out;\r\n }\r\n\r\n /**\r\n * qdescription, except the copy an old auto-task save left in it (an answer's autoTask.taskDescription), which\r\n * the v1 gallery and the question builder do not show either.\r\n */\r\n private visibleQdescription(q: any): string {\r\n const text = String(q?.qdescription || '').trim();\r\n if (!text) { return ''; }\r\n const taskCopy = (q?.answers || []).some((o: any) => o?.autoTask?.enabled && o.autoTask.taskDescription === q.qdescription);\r\n return taskCopy ? '' : text;\r\n }\r\n\r\n /** Capture Image/Video answers: the entry's own type, else the file extension (checklist gallery rule). */\r\n private isVideoAnswer(a: any): boolean {\r\n if (a?.answerType === 'video' || a?.mediaType === 'video' || a?.type === 'video') { return true; }\r\n return VIDEO_FILE.test(String(a?.answer || '').split('?')[0]);\r\n }\r\n\r\n onMediaError(src: string): void {\r\n this.brokenMedia = new Set(this.brokenMedia).add(src);\r\n }\r\n\r\n private questionKey(section: string, qname: string): string {\r\n return section + '|' + this.clean(qname);\r\n }\r\n\r\n private clean(text: any): string {\r\n return String(text ?? '').replace(/\\n/g, ' ').trim();\r\n }\r\n\r\n private num(v: any): number | null {\r\n return v === undefined || v === null || v === '' || !Number.isFinite(Number(v)) ? null : Number(v);\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Paging\r\n // ---------------------------------------------------------------------------\r\n\r\n /** lib-pagination's page (1-based) -> that submission, back at the top of the card. */\r\n goToPage(page: number): void {\r\n const index = Number(page) - 1;\r\n if (this.loading || !Number.isInteger(index) || index < 0 || index >= this.total || index === this.pageIndex) { return; }\r\n this.pageIndex = index;\r\n this.loadPage();\r\n window.scrollTo({ top: 0, behavior: 'smooth' });\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Left panel\r\n // ---------------------------------------------------------------------------\r\n\r\n get sections(): AuditSection[] {\r\n return this.questionSections;\r\n }\r\n\r\n /** « / » hides the question panel so the answers take the full width (v1 sidenav toggle). */\r\n navCollapsed = false;\r\n\r\n toggleNav(): void {\r\n this.navCollapsed = !this.navCollapsed;\r\n }\r\n\r\n /**\r\n * \"(earned/max)\" compliance points of a section in the submission on the right, as the v1 gallery shows next to\r\n * the section name; '' when the section scores nothing.\r\n */\r\n sectionPoints(s: AuditSection): string {\r\n const found = (this.record?.questionAnswer || []).find((x: any) => x?.sectionName === s.name);\r\n const max = Number(found?.answers_complianceScore) || 0;\r\n return max ? `(${Number(found.userAnswer_complianceScore) || 0}/${max})` : '';\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Image viewer (v1 #imageModal: one image at a time, ‹ › through the set it was opened from)\r\n // ---------------------------------------------------------------------------\r\n\r\n viewer: { items: string[]; index: number; title: string } | null = null;\r\n\r\n /**\r\n * The answer gets a right-hand column (v1 col-md-6) for validation photos / videos, or for uploads that sit beside a\r\n * reference image. Reference images, the answer and a typed validation answer stay on the left.\r\n */\r\n hasSide(q: AnswerRow): boolean {\r\n return !!(q.proof.length || this.mediaOnSide(q));\r\n }\r\n\r\n /**\r\n * Reference image and uploads side by side: when the question has any reference image (on the left) the uploaded\r\n * images / videos go to the right column.\r\n */\r\n mediaOnSide(q: AnswerRow): boolean {\r\n return !!q.media.length && !!(q.questionRefs.length || q.optionRefs.length);\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Redo / Create Task: the v1 gallery's per-question actions (gallery-qa-view canRedo* /\r\n // canCreateTaskQuestion, gallery addTask) through the same AddTaskComponent dialog and APIs.\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Redo stays open from the submission day up to redoExtension days after it (v1 canRedoByDate). */\r\n private get redoOpenByDate(): boolean {\r\n const day = this.detail.dateIso;\r\n if (!day) { return false; }\r\n const since = dayjs().startOf('day').diff(dayjs(day).startOf('day'), 'day');\r\n return since >= 0 && since <= (this.redoExtension || 0);\r\n }\r\n\r\n /** Client users with edit rights, on a submission not yet approved, within the redo window. */\r\n canRedo(): boolean {\r\n return this.redoOpenByDate && !this.menuAccess.isTango && !this.detail.approvalStatus\r\n && (this.shownTask ? !!this.menuAccess.canEditTask : this.menuAccess.canEdit);\r\n }\r\n\r\n /** Audits only, once per question, never for a question whose option raises its own task. */\r\n canCreateTask(q: AnswerRow): boolean {\r\n return !this.shownTask && !q.hasTask && !q.autoTask && !this.menuAccess.isTango\r\n && !this.detail.approvalStatus && !!this.menuAccess.canEditTask;\r\n }\r\n\r\n /** Opens the v1 Redo / Create Task dialog on this question (a copy, so the page is never altered). */\r\n openTaskDialog(q: AnswerRow, type: 'redo' | 'createtask'): void {\r\n const section = (this.record?.questionAnswer || []).find((s: any) => s?.sectionName === q.section);\r\n const raw = (section?.questions || []).find((x: any) => String(x?.qno ?? '') === q.qno && this.clean(x?.qname) === q.text);\r\n if (!section || !raw) {\r\n this.toast.getErrorToast('This question could not be found in the submission. Reload and try again.');\r\n return;\r\n }\r\n const data = JSON.parse(JSON.stringify(raw));\r\n // The dialog takes reference images as arrays (v1 addTask).\r\n data.questionReferenceImage = data.multiQuestionReferenceImage?.length\r\n ? data.multiQuestionReferenceImage.map((i: any) => i?.imageURL)\r\n : [data.questionReferenceImage];\r\n (data.answers || []).forEach((ans: any) => {\r\n if (typeof ans?.referenceImage === 'string' && ans.referenceImage) { ans.referenceImage = [ans.referenceImage]; }\r\n });\r\n const ref = this.modal.open(AddTaskComponent, { backdrop: 'static', centered: true, size: 'lg' });\r\n const dialog = ref.componentInstance;\r\n dialog.type = type;\r\n dialog.operationtype = this.shownTask ? 'task' : 'checklist';\r\n dialog.sourceCheckList_id = this.scopePayload?.['checklistId'];\r\n dialog.inputData = data;\r\n dialog.checklistInfo = this.record.checklistInfo;\r\n dialog.storeProfile = this.record.storeProfile;\r\n dialog.sectionInfo = section;\r\n dialog.taskDetails = { sections: [{ id: '', name: '', questions: [data] }] };\r\n ref.result.then((result: any) => {\r\n if (result === 'submit') { this.loadPage(); }\r\n }, () => { /* dismissed */ });\r\n }\r\n\r\n /** v1 block titles: \"Uploaded Image\", \"Uploaded Video\", or both kinds together. */\r\n mediaTitle(list: AnswerMedia[]): string {\r\n const videos = list.filter(m => m.video).length;\r\n return !videos ? 'Uploaded Image' : videos === list.length ? 'Uploaded Video' : 'Uploaded Image / Video';\r\n }\r\n\r\n /** v1 collage: one image full width, up to four in two columns, more in three; tall rows for one or two. */\r\n gridClass(count: number): string {\r\n return count <= 1 ? 'is-one' : count === 2 ? 'is-two is-tall' : count <= 4 ? 'is-two' : 'is-three';\r\n }\r\n\r\n openViewer(items: string[], index: number, title: string): void {\r\n if (!items.length) { return; }\r\n this.viewer = { items, index: Math.min(Math.max(index, 0), items.length - 1), title };\r\n this.setPageScrollLocked(true);\r\n }\r\n\r\n /** Opens the viewer on one capture tile: the image tiles of that group, at the clicked one. */\r\n openMediaViewer(list: AnswerMedia[], m: AnswerMedia, title: string): void {\r\n const images = list.filter(x => !x.video && !this.brokenMedia.has(x.src)).map(x => x.src);\r\n this.openViewer(images, images.indexOf(m.src), title);\r\n }\r\n\r\n closeViewer(): void {\r\n this.viewer = null;\r\n this.setPageScrollLocked(this.filtersOpen);\r\n }\r\n\r\n stepViewer(delta: number): void {\r\n if (!this.viewer) { return; }\r\n const index = this.viewer.index + delta;\r\n if (index >= 0 && index < this.viewer.items.length) {\r\n this.viewer = { ...this.viewer, index };\r\n }\r\n }\r\n\r\n @HostListener('document:keydown', ['$event'])\r\n onViewerKey(event: KeyboardEvent): void {\r\n if (this.proofOpen && event.key === 'Escape') { this.proofOpen = false; return; }\r\n if (!this.viewer) { return; }\r\n if (event.key === 'Escape') { this.closeViewer(); }\r\n else if (event.key === 'ArrowLeft') { this.stepViewer(-1); }\r\n else if (event.key === 'ArrowRight') { this.stepViewer(1); }\r\n }\r\n\r\n /** \"View Proof\" next to Acknowledged By: the name and the photo captured at submit (v1 Verification Details). */\r\n proofOpen = false;\r\n\r\n toggleSection(i: number): void {\r\n this.openSection = this.openSection === i ? null : i;\r\n }\r\n\r\n isQuestionSelected(q: AuditQuestion): boolean {\r\n return this.selectedIds.has(q.key);\r\n }\r\n\r\n toggleQuestion(q: AuditQuestion): void {\r\n // Re-create the Set so the getter-driven template picks up the change.\r\n const next = new Set(this.selectedIds);\r\n next.has(q.key) ? next.delete(q.key) : next.add(q.key);\r\n this.selectedIds = next;\r\n }\r\n\r\n /** Ticked questions in one section (0 = none). */\r\n sectionPicked(s: AuditSection): number {\r\n return this.selectedIds.size ? s.questions.filter(q => this.selectedIds.has(q.key)).length : 0;\r\n }\r\n\r\n /** \"View All Answers\": drop any question selection. */\r\n viewAllAnswers(): void {\r\n this.selectedIds = new Set<string>();\r\n }\r\n\r\n get hasSelection(): boolean {\r\n return this.selectedIds.size > 0;\r\n }\r\n\r\n /** Left-panel dots for the submission in view. */\r\n isRevised(q: AuditQuestion): boolean {\r\n return this.rows.some(r => r.key === q.key && r.revised !== null);\r\n }\r\n\r\n /** Left panel red dot: the store raised a dispute on this question that is still waiting for review. */\r\n isDisputed(q: AuditQuestion): boolean {\r\n return this.rows.some(r => r.key === q.key && r.dispute?.status === 'raised');\r\n }\r\n\r\n isFlagged(q: AuditQuestion): boolean {\r\n return this.rows.some(r => r.key === q.key && r.flagged);\r\n }\r\n\r\n trackBySection(_: number, s: AuditSection): string {\r\n return s.name;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Filter drawer\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Every filter category, in the order the drawer lists them. */\r\n get filterDefs(): FilterDef[] {\r\n const stores = this.filterStores;\r\n const storeIds = stores.map(s => s.storeId);\r\n const groups = this.fScope === 'Clusters' ? this.clusterNames : this.teamNames;\r\n const defs: FilterDef[] = [\r\n {\r\n id: 'type', label: 'Type', hint: 'Pick what kind of records the gallery should list.',\r\n multi: false, kind: 'list', group: 'primary', searchable: true,\r\n options: [\r\n { label: 'Audit', meta: 'Submitted audits' },\r\n { label: 'Task', meta: 'Submitted tasks raised from audits or created in Audit → Manage → Task' }\r\n ]\r\n },\r\n {\r\n // Primary (QA 9 Oct): the audit picked decides everything else in the drawer.\r\n id: 'name', label: this.fType + ' Name',\r\n hint: this.isTask ? 'Tasks raised from audits, or created in Audit → Manage → Task.' : 'Audits configured with audit mode on.',\r\n multi: false, kind: 'list', group: 'primary', searchable: true,\r\n options: this.listedAudits.map(a => ({\r\n label: a.checkListName,\r\n value: a._id,\r\n meta: (a.coverage === 'user' ? 'User coverage' : 'Store coverage') +\r\n (a.passMark ? ' · Pass mark ' + a.passMark + '%' : '') +\r\n ' · ' + (Number(a.visits) || 0) + (Number(a.visits) === 1 ? ' submission' : ' submissions')\r\n }))\r\n },\r\n {\r\n id: 'stores', label: 'Stores', hint: 'Select all stores, or pick them individually. Search several store names separated by commas.',\r\n multi: true, kind: 'list', group: 'primary', searchable: true,\r\n // User-coverage audits are scoped by team users, not stores.\r\n hide: this.fScope === 'Teams',\r\n options: [\r\n ...(storeIds.length ? [{ label: 'All stores', meta: this.auditStoreIds ? 'Every store with a submission of this audit' : 'Select every store in scope', allOf: storeIds }] : []),\r\n // Store name only: the store id is never shown.\r\n ...stores.map(s => ({ label: s.storeName || '—', value: s.storeId }))\r\n ]\r\n },\r\n {\r\n id: 'answer', label: 'Answer Type', hint: 'Filter questions by the answer captured.',\r\n multi: false, kind: 'list', group: 'primary', searchable: true,\r\n options: ANSWER_TYPES.map(a => ({ label: a.label }))\r\n },\r\n {\r\n // Filtered by the API on the score the gallery shows (galleryScoreMatch); a task has no score.\r\n id: 'result', label: 'Pass / Fail Result', hide: this.isTask,\r\n hint: 'Evaluated on the final score after approved disputes. Pass mark ' + this.passThreshold + '%.',\r\n multi: false, kind: 'list', group: 'primary',\r\n options: [\r\n { label: 'All', meta: 'Every submitted audit' },\r\n { label: 'Pass', meta: 'Final score at or above the pass mark' },\r\n { label: 'Fail', meta: 'Final score below the pass mark' }\r\n ]\r\n },\r\n {\r\n id: 'score', label: 'Compliance Score', hide: this.isTask,\r\n hint: 'Show submissions whose final compliance score falls inside this range.',\r\n multi: false, kind: 'score', group: 'primary', options: []\r\n },\r\n {\r\n id: 'date', label: 'Date Range', hint: 'Pick a single date or a start and end date for a range.',\r\n multi: false, kind: 'date', group: 'primary', options: []\r\n },\r\n {\r\n // Starts on the selected audit's coverage; either can be picked (v1 gallery). Teams narrows the\r\n // submissions to the picked teams' users, Clusters to the picked clusters' stores.\r\n id: 'scope', label: 'Clusters / Teams', hint: 'Group by store clusters or by user teams.',\r\n multi: false, kind: 'list', group: 'secondary',\r\n options: [\r\n { label: 'Clusters', meta: 'Group stores by cluster' },\r\n { label: 'Teams', meta: 'Group users by team' }\r\n ]\r\n },\r\n {\r\n id: 'cluster', label: this.fScope === 'Clusters' ? 'Select Clusters' : 'Select Teams',\r\n hint: 'Select one or more, or pick all.', multi: true, kind: 'list',\r\n group: 'secondary', searchable: true,\r\n options: [\r\n { label: this.fScope === 'Clusters' ? 'All clusters' : 'All teams', meta: 'Select every one', allOf: groups },\r\n ...groups.map(g => ({ label: g }))\r\n ]\r\n },\r\n {\r\n id: 'status', label: 'Approval Status', hint: 'Approval state of the submission.',\r\n multi: false, kind: 'list', group: 'secondary',\r\n options: [{ label: 'All' }, { label: 'Approved' }, { label: 'Not-Approved' }]\r\n },\r\n {\r\n id: 'flags', label: 'Submission Flags', hint: 'Show only submissions with these markers.',\r\n multi: true, kind: 'list', group: 'secondary',\r\n options: [\r\n { label: 'Disputed Submissions', meta: 'Has one or more disputes' },\r\n { label: 'Re-do', meta: 'Re-do was requested' },\r\n { label: 'Flag', meta: 'Flagged answers' }\r\n ]\r\n }\r\n ];\r\n return defs.filter(f => !f.hide);\r\n }\r\n\r\n /** Compliance Score quick bands (the prototype's; the Dashboard's score bands). */\r\n readonly scoreBands = [\r\n { label: 'All scores', min: 0, max: 100 },\r\n { label: 'Below 60%', min: 0, max: 59 },\r\n { label: '60–74%', min: 60, max: 74 },\r\n { label: '75–89%', min: 75, max: 89 },\r\n { label: '90–100%', min: 90, max: 100 }\r\n ];\r\n\r\n /** From / To boxes and the two sliders; a minimum above the maximum moves the maximum along (and back). */\r\n setScoreMin(value: any): void {\r\n const v = this.clampScore(value);\r\n this.fScoreMin = v;\r\n if (v > this.fScoreMax) { this.fScoreMax = v; }\r\n }\r\n\r\n setScoreMax(value: any): void {\r\n const v = this.clampScore(value);\r\n this.fScoreMax = v;\r\n if (v < this.fScoreMin) { this.fScoreMin = v; }\r\n }\r\n\r\n private clampScore(value: any): number {\r\n const n = Math.round(Number(value));\r\n return Number.isFinite(n) ? Math.max(0, Math.min(100, n)) : 0;\r\n }\r\n\r\n pickScoreBand(band: { min: number; max: number }): void {\r\n this.fScoreMin = band.min;\r\n this.fScoreMax = band.max;\r\n }\r\n\r\n isScoreBand(band: { min: number; max: number }): boolean {\r\n return this.fScoreMin === band.min && this.fScoreMax === band.max;\r\n }\r\n\r\n get primaryDefs(): FilterDef[] {\r\n return this.filterDefs.filter(f => f.group === 'primary');\r\n }\r\n\r\n get secondaryDefs(): FilterDef[] {\r\n return this.filterDefs.filter(f => f.group === 'secondary');\r\n }\r\n\r\n get activeDef(): FilterDef {\r\n return this.filterDefs.find(f => f.id === this.activeFilter) || this.filterDefs[0];\r\n }\r\n\r\n /**\r\n * Options in the active category, narrowed by the pane search box. Stores search by name as in\r\n * the v1 gallery: \"a, b, c\" lists the stores named exactly a, b and c; one term lists the names\r\n * containing it. While a store search is on, \"All stores\" becomes \"All matching stores\" and\r\n * picks just the stores listed.\r\n */\r\n get activeOptions(): FilterOption[] {\r\n const def = this.activeDef;\r\n const q = this.optionQuery.trim().toLowerCase();\r\n if (!q) { return def.options; }\r\n if (def.id === 'stores') {\r\n const terms = q.split(',').map(t => t.trim()).filter(Boolean);\r\n const hit = (name: string) => {\r\n const n = name.trim().toLowerCase();\r\n return q.includes(',') ? terms.includes(n) : n.includes(q);\r\n };\r\n const stores = def.options.filter(o => !o.allOf && hit(o.label));\r\n return stores.length\r\n ? [{ label: 'All matching stores', meta: stores.length + (stores.length === 1 ? ' store' : ' stores'), allOf: stores.map(o => this.valueOf(o)) }, ...stores]\r\n : [];\r\n }\r\n return def.options.filter(o =>\r\n (o.label + ' ' + (o.meta || '')).toLowerCase().includes(q));\r\n }\r\n\r\n get noOptionMatch(): boolean {\r\n return this.activeDef.kind === 'list' && !this.activeOptions.length;\r\n }\r\n\r\n get searchPlaceholder(): string {\r\n return 'Search ' + this.activeDef.label.toLowerCase();\r\n }\r\n\r\n /** Human-readable current value for a category. */\r\n summaryFor(id: string): string {\r\n switch (id) {\r\n case 'type': return this.fType;\r\n case 'name': return this.fName || 'No audits';\r\n case 'answer': return this.fAnswer;\r\n case 'date': return this.rangeLabel;\r\n case 'scope': return this.fScope;\r\n case 'cluster':\r\n return this.fClusters.length\r\n ? this.fClusters.length + ' selected'\r\n : (this.fScope === 'Clusters' ? 'All clusters' : 'All teams');\r\n case 'stores': return this.fStores.length ? this.fStores.length + ' selected' : 'All stores';\r\n case 'status': return this.fStatus;\r\n case 'result': return this.fResult;\r\n case 'score':\r\n return this.fScoreMin === 0 && this.fScoreMax === 100\r\n ? 'All scores'\r\n : this.fScoreMin + '% – ' + this.fScoreMax + '%';\r\n case 'flags': return this.fFlags.length ? this.fFlags.join(', ') : 'None';\r\n default: return '';\r\n }\r\n }\r\n\r\n /** True when a category differs from its default. */\r\n isDirty(id: string): boolean {\r\n switch (id) {\r\n case 'type': return this.fType !== DEFAULTS.type;\r\n case 'answer': return this.fAnswer !== DEFAULTS.answer;\r\n // The default grouping is the selected audit's (or task's) own coverage.\r\n case 'scope': return this.fScope !== (this.selectedAudit?.coverage === 'user' ? 'Teams' : 'Clusters');\r\n case 'date': return this.datePicked;\r\n case 'cluster': return this.fClusters.length > 0;\r\n case 'stores': return this.fStores.length > 0;\r\n case 'status': return this.fStatus !== DEFAULTS.status;\r\n case 'result': return this.fResult !== DEFAULTS.result;\r\n case 'score': return this.fScoreMin !== 0 || this.fScoreMax !== 100;\r\n case 'flags': return this.fFlags.length > 0;\r\n default: return false;\r\n }\r\n }\r\n\r\n get activeFilterCount(): number {\r\n return this.filterDefs.filter(f => this.isDirty(f.id)).length;\r\n }\r\n\r\n get rangeLabel(): string {\r\n const fmt = (iso: string) => {\r\n const p = (iso || '').split('-');\r\n return p.length === 3 ? p[2] + '-' + p[1] + '-' + p[0] : iso;\r\n };\r\n return fmt(this.fStart) + ' - ' + fmt(this.fEnd || this.fStart);\r\n }\r\n\r\n /** The drawer date differs from the header range. */\r\n get datePicked(): boolean {\r\n return this.fStart !== this.headerStart || this.fEnd !== this.headerEnd;\r\n }\r\n\r\n /** Store chip label in the header bar. */\r\n get storeSummary(): string {\r\n if (this.fScope === 'Teams') {\r\n return this.fClusters.length ? this.fClusters[0] + (this.fClusters.length > 1 ? ' +' + (this.fClusters.length - 1) : '') : 'All teams';\r\n }\r\n if (!this.fStores.length) { return 'All stores'; }\r\n const first = this.storeOptions.find(s => s.storeId === this.fStores[0]);\r\n return (first?.storeName || this.fStores[0]) + (this.fStores.length > 1 ? ' +' + (this.fStores.length - 1) : '');\r\n }\r\n\r\n openFilters(id?: string): void {\r\n this.exportOpen = false;\r\n this.snapshot = this.capture();\r\n this.activeFilter = id || this.activeFilter;\r\n if (!this.filterDefs.some(f => f.id === this.activeFilter)) { this.activeFilter = 'type'; }\r\n this.optionQuery = '';\r\n this.fRange = toInlinePickerRange(this.fStart, this.fEnd || this.fStart);\r\n this.filtersOpen = true;\r\n this.setPageScrollLocked(true);\r\n }\r\n\r\n /** Header \"Stores\" chip opens the Teams list for a user-coverage audit. */\r\n openScopeFilter(): void {\r\n this.openFilters(this.fScope === 'Teams' ? 'cluster' : 'stores');\r\n }\r\n\r\n selectCategory(id: string): void {\r\n this.activeFilter = id;\r\n this.optionQuery = '';\r\n }\r\n\r\n /** Drawer range picker: a single day comes back as the same start and end. */\r\n onRangePicked(e: PickedDates | null): void {\r\n const picked = fromPickerRange(e);\r\n if (!picked) { return; }\r\n this.fStart = picked.from;\r\n this.fEnd = picked.to;\r\n this.loadAuditStores();\r\n this.loadAuditCounts();\r\n }\r\n\r\n /**\r\n * The audit and task lists again for the drawer's dates, so the Name filter lists what was submitted then. The\r\n * audit in view stays picked (listedAudits keeps it), even with nothing in the new dates.\r\n */\r\n private loadAuditCounts(): void {\r\n const from = this.fStart;\r\n const to = this.fEnd && this.fEnd >= this.fStart ? this.fEnd : this.fStart;\r\n const key = from + '|' + to;\r\n if (!from || !this.clientId || key === this.auditCountsKey) { return; }\r\n this.auditCountsKey = key;\r\n forkJoin({ audits: this.fetchAudits(from, to), tasks: this.fetchTasks(from, to) })\r\n .pipe(takeUntil(this.destroy$))\r\n .subscribe(({ audits, tasks }) => {\r\n if (key !== this.auditCountsKey) { return; }\r\n this.auditOptions = audits;\r\n this.taskOptions = tasks;\r\n this.cd.detectChanges();\r\n });\r\n }\r\n\r\n applyFilters(): void {\r\n this.snapshot = null;\r\n this.filtersOpen = false;\r\n this.setPageScrollLocked(false);\r\n if (!this.fEnd || this.fEnd < this.fStart) { this.fEnd = this.fStart; }\r\n this.loadGallery();\r\n }\r\n\r\n cancelFilters(): void {\r\n const clustersBefore = this.fClusters.join('|');\r\n if (this.snapshot) { this.restore(this.snapshot); }\r\n this.snapshot = null;\r\n this.filtersOpen = false;\r\n this.setPageScrollLocked(false);\r\n // Cluster picks reload the store list, so put it back in step with the restored clusters.\r\n if (this.fScope === 'Clusters' && clustersBefore !== this.fClusters.join('|')) { this.loadStores(); }\r\n this.loadAuditStores();\r\n this.loadAuditCounts();\r\n }\r\n\r\n clearFilters(): void {\r\n this.fStart = this.headerStart;\r\n this.fEnd = this.headerEnd;\r\n this.fRange = toInlinePickerRange(this.fStart, this.fEnd || this.fStart);\r\n // Back to Type Audit: a task picked under Task is not in the audit list, so open on the first audit.\r\n if (this.fType !== DEFAULTS.type) {\r\n this.fType = DEFAULTS.type;\r\n const first = this.audits.find(a => Number(a.visits) > 0) || this.audits[0];\r\n if (first) { this.selectAudit(first); } else { this.fAuditId = ''; this.fName = ''; }\r\n }\r\n this.fAnswer = DEFAULTS.answer;\r\n this.fClusters = [];\r\n this.fStores = [];\r\n this.fStatus = DEFAULTS.status;\r\n this.fResult = DEFAULTS.result;\r\n this.fFlags = [];\r\n this.fScoreMin = DEFAULTS.scoreMin;\r\n this.fScoreMax = DEFAULTS.scoreMax;\r\n if (this.fScope === 'Clusters') { this.loadStores(); }\r\n this.loadAuditStores();\r\n this.loadAuditCounts();\r\n }\r\n\r\n private capture(): Record<string, unknown> {\r\n return {\r\n fStart: this.fStart, fEnd: this.fEnd, fType: this.fType, fAuditId: this.fAuditId, fName: this.fName,\r\n fAnswer: this.fAnswer, fScope: this.fScope, fClusters: [...this.fClusters],\r\n fStores: [...this.fStores], fStatus: this.fStatus, fResult: this.fResult,\r\n fFlags: [...this.fFlags], fScoreMin: this.fScoreMin, fScoreMax: this.fScoreMax\r\n };\r\n }\r\n\r\n private restore(s: Record<string, unknown>): void {\r\n this.fStart = s['fStart'] as string;\r\n this.fEnd = s['fEnd'] as string;\r\n this.fType = s['fType'] as string;\r\n this.fAuditId = s['fAuditId'] as string;\r\n this.fName = s['fName'] as string;\r\n this.fAnswer = s['fAnswer'] as string;\r\n this.fScope = s['fScope'] as string;\r\n this.fClusters = s['fClusters'] as string[];\r\n this.fStores = s['fStores'] as string[];\r\n this.fStatus = s['fStatus'] as string;\r\n this.fResult = s['fResult'] as string;\r\n this.fFlags = s['fFlags'] as string[];\r\n this.fScoreMin = s['fScoreMin'] as number;\r\n this.fScoreMax = s['fScoreMax'] as number;\r\n }\r\n\r\n private valueOf(opt: FilterOption): string {\r\n return opt.value ?? opt.label;\r\n }\r\n\r\n /** Whether an option in the active category is currently chosen. */\r\n isSelected(opt: FilterOption): boolean {\r\n const id = this.activeDef.id;\r\n if (opt.allOf) {\r\n const list = this.listFor(id);\r\n return !!opt.allOf.length && opt.allOf.every(v => list.includes(v));\r\n }\r\n switch (id) {\r\n case 'type': return this.fType === opt.label;\r\n case 'name': return this.fAuditId === this.valueOf(opt);\r\n case 'answer': return this.fAnswer === opt.label;\r\n case 'scope': return this.fScope === opt.label;\r\n case 'status': return this.fStatus === opt.label;\r\n case 'result': return this.fResult === opt.label;\r\n case 'cluster': return this.fClusters.includes(opt.label);\r\n case 'stores': return this.fStores.includes(this.valueOf(opt));\r\n case 'flags': return this.fFlags.includes(opt.label);\r\n default: return false;\r\n }\r\n }\r\n\r\n private listFor(id: string): string[] {\r\n if (id === 'cluster') { return this.fClusters; }\r\n if (id === 'stores') { return this.fStores; }\r\n return this.fFlags;\r\n }\r\n\r\n /** Apply a click on an option in the active category. */\r\n pick(opt: FilterOption): void {\r\n const id = this.activeDef.id;\r\n\r\n if (opt.allOf) {\r\n // Adds or removes just the values it stands for (every one, or the stores a search lists).\r\n const all = opt.allOf;\r\n const list = this.listFor(id);\r\n const chosen = all.every(v => list.includes(v)) ? list.filter(v => !all.includes(v)) : [...new Set([...list, ...all])];\r\n if (id === 'cluster') {\r\n this.fClusters = chosen;\r\n if (this.fScope === 'Clusters') { this.loadStores(); }\r\n } else if (id === 'stores') {\r\n this.fStores = chosen;\r\n }\r\n return;\r\n }\r\n\r\n switch (id) {\r\n case 'type': {\r\n if (opt.label === this.fType) { break; }\r\n // Another Type lists other records: open on its first one with submissions in the period, as the page\r\n // does on load (the first task listed often has none); a task's own coverage sets stores / teams.\r\n this.fType = opt.label;\r\n const first = this.audits.find(a => Number(a.visits) > 0) || this.audits[0];\r\n const scopeBefore = this.fScope;\r\n if (first) { this.selectAudit(first); } else { this.fAuditId = ''; this.fName = ''; }\r\n if (this.fScope !== scopeBefore && this.fScope === 'Clusters') { this.loadStores(); }\r\n this.loadAuditStores();\r\n break;\r\n }\r\n case 'name': {\r\n const audit = this.audits.find(a => a._id === this.valueOf(opt));\r\n if (audit) {\r\n const scopeBefore = this.fScope;\r\n this.selectAudit(audit);\r\n if (this.fScope !== scopeBefore && this.fScope === 'Clusters') { this.loadStores(); }\r\n this.loadAuditStores();\r\n }\r\n break;\r\n }\r\n case 'answer': this.fAnswer = opt.label; break;\r\n case 'scope':\r\n if (opt.label === this.fScope) { break; }\r\n // Cluster / team and store picks belong to the other grouping.\r\n this.fScope = opt.label;\r\n this.fClusters = [];\r\n this.fStores = [];\r\n if (this.fScope === 'Clusters') { this.loadStores(); }\r\n break;\r\n case 'status': this.fStatus = opt.label; break;\r\n case 'result': this.fResult = opt.label; break;\r\n case 'cluster':\r\n this.fClusters = this.toggle(this.fClusters, opt.label);\r\n if (this.fScope === 'Clusters') { this.loadStores(); }\r\n break;\r\n case 'stores': this.fStores = this.toggle(this.fStores, this.valueOf(opt)); break;\r\n case 'flags': this.fFlags = this.toggle(this.fFlags, opt.label); break;\r\n }\r\n }\r\n\r\n private toggle(list: string[], value: string): string[] {\r\n return list.includes(value) ? list.filter(x => x !== value) : list.concat(value);\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Score\r\n // ---------------------------------------------------------------------------\r\n\r\n /** The submitted answer, as text. */\r\n actualAnswer(q: AnswerRow): string {\r\n return q.answers.join(', ');\r\n }\r\n\r\n /** The API's compliance score (same rule as the audit dashboard); an older API sends none: share of unflagged questions. */\r\n get compliancePercent(): number {\r\n if (this.detail.complianceScore !== null) { return this.detail.complianceScore; }\r\n return this.flagScore(this.detail.questionCount, this.detail.questionFlag);\r\n }\r\n\r\n private flagScore(count: number, flags: number): number {\r\n return count ? Math.max(0, Math.min(100, Math.round((count - flags) / count * 100))) : 0;\r\n }\r\n\r\n get passed(): boolean {\r\n return this.compliancePercent >= this.passThreshold;\r\n }\r\n\r\n get resultLabel(): string {\r\n return this.passed ? this.labels.pass : this.labels.fail;\r\n }\r\n\r\n get hasSubmission(): boolean {\r\n return !!this.record;\r\n }\r\n\r\n get revisedCount(): number {\r\n return this.rows.filter(r => r.revised !== null).length;\r\n }\r\n\r\n /** Store disputes on this submission still waiting for the approver. */\r\n get pendingDisputeCount(): number {\r\n return this.rows.filter(r => r.dispute?.status === 'raised').length;\r\n }\r\n\r\n /** Why no answer is listed: the ticked questions, the Disputed Submissions flag, or nothing at all (v1 text). */\r\n get noAnswersText(): string {\r\n if (this.hasSelection) { return 'There is no result for the selected questions.'; }\r\n const flags = ['Flag', 'Re-do', 'Disputed Submissions'].filter(f => this.fFlags.includes(f));\r\n if (flags.length) {\r\n return 'This submission has no answers for ' + flags.map(f => '\"' + f + '\"').join(' or ') + '. Clear them in Filters to see every answer.';\r\n }\r\n return 'There is no result for this ' + (this.shownTask ? 'task' : 'audit') + '.';\r\n }\r\n\r\n get visibleQuestions(): AnswerRow[] {\r\n // Left-panel ticks narrow the answers first; the Flags filters then apply on top (QA 10 Oct: Re-do showed every\r\n // answer). Each picked flag keeps its own answers; with several picked, an answer matching any of them stays.\r\n const picked = this.hasSelection\r\n ? this.rows.filter(q => this.selectedIds.has(q.key))\r\n : this.rows;\r\n const flag = this.fFlags.includes('Flag');\r\n const redo = this.fFlags.includes('Re-do');\r\n const disputed = this.fFlags.includes('Disputed Submissions');\r\n if (!flag && !redo && !disputed) { return picked; }\r\n // A submission sent back as a whole marks no single answer: all of its answers are the redo.\r\n const wholeRedo = redo && !this.rows.some(q => q.redo);\r\n return picked.filter(q => (flag && q.flagged) || (redo && (q.redo || wholeRedo))\r\n || (disputed && (q.revised !== null || q.dispute !== null)));\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Answer edit (score revision)\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Why this submission cannot be edited right now; '' when it can. */\r\n get editBlockedReason(): string {\r\n if (!this.hasSubmission) { return 'No submission selected'; }\r\n if (this.detail.approvalStatus) { return 'This audit is approved, so its answers can no longer be edited.'; }\r\n if (this.detail.status !== 'submit') { return 'This audit is back with the store for a re-do.'; }\r\n return this.access.canEdit ? '' : (this.access.reason || 'You cannot edit this audit.');\r\n }\r\n\r\n /** Edit stays off while a store dispute is open or was approved: the dispute review decides that answer (prototype). */\r\n canShowEdit(q: AnswerRow): boolean {\r\n return q.editable && !this.shownTask && !this.isEditing(q) && !this.isReviewing(q)\r\n && (!q.dispute || q.dispute.status === 'rejected');\r\n }\r\n\r\n isEditing(q: AnswerRow): boolean {\r\n return this.editKey === q.key;\r\n }\r\n\r\n startEdit(q: AnswerRow): void {\r\n const blocked = this.editBlockedReason;\r\n if (blocked) {\r\n this.toast.getErrorToast(blocked);\r\n return;\r\n }\r\n this.cancelDispute();\r\n this.editKey = q.key;\r\n this.draftAnswer = q.revised?.answer || this.actualAnswer(q);\r\n const reason = q.revised?.reason || '';\r\n const known = CHANGE_REASONS.includes(reason);\r\n this.draftReason = !reason ? '' : (known ? reason : 'Other');\r\n this.draftOther = known ? '' : reason;\r\n }\r\n\r\n cancelEdit(): void {\r\n this.editKey = null;\r\n this.draftAnswer = '';\r\n this.draftReason = '';\r\n this.draftOther = '';\r\n }\r\n\r\n pickDraft(opt: AnswerOption): void {\r\n this.draftAnswer = opt.label;\r\n }\r\n\r\n isDraft(opt: AnswerOption): boolean {\r\n return this.draftAnswer.trim().toLowerCase() === opt.label.trim().toLowerCase();\r\n }\r\n\r\n isActualOption(q: AnswerRow, opt: AnswerOption): boolean {\r\n return this.actualAnswer(q).trim().toLowerCase() === opt.label.trim().toLowerCase();\r\n }\r\n\r\n /** The draft differs from what the store submitted, so a reason is required. */\r\n draftChanged(q: AnswerRow): boolean {\r\n return this.draftAnswer.trim().toLowerCase() !== this.actualAnswer(q).trim().toLowerCase();\r\n }\r\n\r\n private get finalReason(): string {\r\n return this.draftReason === 'Other' ? this.draftOther.trim() : this.draftReason;\r\n }\r\n\r\n canSave(q: AnswerRow): boolean {\r\n if (this.saving || !this.draftAnswer) { return false; }\r\n const effective = q.revised?.answer || this.actualAnswer(q);\r\n const changed = this.draftChanged(q);\r\n // Nothing to do when the draft is what is already in force (same answer, same reason).\r\n if (this.draftAnswer === effective && (!changed || this.finalReason === (q.revised?.reason || ''))) { return false; }\r\n return !changed || !!this.finalReason;\r\n }\r\n\r\n saveEdit(q: AnswerRow): void {\r\n if (!this.canSave(q)) { return; }\r\n const restoring = !this.draftChanged(q);\r\n this.saving = true;\r\n this.traxService.auditGalleryRevise({\r\n clientId: this.clientId,\r\n submissionId: this.detail.submissionId,\r\n sectionName: q.section,\r\n qno: q.qno,\r\n answer: this.draftAnswer,\r\n reason: restoring ? '' : this.finalReason\r\n }).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (res: any) => {\r\n this.saving = false;\r\n if (res?.code !== 200) {\r\n this.toast.getErrorToast('Could not save the change');\r\n return;\r\n }\r\n const next = this.toRow(q.section, res.data.question);\r\n this.rows = this.rows.map(r => r.key === q.key ? next : r);\r\n this.patchRecordQuestion(q, res.data.question);\r\n this.detail = {\r\n ...this.detail,\r\n questionFlag: Number(res.data.questionFlag) || 0,\r\n complianceScore: this.num(res.data.complianceScore) ?? this.detail.complianceScore\r\n };\r\n this.cancelEdit();\r\n this.toast.getSuccessToast(res.data.restored ? 'Revision removed — actual answer restored' : 'Answer revised — score updated');\r\n this.cd.detectChanges();\r\n },\r\n error: (err: any) => {\r\n this.saving = false;\r\n this.toast.getErrorToast(this.errorText(err, 'Could not save the change'));\r\n this.cd.detectChanges();\r\n }\r\n });\r\n }\r\n\r\n /** Keeps the raw record (used by the single-submission export) in step with a saved revision. */\r\n private patchRecordQuestion(q: AnswerRow, question: any): void {\r\n const section = (this.record?.questionAnswer || []).find((s: any) => s.sectionName === q.section);\r\n const list: any[] = section?.questions || [];\r\n const i = list.findIndex((x: any) => String(x.qno ?? '') === q.qno);\r\n if (i >= 0) { list[i] = question; }\r\n if (this.record?.checklistInfo) {\r\n this.record.checklistInfo.questionFlag = this.detail.questionFlag;\r\n this.record.checklistInfo.complianceScore = this.detail.complianceScore;\r\n }\r\n }\r\n\r\n private errorText(err: any, fallback: string): string {\r\n const e = err?.error;\r\n const text = typeof e?.error === 'string' ? e.error : (e?.error?.message || e?.details?.message || e?.message);\r\n return text || fallback;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Store dispute review (POST /trax/audit/gallery/dispute): Approve keeps or revises the answer, Reject keeps it\r\n // and sends the reason to the store. Same permission and lock as Approve.\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Why the disputes of this submission cannot be reviewed now; '' when they can. */\r\n get disputeBlockedReason(): string {\r\n if (this.shownTask) { return 'Task answers are view-only here.'; }\r\n if (!this.hasSubmission) { return 'No submission selected'; }\r\n if (this.detail.approvalStatus) { return 'This audit is already approved.'; }\r\n if (this.detail.status !== 'submit') { return 'This audit is back with the store for a re-do.'; }\r\n if (!this.disputeAccess.canReview) { return this.disputeAccess.reason || 'Only the Edit Submitted Audit users can review disputes.'; }\r\n return this.menuAccess.canEdit ? '' : 'Only users who can edit audits can review disputes.';\r\n }\r\n\r\n /**\r\n * Actual vs disputed blocks: any dispute, unless it was rejected and an editor revised the answer afterwards (then the\r\n * revision view tells the story, as in the prototype).\r\n */\r\n showDisputeView(q: AnswerRow): boolean {\r\n return !!q.dispute && !this.isEditing(q) && !(q.dispute.status === 'rejected' && q.revised);\r\n }\r\n\r\n /** Line under the disputed submission label. */\r\n disputeStatusText(q: AnswerRow): string {\r\n const d = q.dispute;\r\n if (!d || d.status === 'raised') { return 'Dispute raised by store team' + (d?.raisedBy ? ' (' + d.raisedBy + ')' : '') + ' — pending review'; }\r\n const by = d.reviewedBy ? ' by ' + d.reviewedBy : '';\r\n if (d.status === 'rejected') { return 'Dispute from store team — rejected' + by; }\r\n return d.answer ? 'Dispute reviewed — answer revised' + by : 'Dispute reviewed — recorded answer kept' + by;\r\n }\r\n\r\n /** Approve / Reject buttons: a dispute still waiting, with no review form or edit open on it. */\r\n showDisputeActions(q: AnswerRow): boolean {\r\n return q.dispute?.status === 'raised' && !this.disputeBlockedReason && !this.isReviewing(q) && !this.isEditing(q);\r\n }\r\n\r\n isReviewing(q: AnswerRow, mode?: 'approve' | 'reject'): boolean {\r\n return this.disputeKey === q.key && (!mode || this.disputeMode === mode);\r\n }\r\n\r\n openDispute(q: AnswerRow, mode: 'approve' | 'reject'): void {\r\n const blocked = this.disputeBlockedReason;\r\n if (blocked) {\r\n this.toast.getErrorToast(blocked);\r\n return;\r\n }\r\n this.cancelEdit();\r\n this.disputeKey = q.key;\r\n this.disputeMode = mode;\r\n this.disputeAnswer = this.recordedAnswer(q);\r\n this.disputeReason = '';\r\n this.disputeOther = '';\r\n }\r\n\r\n cancelDispute(): void {\r\n this.disputeKey = null;\r\n this.disputeMode = null;\r\n this.disputeAnswer = '';\r\n this.disputeReason = '';\r\n this.disputeOther = '';\r\n }\r\n\r\n /** The answer in force before the review: the reviewer's revision, else what the store submitted. */\r\n recordedAnswer(q: AnswerRow): string {\r\n return q.revised?.answer || this.actualAnswer(q);\r\n }\r\n\r\n pickDisputeAnswer(opt: AnswerOption): void {\r\n this.disputeAnswer = opt.label;\r\n }\r\n\r\n isDisputeDraft(opt: AnswerOption): boolean {\r\n return this.disputeAnswer.trim().toLowerCase() === opt.label.trim().toLowerCase();\r\n }\r\n\r\n /** Approving with the recorded answer keeps it; another option revises the answer (and the score). */\r\n disputeKeeps(q: AnswerRow): boolean {\r\n return !q.editable || this.disputeAnswer.trim().toLowerCase() === this.recordedAnswer(q).trim().toLowerCase();\r\n }\r\n\r\n private get disputeRejectText(): string {\r\n return this.disputeReason === 'Other' ? this.disputeOther.trim() : this.disputeReason;\r\n }\r\n\r\n canConfirmDispute(): boolean {\r\n if (this.disputeSaving) { return false; }\r\n return this.disputeMode === 'reject' ? !!this.disputeRejectText : !!this.disputeMode;\r\n }\r\n\r\n confirmDispute(q: AnswerRow): void {\r\n if (!this.canConfirmDispute() || !this.disputeMode) { return; }\r\n const action = this.disputeMode;\r\n const keeps = action === 'approve' && this.disputeKeeps(q);\r\n const answer = this.disputeAnswer;\r\n this.disputeSaving = true;\r\n this.traxService.auditGalleryDispute({\r\n clientId: this.clientId,\r\n submissionId: this.detail.submissionId,\r\n sectionName: q.section,\r\n qno: q.qno,\r\n action,\r\n ...(action === 'reject' ? { reason: this.disputeRejectText } : { answer: keeps ? '' : answer })\r\n }).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (res: any) => {\r\n this.disputeSaving = false;\r\n if (res?.code !== 200) {\r\n this.toast.getErrorToast('Could not save the review');\r\n return;\r\n }\r\n const next = this.toRow(q.section, res.data.question);\r\n this.rows = this.rows.map(r => r.key === q.key ? next : r);\r\n this.patchRecordQuestion(q, res.data.question);\r\n this.detail = {\r\n ...this.detail,\r\n questionFlag: Number(res.data.questionFlag) || 0,\r\n complianceScore: this.num(res.data.complianceScore) ?? this.detail.complianceScore\r\n };\r\n this.cancelDispute();\r\n this.toast.getSuccessToast(action === 'reject'\r\n ? 'Dispute rejected — reason shared with the store team'\r\n : keeps ? 'Dispute reviewed — answer kept' : 'Dispute accepted — answer revised to \"' + answer + '\"');\r\n this.cd.detectChanges();\r\n },\r\n error: (err: any) => {\r\n this.disputeSaving = false;\r\n this.toast.getErrorToast(this.errorText(err, 'Could not save the review'));\r\n this.cd.detectChanges();\r\n }\r\n });\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Approve (existing checklist approval: all submissions of this store / user on this day)\r\n // ---------------------------------------------------------------------------\r\n\r\n requestApprove(): void {\r\n if (!this.hasSubmission || this.detail.approvalStatus || !this.detail.approvalEnable) { return; }\r\n // Approval records the final score, so every store dispute is reviewed first (the API holds those back too).\r\n if (this.pendingDisputeCount) {\r\n this.toast.getErrorToast('Review the pending store disputes (Approve or Reject) before approving');\r\n return;\r\n }\r\n this.cancelEdit();\r\n this.cancelDispute();\r\n this.approveConfirm = true;\r\n }\r\n\r\n confirmApprove(): void {\r\n const audit = this.selectedAudit;\r\n if (!audit || this.approving) { return; }\r\n const byUser = this.fScope === 'Teams';\r\n this.approving = true;\r\n this.traxService.auditGalleryApprove({\r\n clientId: this.clientId,\r\n fromDate: this.detail.dateIso,\r\n toDate: this.detail.dateIso,\r\n storeId: byUser ? [] : [this.detail.storeId],\r\n userEmail: byUser ? [this.detail.email] : [],\r\n sourceCheckList_id: audit._id,\r\n filtertype: this.fScope\r\n }).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (res: any) => {\r\n this.approving = false;\r\n this.approveConfirm = false;\r\n if (res?.code === 200) {\r\n this.toast.getSuccessToast(res.message || 'Audit approved');\r\n this.loadPage();\r\n } else {\r\n this.toast.getErrorToast('Nothing left to approve for this submission');\r\n }\r\n this.cd.detectChanges();\r\n },\r\n error: (err: any) => {\r\n this.approving = false;\r\n this.toast.getErrorToast(this.errorText(err, 'Could not approve this audit'));\r\n this.cd.detectChanges();\r\n }\r\n });\r\n }\r\n\r\n cancelApprove(): void {\r\n this.approveConfirm = false;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Export (.xlsx: a Summary sheet and an Answers sheet)\r\n // ---------------------------------------------------------------------------\r\n\r\n toggleExport(): void {\r\n this.exportOpen = !this.exportOpen;\r\n }\r\n\r\n exportCurrent(): void {\r\n this.exportOpen = false;\r\n if (!this.record) { return; }\r\n const d = this.detail;\r\n this.writeExport([this.record], [this.fName, d.storeName, d.dateIso].filter(Boolean).join(' - '));\r\n }\r\n\r\n exportAll(): void {\r\n this.exportOpen = false;\r\n if (!this.scopePayload || !this.total || this.exporting) { return; }\r\n const wanted = Math.min(this.total, EXPORT_MAX);\r\n const pages = Math.ceil(wanted / EXPORT_PAGE);\r\n const records: any[] = [];\r\n const scopeName = [this.fName, this.fStart + ' to ' + (this.fEnd || this.fStart)].join(' - ');\r\n this.exporting = true;\r\n const fetch = (page: number) => {\r\n this.answersRequest(page, EXPORT_PAGE).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (res: any) => {\r\n const batch = res?.code === 200 ? res.data?.checklistAnswers || [] : [];\r\n records.push(...batch);\r\n if (batch.length === EXPORT_PAGE && page + 1 < pages) {\r\n fetch(page + 1);\r\n return;\r\n }\r\n this.exporting = false;\r\n if (!records.length) {\r\n this.toast.getErrorToast('No submissions to export');\r\n } else {\r\n this.writeExport(records.slice(0, EXPORT_MAX), scopeName);\r\n if (this.total > EXPORT_MAX) {\r\n this.toast.getSuccessToast('Exported the latest ' + EXPORT_MAX + ' of ' + this.total + ' submissions. Narrow the date range for the rest.');\r\n }\r\n }\r\n this.cd.detectChanges();\r\n },\r\n error: () => {\r\n this.exporting = false;\r\n this.toast.getErrorToast('Export failed. Try again.');\r\n this.cd.detectChanges();\r\n }\r\n });\r\n };\r\n fetch(0);\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // CSV / PDF / PPT / ZIP: POST /trax/audit/gallery/download, the audit copy of the checklist downloadInsert\r\n // (checks the id is a live audit with submissions for these filters, then queues the same report job).\r\n // The file is built in the background and lands in Notifications > Downloads.\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Ticked left-panel questions, grouped by section as the v1 gallery sends them ([] = every question). */\r\n private selectedQuestionsPayload(): Array<{ sectionName: string; questions: string[]; answerType: string[] }> {\r\n const out: Array<{ sectionName: string; questions: string[]; answerType: string[] }> = [];\r\n this.questionSections.forEach(s => {\r\n const picked = s.questions.filter(q => this.selectedIds.has(q.key));\r\n if (picked.length) {\r\n out.push({ sectionName: s.name, questions: picked.map(q => q.text.replace(/\\n/g, ' ')), answerType: picked.map(q => q.answerType) });\r\n }\r\n });\r\n return out;\r\n }\r\n\r\n /** Audit export request for this audit and the applied filters (the fields auditDownloadValidation accepts). */\r\n private downloadPayload(fileType: string): Record<string, any> {\r\n const p = this.scopePayload || {};\r\n return {\r\n clientId: this.clientId,\r\n // Audit or task export, as the applied filters list.\r\n type: p['type'] || this.galleryType,\r\n sourceCheckList_id: this.selectedAudit?._id || '',\r\n fromDate: this.fStart,\r\n toDate: this.fEnd || this.fStart,\r\n fileType,\r\n filtertype: this.fScope === 'Teams' ? 'Teams' : 'Clusters',\r\n storeIds: p['storeId'] || [],\r\n userEmailList: p['userEmail'] || [],\r\n questions: this.selectedQuestionsPayload(),\r\n answerType: p['answerType'] || 'all',\r\n approveFilter: p['approveFilter'] || 'all',\r\n viewFlag: !!p['viewFlag'],\r\n viewRedo: !!p['viewRedo'],\r\n viewDisputed: !!p['viewDisputed'],\r\n previewType: 'image',\r\n ...(p['result'] ? { result: p['result'] } : {}),\r\n ...(p['scoreMin'] !== undefined ? { scoreMin: p['scoreMin'], scoreMax: p['scoreMax'] } : {})\r\n };\r\n }\r\n\r\n private downloadQueuedToast(): void {\r\n this.toast.getSuccessToast(\r\n '<div><span class=\"me-8\">Downloading your reports</span><a href=\"notifications/alerts?tab=download\" style=\"color:#99c3ff; text-decoration:underline; cursor:pointer\">View</a></div>'\r\n );\r\n }\r\n\r\n /** Exports need loaded results: say why instead of doing nothing. */\r\n private exportBlocked(): boolean {\r\n if (this.loading || !this.scopePayload) {\r\n this.toast.getErrorToast(this.selectedAudit ? 'Submissions are still loading, try again in a moment' : 'Pick an audit to export');\r\n return true;\r\n }\r\n if (!this.total) {\r\n this.toast.getErrorToast('No submissions to export for the selected filters');\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /** CSV and PDF are queued straight away, as in the v1 gallery. */\r\n exportFile(fileType: 'csv' | 'pdf'): void {\r\n this.exportOpen = false;\r\n if (this.exporting) { return; }\r\n if (this.exportBlocked()) { return; }\r\n this.exporting = true;\r\n this.traxService.auditGalleryDownload(this.downloadPayload(fileType)).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (res: any) => {\r\n this.exporting = false;\r\n if (res?.code === 200) { this.downloadQueuedToast(); } else { this.toast.getErrorToast(this.errorText({ error: res }, 'Could not start the export')); }\r\n this.cd.detectChanges();\r\n },\r\n error: (e: any) => {\r\n this.exporting = false;\r\n this.toast.getErrorToast(this.errorText(e, 'Could not start the export'));\r\n this.cd.detectChanges();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * PPT and ZIP open the v1 export popup (date range / preview type) that then queues the job. PPT keeps\r\n * the v1 limits: a 1-3 day range allows at most 3 questions (1 question for 3 days); pick them on the left.\r\n */\r\n /** Questions ticked in the left panel (PPT / ZIP read only those). */\r\n get pickedQuestionCount(): number {\r\n return this.selectedQuestionsPayload().reduce((n, s) => n + s.questions.length, 0);\r\n }\r\n\r\n /** PPT / ZIP show in the Export menu only with 1 to 3 questions ticked (v1 needed a pick; at most 3). */\r\n get mediaExportAllowed(): boolean {\r\n const n = this.pickedQuestionCount;\r\n return n >= 1 && n <= 3;\r\n }\r\n\r\n exportWithOptions(fileType: 'ppt' | 'zipfiles'): void {\r\n this.exportOpen = false;\r\n if (this.exportBlocked()) { return; }\r\n if (!this.mediaExportAllowed) {\r\n this.toast.getErrorToast('Tick 1 to 3 questions on the left to export as ' + (fileType === 'ppt' ? 'PPT' : 'ZIP'));\r\n return;\r\n }\r\n const label = fileType === 'ppt' ? 'Export as PPT' : 'Export as ZIP';\r\n if (fileType === 'ppt') {\r\n const days = dayjs(this.fEnd || this.fStart).diff(dayjs(this.fStart), 'day');\r\n const picked = this.pickedQuestionCount;\r\n if (days === 2 && picked > 1) { this.toast.getErrorToast('Please select maximum of 1 question only'); return; }\r\n if (days <= 1 && picked > 3) { this.toast.getErrorToast('Please select maximum of 3 question only'); return; }\r\n }\r\n const ref = this.modal.open(ExportGalleryComponent, {\r\n centered: true, size: 'lg', scrollable: true, backdrop: 'static', windowClass: 'custom-height-modal'\r\n });\r\n ref.componentInstance.type = label;\r\n ref.componentInstance.payload = this.downloadPayload(fileType);\r\n ref.componentInstance.exportgalleryPdf = false;\r\n ref.componentInstance.submitFn = (payload: any) => this.traxService.auditGalleryDownload(payload);\r\n ref.result.then((result: any) => {\r\n if (result === 'success') { this.downloadQueuedToast(); }\r\n else if (result === 'error') { this.toast.getErrorToast('Could not start the export'); }\r\n }, () => { /* dismissed */ });\r\n }\r\n\r\n private writeExport(records: any[], name: string): void {\r\n const summary: any[] = [];\r\n const answers: any[] = [];\r\n records.forEach(record => {\r\n const info = record.checklistInfo || {};\r\n const store = record.storeProfile || {};\r\n const rows: AnswerRow[] = (record.questionAnswer || []).flatMap((s: any) =>\r\n (s.questions || []).map((q: any) => this.toRow(s.sectionName, q)));\r\n const count = Number(info.noofQuestions) || rows.length;\r\n const flags = this.num(info.questionFlag) ?? rows.filter(r => r.flagged).length;\r\n const score = this.num(info.complianceScore) ?? this.flagScore(count, flags);\r\n // No question with compliance scoring: no score and no result (blank cells), as on the page.\r\n const scored = this.complianceOn(record);\r\n const base = { 'Store Name': store.storeName || store.store_id || '', 'Date': info.date || '' };\r\n summary.push({\r\n ...base,\r\n 'Location': [store.city, store.state, store.Country].filter(Boolean).join(', '),\r\n 'Audit': info.checklistName || this.fName,\r\n 'Time': info.time || '',\r\n 'Duration': info.duration || '',\r\n 'Submitted By': info.submittedBy || '',\r\n 'Email': info.userEmail || '',\r\n 'Questions': count,\r\n 'Flagged': flags,\r\n 'Revised': rows.filter(r => r.revised).length,\r\n 'Compliance Score (%)': scored ? score : '',\r\n 'Result': scored ? (score >= this.passThreshold ? this.labels.pass : this.labels.fail) : '',\r\n 'Approval': info.approvalStatus ? 'Approved' + (info.approvalByName ? ' by ' + info.approvalByName : '') : (info.approvalEnable ? 'Pending' : 'Not required')\r\n });\r\n rows.forEach(r => answers.push({\r\n ...base,\r\n 'Section': r.section,\r\n 'Q.No': r.qno,\r\n 'Question': r.text,\r\n 'Answer': this.actualAnswer(r),\r\n 'Validation Answer': r.validationText,\r\n 'Score': r.actualScore ?? '',\r\n 'Flagged': r.flagged ? 'Yes' : 'No',\r\n 'Revised Answer': r.revised?.answer || '',\r\n 'Revised Score': r.revised ? (r.revised.score ?? '') : '',\r\n 'Reason for Change': r.revised?.reason || '',\r\n 'Revised By': r.revised?.by || '',\r\n [this.labels.remarks]: r.remark,\r\n [this.labels.additional]: r.extraRemark,\r\n 'Images': r.images.join(' '),\r\n 'Videos': r.videos.join(' ')\r\n }));\r\n });\r\n const file = (name || 'Audit gallery').replace(/[\\\\/:*?\"<>|]+/g, '-').slice(0, 120);\r\n this.traxService.exportWorkbook([{ name: 'Summary', rows: summary }, { name: 'Answers', rows: answers }], file);\r\n }\r\n\r\n trackById(_: number, q: { key: string }): string {\r\n return q.key;\r\n }\r\n\r\n trackByOption(_: number, opt: FilterOption): string {\r\n return opt.value ?? opt.label;\r\n }\r\n\r\n trackByDef(_: number, def: FilterDef): string {\r\n return def.id;\r\n }\r\n\r\n trackByLabel(_: number, o: { label: string }): string {\r\n return o.label;\r\n }\r\n}\r\n","<div class=\"av2-page audit-gallery\">\r\n\r\n <!-- Header bar with quick selects -->\r\n <section class=\"gal-header\">\r\n <div class=\"gal-heading\">\r\n <div class=\"gal-header-title\">Gallery</div>\r\n <div class=\"gal-header-sub\">\r\n <ng-container *ngIf=\"total\">{{ total }} {{ total === 1 ? 'submission' : 'submissions' }} · </ng-container>{{ rangeLabel }}\r\n </div>\r\n </div>\r\n <span class=\"gal-tag gal-tag--error gal-dispute-chip\" *ngIf=\"pendingDisputeCount && !loading\"\r\n [title]=\"pendingDisputeCount + ' store ' + (pendingDisputeCount === 1 ? 'dispute' : 'disputes') + ' on this submission waiting for review'\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 21V4h11l-1.5 4L15 12H4\"></path></svg>\r\n Dispute Raised<ng-container *ngIf=\"pendingDisputeCount > 1\"> · {{ pendingDisputeCount }}</ng-container>\r\n </span>\r\n <div class=\"av2-grow\"></div>\r\n\r\n <!-- Chevrons are SVGs, not text glyphs, so they sit on the chip's centre line. -->\r\n <button type=\"button\" class=\"quickchip chip-on\" (click)=\"openFilters('type')\">\r\n {{ fType }}\r\n <svg class=\"chip-chev\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </button>\r\n\r\n <button type=\"button\" class=\"quickchip quickchip--name\" (click)=\"openFilters('name')\" [title]=\"fName\">\r\n <span class=\"quickchip-label\">{{ fName || 'Select audit' }}</span>\r\n <svg class=\"chip-chev\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </button>\r\n\r\n <button type=\"button\" class=\"quickchip chip-on\" *ngIf=\"datePicked\" (click)=\"openFilters('date')\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\"></rect>\r\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line>\r\n <line x1=\"8\" y1=\"3\" x2=\"8\" y2=\"6\"></line>\r\n <line x1=\"16\" y1=\"3\" x2=\"16\" y2=\"6\"></line>\r\n </svg>\r\n {{ rangeLabel }}\r\n </button>\r\n\r\n <button type=\"button\" class=\"quickchip\" (click)=\"openScopeFilter()\">\r\n {{ storeSummary }}\r\n <svg class=\"chip-chev\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </button>\r\n\r\n <button type=\"button\" class=\"quickchip quickchip--strong\" (click)=\"openFilters()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"4\" y1=\"7\" x2=\"20\" y2=\"7\"></line>\r\n <line x1=\"7\" y1=\"12\" x2=\"17\" y2=\"12\"></line>\r\n <line x1=\"10\" y1=\"17\" x2=\"14\" y2=\"17\"></line>\r\n </svg>\r\n All Filters\r\n <span class=\"countbadge\" *ngIf=\"activeFilterCount\">{{ activeFilterCount }}</span>\r\n </button>\r\n\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm av2-btn--wide\" (click)=\"applyFilters()\">\r\n Apply\r\n </button>\r\n </section>\r\n\r\n <div class=\"gal-body\">\r\n\r\n <!-- Question navigation -->\r\n <!-- The white column runs the full height of the right card; its content stays in view while scrolling. -->\r\n <aside class=\"gal-left\" [class.is-collapsed]=\"navCollapsed\">\r\n <!-- « hides the panel (v1 sidenav); » in the toolbar brings it back. -->\r\n <button type=\"button\" class=\"gal-nav-toggle\" *ngIf=\"!navCollapsed\" (click)=\"toggleNav()\"\r\n title=\"Hide questions\" aria-label=\"Hide questions\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M11 17L6 12L11 7M18 17L13 12L18 7\"></path></svg>\r\n </button>\r\n <div class=\"gal-left-inner\" *ngIf=\"!navCollapsed\">\r\n <div class=\"gal-left-head\">\r\n <span class=\"av2-sk av2-sk--title\" *ngIf=\"navLoading && !fName\"></span>\r\n <div class=\"gal-audit-name\" *ngIf=\"!navLoading || fName\">{{ fName || 'No audit selected' }}</div>\r\n <div class=\"gal-audit-sub\" *ngIf=\"detail.subtitle\">{{ detail.subtitle }}</div>\r\n </div>\r\n\r\n <!-- No submission for the filters (e.g. the last one was just approved under \"Not Approved\"):\r\n nothing to navigate, so the question list goes with it. -->\r\n <div class=\"gal-nav-empty\" *ngIf=\"!loading && !hasSubmission\">No submissions for the selected filters.</div>\r\n\r\n <ng-container *ngIf=\"loading || hasSubmission\">\r\n <!-- Clears any question selection. -->\r\n <div class=\"view-all\" [class.is-active]=\"!hasSelection\">\r\n <button type=\"button\" class=\"view-all-link\" (click)=\"viewAllAnswers()\">View All Answers</button>\r\n </div>\r\n\r\n <!-- Section accordion: one open at a time. -->\r\n <div class=\"gal-sections\">\r\n <lib-audit-v2-shimmer *ngIf=\"navLoading\" [rows]=\"3\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!navLoading\">\r\n <ng-container *ngFor=\"let s of sections; let i = index; trackBy: trackBySection\">\r\n <button type=\"button\" class=\"gal-section\" [class.is-open]=\"openSection === i\" (click)=\"toggleSection(i)\">\r\n <!-- A long name ends in \"…\"; the full name shows in a tooltip only when it is cut. -->\r\n <span class=\"gal-section-name\" #secName [ngbTooltip]=\"s.name\" [disableTooltip]=\"secName.scrollWidth <= secName.clientWidth\"\r\n tooltipClass=\"av2-tip\" placement=\"top-start\" container=\"body\">{{ s.name }}</span>\r\n <span class=\"gal-section-points\" *ngIf=\"sectionPoints(s) as pts\"\r\n title=\"Compliance points earned / possible in this section\">{{ pts }}</span>\r\n <!-- Ticks stay when a section is collapsed; the count shows they are still narrowing the answers. -->\r\n <span class=\"gal-section-count\" *ngIf=\"sectionPicked(s) as n\" [attr.title]=\"n + ' selected in this section'\">{{ n }}</span>\r\n <span class=\"gal-section-rule\"></span>\r\n <span class=\"gal-section-chev\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" [class.rotate]=\"openSection !== i\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </span>\r\n </button>\r\n\r\n <ng-container *ngIf=\"openSection === i\">\r\n <button type=\"button\" class=\"gal-nav-item\" *ngFor=\"let q of s.questions; trackBy: trackById\"\r\n [class.is-picked]=\"isQuestionSelected(q)\" (click)=\"toggleQuestion(q)\">\r\n <span class=\"gal-check\" [class.is-on]=\"isQuestionSelected(q)\">\r\n <svg *ngIf=\"isQuestionSelected(q)\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg>\r\n </span>\r\n <span class=\"gal-nav-text\" #qName [ngbTooltip]=\"q.qno + ' . ' + q.text\" [disableTooltip]=\"qName.scrollWidth <= qName.clientWidth\"\r\n tooltipClass=\"av2-tip\" placement=\"top-start\" container=\"body\">{{ q.qno }} . {{ q.text }}</span>\r\n <span class=\"gal-dot gal-dot--flag\" *ngIf=\"isFlagged(q)\" title=\"Flagged\"></span>\r\n <span class=\"gal-dot gal-dot--revised\" *ngIf=\"isRevised(q)\" title=\"Revised\"></span>\r\n <span class=\"gal-dot gal-dot--dispute\" *ngIf=\"isDisputed(q)\" title=\"Dispute raised\"></span>\r\n </button>\r\n <div class=\"gal-nav-empty\" *ngIf=\"!s.questions.length\">No questions in this section</div>\r\n </ng-container>\r\n </ng-container>\r\n <div class=\"gal-nav-empty\" *ngIf=\"!sections.length\">No questions for the selected filters</div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </aside>\r\n\r\n <section class=\"gal-main\">\r\n <!-- Pager + export -->\r\n <div class=\"gal-toolbar\">\r\n <button type=\"button\" class=\"gal-nav-toggle gal-nav-toggle--open\" *ngIf=\"navCollapsed\" (click)=\"toggleNav()\"\r\n title=\"Show questions\" aria-label=\"Show questions\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M13 17L18 12L13 7M6 17L11 12L6 7\"></path></svg>\r\n </button>\r\n <span class=\"status-pill status-pill--warning\" *ngIf=\"!loading && hasSubmission && detail.status !== 'submit'\">Re-do requested</span>\r\n <div class=\"av2-grow\"></div>\r\n\r\n <div class=\"export-wrap\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm gal-export\" [disabled]=\"exporting || !total\"\r\n (click)=\"toggleExport()\" [attr.aria-expanded]=\"exportOpen\">\r\n {{ exporting ? 'Exporting…' : 'Export' }}\r\n </button>\r\n <div class=\"export-menu\" *ngIf=\"exportOpen\" role=\"menu\">\r\n <!-- Excel: built here, downloads right away (hidden for now, see showExcelExport) -->\r\n <ng-container *ngIf=\"showExcelExport\">\r\n <div class=\"export-group\">Excel (.xlsx) · downloads now</div>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" [disabled]=\"!hasSubmission\" (click)=\"exportCurrent()\">\r\n <span class=\"export-title\">This submission</span>\r\n <span class=\"export-meta\">{{ detail.storeName }} · {{ detail.date }}</span>\r\n </button>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportAll()\">\r\n <span class=\"export-title\">All {{ total }} {{ total === 1 ? 'submission' : 'submissions' }}</span>\r\n <span class=\"export-meta\">Current filters · summary + every answer</span>\r\n </button>\r\n </ng-container>\r\n <!-- CSV / PDF / PPT / ZIP: the v1 gallery's download service (files land in Notifications › Downloads) -->\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportFile('csv')\">\r\n <span class=\"export-title\">Export as CSV</span>\r\n </button>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportFile('pdf')\">\r\n <span class=\"export-title\">Export as PDF</span>\r\n </button>\r\n <!-- PPT / ZIP export the pictures of picked questions: offered once 1 to 3 questions are ticked on the left (v1). -->\r\n <ng-container *ngIf=\"mediaExportAllowed\">\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportWithOptions('ppt')\">\r\n <span class=\"export-title\">Export as PPT</span>\r\n </button>\r\n <button type=\"button\" class=\"export-item\" role=\"menuitem\" (click)=\"exportWithOptions('zipfiles')\">\r\n <span class=\"export-title\">Export as ZIP</span>\r\n </button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Loading -->\r\n <div class=\"gal-skeleton\" *ngIf=\"loading\" aria-busy=\"true\" aria-label=\"Loading submission\">\r\n <div class=\"sk sk-logo\"></div>\r\n <div class=\"sk sk-facts\"></div>\r\n <div class=\"sk sk-card\"></div>\r\n <div class=\"sk sk-card\"></div>\r\n <div class=\"sk sk-card sk-card--short\"></div>\r\n </div>\r\n\r\n <!-- Error -->\r\n <div class=\"gal-state\" *ngIf=\"!loading && loadError\">\r\n <span class=\"gal-state-icon gal-state-icon--error\">\r\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <circle cx=\"12\" cy=\"12\" r=\"9\"></circle>\r\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12.5\"></line>\r\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line>\r\n </svg>\r\n </span>\r\n <div class=\"gal-state-title\">{{ loadError }}</div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"retry()\">Retry</button>\r\n </div>\r\n\r\n <!-- Nothing submitted -->\r\n <div class=\"gal-state\" *ngIf=\"!loading && !loadError && !hasSubmission\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"gal-state-title\">{{ fName ? 'No submissions found' : (linkMissing ? 'Audit not found' : 'No audits to show') }}</div>\r\n <div class=\"gal-state-sub\" *ngIf=\"fName\">\r\n Nothing was submitted for <strong>{{ fName }}</strong> between {{ rangeLabel }} with the current filters.\r\n Try a wider date range or another store.\r\n </div>\r\n <div class=\"gal-state-sub\" *ngIf=\"!fName && linkMissing\">\r\n The audit you opened was deleted or is not an audit. Pick an audit in the filters to see its submissions.\r\n </div>\r\n <div class=\"gal-state-sub\" *ngIf=\"!fName && !linkMissing\">Create an audit in Manage to see its submissions here.</div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" *ngIf=\"fName || (linkMissing && audits.length)\"\r\n (click)=\"openFilters(fName ? 'date' : 'name')\">{{ fName ? 'Change filters' : 'Pick an audit' }}</button>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!loading && hasSubmission\">\r\n <!-- Client brand -->\r\n <div class=\"gal-brand\">\r\n <span class=\"gal-brand-box\" [class.has-logo]=\"clientLogo && !logoFailed\">\r\n <img *ngIf=\"clientLogo && !logoFailed\" [src]=\"clientLogo\" [alt]=\"clientName || 'Client logo'\" (error)=\"logoFailed = true\">\r\n <ng-container *ngIf=\"!clientLogo || logoFailed\">{{ clientName || 'Logo' }}</ng-container>\r\n </span>\r\n </div>\r\n\r\n <!-- Who / where / when, read row by row across the two columns -->\r\n <dl class=\"gal-facts\">\r\n <div class=\"gal-fact\"><dt>Store Name:</dt><dd>{{ detail.storeName }}</dd></div>\r\n <div class=\"gal-fact gal-fact--side\"><dt>Duration:</dt><dd>{{ detail.duration }}</dd></div>\r\n <div class=\"gal-fact\"><dt>{{ shownTask ? 'Task' : 'Audit' }} Name:</dt><dd>{{ detail.auditName }}</dd></div>\r\n <div class=\"gal-fact gal-fact--side\"><dt>Date:</dt><dd>{{ detail.date }}</dd></div>\r\n <div class=\"gal-fact\"><dt>State & Country:</dt><dd>{{ detail.region }}</dd></div>\r\n <div class=\"gal-fact gal-fact--side\"><dt>Time:</dt><dd>{{ detail.time }}</dd></div>\r\n <div class=\"gal-fact\"><dt>No. of Questions:</dt><dd>{{ detail.questionCount }}</dd></div>\r\n <!-- Only when the audit scores compliance (a question with compliance scoring on); no label without a value. -->\r\n <div class=\"gal-fact gal-fact--side\" *ngIf=\"detail.complianceEnabled\">\r\n <dt>Compliance Score:</dt>\r\n <dd [title]=\"'Pass mark ' + passThreshold + '%'\">{{ compliancePercent }}% <span class=\"gal-result\" [class.is-fail]=\"!passed\">({{ resultLabel }})</span></dd>\r\n </div>\r\n <div class=\"gal-fact\"><dt>Submitted By:</dt><dd>{{ detail.submittedBy }}</dd></div>\r\n <!-- Only when the submitter acknowledged with a name (no label without a value); View Proof when a photo exists too. -->\r\n <div class=\"gal-fact gal-fact--side\" *ngIf=\"detail.acknowledgedBy\">\r\n <dt>Acknowledged By:</dt>\r\n <dd>\r\n {{ detail.acknowledgedBy }}\r\n <button type=\"button\" class=\"gal-proof-link\" *ngIf=\"detail.proofImage\" (click)=\"proofOpen = true\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"></path><circle cx=\"12\" cy=\"12\" r=\"3\"></circle></svg>\r\n View Proof\r\n </button>\r\n </dd>\r\n </div>\r\n </dl>\r\n\r\n <!-- Answers -->\r\n <div class=\"gal-answers\" id=\"view-all\">\r\n <article class=\"answerbox\" *ngFor=\"let q of visibleQuestions; let i = index; trackBy: trackById\"\r\n [class.is-flagged]=\"q.flagged\" [class.is-editing]=\"isEditing(q)\"\r\n [style.animation-delay.ms]=\"i < 10 ? i * 35 : 0\">\r\n <header class=\"answerbox-head\">\r\n <div class=\"qtext\">\r\n <span class=\"qsection\" *ngIf=\"sections.length > 1\">{{ q.section }}</span>\r\n {{ q.qno }}.{{ q.text }}\r\n <span class=\"qdesc\" *ngIf=\"q.description\">{{ q.description }}</span>\r\n </div>\r\n <span class=\"gal-tag gal-tag--error\" *ngIf=\"q.dispute?.status === 'raised'\">\r\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 21V4h11l-1.5 4L15 12H4\"></path></svg>\r\n Dispute Raised\r\n </span>\r\n <span class=\"gal-tag gal-tag--success\" *ngIf=\"q.dispute?.status === 'approved' && q.dispute?.answer\">Revised via approved store dispute</span>\r\n <span class=\"gal-tag gal-tag--gray\" *ngIf=\"q.dispute?.status === 'rejected' && !q.revised\">Dispute Rejected</span>\r\n <span class=\"gal-tag gal-tag--warning\" *ngIf=\"q.revised && !(q.dispute?.status === 'approved' && q.dispute?.answer)\">Revised</span>\r\n <span class=\"gal-tag gal-tag--error\" *ngIf=\"q.flagged\">\r\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 21V4h11l-1.5 4L15 12H4\"></path></svg>\r\n Flagged\r\n </span>\r\n <span class=\"gal-tag gal-tag--gray\" *ngIf=\"q.redo\">Re-do</span>\r\n <span class=\"scorechip\" *ngIf=\"q.score !== null && !q.revised\">Score:{{ q.score }}</span>\r\n <button type=\"button\" class=\"editicon\" *ngIf=\"canShowEdit(q)\"\r\n [class.is-locked]=\"!!editBlockedReason\" [attr.aria-disabled]=\"!!editBlockedReason\"\r\n [ngbTooltip]=\"editBlockedReason || 'Edit answer'\" tooltipClass=\"av2-tip\" placement=\"top-end\" container=\"body\"\r\n [attr.aria-label]=\"editBlockedReason || 'Edit answer'\" (click)=\"startEdit(q)\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M12 20h9\"></path>\r\n <path d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z\"></path>\r\n </svg>\r\n </button>\r\n </header>\r\n\r\n <!-- As submitted -->\r\n <div class=\"answerbox-body\" *ngIf=\"!q.revised && !isEditing(q) && !showDisputeView(q)\">\r\n <ng-container *ngTemplateOutlet=\"submitted; context: { $implicit: q }\"></ng-container>\r\n </div>\r\n\r\n <!-- Actual vs revised -->\r\n <div class=\"revision\" *ngIf=\"q.revised && !isEditing(q) && !showDisputeView(q)\">\r\n <div class=\"rev-block\">\r\n <div class=\"rev-head\">\r\n <span class=\"rev-label\">Actual submission</span>\r\n <span class=\"av2-grow\"></span>\r\n <span class=\"scorechip\" *ngIf=\"q.actualScore !== null\">Score:{{ q.actualScore }}</span>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"submitted; context: { $implicit: q }\"></ng-container>\r\n </div>\r\n <div class=\"rev-block rev-block--revised\">\r\n <div class=\"rev-head\">\r\n <span class=\"rev-label rev-label--warning\">Revised submission</span>\r\n <span class=\"av2-grow\"></span>\r\n <span class=\"scorechip\" *ngIf=\"q.revised.score !== null\">Score:{{ q.revised.score }}</span>\r\n </div>\r\n <div class=\"answertext answertext--strong\">{{ q.revised.answer || '—' }}</div>\r\n <div class=\"rev-reason\">{{ q.revised.reason || '—' }}</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Store dispute (raised from mobile): actual vs disputed, then the approver's decision -->\r\n <div class=\"revision\" *ngIf=\"showDisputeView(q) && q.dispute as d\">\r\n <div class=\"rev-block\" [class.is-dim]=\"d.status === 'approved' && !!d.answer\"\r\n [class.is-final]=\"d.status === 'rejected'\">\r\n <div class=\"rev-head\">\r\n <span class=\"rev-label\">Actual submission</span>\r\n <span class=\"av2-grow\"></span>\r\n <span class=\"gal-tag gal-tag--success gal-tag--sm\" *ngIf=\"d.status === 'rejected' || (d.status === 'approved' && !d.answer)\">Final answer</span>\r\n <span class=\"scorechip\" *ngIf=\"q.actualScore !== null\">Score:{{ q.actualScore }}</span>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"submitted; context: { $implicit: q }\"></ng-container>\r\n </div>\r\n <div class=\"rev-block dispute-block\" [class.is-pending]=\"d.status === 'raised'\"\r\n [class.is-final]=\"d.status === 'approved' && !!d.answer\" [class.is-rejected]=\"d.status === 'rejected'\">\r\n <div class=\"rev-head\">\r\n <span class=\"rev-label rev-label--warning\">{{ d.status === 'approved' && d.answer ? 'Revised submission' : 'Disputed submission' }}</span>\r\n <span class=\"av2-grow\"></span>\r\n <span class=\"gal-tag gal-tag--success gal-tag--sm\" *ngIf=\"d.status === 'approved' && d.answer\">Final answer</span>\r\n <span class=\"gal-tag gal-tag--gray gal-tag--sm\" *ngIf=\"d.status === 'rejected'\">Discarded</span>\r\n <span class=\"scorechip\" *ngIf=\"d.status === 'approved' && d.answer && q.revised?.score !== null && q.revised?.score !== undefined\">Score:{{ q.revised?.score }}</span>\r\n </div>\r\n <div class=\"answertext answertext--strong\" *ngIf=\"d.status === 'approved' && d.answer\">{{ d.answer }}</div>\r\n <div class=\"dispute-status\">{{ disputeStatusText(q) }}</div>\r\n <div class=\"dispute-evidence\">\r\n <button type=\"button\" class=\"dispute-photo\" *ngIf=\"d.image && !brokenMedia.has(d.image)\" title=\"View the store's photo\"\r\n (click)=\"openViewer([d.image], 0, 'Dispute photo')\">\r\n <img [src]=\"d.image\" alt=\"Photo from the store\" loading=\"lazy\" (error)=\"onMediaError(d.image)\">\r\n </button>\r\n <span class=\"dispute-photo is-empty\" *ngIf=\"!d.image || brokenMedia.has(d.image)\" title=\"No photo\"></span>\r\n <div class=\"dispute-desc\">\r\n <span class=\"dispute-desc-label\">Description from store</span>\r\n <span class=\"dispute-desc-text\">{{ d.description || '—' }}</span>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"d.status === 'rejected' && d.rejectReason\">\r\n <div class=\"rev-reason-label\">Reason for Rejection:</div>\r\n <div class=\"rev-reason rev-reason--error\">{{ d.rejectReason }}</div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <!-- Dispute: approve (keep or revise the answer) -->\r\n <div class=\"editpanel\" *ngIf=\"isReviewing(q, 'approve')\">\r\n <div class=\"edit-title\">Select the revised answer</div>\r\n <div class=\"edit-sub\">Keep the actual answer or change it based on the store's evidence.</div>\r\n <div class=\"edit-options\" role=\"radiogroup\" *ngIf=\"q.editable\" [attr.aria-label]=\"'Answer for question ' + q.qno\">\r\n <button type=\"button\" role=\"radio\" class=\"edit-option\" *ngFor=\"let opt of q.options; trackBy: trackByLabel\"\r\n [class.is-on]=\"isDisputeDraft(opt)\" [attr.aria-checked]=\"isDisputeDraft(opt)\" (click)=\"pickDisputeAnswer(opt)\">\r\n <span class=\"edit-radio\">\r\n <svg *ngIf=\"isDisputeDraft(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"edit-option-label\">{{ opt.label }}</span>\r\n <span class=\"edit-option-flag\" *ngIf=\"opt.flag\">Flags</span>\r\n <span class=\"edit-option-score\" *ngIf=\"opt.score !== null\">Score {{ opt.score }}</span>\r\n <span class=\"edit-option-actual\" *ngIf=\"isActualOption(q, opt)\">Actual answer</span>\r\n </button>\r\n </div>\r\n <div class=\"edit-hint\" *ngIf=\"!q.editable\">\r\n This answer type cannot be changed here, so approving keeps the recorded answer.\r\n </div>\r\n <div class=\"edit-actions\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"cancelDispute()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--sm dispute-approve\" [disabled]=\"!canConfirmDispute()\" (click)=\"confirmDispute(q)\">\r\n {{ disputeSaving ? 'Saving…' : (disputeKeeps(q) ? 'Keep answer' : 'Save revised answer') }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Dispute: reject with a reason (shown to the store on mobile) -->\r\n <div class=\"editpanel\" *ngIf=\"isReviewing(q, 'reject')\">\r\n <div class=\"edit-title\">Reason for rejection <span class=\"req\">*</span></div>\r\n <div class=\"edit-sub\">This reason will be visible to the store team on mobile.</div>\r\n <lib-audit-v2-select class=\"edit-select\" [(ngModel)]=\"disputeReason\" [options]=\"disputeReasonOptions\"\r\n placeholder=\"Select a reason\" ariaLabel=\"Reason for rejection\"></lib-audit-v2-select>\r\n <input *ngIf=\"disputeReason === 'Other'\" type=\"text\" class=\"edit-input\" maxlength=\"300\"\r\n placeholder=\"Enter the reason for rejection\" [(ngModel)]=\"disputeOther\">\r\n <div class=\"edit-actions\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"cancelDispute()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--sm dispute-reject-confirm\" [disabled]=\"!canConfirmDispute()\" (click)=\"confirmDispute(q)\">\r\n {{ disputeSaving ? 'Saving…' : 'Confirm Rejection' }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Dispute: decision buttons -->\r\n <div class=\"answerbox-actions\" *ngIf=\"showDisputeActions(q)\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--sm dispute-reject\" (click)=\"openDispute(q, 'reject')\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg>\r\n Reject\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--sm dispute-approve\" (click)=\"openDispute(q, 'approve')\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n Approve\r\n </button>\r\n </div>\r\n\r\n <!-- Edit -->\r\n <div class=\"editpanel\" *ngIf=\"isEditing(q)\">\r\n <div class=\"edit-title\">Select the revised answer</div>\r\n <div class=\"edit-options\" role=\"radiogroup\" [attr.aria-label]=\"'Answer for question ' + q.qno\">\r\n <button type=\"button\" role=\"radio\" class=\"edit-option\" *ngFor=\"let opt of q.options; trackBy: trackByLabel\"\r\n [class.is-on]=\"isDraft(opt)\" [attr.aria-checked]=\"isDraft(opt)\" (click)=\"pickDraft(opt)\">\r\n <span class=\"edit-radio\">\r\n <svg *ngIf=\"isDraft(opt)\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>\r\n <span class=\"edit-option-label\">{{ opt.label }}</span>\r\n <span class=\"edit-option-flag\" *ngIf=\"opt.flag\">Flags</span>\r\n <span class=\"edit-option-score\" *ngIf=\"opt.score !== null\">Score {{ opt.score }}</span>\r\n <span class=\"edit-option-actual\" *ngIf=\"isActualOption(q, opt)\">Actual answer</span>\r\n </button>\r\n </div>\r\n\r\n <div class=\"edit-reason\" *ngIf=\"draftChanged(q)\">\r\n <div class=\"edit-title\">Reason for change <span class=\"req\">*</span></div>\r\n <lib-audit-v2-select class=\"edit-select\" [(ngModel)]=\"draftReason\" [options]=\"reasonOptions\"\r\n placeholder=\"Select a reason\" ariaLabel=\"Reason for change\"></lib-audit-v2-select>\r\n <input *ngIf=\"draftReason === 'Other'\" type=\"text\" class=\"edit-input\" maxlength=\"300\"\r\n placeholder=\"Enter the reason for change\" [(ngModel)]=\"draftOther\">\r\n </div>\r\n <div class=\"edit-hint\" *ngIf=\"!draftChanged(q) && q.revised\">\r\n Saving keeps the store's actual answer and removes the revision.\r\n </div>\r\n\r\n <div class=\"edit-actions\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"cancelEdit()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm\" [disabled]=\"!canSave(q)\" (click)=\"saveEdit(q)\">\r\n {{ saving ? 'Saving…' : 'Save Changes' }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- v1 gallery per-question actions (client users): send the question back for Redo, or raise a task. -->\r\n <div class=\"answerbox-actions\" *ngIf=\"!isEditing(q) && !isReviewing(q) && (canRedo() || canCreateTask(q))\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" *ngIf=\"canRedo()\" [disabled]=\"q.redo\"\r\n [title]=\"q.redo ? 'Redo already requested for this question' : 'Ask the auditor to answer this question again'\"\r\n (click)=\"openTaskDialog(q, 'redo')\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"1 4 1 10 7 10\"></polyline><path d=\"M3.51 15a9 9 0 1 0 2.13-9.36L1 10\"></path></svg>\r\n Redo\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm answerbox-task\" *ngIf=\"canCreateTask(q)\"\r\n title=\"Raise a task from this answer\" (click)=\"openTaskDialog(q, 'createtask')\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line></svg>\r\n Create Task\r\n </button>\r\n </div>\r\n </article>\r\n\r\n <!-- v1 gallery empty state (Nodata1 + \"No data found\"), with what is hiding the answers. -->\r\n <div class=\"av2-empty gal-noanswers\" *ngIf=\"!visibleQuestions.length\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ noAnswersText }}</div>\r\n <button type=\"button\" class=\"av2-link\" *ngIf=\"hasSelection\" (click)=\"viewAllAnswers()\">View all answers</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- v1 gallery pagination: one submission per page. -->\r\n <!-- Always with a submission to show (QA 10 Oct: missing with a single one), as the v1 gallery. -->\r\n <div class=\"gal-pagination\" *ngIf=\"total > 0\">\r\n <lib-pagination [itemsPerPage]=\"1\" [pageSize]=\"1\" [paginationSizes]=\"[1]\" [currentPage]=\"pageIndex + 1\"\r\n [totalItems]=\"total\" (pageChange)=\"goToPage($event)\"></lib-pagination>\r\n </div>\r\n </ng-container>\r\n </section>\r\n </div>\r\n\r\n <!-- Approve bar -->\r\n <div class=\"gal-approve-bar\" *ngIf=\"hasSubmission && !loading\">\r\n <div class=\"approve-status\">\r\n <ng-container *ngIf=\"detail.approvalStatus\">\r\n <span class=\"approve-dot approve-dot--success\"></span>\r\n Approved<ng-container *ngIf=\"detail.approvedBy\"> by <strong>{{ detail.approvedBy }}</strong></ng-container><ng-container *ngIf=\"detail.approvedAt\"> · {{ detail.approvedAt }}</ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!detail.approvalStatus && detail.approvalEnable\">\r\n <span class=\"approve-dot approve-dot--warning\"></span>\r\n Waiting for approval<ng-container *ngIf=\"revisedCount\"> · {{ revisedCount }} {{ revisedCount === 1 ? 'answer' : 'answers' }} revised</ng-container><ng-container *ngIf=\"pendingDisputeCount\"> · {{ pendingDisputeCount }} {{ pendingDisputeCount === 1 ? 'dispute' : 'disputes' }} pending review</ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!detail.approvalEnable\">\r\n <span class=\"approve-dot\"></span>\r\n No approval step is set for this audit\r\n </ng-container>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <!-- Approve: the audit's approvers and the Super Admin only; anyone else sees no button and no hint (QA 11 Oct). -->\r\n <ng-container *ngIf=\"detail.approvalEnable && !detail.approvalStatus && menuAccess.canEdit && approveAccess.canApprove && !shownTask\">\r\n <button type=\"button\" class=\"av2-btn gal-approve\" *ngIf=\"!approveConfirm\" (click)=\"requestApprove()\">Approve</button>\r\n <ng-container *ngIf=\"approveConfirm\">\r\n <span class=\"approve-warn\">Approval records the final score and locks further edits.</span>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"cancelApprove()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn gal-approve gal-approve--confirm\" [disabled]=\"approving\" (click)=\"confirmApprove()\">\r\n {{ approving ? 'Approving…' : 'Confirm approval' }}\r\n </button>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- What the store submitted: answer, proof, captures and remarks. Shared by the plain and the revised views. -->\r\n <ng-template #submitted let-q>\r\n <!-- Two columns (v1 col-md-6 / col-md-6): every reference image (the question's, the chosen option's or the\r\n capture's) and the answer on the left; uploads, validation photos / videos and AI results on the right. -->\r\n <div class=\"gal-split\" [class.is-split]=\"hasSide(q)\">\r\n <div class=\"gal-split-main\">\r\n <div class=\"gal-block\" *ngIf=\"q.questionRefs.length\">\r\n <div class=\"gal-block-title\">Reference Image</div>\r\n <ng-container *ngTemplateOutlet=\"refGrid; context: { $implicit: q.questionRefs, title: 'Reference Image' }\"></ng-container>\r\n </div>\r\n\r\n <div class=\"gal-block\" *ngIf=\"q.optionRefs.length\">\r\n <div class=\"gal-block-title\">Reference Image</div>\r\n <ng-container *ngTemplateOutlet=\"refGrid; context: { $implicit: q.optionRefs, title: 'Reference Image' }\"></ng-container>\r\n </div>\r\n\r\n <!-- Every chosen answer on a line of its own (a multiple-choice answer is not run together with commas). -->\r\n <ng-container *ngIf=\"actualAnswer(q)\">\r\n <div class=\"answertext\" *ngFor=\"let a of q.answers\" [class.is-flag]=\"q.flagged\">{{ a }}{{ q.unit }}</div>\r\n </ng-container>\r\n <div class=\"answertext\" *ngIf=\"!actualAnswer(q) && !q.media.length && !q.proof.length && !q.validationText\">—</div>\r\n <!-- Typed validation answer under the answer (v1 \"Validation Answer : 88\"); with several, each one gets its\r\n own \"Validation Answer :\" label on the line above it. -->\r\n <div class=\"prooftext\" *ngIf=\"q.validationTexts.length === 1\" [class.is-flag]=\"q.flagged\">Validation Answer : {{ q.validationTexts[0] }}</div>\r\n <ng-container *ngIf=\"q.validationTexts.length > 1\">\r\n <ng-container *ngFor=\"let v of q.validationTexts\">\r\n <div class=\"prooftext\" [class.is-flag]=\"q.flagged\">Validation Answer :</div>\r\n <div class=\"prooftext\" [class.is-flag]=\"q.flagged\">{{ v }}</div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- Uploads stay here only when there is no reference image to sit beside. -->\r\n <div class=\"gal-block\" *ngIf=\"q.media.length && !mediaOnSide(q)\">\r\n <div class=\"gal-block-title\">{{ mediaTitle(q.media) }}</div>\r\n <ng-container *ngTemplateOutlet=\"mediaGrid; context: { $implicit: q.media, title: mediaTitle(q.media) }\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"gal-split-side\" *ngIf=\"hasSide(q)\">\r\n <!-- Uploaded images / videos, to the right of the reference image. -->\r\n <div class=\"gal-block\" *ngIf=\"mediaOnSide(q)\">\r\n <div class=\"gal-block-title\">{{ mediaTitle(q.media) }}</div>\r\n <ng-container *ngTemplateOutlet=\"mediaGrid; context: { $implicit: q.media, title: mediaTitle(q.media) }\"></ng-container>\r\n </div>\r\n\r\n <!-- Photo / video proof the chosen option asked for. -->\r\n <div class=\"gal-block\" *ngIf=\"q.proof.length\">\r\n <div class=\"gal-block-title\">Validation Answer</div>\r\n <ng-container *ngTemplateOutlet=\"mediaGrid; context: { $implicit: q.proof, title: 'Validation Answer' }\"></ng-container>\r\n </div>\r\n\r\n <div class=\"gal-ai\" *ngIf=\"q.aiResults.length\">\r\n <div class=\"gal-ai-line\" *ngFor=\"let r of q.aiResults\"><b>{{ r.label }} :</b> {{ r.value }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Image / video questions keep their AI results under the uploads (v1). -->\r\n <div class=\"gal-ai\" *ngIf=\"q.aiResults.length && !hasSide(q)\">\r\n <div class=\"gal-ai-line\" *ngFor=\"let r of q.aiResults\"><b>{{ r.label }} :</b> {{ r.value }}</div>\r\n </div>\r\n\r\n <div class=\"remarktext\" *ngIf=\"q.remark\">{{ labels.remarks }} : {{ q.remark }}</div>\r\n <div class=\"remarktext\" *ngIf=\"q.extraRemark\">{{ labels.additional }} : {{ q.extraRemark }}</div>\r\n </ng-template>\r\n\r\n <!-- Reference images: v1 collage (1 column for one, 2 for up to four, then 3), click opens the viewer. -->\r\n <ng-template #refGrid let-list let-title=\"title\">\r\n <div class=\"gal-grid\" [ngClass]=\"gridClass(list.length)\">\r\n <button type=\"button\" class=\"gal-tile\" *ngFor=\"let src of list; let i = index\" [title]=\"'Open ' + title\"\r\n (click)=\"openViewer(list, i, title)\">\r\n <img [src]=\"src\" [alt]=\"title + ' ' + (i + 1)\" loading=\"lazy\">\r\n </button>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Captured photos / videos with the v1 extras: Matched badge, upload time, per-image description. -->\r\n <ng-template #mediaGrid let-list let-title=\"title\">\r\n <div class=\"gal-grid\" [ngClass]=\"gridClass(list.length)\">\r\n <figure class=\"gal-tile-wrap\" *ngFor=\"let m of list; let mi = index\">\r\n <ng-container *ngIf=\"!brokenMedia.has(m.src)\">\r\n <button *ngIf=\"!m.video\" type=\"button\" class=\"gal-tile\" [title]=\"'Open ' + title\" (click)=\"openMediaViewer(list, m, title)\">\r\n <img [src]=\"m.src\" [alt]=\"title + ' ' + (mi + 1)\" loading=\"lazy\" (error)=\"onMediaError(m.src)\">\r\n </button>\r\n <video *ngIf=\"m.video\" [src]=\"m.src\" controls preload=\"metadata\" class=\"gal-tile gal-tile--video\" (error)=\"onMediaError(m.src)\"></video>\r\n </ng-container>\r\n <a *ngIf=\"brokenMedia.has(m.src)\" [href]=\"m.src\" target=\"_blank\" rel=\"noopener\" class=\"gal-tile gal-tile--missing\"\r\n [title]=\"(m.video ? 'Video' : 'Image') + ' could not be loaded - open the file'\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\"></rect>\r\n <circle cx=\"9\" cy=\"10\" r=\"1.6\"></circle>\r\n <path d=\"M21 16l-5-5-9 9\"></path>\r\n </svg>\r\n <span>Not available</span>\r\n </a>\r\n <span class=\"gal-detect\" *ngIf=\"m.detection\" [class.is-bad]=\"m.detection === 'notmatched'\">{{ m.detection === 'matched' ? 'Matched' : 'Not Matched' }}</span>\r\n <figcaption>\r\n <span class=\"gal-upload-time\" *ngIf=\"m.uploaded\">{{ m.uploaded }}</span>\r\n <span *ngIf=\"m.caption\">Image {{ mi + 1 }} : {{ m.caption }}</span>\r\n </figcaption>\r\n </figure>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Image viewer -->\r\n <div class=\"gal-viewer\" *ngIf=\"viewer\" role=\"dialog\" aria-modal=\"true\" [attr.aria-label]=\"viewer.title\" (click)=\"closeViewer()\">\r\n <div class=\"gal-viewer-box\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"gal-viewer-head\">\r\n <span class=\"gal-viewer-title\">{{ viewer.title }}<span *ngIf=\"viewer.items.length > 1\"> · {{ viewer.index + 1 }} / {{ viewer.items.length }}</span></span>\r\n <button type=\"button\" class=\"gal-viewer-close\" (click)=\"closeViewer()\" aria-label=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg>\r\n </button>\r\n </div>\r\n <div class=\"gal-viewer-stage\">\r\n <button type=\"button\" class=\"gal-viewer-nav gal-viewer-nav--prev\" *ngIf=\"viewer.items.length > 1\"\r\n [disabled]=\"viewer.index === 0\" (click)=\"stepViewer(-1)\" aria-label=\"Previous image\">‹</button>\r\n <img [src]=\"viewer.items[viewer.index]\" [alt]=\"viewer.title\">\r\n <button type=\"button\" class=\"gal-viewer-nav gal-viewer-nav--next\" *ngIf=\"viewer.items.length > 1\"\r\n [disabled]=\"viewer.index === viewer.items.length - 1\" (click)=\"stepViewer(1)\" aria-label=\"Next image\">›</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- View Proof (v1 \"Verification Details\") -->\r\n <div class=\"gal-viewer\" *ngIf=\"proofOpen\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Verification Details\" (click)=\"proofOpen = false\">\r\n <div class=\"gal-viewer-box gal-viewer-box--md\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"gal-viewer-head\">\r\n <span class=\"gal-viewer-title\">Verification Details</span>\r\n <button type=\"button\" class=\"gal-viewer-close\" (click)=\"proofOpen = false\" aria-label=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg>\r\n </button>\r\n </div>\r\n <div class=\"gal-proof-body\">\r\n <ng-container *ngIf=\"detail.proofImage\">\r\n <div class=\"gal-block-title\">Captured Photo</div>\r\n <img class=\"gal-proof-img\" [src]=\"detail.proofImage\" alt=\"Captured photo\">\r\n </ng-container>\r\n <div class=\"gal-proof-name\"><b>Name :</b> {{ detail.acknowledgedBy || '—' }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Closes the export menu on an outside click -->\r\n <div class=\"menu-backdrop\" *ngIf=\"exportOpen\" (click)=\"exportOpen = false\"></div>\r\n\r\n <!-- Filter drawer -->\r\n <div class=\"filter-backdrop\" *ngIf=\"filtersOpen\" (click)=\"cancelFilters()\"></div>\r\n\r\n <div class=\"filter-drawer\" *ngIf=\"filtersOpen\">\r\n <div class=\"drawer-head\">\r\n <span class=\"drawer-title\">Filters</span>\r\n <span class=\"countpill\" *ngIf=\"activeFilterCount\">{{ activeFilterCount }}</span>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"closebtn\" (click)=\"cancelFilters()\" title=\"Close\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-body\">\r\n <!-- Categories -->\r\n <div class=\"drawer-nav\">\r\n <div class=\"drawer-group\">\r\n <div class=\"grouplabel\">Primary</div>\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let def of primaryDefs; trackBy: trackByDef\"\r\n [class.navitem-active]=\"activeFilter === def.id\" (click)=\"selectCategory(def.id)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ def.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"isDirty(def.id)\">{{ summaryFor(def.id) }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"isDirty(def.id)\"></span>\r\n <svg class=\"navchev\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"9 6 15 12 9 18\"></polyline>\r\n </svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"drawer-group\">\r\n <div class=\"grouplabel\">Secondary</div>\r\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let def of secondaryDefs; trackBy: trackByDef\"\r\n [class.navitem-active]=\"activeFilter === def.id\" (click)=\"selectCategory(def.id)\">\r\n <span class=\"navtext\">\r\n <span class=\"navtitle\">{{ def.label }}</span>\r\n <span class=\"navvalue\" [class.is-dirty]=\"isDirty(def.id)\">{{ summaryFor(def.id) }}</span>\r\n </span>\r\n <span class=\"dirtydot\" *ngIf=\"isDirty(def.id)\"></span>\r\n <svg class=\"navchev\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"9 6 15 12 9 18\"></polyline>\r\n </svg>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Options -->\r\n <div class=\"drawer-pane\">\r\n <div class=\"pane-head\">\r\n <div class=\"panetitle\">{{ activeDef.label }}</div>\r\n <div class=\"panehint\">{{ activeDef.hint }}</div>\r\n </div>\r\n\r\n <!-- Date range -->\r\n <div class=\"pane-scroll pane-fields pane-fields--date\" *ngIf=\"activeDef.kind === 'date'\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">Selected</span>\r\n <span class=\"gal-range-readout\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\r\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\r\n {{ rangeLabel }}\r\n </span>\r\n </div>\r\n <!-- Inline calendars: a dropdown inside this scrolling pane opened off to the side and scrolled sideways.\r\n Keyed on fRange so Clear all / reopening rebuilds it on the restored range. -->\r\n <div class=\"av2-datepick av2-datepick--compact gal-inline-picker\" *ngFor=\"let r of [fRange]\">\r\n <ngx-daterangepicker-material *ngIf=\"r\" [startDate]=\"r.startDate\" [endDate]=\"r.endDate\"\r\n [locale]=\"pickerLocale\" [maxDate]=\"today\" [autoApply]=\"true\" [alwaysShowCalendars]=\"true\"\r\n [showCancel]=\"false\" (datesUpdated)=\"onRangePicked($event)\"></ngx-daterangepicker-material>\r\n </div>\r\n </div>\r\n\r\n <!-- Score range (prototype: From / To, range bar, Minimum / Maximum sliders, quick bands) -->\r\n <div class=\"pane-scroll score-pane\" *ngIf=\"activeDef.kind === 'score'\">\r\n <div class=\"pane-fields score-fields\">\r\n <div class=\"field\">\r\n <span class=\"field-label\">From</span>\r\n <label class=\"field-box field-box--num\">\r\n <input type=\"number\" min=\"0\" max=\"100\" [ngModel]=\"fScoreMin\" (change)=\"setScoreMin($any($event.target).value)\"><span class=\"field-unit\">%</span>\r\n </label>\r\n </div>\r\n <span class=\"field-sep\">to</span>\r\n <div class=\"field\">\r\n <span class=\"field-label\">To</span>\r\n <label class=\"field-box field-box--num\">\r\n <input type=\"number\" min=\"0\" max=\"100\" [ngModel]=\"fScoreMax\" (change)=\"setScoreMax($any($event.target).value)\"><span class=\"field-unit\">%</span>\r\n </label>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <span class=\"score-readout\">{{ fScoreMin }}% – {{ fScoreMax }}%</span>\r\n </div>\r\n\r\n <div class=\"score-sliders\">\r\n <div class=\"score-track\">\r\n <span class=\"score-fill\" [style.left.%]=\"fScoreMin\" [style.width.%]=\"fScoreMax - fScoreMin\"></span>\r\n </div>\r\n <div class=\"score-ticks\"><span>0%</span><span>50%</span><span>100%</span></div>\r\n <label class=\"score-slider\">\r\n <span class=\"score-slider-label\">Minimum score</span>\r\n <input type=\"range\" min=\"0\" max=\"100\" [ngModel]=\"fScoreMin\" (ngModelChange)=\"setScoreMin($event)\">\r\n </label>\r\n <label class=\"score-slider\">\r\n <span class=\"score-slider-label\">Maximum score</span>\r\n <input type=\"range\" min=\"0\" max=\"100\" [ngModel]=\"fScoreMax\" (ngModelChange)=\"setScoreMax($event)\">\r\n </label>\r\n </div>\r\n\r\n <div class=\"score-bands\">\r\n <span class=\"field-label\">Quick bands</span>\r\n <div class=\"score-band-list\">\r\n <button type=\"button\" class=\"score-band\" *ngFor=\"let b of scoreBands\" [class.is-on]=\"isScoreBand(b)\"\r\n (click)=\"pickScoreBand(b)\">{{ b.label }}</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Option list -->\r\n <div class=\"pane-scroll pane-list\" *ngIf=\"activeDef.kind === 'list'\">\r\n <label class=\"panesearch\" *ngIf=\"activeDef.searchable\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"searchPlaceholder\" [(ngModel)]=\"optionQuery\">\r\n </label>\r\n\r\n <button type=\"button\" class=\"optionrow\" *ngFor=\"let opt of activeOptions; trackBy: trackByOption\"\r\n [class.option-selected]=\"isSelected(opt)\" (click)=\"pick(opt)\">\r\n <span class=\"optionmark\" [class.mark-on]=\"isSelected(opt)\" [class.mark-multi]=\"activeDef.multi\">\r\n <svg *ngIf=\"isSelected(opt)\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg>\r\n </span>\r\n <span class=\"opttext\">\r\n <span class=\"optlabel\">{{ opt.label }}</span>\r\n <span class=\"optmeta\" *ngIf=\"opt.meta\">{{ opt.meta }}</span>\r\n </span>\r\n </button>\r\n\r\n <div class=\"nomatch\" *ngIf=\"noOptionMatch\">{{ noOptionText }}</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"drawer-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" (click)=\"clearFilters()\">Clear all</button>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--wide\" (click)=\"applyFilters()\">Apply filters</button>\r\n </div>\r\n </div>\r\n\r\n</div>\r\n","import { ChangeDetectorRef, Component, DoCheck, ElementRef, EventEmitter, HostListener, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges, ViewChild } from '@angular/core';\r\nimport { ReplaySubject, Subject, debounceTime, forkJoin, of, take, takeUntil } from 'rxjs';\r\nimport { catchError } from 'rxjs/operators';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport dayjs from 'dayjs';\r\nimport * as XLSX from 'xlsx';\r\nimport { TraxService } from '../../../services/trax.service';\r\n\r\n/** An audit the schedule can raise. */\r\nexport interface ScheduleAudit {\r\n id: string;\r\n name: string;\r\n meta: string;\r\n questions: number;\r\n /** Published audit; the rows' Audit assigned list offers only these (plus the schedule's own audits). */\r\n publish?: boolean;\r\n}\r\n\r\n/** One schedule row: a user, at a store, on a date, for an audit. */\r\nexport interface EditorRow {\r\n key: number;\r\n date: string;\r\n userEmail: string;\r\n /** The picked store's id ('' until the typed text names an active store). Never shown. */\r\n storeId: string;\r\n /** What the store cell shows: the store name (or the text being typed). */\r\n storeText: string;\r\n checkListId: string;\r\n start: string;\r\n end: string;\r\n selected: boolean;\r\n /**\r\n * Rows of one visit (same date, user, store and window) share a group: the table shows the group as one row with\r\n * its audits in the Audit assigned dropdown (QA 10 Oct), and edits to that row apply to every audit of it. The API\r\n * still takes one row per audit.\r\n */\r\n group: number;\r\n}\r\n\r\ninterface PickStore { storeId: string; storeName: string; city: string; }\r\ninterface PickUser { email: string; name: string; }\r\ntype PickCell = 'userEmail' | 'storeId' | 'checkListId';\r\ntype RowField = 'date' | PickCell | 'window';\r\n\r\n/**\r\n * Manage › Schedule Info › Create schedule, then › Rows (the prototype's two schedule pages).\r\n * Create: name the schedule and pick its audits, then import the CSV template or add a row.\r\n * Rows: one user, store, date and audit per row, checked against the client's active stores\r\n * and users before anything is saved. Save as draft keeps it unpublished; Publish schedule\r\n * saves it and publishes it (POST/PUT /trax/audit/schedule/*), which assigns the rows' stores\r\n * to their audits in Trax and publishes audits that are still drafts.\r\n * With `scheduleId` it opens an existing schedule straight on its rows (Edit rows).\r\n */\r\n@Component({\r\n selector: 'lib-audit-v2-schedule-editor',\r\n templateUrl: './audit-v2-schedule-editor.component.html',\r\n styleUrl: './audit-v2-schedule-editor.component.scss'\r\n})\r\nexport class AuditV2ScheduleEditorComponent implements OnInit, OnChanges, DoCheck, OnDestroy {\r\n @Input() clientId = '';\r\n /** Audits that can be picked. */\r\n @Input() audits: ScheduleAudit[] = [];\r\n /** Audits ticked when the page opens (Not scheduled › Schedule, Schedule selected, Configure). */\r\n @Input() preselect: string[] = [];\r\n /**\r\n * The preselected audits are the schedule's audits and cannot be changed (opened from an\r\n * audit's Configure page): the audit picker card is hidden and the audit is named once.\r\n * Otherwise the picker lists every audit with the preselected ones ticked.\r\n */\r\n @Input() lockAudits = false;\r\n /** Text of the Back button (Manage passes where Back goes). */\r\n @Input() backLabel = 'Back';\r\n /** Edit an existing schedule's rows instead of creating one. */\r\n @Input() scheduleId = '';\r\n /** Emits true when the schedule was saved, false on back / cancel. */\r\n @Output() closed = new EventEmitter<boolean>();\r\n\r\n @ViewChild('csvInput') csvInput?: ElementRef<HTMLInputElement>;\r\n\r\n step: 'create' | 'rows' = 'create';\r\n name = '';\r\n picks: string[] = [];\r\n /** Opened with audits picked on the previous page: those are the schedule's audits and cannot be changed here. */\r\n locked = false;\r\n pickQuery = '';\r\n /** Hidden for now on both Create and Edit (QA): the \"Audits to schedule\" picker and the \"What the template expects\" panel. */\r\n readonly showAuditPicker = false;\r\n readonly showTemplatePreview = false;\r\n rows: EditorRow[] = [];\r\n rowQuery = '';\r\n saving = false;\r\n /**\r\n * Template rows (no header) for the picked audits, as the sample panel shows them and Download\r\n * template writes them; `templateFor` is the picks they were built for.\r\n */\r\n templateLines: string[][] = [];\r\n templateLoading = false;\r\n private templateFor = '';\r\n /** Rows the sample panel lists before \"+ n more\". */\r\n readonly previewLimit = 6;\r\n loadingEdit = false;\r\n published = false;\r\n\r\n stores: PickStore[] = [];\r\n users: PickUser[] = [];\r\n /** Which picker cell is open. */\r\n openCell: { key: number; field: PickCell } | null = null;\r\n /** Problems the API reported, keyed by row key and field. */\r\n private serverErrors = new Map<string, string>();\r\n /**\r\n * What the API's dry run (POST /schedule/check) says about the rows, keyed by row key and field: chiefly a\r\n * user's window overlapping their visit at another store in another published schedule, which only the API\r\n * can see. Refreshed a moment after the rows change; shown after the editor's own checks.\r\n */\r\n private liveErrors = new Map<string, string>();\r\n /** The dry run's hints (row key -> messages): the same audit, date and window in another schedule. They do not block Publish. */\r\n private liveWarnings = new Map<number, string[]>();\r\n private lastChecked = '';\r\n private readonly check$ = new Subject<void>();\r\n /** Rows repeating an audit for the same user or store on the same date and window, keyed by row key and field (rebuilt every check). */\r\n private dupErrors = new Map<string, string>();\r\n /** Each picked audit's own time frame ('HH:mm'), the window of a row left blank (from the template call). */\r\n private auditWindows = new Map<string, { start: string; end: string }>();\r\n /**\r\n * Rows the schedule had already raised when it was opened published (see visitKey). They may be\r\n * past by now and still stay; only new or changed rows must be dated today or later (as the API).\r\n */\r\n private raisedKeys = new Set<string>();\r\n /** Row keys of a published schedule's rows dated before today: visits already raised, read-only. */\r\n lockedKeys = new Set<number>();\r\n /** Why the last publish failed when the API named no row (cleared by the next edit). */\r\n publishProblem = '';\r\n private storeIds = new Set<string>();\r\n private userEmails = new Set<string>();\r\n private storeById = new Map<string, PickStore>();\r\n private userByEmail = new Map<string, PickUser>();\r\n /** Where the open picker menu sits. It is fixed to the viewport so the table's scroll box cannot clip it. */\r\n menuPos: { top: number | null; bottom: number | null; left: number; width: number } = { top: null, bottom: null, left: 0, width: 0 };\r\n /** Keyboard-highlighted option in the open menu. */\r\n activeIndex = 0;\r\n private menuAnchor: HTMLElement | null = null;\r\n /** Options a picker lists at once; typing narrows the rest. */\r\n readonly pickLimit = 30;\r\n /** Audits of the edited schedule that are not in `audits` (already scheduled elsewhere). */\r\n private ownAudits: ScheduleAudit[] = [];\r\n private nextKey = 1;\r\n private readonly destroy$ = new Subject<void>();\r\n /** Emits once the client's stores and users have loaded (or failed): the template waits for its Store dropdown. */\r\n private readonly peopleReady$ = new ReplaySubject<void>(1);\r\n /** Download template clicked while the store list is still loading. */\r\n templateWaiting = false;\r\n\r\n /**\r\n * \"New User found\" (as the v1 checklist upload): row emails with no active user, offered for invite after an\r\n * import or from a row's message. Invite Selected creates them as users of the client (POST /schedule/invite).\r\n */\r\n inviteEmails: string[] = [];\r\n invitePicked = new Set<string>();\r\n inviteOpen = false;\r\n inviting = false;\r\n\r\n constructor(\r\n private traxService: TraxService,\r\n private toast: ToastService,\r\n private cd: ChangeDetectorRef\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n document.addEventListener('pointerdown', this.onOutside, true);\r\n document.addEventListener('focusin', this.onOutside, true);\r\n this.picks = [...this.preselect];\r\n this.locked = this.lockAudits && this.picks.length > 0;\r\n this.loadTemplate();\r\n const safe = (o: any) => o.pipe(catchError(() => of(null)));\r\n forkJoin({\r\n stores: safe(this.traxService.getassignDropdown({ clientId: this.clientId, coverage: 'store', assignType: 'store' })),\r\n users: safe(this.traxService.getClientUser(this.clientId, true))\r\n }).pipe(takeUntil(this.destroy$)).subscribe(({ stores, users }: any) => {\r\n this.stores = (stores?.code === 200 ? stores.data?.data || [] : [])\r\n .map((s: any) => ({ storeId: String(s.storeId || ''), storeName: s.storeName || '', city: s.city || '' }))\r\n .filter((s: PickStore) => s.storeId);\r\n this.users = (users?.code === 200 ? users.data || [] : [])\r\n .map((u: any) => ({ email: String(u.email || '').trim().toLowerCase(), name: u.userName || '' }))\r\n .filter((u: PickUser) => u.email);\r\n this.storeIds = new Set(this.stores.map(s => s.storeId));\r\n this.userEmails = new Set(this.users.map(u => u.email));\r\n this.storeById = new Map(this.stores.map(s => [s.storeId, s]));\r\n this.userByEmail = new Map(this.users.map(u => [u.email, u]));\r\n // Rows typed or imported before the stores arrived: pick the store their name stands for.\r\n this.rows.filter(r => !r.storeId && r.storeText).forEach(r => r.storeId = this.storeIdFor(r.storeText));\r\n this.peopleReady$.next();\r\n this.cd.detectChanges();\r\n });\r\n if (this.scheduleId) { this.loadSchedule(); }\r\n this.check$.pipe(debounceTime(600), takeUntil(this.destroy$)).subscribe(() => this.runLiveCheck());\r\n }\r\n\r\n /**\r\n * Manage loads its audit lists after the editor opens (straight from Configure, on a fresh\r\n * page): once they arrive, the picked audits have names and the template rows can load.\r\n */\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['audits'] && !changes['audits'].firstChange\r\n && this.offeredAudits.map(a => a.id).join(',') !== this.templateFor) {\r\n this.loadTemplate();\r\n }\r\n }\r\n\r\n /** Duplicate checks need every row, so they are worked out once per check instead of per cell. */\r\n ngDoCheck(): void {\r\n this.dupErrors = this.findDuplicates();\r\n const signature = this.rows.map(r => [r.key, r.date, r.userEmail, r.storeId, r.storeText, r.checkListId, r.start, r.end].join('|')).join('\\n');\r\n if (signature !== this.lastChecked) {\r\n this.lastChecked = signature;\r\n this.check$.next();\r\n }\r\n }\r\n\r\n /** The API's dry run of the rows (debounced): keeps liveErrors in step with what Save would answer. */\r\n private runLiveCheck(): void {\r\n const sent = [...this.rows];\r\n const checklistIds = Array.from(new Set([...this.picks, ...sent.map(r => r.checkListId)].filter(Boolean)));\r\n if (!sent.length || !checklistIds.length) { this.liveErrors = new Map(); this.liveWarnings = new Map(); return; }\r\n this.traxService.auditScheduleCheck({\r\n clientId: this.clientId,\r\n ...(this.scheduleId ? { scheduleId: this.scheduleId } : {}),\r\n checklistIds,\r\n rows: sent.map(r => ({\r\n date: r.date, userEmail: r.userEmail.trim().toLowerCase(), storeId: r.storeId.trim(), storeName: r.storeText.trim(),\r\n checkListId: r.checkListId || '', start: r.start, end: r.end\r\n }))\r\n }).pipe(catchError(() => of(null)), takeUntil(this.destroy$)).subscribe((res: any) => {\r\n // An API without the dry run (or a failed call) leaves these checks to Save, as before.\r\n if (res?.code !== 200) { return; }\r\n const next = new Map<string, string>();\r\n (res.data?.rowErrors || []).forEach((x: any) => {\r\n const row = sent[Number(x.row) - 1];\r\n const message = String(x.message || '');\r\n // The editor says these itself (before the store / user lists load the API would say them about names).\r\n if (!row || /^(No active|Required|Audit is not part)/.test(message)) { return; }\r\n const key = row.key + '|' + String(x.field);\r\n if (!next.has(key)) { next.set(key, message); }\r\n });\r\n this.liveErrors = next;\r\n const hints = new Map<number, string[]>();\r\n (res.data?.rowWarnings || []).forEach((x: any) => {\r\n const row = sent[Number(x.row) - 1];\r\n const message = String(x.message || '');\r\n if (!row || !message) { return; }\r\n const list = hints.get(row.key) || [];\r\n if (!list.includes(message)) { list.push(message); }\r\n hints.set(row.key, list);\r\n });\r\n this.liveWarnings = hints;\r\n this.cd.detectChanges();\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n document.removeEventListener('pointerdown', this.onOutside, true);\r\n document.removeEventListener('focusin', this.onOutside, true);\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n /**\r\n * A press or focus anywhere outside the open picker closes it. Listened to in the capture\r\n * phase, so no element that stops click propagation can keep a menu open.\r\n */\r\n private readonly onOutside = (event: Event): void => {\r\n if (!this.openCell) { return; }\r\n const target = event.target as HTMLElement | null;\r\n if (target && typeof target.closest === 'function' && target.closest('.se-pick.is-open')) { return; }\r\n this.closePicker();\r\n this.cd.detectChanges();\r\n };\r\n\r\n /** Keep the open menu under its cell while the page or the table scrolls. */\r\n @HostListener('window:scroll')\r\n @HostListener('window:resize')\r\n onViewportChange(): void {\r\n if (this.openCell) { this.placeMenu(); }\r\n }\r\n\r\n private loadSchedule(): void {\r\n this.loadingEdit = true;\r\n this.traxService.auditScheduleDetail({ clientId: this.clientId, scheduleId: this.scheduleId })\r\n .pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (res: any) => {\r\n const d = res?.code === 200 ? res.data : null;\r\n this.loadingEdit = false;\r\n if (!d) { this.toast.getErrorToast('Could not load this schedule'); this.closed.emit(false); return; }\r\n this.name = d.schedule?.name || '';\r\n this.published = !!d.schedule?.publish;\r\n const lists: any[] = d.schedule?.checkLists || [];\r\n this.picks = lists.map(c => String(c.checkListId));\r\n this.loadTemplate();\r\n this.ownAudits = lists\r\n .filter(c => !this.audits.some(a => a.id === String(c.checkListId)))\r\n .map(c => ({ id: String(c.checkListId), name: c.checkListName || 'Audit', meta: 'In this schedule', questions: 0 }));\r\n // Schedules made before rows existed list their raised visits; the same user, store,\r\n // date, audit and window can appear more than once there, so keep one row per combination\r\n // (the same user and store at another time is a row of its own).\r\n const seen = new Set<string>();\r\n this.rows = (d.rows || []).filter((r: any) => {\r\n const key = [r.date, String(r.userEmail || '').toLowerCase(), r.storeId, r.checkListId, r.start || '', r.end || ''].join('|');\r\n if (seen.has(key)) { return false; }\r\n seen.add(key);\r\n return true;\r\n }).map((r: any) => this.row({\r\n date: r.date || '', userEmail: String(r.userEmail || '').toLowerCase(), storeId: r.storeId || '',\r\n storeText: r.storeName || this.storeLabel(r.storeId) || r.storeId || '',\r\n checkListId: r.checkListId ? String(r.checkListId) : '', start: r.start || '', end: r.end || ''\r\n }));\r\n this.regroup();\r\n this.raisedKeys = new Set(this.published ? this.rows.map(r => this.visitKey(r)) : []);\r\n // A published schedule's rows dated before today are visits already raised: read-only (QA 11 Oct).\r\n this.lockedKeys = new Set(this.published ? this.rows.filter(r => r.date && r.date < this.today).map(r => r.key) : []);\r\n this.step = 'rows';\r\n this.cd.detectChanges();\r\n },\r\n error: () => { this.loadingEdit = false; this.toast.getErrorToast('Could not load this schedule'); this.closed.emit(false); }\r\n });\r\n }\r\n\r\n // ---- create step ----------------------------------------------------------------------\r\n\r\n get allAudits(): ScheduleAudit[] {\r\n return [...this.ownAudits, ...this.audits];\r\n }\r\n\r\n get pickables(): ScheduleAudit[] {\r\n const q = this.pickQuery.trim().toLowerCase();\r\n return this.allAudits.filter(a => !q || (a.name + ' ' + a.meta).toLowerCase().includes(q));\r\n }\r\n\r\n /** The fixed audits' names, for the line that replaces the picker when the audits are locked. */\r\n get lockedAuditNames(): string {\r\n return this.pickedAudits.map(a => a.name).join(', ');\r\n }\r\n\r\n get pickCount(): string {\r\n return this.picks.length ? this.picks.length + ' selected' : 'None selected';\r\n }\r\n\r\n get allPicked(): boolean {\r\n const list = this.pickables;\r\n return list.length > 0 && list.every(a => this.picks.includes(a.id));\r\n }\r\n\r\n get allLabel(): string {\r\n return this.pickQuery.trim() ? 'Select all matches' : 'Select all audits';\r\n }\r\n\r\n get ready(): boolean {\r\n return !!this.name.trim() && (this.picks.length > 0 || this.openAudits);\r\n }\r\n\r\n isPicked(a: ScheduleAudit): boolean {\r\n return this.picks.includes(a.id);\r\n }\r\n\r\n togglePick(a: ScheduleAudit): void {\r\n this.picks = this.isPicked(a) ? this.picks.filter(id => id !== a.id) : [...this.picks, a.id];\r\n this.loadTemplate();\r\n }\r\n\r\n toggleAllPicks(): void {\r\n const ids = this.pickables.map(a => a.id);\r\n this.picks = this.allPicked\r\n ? this.picks.filter(id => !ids.includes(id))\r\n : Array.from(new Set([...this.picks, ...ids]));\r\n this.loadTemplate();\r\n }\r\n\r\n /**\r\n * Why Import from CSV / Add a single row are off; shown as their tooltip. The buttons are not\r\n * [disabled] (a disabled button shows no tooltip), so their handlers ignore clicks until ready.\r\n */\r\n get notReadyReason(): string {\r\n if (!this.name.trim()) { return 'Enter a schedule name first'; }\r\n return this.picks.length || this.openAudits ? '' : 'Pick at least one audit first';\r\n }\r\n\r\n addSingle(): void {\r\n if (!this.ready) { return; }\r\n this.rows = [...this.rows, this.row()];\r\n this.step = 'rows';\r\n this.toast.getSuccessToast('Row added — fill in user, store and date');\r\n }\r\n\r\n importCsv(): void {\r\n if (!this.ready) { return; }\r\n this.csvInput?.nativeElement.click();\r\n }\r\n\r\n onCsvPicked(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n const file = input.files?.[0];\r\n input.value = '';\r\n if (!file) { return; }\r\n // The downloaded template is xlsx (store and audit dropdowns); a CSV still imports.\r\n const isExcel = /.xlsx?$/i.test(file.name);\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n let table: string[][];\r\n try {\r\n table = isExcel ? sheetTable(reader.result as ArrayBuffer) : parseCsv(String(reader.result || ''));\r\n } catch (e) {\r\n this.toast.getErrorToast('Could not read ' + file.name + '. Use the downloaded template (.xlsx) or a CSV.');\r\n return;\r\n }\r\n const added = this.rowsFromTable(table);\r\n if (!added.length) {\r\n this.toast.getErrorToast('No rows found. Use the template: Date, User email, Store name, Audit, Visit start, Visit end');\r\n return;\r\n }\r\n this.rows = [...this.rows, ...added];\r\n this.regroup();\r\n this.publishProblem = '';\r\n this.step = 'rows';\r\n this.toast.getSuccessToast(added.length + (added.length === 1 ? ' row imported' : ' rows imported') + ' from ' + file.name);\r\n this.cd.detectChanges();\r\n // As the v1 checklist upload: emails in the file with no user yet are offered for invite (once users have loaded).\r\n this.peopleReady$.pipe(take(1), takeUntil(this.destroy$)).subscribe(() => {\r\n const fresh = this.newUserEmails(added);\r\n if (fresh.length) { this.openInvite(fresh); }\r\n });\r\n };\r\n if (isExcel) { reader.readAsArrayBuffer(file); } else { reader.readAsText(file); }\r\n }\r\n\r\n // ---- invite new users -------------------------------------------------------------------\r\n\r\n /** Well-formed emails of these rows that are no active user of the client (once the users have loaded). */\r\n newUserEmails(rows: EditorRow[] = this.rows): string[] {\r\n if (!this.users.length) { return []; }\r\n const emails = rows.map(r => r.userEmail.trim().toLowerCase()).filter(e => EMAIL.test(e) && !this.userEmails.has(e));\r\n return Array.from(new Set(emails));\r\n }\r\n\r\n /** The row's visit has an email that could be invited (shown as Invite user under the row). */\r\n inviteable(row: EditorRow): boolean {\r\n return this.newUserEmails(this.groupRows(row)).length > 0;\r\n }\r\n\r\n openInvite(emails: string[]): void {\r\n if (!emails.length) { return; }\r\n this.closePicker();\r\n this.inviteEmails = emails;\r\n this.invitePicked = new Set(emails);\r\n this.inviteOpen = true;\r\n this.cd.detectChanges();\r\n }\r\n\r\n closeInvite(): void {\r\n if (this.inviting) { return; }\r\n this.inviteOpen = false;\r\n }\r\n\r\n toggleInvite(email: string): void {\r\n if (this.invitePicked.has(email)) { this.invitePicked.delete(email); } else { this.invitePicked.add(email); }\r\n }\r\n\r\n get allInvitePicked(): boolean {\r\n return this.inviteEmails.length > 0 && this.inviteEmails.every(e => this.invitePicked.has(e));\r\n }\r\n\r\n toggleAllInvite(): void {\r\n this.invitePicked = this.allInvitePicked ? new Set() : new Set(this.inviteEmails);\r\n }\r\n\r\n /**\r\n * Invite Selected: the API creates each picked email as a user of the client (role user, as v1 does), named by the\r\n * part before the @. Invited emails join the user list, so their rows pass; the rest are named in a toast.\r\n */\r\n inviteSelected(): void {\r\n const emails = this.inviteEmails.filter(e => this.invitePicked.has(e));\r\n if (!emails.length || this.inviting) { return; }\r\n this.inviting = true;\r\n const users = emails.map(email => ({ email, userName: email.split('@')[0] }));\r\n this.traxService.auditScheduleInvite({ clientId: this.clientId, users }).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (res: any) => {\r\n this.inviting = false;\r\n if (res?.code !== 200) {\r\n this.toast.getErrorToast('Could not invite the users — try again');\r\n return;\r\n }\r\n const invited: Array<{ email: string; userName: string }> = res.data?.invited || [];\r\n const skipped: Array<{ email: string; reason: string }> = res.data?.skipped || [];\r\n // Already active here (e.g. added in Manage > Users meanwhile) counts as usable too.\r\n const usable = [\r\n ...invited.map(u => ({ email: u.email, name: u.userName || '' })),\r\n ...skipped.filter(s => s.reason === 'active').map(s => ({ email: s.email, name: '' }))\r\n ];\r\n usable.forEach(u => {\r\n if (this.userEmails.has(u.email)) { return; }\r\n this.users = [...this.users, u];\r\n this.userEmails.add(u.email);\r\n this.userByEmail.set(u.email, u);\r\n });\r\n if (invited.length) {\r\n this.toast.getSuccessToast(invited.length + (invited.length === 1 ? ' user invited' : ' users invited'));\r\n }\r\n const blocked = skipped.filter(s => s.reason !== 'active');\r\n if (blocked.length) {\r\n this.toast.getErrorToast(blocked.map(s => s.email + ' — ' + (INVITE_REASONS[s.reason] || s.reason)).join('; '));\r\n }\r\n // What a refused publish said about these users is out of date now.\r\n this.rows.filter(r => this.userEmails.has(r.userEmail.trim().toLowerCase())).forEach(r => this.serverErrors.delete(r.key + '|userEmail'));\r\n this.inviteOpen = false;\r\n this.publishProblem = '';\r\n this.check$.next();\r\n this.cd.detectChanges();\r\n },\r\n error: () => {\r\n this.inviting = false;\r\n this.toast.getErrorToast('Could not invite the users — try again');\r\n this.cd.detectChanges();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Builds the template rows for the picked audits from their assignments: one row per assigned\r\n * store (or user, for user-coverage audits) with its user email, dated tomorrow. An audit with no\r\n * single store / user assigned yet gets one row with only its Audit cell filled (skipped on import\r\n * if left that way). Rebuilt whenever the picks change.\r\n */\r\n private loadTemplate(onReady?: () => void): void {\r\n const audits = this.offeredAudits;\r\n const key = audits.map(a => a.id).join(',');\r\n if (!audits.length) {\r\n this.templateFor = key;\r\n this.templateLines = [];\r\n onReady?.();\r\n return;\r\n }\r\n if (key === this.templateFor && !this.templateLoading) { onReady?.(); return; }\r\n this.templateFor = key;\r\n this.templateLoading = true;\r\n // The API takes up to 50 audits a call; with every audit on offer there can be more.\r\n const ids = audits.map(a => a.id);\r\n const chunks = Array.from({ length: Math.ceil(ids.length / 50) }, (_, i) => ids.slice(i * 50, i * 50 + 50));\r\n forkJoin(chunks.map(checklistIds => this.traxService.auditScheduleTemplate({ clientId: this.clientId, checklistIds })\r\n .pipe(catchError(() => of(null))))).pipe(takeUntil(this.destroy$)).subscribe((results: any[]) => {\r\n if (key !== this.templateFor) { return; }\r\n this.templateLoading = false;\r\n const ok = results.every(res => res?.code === 200);\r\n if (!ok) {\r\n // Try again on the next pick change / download.\r\n this.templateFor = '';\r\n this.toast.getErrorToast('Could not load the assigned stores — the template lists the audits only');\r\n }\r\n // concat instead of flatMap: the library targets a lib without Array#flatMap.\r\n const rows: any[] = ok ? ([] as any[]).concat(...results.map((res: any) => res.data?.rows || [])) : [];\r\n (ok ? ([] as any[]).concat(...results.map((res: any) => res.data?.audits || [])) : []).forEach((a: any) => {\r\n if (a?.checkListId && a.start && a.end) { this.auditWindows.set(String(a.checkListId), { start: a.start, end: a.end }); }\r\n });\r\n const date = dayjs().add(1, 'day').format('DD-MM-YYYY');\r\n this.templateLines = audits.reduce((out: string[][], a) => {\r\n const mine = rows.filter(r => String(r.checkListId) === a.id);\r\n // Stores by name: the store code is not shown or asked for anywhere in the editor.\r\n // Visit start / end stay blank: the window is optional, and blank means the store's open - close time.\r\n return out.concat(mine.length\r\n ? mine.map(r => [date, r.userEmail || '', r.storeName || this.storeLabel(r.storeId) || r.storeId || '', a.name, '', ''])\r\n : [['', '', '', a.name, '', '']]);\r\n }, []);\r\n this.cd.detectChanges();\r\n onReady?.();\r\n });\r\n }\r\n\r\n /** The sample panel: the first template rows, exactly as they will be in the file. */\r\n get previewRows(): { date: string; email: string; store: string; audit: string }[] {\r\n return this.templateLines.slice(0, this.previewLimit)\r\n .map(l => ({ date: l[0] || '—', email: l[1] || '—', store: l[2] || '—', audit: l[3] || '—' }));\r\n }\r\n\r\n get previewMore(): number {\r\n return Math.max(0, this.templateLines.length - this.previewLimit);\r\n }\r\n\r\n /** Picked audits that have no single store / user assigned yet (their row holds only the audit name). */\r\n get unassignedAudits(): string[] {\r\n return this.templateLines.filter(l => !l[1] && !l[2]).map(l => l[3]);\r\n }\r\n\r\n /**\r\n * Download template. A blank Create schedule (every audit on offer, none picked) gets an empty sheet: headers only,\r\n * with the Store name and Audit dropdowns on every row (QA 10 Oct: it listed every audit's assignments). With audits\r\n * picked, the rows the sample panel shows: those audits' assigned stores / users (fetched first if the picks changed).\r\n */\r\n downloadTemplate(event: Event): void {\r\n event.preventDefault();\r\n if (this.templateLoading || this.templateWaiting) { return; }\r\n const head = ['Date', 'User email', 'Store name', 'Audit', 'Visit start', 'Visit end'];\r\n if (this.openAudits) {\r\n this.downloadXlsx('schedule-template.xlsx', [head, TEMPLATE_HINTS]);\r\n return;\r\n }\r\n this.loadTemplate(() => {\r\n // A row built before the store list arrived may hold a store id; write its name now. Rows that would hold only\r\n // an audit name are left out: the Audit column is a dropdown, so any audit can be picked on an empty row.\r\n const lines = this.templateLines.filter(l => l[1] || l[2]).map(l => [l[0], l[1], this.storeLabel(l[2]) || l[2], ...l.slice(3)]);\r\n this.downloadXlsx('schedule-template.xlsx', [head, TEMPLATE_HINTS, ...lines]);\r\n });\r\n }\r\n\r\n // ---- rows step --------------------------------------------------------------------------\r\n\r\n private row(init: Partial<EditorRow> = {}): EditorRow {\r\n const onlyAudit = this.picks.length === 1 ? this.picks[0] : '';\r\n const key = this.nextKey++;\r\n return {\r\n key, date: '', userEmail: '', storeId: '', storeText: '', checkListId: onlyAudit, start: '', end: '', selected: false,\r\n group: key,\r\n ...init\r\n };\r\n }\r\n\r\n /** Same visit except the audit: date, user, store and window (all of date, user and store given). */\r\n private visitGroupKey(r: EditorRow): string {\r\n if (!r.date || !r.userEmail.trim() || !(r.storeId.trim() || r.storeText.trim())) { return ''; }\r\n return [r.date, r.userEmail.trim().toLowerCase(), r.storeId.trim() || r.storeText.trim().toLowerCase(), r.start || '', r.end || ''].join('|');\r\n }\r\n\r\n /** Loaded / imported rows of one visit join one group (the first such row's), so they show as one row. */\r\n private regroup(): void {\r\n const first = new Map<string, number>();\r\n // Audits already in each group: a repeated audit stays its own (red) row instead of hiding in the group.\r\n const audits = new Map<number, Set<string>>();\r\n this.rows.forEach(r => {\r\n const k = this.visitGroupKey(r);\r\n if (!k) { return; }\r\n const g = first.get(k);\r\n if (g !== undefined && !(r.checkListId && audits.get(g)?.has(r.checkListId))) { r.group = g; }\r\n else if (g === undefined) { first.set(k, r.group); }\r\n const set = audits.get(r.group) || new Set<string>();\r\n if (r.checkListId) { set.add(r.checkListId); }\r\n audits.set(r.group, set);\r\n });\r\n }\r\n\r\n /**\r\n * After a picked user / store or a changed date / window: a row that now is the same visit as another row joins\r\n * that row (QA 10 Oct: one record per visit, its audits in the dropdown), as loaded and imported rows do. Only on\r\n * those finished choices, never while typing, so a cell being typed in never disappears.\r\n */\r\n private mergeVisit(row: EditorRow): boolean {\r\n const key = this.visitGroupKey(row);\r\n if (!key) { return false; }\r\n const target = this.rows.find(r => r.group !== row.group && this.visitGroupKey(r) === key);\r\n if (!target) { return false; }\r\n const mine = this.groupRows(row);\r\n const theirs = this.groupRows(target);\r\n // An audit the visit already has stays its own (red) row, so the duplicate is seen and can be deleted.\r\n if (mine.some(m => m.checkListId && theirs.some(t => t.checkListId === m.checkListId))) { return false; }\r\n mine.forEach(m => m.group = target.group);\r\n this.toast.getSuccessToast('Added to the existing row for this visit (same date, user, store and window)');\r\n return true;\r\n }\r\n\r\n /** Every row (audit) of this row's visit group. */\r\n groupRows(row: EditorRow): EditorRow[] {\r\n return this.rows.filter(r => r.group === row.group);\r\n }\r\n\r\n /** The Audit assigned cell: every audit of the group, by name. */\r\n groupAuditLabel(row: EditorRow): string {\r\n return this.groupAuditNames(row).join(', ');\r\n }\r\n\r\n /** The group's audit names, in row order (each audit once). */\r\n private groupAuditNames(row: EditorRow): string[] {\r\n return Array.from(new Set(this.groupRows(row).map(r => this.auditName(r.checkListId)).filter(Boolean)));\r\n }\r\n\r\n /** The cell shows the first audit by name and the rest as a \"+N\" chip (prototype). */\r\n groupAuditFirst(row: EditorRow): string {\r\n return this.groupAuditNames(row)[0] || '';\r\n }\r\n\r\n groupAuditMore(row: EditorRow): number {\r\n return Math.max(0, this.groupAuditNames(row).length - 1);\r\n }\r\n\r\n /** Shown rows (visit groups), whatever number of audits each holds. */\r\n get groupCount(): number {\r\n return new Set(this.rows.map(r => r.group)).size;\r\n }\r\n\r\n /** The row's date, user, store and window go to the other audits of its group (they are one visit). */\r\n private syncGroup(row: EditorRow): void {\r\n this.rows.forEach(r => {\r\n if (r === row || r.group !== row.group) { return; }\r\n r.date = row.date;\r\n r.userEmail = row.userEmail;\r\n r.storeId = row.storeId;\r\n r.storeText = row.storeText;\r\n r.start = row.start;\r\n r.end = row.end;\r\n });\r\n }\r\n\r\n get pickedAudits(): ScheduleAudit[] {\r\n return this.allAudits.filter(a => this.picks.includes(a.id));\r\n }\r\n\r\n /**\r\n * Create schedule opened blank (no audit passed in) while the audit picker is hidden: nothing can be\r\n * picked up front, so every audit is on offer (template, row picker) and the rows decide the picks (QA 9 Oct).\r\n */\r\n get openAudits(): boolean {\r\n return !this.showAuditPicker && !this.locked && !this.scheduleId && !this.preselect.length;\r\n }\r\n\r\n /** Audits the template lists and a row can pick. */\r\n get offeredAudits(): ScheduleAudit[] {\r\n return this.openAudits ? this.allAudits : this.pickedAudits;\r\n }\r\n\r\n /**\r\n * The Audit assigned list (every row, always shown): every published audit of the client, plus any the schedule\r\n * already uses (picked or on a row), so an existing row keeps its name (QA 9 Oct: list by publish state). A row\r\n * may name an audit outside the schedule's picks; saving adds it (save()).\r\n */\r\n get rowAuditOptions(): ScheduleAudit[] {\r\n const used = new Set([...this.picks, ...this.rows.map(r => r.checkListId)].filter(Boolean));\r\n return this.allAudits.filter(a => a.publish !== false || used.has(a.id));\r\n }\r\n\r\n /** Search text of the open Audit assigned picker. */\r\n auditQuery = '';\r\n\r\n auditMatches(): ScheduleAudit[] {\r\n const q = this.auditQuery.trim().toLowerCase();\r\n return this.rowAuditOptions.filter(a => !q || a.name.toLowerCase().includes(q));\r\n }\r\n\r\n /**\r\n * Rows for the same visit except the audit: date, user, store and window. The Audit assigned picker is a\r\n * multi-select over such a group, one row per audit, so each row is still one visit (as the API takes it).\r\n */\r\n private auditGroup(row: EditorRow): EditorRow[] {\r\n return this.groupRows(row);\r\n }\r\n\r\n auditTicked(row: EditorRow, a: ScheduleAudit): boolean {\r\n return this.auditGroup(row).some(r => r.checkListId === a.id);\r\n }\r\n\r\n /** Audits picked for this row's visit (its group), for the picker's footer. */\r\n auditTickCount(row: EditorRow): number {\r\n return new Set(this.auditGroup(row).map(r => r.checkListId).filter(Boolean)).size;\r\n }\r\n\r\n /**\r\n * Multi-select: ticking another audit adds a row for it right after the group (same date, user, store and\r\n * window); unticking removes that audit's row (the last one left is cleared instead). The menu stays open.\r\n */\r\n toggleAudit(row: EditorRow, a: ScheduleAudit, event: Event): void {\r\n event.stopPropagation();\r\n const group = this.auditGroup(row);\r\n const owner = group.find(r => r.checkListId === a.id);\r\n if (owner) {\r\n if (group.length === 1) {\r\n owner.checkListId = '';\r\n this.touch(owner, 'checkListId');\r\n } else {\r\n if (owner.key === this.openCell?.key) { this.closePicker(); }\r\n this.rows = this.rows.filter(r => r !== owner);\r\n // Unticking the audit that clashed with another row of the same visit: the rest joins that row (QA 11 Oct).\r\n const rest = this.rows.find(r => r.group === owner.group);\r\n if (rest && this.mergeVisit(rest)) { this.closePicker(); }\r\n }\r\n return;\r\n }\r\n if (!this.picks.includes(a.id)) { this.picks = [...this.picks, a.id]; }\r\n if (!row.checkListId) {\r\n row.checkListId = a.id;\r\n this.touch(row, 'checkListId');\r\n return;\r\n }\r\n const added = this.row({ date: row.date, userEmail: row.userEmail, storeId: row.storeId, storeText: row.storeText, checkListId: a.id, start: row.start, end: row.end, group: row.group });\r\n const at = Math.max(...group.map(r => this.rows.indexOf(r))) + 1;\r\n this.rows = [...this.rows.slice(0, at), added, ...this.rows.slice(at)];\r\n this.touch(added, 'checkListId');\r\n }\r\n\r\n /** One row per visit group (its first row); the search reads every audit of the group. */\r\n get shownRows(): EditorRow[] {\r\n const q = this.rowQuery.trim().toLowerCase();\r\n const seen = new Set<number>();\r\n return this.rows.filter(r => {\r\n if (seen.has(r.group)) { return false; }\r\n seen.add(r.group);\r\n return !q || (r.date + ' ' + r.userEmail + ' ' + r.storeText + ' ' + this.groupAuditLabel(r)).toLowerCase().includes(q);\r\n });\r\n }\r\n\r\n get badRows(): number {\r\n return this.rows.filter(r => this.rowInvalid(r)).length;\r\n }\r\n\r\n get canPublish(): boolean {\r\n return this.rows.length > 0 && this.badRows === 0 && !this.saving;\r\n }\r\n\r\n /**\r\n * The banner above the rows is green only when the rows pass every check here (past dates\r\n * included) and the API did not just refuse to publish them.\r\n */\r\n get readyOk(): boolean {\r\n return this.canPublish && !this.publishProblem;\r\n }\r\n\r\n get readyLabel(): string {\r\n if (this.canPublish && this.publishProblem) {\r\n return 'Not published — ' + this.publishProblem;\r\n }\r\n if (this.canPublish) {\r\n const total = this.groupCount;\r\n return 'Ready to publish — ' + total + (total === 1 ? ' row' : ' rows') + ' will raise ' + this.rows.length\r\n + (this.rows.length === 1 ? ' visit' : ' visits');\r\n }\r\n if (!this.rows.length) { return 'Add at least one row before publishing'; }\r\n const n = this.badRows;\r\n const first = this.firstProblem;\r\n return n + (n === 1 ? ' row needs' : ' rows need') + ' a fix (missing, wrong or past value, or a repeated assignment)'\r\n + (first ? ' — row ' + first.row + ': ' + first.message : '');\r\n }\r\n\r\n /** The first problem in the rows (1-based position in the whole list), for the banner above the table. */\r\n get firstProblem(): { row: number; message: string } | null {\r\n const fields: RowField[] = ['date', 'userEmail', 'storeId', 'checkListId', 'window'];\r\n for (let i = 0; i < this.rows.length; i++) {\r\n for (const f of fields) {\r\n const message = this.cellError(this.rows[i], f);\r\n if (message) { return { row: i + 1, message }; }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n get metrics(): Array<{ label: string; value: number }> {\r\n const uniq = (list: string[]) => new Set(list.filter(Boolean)).size;\r\n return [\r\n { label: 'Rows', value: this.groupCount },\r\n { label: 'Users', value: uniq(this.rows.map(r => r.userEmail)) },\r\n { label: 'Stores', value: uniq(this.rows.map(r => r.storeId)) },\r\n { label: 'Audits', value: uniq(this.rows.map(r => r.checkListId)) }\r\n ];\r\n }\r\n\r\n get selectedCount(): number {\r\n return this.rows.filter(r => r.selected).length;\r\n }\r\n\r\n /** Selected shown rows (a row's checkbox selects every audit of its group). */\r\n get selectedGroups(): number {\r\n return new Set(this.rows.filter(r => r.selected).map(r => r.group)).size;\r\n }\r\n\r\n get selectionLabel(): string {\r\n const n = this.selectedGroups;\r\n const total = this.groupCount;\r\n return n\r\n ? n + ' of ' + total + ' rows selected'\r\n : total + (total === 1 ? ' row' : ' rows') + ' in this schedule';\r\n }\r\n\r\n /** Rows the header checkbox acts on: past (locked) rows cannot be selected. */\r\n private get selectableRows(): EditorRow[] {\r\n return this.shownRows.filter(r => !this.isLocked(r));\r\n }\r\n\r\n get allRowsSelected(): boolean {\r\n const rows = this.selectableRows;\r\n return rows.length > 0 && rows.every(r => r.selected);\r\n }\r\n\r\n toggleAllRows(): void {\r\n const on = !this.allRowsSelected;\r\n this.selectableRows.forEach(r => this.groupRows(r).forEach(m => m.selected = on));\r\n }\r\n\r\n /** A shown row's checkbox selects every audit of its group; a past (locked) row cannot be selected. */\r\n toggleRow(row: EditorRow): void {\r\n if (this.isLocked(row)) { return; }\r\n const on = !row.selected;\r\n this.groupRows(row).forEach(m => m.selected = on);\r\n }\r\n\r\n addRow(): void {\r\n this.rows = [...this.rows, this.row()];\r\n this.publishProblem = '';\r\n }\r\n\r\n /** A row (visit) that can no longer be edited or deleted (QA 11 Oct: no editing older dates). */\r\n isLocked(row: EditorRow): boolean {\r\n return this.lockedKeys.has(row.key);\r\n }\r\n\r\n /** The shown row is the visit: every audit of its group goes. */\r\n deleteRow(row: EditorRow): void {\r\n if (this.isLocked(row)) { return; }\r\n this.rows = this.rows.filter(r => r.group !== row.group);\r\n this.publishProblem = '';\r\n }\r\n\r\n duplicateSelected(): void {\r\n // A copied group stays one group (a new one).\r\n const groups = new Map<number, number>();\r\n const copies = this.rows.filter(r => r.selected).map(r => {\r\n const copy = this.row({\r\n date: r.date, userEmail: r.userEmail, storeId: r.storeId, storeText: r.storeText, checkListId: r.checkListId, start: r.start, end: r.end\r\n });\r\n if (groups.has(r.group)) { copy.group = groups.get(r.group)!; } else { groups.set(r.group, copy.group); }\r\n return copy;\r\n });\r\n if (!copies.length) { return; }\r\n this.rows.forEach(r => r.selected = false);\r\n this.rows = [...this.rows, ...copies];\r\n this.toast.getSuccessToast(groups.size + (groups.size === 1 ? ' row duplicated' : ' rows duplicated'));\r\n }\r\n\r\n deleteSelected(): void {\r\n const n = this.selectedGroups;\r\n if (!n) { return; }\r\n // Past rows of a published schedule stay (isLocked); the rest of the selection goes.\r\n const kept = new Set(this.rows.filter(r => r.selected && this.isLocked(r)).map(r => r.group)).size;\r\n this.rows = this.rows.filter(r => !r.selected || this.isLocked(r));\r\n this.rows.forEach(r => r.selected = false);\r\n this.publishProblem = '';\r\n const gone = n - kept;\r\n if (gone) { this.toast.getSuccessToast(gone + (gone === 1 ? ' row deleted' : ' rows deleted')); }\r\n if (kept) { this.toast.getErrorToast(kept + (kept === 1 ? ' past row was' : ' past rows were') + ' kept: visits already raised cannot be deleted'); }\r\n }\r\n\r\n backToCreate(event: Event): void {\r\n event.preventDefault();\r\n this.step = 'create';\r\n }\r\n\r\n back(event?: Event): void {\r\n event?.preventDefault();\r\n this.closed.emit(false);\r\n }\r\n\r\n /** Editing a cell clears what the API said about it. */\r\n touch(row: EditorRow, field: RowField): void {\r\n if (field !== 'checkListId') { this.syncGroup(row); }\r\n this.serverErrors.delete(row.key + '|' + field);\r\n // A repeated user / store is a matter of date and window too: changing either may fix it.\r\n if (field === 'date' || field === 'window') {\r\n this.serverErrors.delete(row.key + '|userEmail');\r\n this.serverErrors.delete(row.key + '|storeId');\r\n // A window merges only once both times are set (a half-typed time is not a window yet).\r\n if (field === 'date' || (row.start && row.end)) { this.mergeVisit(row); }\r\n }\r\n this.publishProblem = '';\r\n }\r\n\r\n // ---- validation -------------------------------------------------------------------------\r\n\r\n cellError(row: EditorRow, field: RowField): string {\r\n const server = this.serverErrors.get(row.key + '|' + field);\r\n if (server) { return server; }\r\n switch (field) {\r\n case 'date':\r\n if (!row.date) { return 'Pick a date'; }\r\n // Past dates cannot be published (QA); rows a published schedule already raised stay.\r\n return row.date < this.today && !this.raisedKeys.has(this.visitKey(row)) ? 'Date is in the past — pick today or a later date' : '';\r\n case 'userEmail':\r\n if (!row.userEmail.trim()) { return 'Pick a user'; }\r\n if (this.users.length && !this.userEmails.has(row.userEmail.trim().toLowerCase())) { return 'No active user with this email'; }\r\n return this.dupErrors.get(row.key + '|userEmail') || this.liveErrors.get(row.key + '|userEmail') || '';\r\n case 'storeId':\r\n // Stores are picked by name; the store id is resolved behind the scenes and never asked for.\r\n if (!row.storeText.trim() && !row.storeId.trim()) { return 'Pick a store'; }\r\n if (this.stores.length && !this.storeIds.has(row.storeId.trim())) { return 'No active store named “' + row.storeText.trim() + '”'; }\r\n return this.dupErrors.get(row.key + '|storeId') || this.liveErrors.get(row.key + '|storeId') || '';\r\n case 'checkListId':\r\n // Any audit a row picks joins the schedule's audits on save (QA 10 Oct), so only a missing one is flagged.\r\n return !row.checkListId ? 'Pick an audit' : '';\r\n default:\r\n // The visit window is optional (QA 10 Oct): left blank, the API raises the visit with the store's open - close\r\n // time (10:00 - 22:00 when the store has none). Given, it needs both times, ending after it starts.\r\n if (!row.start && !row.end) { return ''; }\r\n if (!row.start || !row.end) { return 'Pick both the start and the end time, or leave both blank'; }\r\n if (row.start && row.end && row.start >= row.end) { return 'Window must end after it starts'; }\r\n // A row for today whose own window is already over could only be missed. (A blank window\r\n // uses the audit's time frame, which the API checks.)\r\n if (row.date === this.today && row.end && row.end <= dayjs().format('HH:mm') && !this.raisedKeys.has(this.visitKey(row))) {\r\n return 'This window ended at ' + row.end + ' today — pick a later end time or date';\r\n }\r\n return this.dupErrors.get(row.key + '|window') || this.liveErrors.get(row.key + '|window') || '';\r\n }\r\n }\r\n\r\n /** Today on this device (YYYY-MM-DD): the first date a new row may have. */\r\n get today(): string {\r\n return dayjs().format('YYYY-MM-DD');\r\n }\r\n\r\n /** A row as a visit: audit, store, date, user and window (the API's rowVisitKey). */\r\n private visitKey(r: EditorRow): string {\r\n return [r.checkListId, r.storeId.trim(), r.date, r.userEmail.trim().toLowerCase(), r.start || '', r.end || ''].join('|');\r\n }\r\n\r\n /** What is wrong with a row, one line per problem: shown in red under the row (a red cell alone does not say why). */\r\n rowMessages(row: EditorRow): string[] {\r\n const out: string[] = [];\r\n const group = this.groupRows(row);\r\n group.forEach(r => {\r\n (['date', 'userEmail', 'storeId', 'checkListId', 'window'] as RowField[]).forEach(f => {\r\n const m = this.cellError(r, f);\r\n // An audit's own problem says which audit, when the row holds several (unless the message names it already).\r\n const name = r.checkListId ? this.auditName(r.checkListId) : '';\r\n const text = m && group.length > 1 && (f === 'checkListId' || f === 'userEmail' || f === 'storeId') && name\r\n && !m.includes('\"' + name + '\"')\r\n ? name + ': ' + m : m;\r\n if (text && !out.includes(text)) { out.push(text); }\r\n });\r\n });\r\n return out;\r\n }\r\n\r\n /** Hints under the row (grey): allowed, shown so the user knows. Every audit of the group. */\r\n rowHints(row: EditorRow): string[] {\r\n const out: string[] = [];\r\n const group = this.groupRows(row);\r\n group.forEach(r => (this.liveWarnings.get(r.key) || []).forEach(m => {\r\n const text = group.length > 1 && r.checkListId ? this.auditName(r.checkListId) + ': ' + m : m;\r\n if (!out.includes(text)) { out.push(text); }\r\n }));\r\n return out;\r\n }\r\n\r\n private rowInvalid(row: EditorRow): boolean {\r\n return (['date', 'userEmail', 'storeId', 'checkListId', 'window'] as RowField[]).some(f => !!this.cellError(row, f));\r\n }\r\n\r\n /**\r\n * The window a row's visit gets: its own times, or the audit's time frame when it leaves them\r\n * blank (the API raises it the same way; 10:00–22:00 when the audit has none).\r\n */\r\n /** A row's visit window; blank = 10:00 AM - 10:00 PM, as the API raises it (QA 10 Oct). */\r\n private rowWindow(r: EditorRow): string {\r\n return r.start && r.end ? r.start + '-' + r.end : '10:00-22:00';\r\n }\r\n\r\n /**\r\n * A store gets one visit of an audit per date and visit window: a later row repeating it is flagged on its store\r\n * cell. The same user at another store (or before a store is picked) is not a duplicate (QA 11 Oct). Blank windows\r\n * are 10:00 AM - 10:00 PM, so blank rows of one store clash. Same messages as the API, which also checks the\r\n * client's other published schedules (as a hint).\r\n */\r\n private findDuplicates(): Map<string, string> {\r\n const out = new Map<string, string>();\r\n const firstEmail = new Map<string, string>();\r\n // Visit windows are not compared across stores (QA 10 Oct): only each row's own start / end are checked (cellError).\r\n this.rows.forEach(r => {\r\n const store = r.storeId.trim();\r\n if (!r.date || !r.checkListId || !store) { return; }\r\n // A half-filled or reversed window has its own error; it is not compared until fixed.\r\n if (!!r.start !== !!r.end || (r.start && r.end && r.start >= r.end)) { return; }\r\n const email = r.userEmail.trim().toLowerCase();\r\n const slot = r.checkListId + '|' + r.date + '|' + this.rowWindow(r) + '|' + store;\r\n if (firstEmail.has(slot)) {\r\n // Names the audit (QA 11 Oct), as the API's message does.\r\n const audit = this.auditName(r.checkListId);\r\n const who = email && firstEmail.get(slot) === email ? 'This user and store already have the ' : 'This store already has the ';\r\n out.set(r.key + '|storeId', who + (audit ? '\"' + audit + '\"' : 'this') + ' audit scheduled for this date and visit window in another row');\r\n } else {\r\n firstEmail.set(slot, email);\r\n }\r\n });\r\n return out;\r\n }\r\n\r\n // ---- pickers ----------------------------------------------------------------------------\r\n\r\n openPicker(row: EditorRow, field: PickCell, event: Event): void {\r\n event.stopPropagation();\r\n const anchor = event.currentTarget as HTMLElement;\r\n if (this.isOpen(row, field) && event.type === 'click' && field === 'checkListId') {\r\n this.closePicker();\r\n return;\r\n }\r\n const reopen = !this.isOpen(row, field);\r\n this.openCell = { key: row.key, field };\r\n this.menuAnchor = anchor;\r\n if (reopen && field === 'checkListId') {\r\n this.auditQuery = '';\r\n setTimeout(() => (document.querySelector('.se-menu .se-menu-search input') as HTMLInputElement | null)?.focus());\r\n }\r\n if (reopen) { this.activeIndex = this.selectedIndex(row, field); }\r\n this.placeMenu();\r\n }\r\n\r\n closePicker(): void {\r\n this.openCell = null;\r\n this.menuAnchor = null;\r\n }\r\n\r\n /** Below the cell, or above it when the viewport has no room underneath. */\r\n placeMenu(): void {\r\n if (!this.menuAnchor) { return; }\r\n const r = this.menuAnchor.getBoundingClientRect();\r\n const room = window.innerHeight - r.bottom;\r\n const up = room < 300 && r.top > room;\r\n this.menuPos = {\r\n top: up ? null : Math.round(r.bottom + 4),\r\n bottom: up ? Math.round(window.innerHeight - r.top + 4) : null,\r\n left: Math.round(r.left),\r\n width: Math.round(r.width)\r\n };\r\n }\r\n\r\n isOpen(row: EditorRow, field: PickCell): boolean {\r\n return this.openCell?.key === row.key && this.openCell?.field === field;\r\n }\r\n\r\n userMatches(row: EditorRow): PickUser[] {\r\n const q = row.userEmail.trim().toLowerCase();\r\n return this.users.filter(u => !q || u.email.includes(q) || u.name.toLowerCase().includes(q));\r\n }\r\n\r\n userSuggestions(row: EditorRow): PickUser[] {\r\n return this.userMatches(row).slice(0, this.pickLimit);\r\n }\r\n\r\n storeMatches(row: EditorRow): PickStore[] {\r\n const q = row.storeText.trim().toLowerCase();\r\n return this.stores.filter(s => !q || s.storeId.toLowerCase().includes(q) || s.storeName.toLowerCase().includes(q) || s.city.toLowerCase().includes(q));\r\n }\r\n\r\n storeSuggestions(row: EditorRow): PickStore[] {\r\n return this.storeMatches(row).slice(0, this.pickLimit);\r\n }\r\n\r\n /** \"Showing 30 of 3,390 stores\" when the list is cut; empty when everything fits. */\r\n moreLabel(shown: number, total: number, noun: string): string {\r\n return total > shown ? 'Showing ' + shown + ' of ' + total.toLocaleString() + ' ' + noun + ' · type to narrow' : '';\r\n }\r\n\r\n private optionCount(row: EditorRow, field: PickCell): number {\r\n if (field === 'userEmail') { return this.userSuggestions(row).length; }\r\n if (field === 'storeId') { return this.storeSuggestions(row).length; }\r\n return this.auditMatches().length;\r\n }\r\n\r\n private selectedIndex(row: EditorRow, field: PickCell): number {\r\n let i = -1;\r\n if (field === 'userEmail') { i = this.userSuggestions(row).findIndex(u => u.email === row.userEmail.trim().toLowerCase()); }\r\n if (field === 'storeId') { i = this.storeSuggestions(row).findIndex(s => s.storeId === row.storeId.trim()); }\r\n if (field === 'checkListId') { i = this.auditMatches().findIndex(a => a.id === row.checkListId); }\r\n return Math.max(i, 0);\r\n }\r\n\r\n /** Arrow keys move through the options, Enter picks, Escape closes. */\r\n onPickerKey(row: EditorRow, field: PickCell, event: KeyboardEvent): void {\r\n if (event.key === 'Escape') { this.closePicker(); return; }\r\n if (!this.isOpen(row, field)) {\r\n if (event.key === 'ArrowDown') { this.openPicker(row, field, event); event.preventDefault(); }\r\n return;\r\n }\r\n const count = this.optionCount(row, field);\r\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n if (!count) { return; }\r\n this.activeIndex = (this.activeIndex + (event.key === 'ArrowDown' ? 1 : -1) + count) % count;\r\n setTimeout(() => document.querySelector('.se-menu .se-opt.is-active')?.scrollIntoView({ block: 'nearest' }));\r\n } else if (event.key === 'Enter') {\r\n event.preventDefault();\r\n if (!count) { return; }\r\n const i = Math.min(this.activeIndex, count - 1);\r\n if (field === 'userEmail') { this.pickUser(row, this.userSuggestions(row)[i], event); }\r\n else if (field === 'storeId') { this.pickStore(row, this.storeSuggestions(row)[i], event); }\r\n else { this.toggleAudit(row, this.auditMatches()[i], event); }\r\n } else if (event.key === 'Tab') {\r\n this.closePicker();\r\n }\r\n }\r\n\r\n /** Typing in a picker cell starts the highlight over at the first match. */\r\n onPickerInput(row: EditorRow, field: PickCell): void {\r\n this.touch(row, field);\r\n this.activeIndex = 0;\r\n // Typing after Escape brings the list back under the focused cell.\r\n if (!this.isOpen(row, field) && document.activeElement instanceof HTMLElement) {\r\n this.openCell = { key: row.key, field };\r\n this.menuAnchor = document.activeElement;\r\n this.placeMenu();\r\n }\r\n }\r\n\r\n pickUser(row: EditorRow, u: PickUser, event: Event): void {\r\n event.stopPropagation();\r\n row.userEmail = u.email;\r\n this.touch(row, 'userEmail');\r\n this.closePicker();\r\n this.mergeVisit(row);\r\n }\r\n\r\n pickStore(row: EditorRow, s: PickStore, event: Event): void {\r\n event.stopPropagation();\r\n row.storeId = s.storeId;\r\n row.storeText = s.storeName || s.storeId;\r\n this.touch(row, 'storeId');\r\n this.closePicker();\r\n this.mergeVisit(row);\r\n }\r\n\r\n /** Typing in the store cell: the text is the store name; it picks the store once it names one exactly. */\r\n onStoreTyped(row: EditorRow, text: string): void {\r\n row.storeText = text;\r\n row.storeId = this.storeIdFor(text);\r\n this.onPickerInput(row, 'storeId');\r\n }\r\n\r\n /** The active store a name (or, from an old template, an id) stands for; '' when none or not loaded. */\r\n private storeIdFor(text: string): string {\r\n const t = String(text || '').trim().toLowerCase();\r\n if (!t) { return ''; }\r\n const named = this.stores.filter(s => s.storeName.trim().toLowerCase() === t);\r\n if (named.length === 1) { return named[0].storeId; }\r\n return this.stores.find(s => s.storeId.toLowerCase() === t)?.storeId || '';\r\n }\r\n\r\n storeLabel(storeId: string): string {\r\n return this.storeById.get(String(storeId || '').trim())?.storeName || '';\r\n }\r\n\r\n userLabel(email: string): string {\r\n return this.userByEmail.get(String(email || '').trim().toLowerCase())?.name || '';\r\n }\r\n\r\n initials(text: string): string {\r\n const parts = String(text || '').trim().split(/[\\s._@-]+/).filter(Boolean);\r\n return ((parts[0]?.[0] || '') + (parts[1]?.[0] || parts[0]?.[1] || '')).toUpperCase();\r\n }\r\n\r\n auditName(id: string): string {\r\n return this.allAudits.find(a => a.id === id)?.name || '';\r\n }\r\n\r\n trackByRow(_: number, row: EditorRow): number {\r\n return row.key;\r\n }\r\n\r\n trackByAudit(_: number, a: ScheduleAudit): string {\r\n return a.id;\r\n }\r\n\r\n // ---- save -------------------------------------------------------------------------------\r\n\r\n saveDraft(): void {\r\n this.save(false);\r\n }\r\n\r\n publish(): void {\r\n if (!this.canPublish) {\r\n this.toast.getErrorToast(this.rows.length ? 'Complete the highlighted rows first' : 'Add at least one row');\r\n return;\r\n }\r\n this.save(true);\r\n }\r\n\r\n private save(publish: boolean): void {\r\n if (this.saving) { return; }\r\n if (!this.name.trim()) { this.toast.getErrorToast('Name the schedule first'); this.step = 'create'; return; }\r\n // Every audit on offer: the schedule's audits are the ones its rows name. Otherwise the picks plus any audit a\r\n // row chose in the Audit assigned column (the API checks each row's audit against the schedule's list).\r\n const rowAudits = this.rows.map(r => r.checkListId).filter(Boolean);\r\n this.picks = Array.from(new Set(this.openAudits ? rowAudits : [...this.picks, ...rowAudits]));\r\n if (!this.picks.length) { this.toast.getErrorToast('Pick at least one audit'); this.step = 'create'; return; }\r\n this.saving = true;\r\n this.serverErrors.clear();\r\n this.publishProblem = '';\r\n const sent = [...this.rows];\r\n const body: any = {\r\n clientId: this.clientId,\r\n name: this.name.trim(),\r\n checklistIds: this.picks,\r\n // storeName lets the API find the store when the id is not resolved here (stores not loaded).\r\n rows: sent.map(r => ({\r\n date: r.date, userEmail: r.userEmail.trim().toLowerCase(), storeId: r.storeId.trim(), storeName: r.storeText.trim(),\r\n checkListId: r.checkListId || '', start: r.start, end: r.end\r\n })),\r\n publish\r\n };\r\n const call = this.scheduleId\r\n ? this.traxService.auditScheduleUpdate({ ...body, scheduleId: this.scheduleId })\r\n : this.traxService.auditScheduleCreate(body);\r\n call.pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (res: any) => {\r\n this.saving = false;\r\n if (res?.code !== 200) {\r\n this.publishProblem = publish ? res?.message || 'Could not publish the schedule' : '';\r\n this.toast.getErrorToast(res?.message || 'Could not save the schedule');\r\n this.cd.detectChanges();\r\n return;\r\n }\r\n const name = this.name.trim();\r\n if (publish) {\r\n const audits: any[] = res?.data?.audits || [];\r\n const nowLive = audits.filter(a => a.publishedNow).length;\r\n this.toast.getSuccessToast('\"' + name + '\" published · ' + sent.length + (sent.length === 1 ? ' visit' : ' visits') + ' scheduled'\r\n + (nowLive ? ' · ' + nowLive + (nowLive === 1 ? ' audit' : ' audits') + ' published' : ''));\r\n } else {\r\n this.toast.getSuccessToast('\"' + name + '\" saved as a draft');\r\n }\r\n this.closed.emit(true);\r\n },\r\n error: (e: any) => {\r\n this.saving = false;\r\n // Production sends the error object as `error`; the local dev helper sends text plus `details`.\r\n const body = e?.error || {};\r\n const err = body.error && typeof body.error === 'object'\r\n ? body.error\r\n : { ...(body.details || {}), message: body.details?.message || (typeof body.error === 'string' ? body.error : '') };\r\n // A new schedule is kept as a draft when publishing it fails; update it from now on.\r\n if (err?.scheduleId && !this.scheduleId) { this.scheduleId = String(err.scheduleId); }\r\n let marked = 0;\r\n (Array.isArray(err?.rowErrors) ? err.rowErrors : []).forEach((x: any) => {\r\n const row = sent[Number(x.row) - 1];\r\n if (row) { this.serverErrors.set(row.key + '|' + String(x.field), String(x.message || 'Check this value')); marked++; }\r\n });\r\n const message = err?.message || (typeof err === 'string' ? err : '') || 'Could not save the schedule';\r\n // A refusal that names no row (audit not ready, a visit that cannot be raised) still turns\r\n // the banner from \"Ready to publish\" to the reason, until the rows are edited.\r\n this.publishProblem = publish && !marked ? message : '';\r\n this.toast.getErrorToast(message);\r\n this.cd.detectChanges();\r\n }\r\n });\r\n }\r\n\r\n // ---- CSV --------------------------------------------------------------------------------\r\n\r\n private rowsFromTable(rows: string[][]): EditorRow[] {\r\n const table = rows.filter(r => r.some(c => String(c ?? '').trim()));\r\n if (table.length < 2) { return []; }\r\n const head = table[0].map(h => h.trim().toLowerCase());\r\n const col = (...names: string[]) => head.findIndex(h => names.some(n => h.includes(n)));\r\n const cDate = col('date');\r\n const cEmail = col('email', 'user');\r\n const cStore = col('store');\r\n const cAudit = col('audit', 'checklist');\r\n const cStart = col('start');\r\n const cEnd = col('end');\r\n const byName = new Map(this.allAudits.map(a => [a.name.trim().toLowerCase(), a.id]));\r\n const cell = (r: string[], i: number) => (i >= 0 ? String(r[i] || '').trim() : '');\r\n // Template rows still holding only their Audit name were never filled in, and the guidance row\r\n // (TEMPLATE_HINTS) is not a row: skip them.\r\n const filled = (r: string[]) => [cDate, cEmail, cStore, cStart, cEnd].some(i => cell(r, i));\r\n const hint = (r: string[]) => r.some(c => HINT_TEXTS.has(String(c ?? '').trim().toLowerCase()));\r\n return table.slice(1).filter(r => filled(r) && !hint(r)).map(r => {\r\n const auditId = byName.get(cell(r, cAudit).toLowerCase()) || '';\r\n // A row naming another audit adds it to the schedule's audits (save() does the same).\r\n if (auditId && !this.picks.includes(auditId)) { this.picks = [...this.picks, auditId]; }\r\n // The Store column holds the store name (older templates: the store id); either picks the store.\r\n const store = cell(r, cStore);\r\n const storeId = this.storeIdFor(store);\r\n return this.row({\r\n date: toIsoDate(cell(r, cDate)),\r\n userEmail: cell(r, cEmail).toLowerCase(),\r\n storeId,\r\n storeText: storeId ? (this.storeLabel(storeId) || store) : store,\r\n checkListId: auditId || (this.picks.length === 1 ? this.picks[0] : ''),\r\n start: toTime(cell(r, cStart)),\r\n end: toTime(cell(r, cEnd))\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * The template as xlsx: Store name and Audit are dropdowns of the client's stores and the audits on offer. Waits for\r\n * the store list (loaded when the editor opens), so a quick click still gets the Store name dropdown.\r\n */\r\n private downloadXlsx(fileName: string, lines: string[][]): void {\r\n this.templateWaiting = true;\r\n this.peopleReady$.pipe(take(1), takeUntil(this.destroy$)).subscribe(() => {\r\n this.templateWaiting = false;\r\n if (!this.stores.length) {\r\n this.toast.getErrorToast('Could not load the store list — Store name has no dropdown in this template');\r\n }\r\n this.writeXlsx(fileName, lines);\r\n this.cd.detectChanges();\r\n });\r\n }\r\n\r\n private writeXlsx(fileName: string, lines: string[][]): void {\r\n const stores = [...new Set(this.stores.map(s => s.storeName || s.storeId).filter(Boolean))].sort((a, b) => a.localeCompare(b));\r\n const audits = [...new Set(this.rowAuditOptions.map(a => a.name).filter(Boolean))];\r\n const blob = new Blob([scheduleTemplateXlsx(lines, stores, audits)], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = fileName;\r\n a.click();\r\n setTimeout(() => URL.revokeObjectURL(url));\r\n }\r\n\r\n private download(fileName: string, lines: string[][]): void {\r\n const csv = lines.map(l => l.map(csvCell).join(',')).join('\\r\\n');\r\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8' });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = fileName;\r\n a.click();\r\n URL.revokeObjectURL(url);\r\n }\r\n}\r\n\r\n/** A well-formed email (an email the invite can create a user for). */\r\nconst EMAIL = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n\r\n/** Why /schedule/invite left an email out (its `skipped[].reason`). */\r\nconst INVITE_REASONS: Record<string, string> = {\r\n inactive: 'inactive user, activate it in Manage > Users',\r\n otherClient: 'belongs to another client',\r\n failed: 'could not be created'\r\n};\r\n\r\n/**\r\n * Row 2 of the downloaded template: what each column takes (QA: show placeholders). Import skips a row holding\r\n * any of these texts, so it can be left in the file.\r\n */\r\nconst TEMPLATE_HINTS = [\r\n 'Please enter date (DD-MM-YYYY)',\r\n 'Please enter valid user email',\r\n 'Pick a store from the dropdown',\r\n 'Pick an audit from the dropdown',\r\n 'Optional: HH:MM, e.g. 10:00',\r\n 'Optional: HH:MM, e.g. 18:00'\r\n];\r\nconst HINT_TEXTS = new Set(TEMPLATE_HINTS.map(h => h.toLowerCase()));\r\n\r\n/** Last row the template dropdowns cover. */\r\nconst TEMPLATE_ROWS = 5000;\r\n\r\n/**\r\n * Schedule template workbook. Sheet Schedule holds the rows; Store name (C) and Audit (D) are list\r\n * dropdowns over a hidden Lists sheet (a client's thousands of store names do not fit Excel's 255-character\r\n * inline list). The community xlsx build cannot write data validation, so it is added to the sheet XML\r\n * (CT_Worksheet order: dataValidations follows sheetData), as the question template does (bulk-upload).\r\n */\r\nfunction scheduleTemplateXlsx(lines: string[][], stores: string[], audits: string[]): Uint8Array {\r\n const book = XLSX.utils.book_new();\r\n const sheet = XLSX.utils.aoa_to_sheet(lines);\r\n sheet['!cols'] = [{ wch: 12 }, { wch: 32 }, { wch: 26 }, { wch: 34 }, { wch: 11 }, { wch: 11 }];\r\n XLSX.utils.book_append_sheet(book, sheet, 'Schedule');\r\n const count = Math.max(stores.length, audits.length);\r\n XLSX.utils.book_append_sheet(book, XLSX.utils.aoa_to_sheet([['Stores', 'Audits'],\r\n ...Array.from({ length: count }, (_, i) => [stores[i] ?? '', audits[i] ?? ''])]), 'Lists');\r\n book.Workbook = { Sheets: [{ Hidden: 0 }, { Hidden: 1 }] };\r\n const list = (col: string, listCol: string, n: number) => (n ? '<dataValidation type=\"list\" allowBlank=\"1\" showErrorMessage=\"1\" '\r\n + 'errorTitle=\"Not in the list\" error=\"Pick a value from the dropdown.\" sqref=\"' + col + '2:' + col + TEMPLATE_ROWS + '\">'\r\n + '<formula1>Lists!$' + listCol + '$2:$' + listCol + '$' + (n + 1) + '</formula1></dataValidation>' : '');\r\n const rules = list('C', 'A', stores.length) + list('D', 'B', audits.length);\r\n const bytes = new Uint8Array(XLSX.write(book, { bookType: 'xlsx', type: 'array' }));\r\n if (!rules) { return bytes; }\r\n const CFB = (XLSX as any).CFB;\r\n const zip = CFB.read(bytes, { type: 'array' });\r\n const entry = zip.FileIndex[zip.FullPaths.findIndex((p: string) => p.endsWith('xl/worksheets/sheet1.xml'))];\r\n if (!entry?.content) { return bytes; }\r\n const xml: string = new TextDecoder().decode(entry.content);\r\n const n = (rules.match(/<dataValidation /g) || []).length;\r\n entry.content = new TextEncoder().encode(xml.replace('</sheetData>', '</sheetData><dataValidations count=\"' + n + '\">' + rules + '</dataValidations>'));\r\n entry.size = entry.content.length;\r\n return new Uint8Array(CFB.write(zip, { fileType: 'zip', type: 'array' }));\r\n}\r\n\r\n/**\r\n * The first sheet of an uploaded xlsx as text rows. A date or time typed in Excel is stored as a serial number; in\r\n * the Date / Visit start / Visit end columns it is decoded with the sheet's own calendar (SSF), not a JS Date (that\r\n * shifts the day by the browser's time zone), and written as YYYY-MM-DD / HH:mm so it reads like the CSV text.\r\n */\r\nfunction sheetTable(data: ArrayBuffer): string[][] {\r\n const book = XLSX.read(data, { type: 'array' });\r\n const sheet = book.Sheets[book.SheetNames.includes('Schedule') ? 'Schedule' : book.SheetNames[0]];\r\n const rows: any[][] = XLSX.utils.sheet_to_json(sheet, { header: 1, raw: true, defval: '' });\r\n const head = (rows[0] || []).map(h => String(h ?? '').trim().toLowerCase());\r\n const timeCols = new Set(head.map((h, i) => (/date|start|end/.test(h) ? i : -1)).filter(i => i >= 0));\r\n const pad = (n: number) => String(n).padStart(2, '0');\r\n const text = (v: any, i: number) => {\r\n if (typeof v !== 'number' || !timeCols.has(i)) { return String(v ?? ''); }\r\n const d = (XLSX as any).SSF.parse_date_code(v);\r\n if (!d) { return String(v); }\r\n return v < 1 ? pad(d.H) + ':' + pad(d.M) : d.y + '-' + pad(d.m) + '-' + pad(d.d);\r\n };\r\n return rows.map((r, ri) => r.map((v, i) => (ri === 0 ? String(v ?? '') : text(v, i))));\r\n}\r\n\r\n/** Quote a CSV cell when it needs it. */\r\nexport function csvCell(v: any): string {\r\n const s = String(v ?? '');\r\n return /[\",\\r\\n]/.test(s) ? '\"' + s.replace(/\"/g, '\"\"') + '\"' : s;\r\n}\r\n\r\n/** Minimal RFC 4180 reader: quoted cells, escaped quotes, CRLF or LF. */\r\nfunction parseCsv(text: string): string[][] {\r\n const out: string[][] = [];\r\n let row: string[] = [];\r\n let cell = '';\r\n let quoted = false;\r\n const src = text.replace(/^/, '');\r\n for (let i = 0; i < src.length; i++) {\r\n const ch = src[i];\r\n if (quoted) {\r\n if (ch === '\"' && src[i + 1] === '\"') { cell += '\"'; i++; }\r\n else if (ch === '\"') { quoted = false; }\r\n else { cell += ch; }\r\n } else if (ch === '\"') {\r\n quoted = true;\r\n } else if (ch === ',') {\r\n row.push(cell); cell = '';\r\n } else if (ch === '\\n' || ch === '\\r') {\r\n if (ch === '\\r' && src[i + 1] === '\\n') { i++; }\r\n row.push(cell); out.push(row); row = []; cell = '';\r\n } else {\r\n cell += ch;\r\n }\r\n }\r\n if (cell || row.length) { row.push(cell); out.push(row); }\r\n return out;\r\n}\r\n\r\n/** DD-MM-YYYY, DD/MM/YYYY or YYYY-MM-DD to YYYY-MM-DD; anything else stays blank. */\r\nfunction toIsoDate(v: string): string {\r\n let m = v.match(/^(\\d{4})-(\\d{1,2})-(\\d{1,2})$/);\r\n if (m) { return m[1] + '-' + m[2].padStart(2, '0') + '-' + m[3].padStart(2, '0'); }\r\n m = v.match(/^(\\d{1,2})[-/.](\\d{1,2})[-/.](\\d{4})$/);\r\n if (m) { return m[3] + '-' + m[2].padStart(2, '0') + '-' + m[1].padStart(2, '0'); }\r\n return '';\r\n}\r\n\r\n/** H:mm or HH:mm (24h) to HH:mm; \"blank\" and anything else stay blank. */\r\nfunction toTime(v: string): string {\r\n const m = v.match(/^(\\d{1,2}):(\\d{2})$/);\r\n return m && Number(m[1]) < 24 && Number(m[2]) < 60 ? m[1].padStart(2, '0') + ':' + m[2] : '';\r\n}\r\n","<input #csvInput type=\"file\" accept=\".xlsx,.csv,text/csv\" class=\"se-hidden\" (change)=\"onCsvPicked($event)\">\n\n<!-- Editing opens on the Rows step, so its skeleton mirrors that screen. -->\n<ng-container *ngIf=\"loadingEdit\">\n <div class=\"se-titlebar\">\n <div class=\"se-titletext\">\n <span class=\"av2-sk se-sk-crumb\"></span>\n <span class=\"av2-sk av2-sk--title se-sk-name\"></span>\n </div>\n </div>\n\n <div class=\"se-card se-card--table\">\n <lib-audit-v2-shimmer></lib-audit-v2-shimmer>\n </div>\n</ng-container>\n\n<!-- ============ Create schedule ============ -->\n<ng-container *ngIf=\"step === 'create' && !loadingEdit\">\n <div class=\"se-backbar\">\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm se-back\" (click)=\"back()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 6 9 12 15 18\"></polyline></svg>\n {{ backLabel }}\n </button>\n <div class=\"se-crumb\"><a href=\"#\" (click)=\"back($event)\">Schedule</a> › {{ scheduleId ? name || 'Schedule' : 'Create schedule' }}</div>\n </div>\n\n <div class=\"se-create\">\n <div class=\"se-card se-card--form\">\n <span class=\"se-badge\">\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"></circle><path d=\"M12 8v8M8 12h8\"></path></svg>\n </span>\n <div class=\"se-head\">\n <div class=\"se-title\">{{ scheduleId ? 'Edit schedule' : 'Create schedule' }}</div>\n <div class=\"se-sub\">{{ scheduleId ? 'Rename the schedule, or add rows from the template.' : (locked ? 'Name the schedule, then add rows for this audit.' : 'Name the schedule, then add rows.') }}</div>\n </div>\n\n <!-- Opened from an audit's Configure page: that audit is the schedule's audit, named once here\n instead of an audit picker card (QA: the card is not needed when the audit is already chosen). -->\n <div class=\"se-fixed-audit\" *ngIf=\"locked\">\n <span class=\"se-label\">{{ pickedAudits.length > 1 ? 'Audits' : 'Audit' }}</span>\n <span class=\"se-fixed-audit-name\">{{ lockedAuditNames || 'Loading audit…' }}</span>\n </div>\n\n <label class=\"se-field\">\n <span class=\"se-label\">Schedule name</span>\n <input type=\"text\" class=\"se-input\" [(ngModel)]=\"name\" placeholder=\"e.g. February hygiene round\">\n </label>\n\n <!-- Every audit, with the ones picked on the previous page (Not scheduled) already ticked.\n Create only: Edit schedule keeps the schedule's audits and does not ask for them (QA).\n Hidden for now on both (showAuditPicker). -->\n <div class=\"se-field\" *ngIf=\"showAuditPicker && !locked && !scheduleId\">\n <div class=\"se-row\">\n <span class=\"se-label se-grow\">Audits to schedule</span>\n <span class=\"se-count\">{{ pickCount }}</span>\n </div>\n <label class=\"se-search\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\n <input type=\"text\" [(ngModel)]=\"pickQuery\" placeholder=\"Search audits\">\n <a class=\"se-clear\" *ngIf=\"pickQuery.trim()\" title=\"Clear search\" (click)=\"pickQuery = ''\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\n </a>\n </label>\n <div class=\"se-picklist\">\n <div class=\"se-pickrow se-pickrow--all\" (click)=\"toggleAllPicks()\">\n <span class=\"se-box\" [class.is-on]=\"allPicked\">\n <svg *ngIf=\"allPicked\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-pickall\">{{ allLabel }}</span>\n </div>\n <div class=\"se-empty-sm\" *ngIf=\"!pickables.length\">No audits match that search.</div>\n <div class=\"se-pickrow\" *ngFor=\"let a of pickables; trackBy: trackByAudit\" [class.is-on]=\"isPicked(a)\" (click)=\"togglePick(a)\">\n <span class=\"se-box\" [class.is-on]=\"isPicked(a)\">\n <svg *ngIf=\"isPicked(a)\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-pickname\">\n <span class=\"se-ellipsis\">{{ a.name }}</span>\n <span class=\"se-meta\">{{ a.meta }}{{ a.questions ? ' · ' + a.questions + ' questions' : '' }}</span>\n </span>\n </div>\n </div>\n </div>\n\n <ol class=\"se-steps\">\n <li>Use the template to schedule multiple users at once.</li>\n <li>Download the template here — <a href=\"#\" (click)=\"downloadTemplate($event)\">{{ templateLoading || templateWaiting ? 'Preparing…' : 'Download template' }}</a></li>\n <li>Add your data, then upload it below.</li>\n </ol>\n\n <div class=\"se-actions\">\n <button type=\"button\" class=\"se-btn-lg se-btn-lg--primary\" [class.is-off]=\"!ready\" [attr.aria-disabled]=\"!ready\"\n [ngbTooltip]=\"notReadyReason\" [disableTooltip]=\"ready\" placement=\"top\" (click)=\"importCsv()\">Import from CSV</button>\n <span class=\"se-or\">or</span>\n <button type=\"button\" class=\"se-btn-lg se-btn-lg--ghost\" [class.is-off]=\"!ready\" [attr.aria-disabled]=\"!ready\"\n [ngbTooltip]=\"notReadyReason\" [disableTooltip]=\"ready\" placement=\"top\" (click)=\"addSingle()\">Add a single row</button>\n </div>\n </div>\n\n <!-- Hidden for now on both Create and Edit (showTemplatePreview). -->\n <div class=\"se-card se-card--side\" *ngIf=\"showTemplatePreview\">\n <div class=\"se-head\">\n <div class=\"se-side-title\">What the template expects</div>\n <div class=\"se-sub\">One row per user, store and date. These are the rows the downloaded template will hold for the selected\n {{ picks.length === 1 ? 'audit' : 'audits' }} — edit or add rows in the file, then import it.</div>\n </div>\n <div class=\"se-sample\">\n <div class=\"se-sample-row se-sample-row--head\">\n <span>Date</span><span>User email</span><span>Assign store</span><span>Assign audit</span>\n </div>\n <lib-audit-v2-shimmer *ngIf=\"templateLoading\" [rows]=\"3\"></lib-audit-v2-shimmer>\n <ng-container *ngIf=\"!templateLoading\">\n <!-- The selected audits' assigned stores / users: the same rows Download template writes. -->\n <div class=\"se-sample-row\" *ngFor=\"let r of previewRows\">\n <span [title]=\"r.date\">{{ r.date }}</span><span [title]=\"r.email\">{{ r.email }}</span>\n <span [title]=\"r.store\">{{ r.store }}</span><span [title]=\"r.audit\">{{ r.audit }}</span>\n </div>\n <div class=\"se-sample-more\" *ngIf=\"previewMore\">+ {{ previewMore }} more {{ previewMore === 1 ? 'row' : 'rows' }} in the file</div>\n <div class=\"se-sample-more\" *ngIf=\"!previewRows.length\">Pick an audit to see its template rows.</div>\n </ng-container>\n </div>\n <span class=\"se-note se-note--warn\" *ngIf=\"!templateLoading && unassignedAudits.length\">\n {{ unassignedAudits.join(', ') }} {{ unassignedAudits.length === 1 ? 'has' : 'have' }} no store assigned yet — fill in Date, User email\n and Store name for {{ unassignedAudits.length === 1 ? 'its row' : 'their rows' }}.</span>\n <span class=\"se-note\">Visit start and Visit end (HH:mm) are optional — leave them blank to use the store's open and close time (10:00 to 22:00 when the store has none).</span>\n <span class=\"se-note\">Rows with an unknown store, email or audit are reported before anything is saved. Draft audits\n are published when the schedule is published.</span>\n </div>\n </div>\n</ng-container>\n\n<!-- ============ Rows ============ -->\n<ng-container *ngIf=\"step === 'rows' && !loadingEdit\">\n <!-- Back + crumb on one line, as on the Create step; the name and actions below, left edges aligned.\n Edit has no \"Edit schedule\" step in the crumb (QA 9 Oct): it opens on, and stays on, the rows. -->\n <div class=\"se-backbar\">\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm se-back\" (click)=\"back()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 6 9 12 15 18\"></polyline></svg>\n {{ backLabel }}\n </button>\n <div class=\"se-crumb\">\n <a href=\"#\" (click)=\"back($event)\">Schedule</a> ›\n <ng-container *ngIf=\"!scheduleId\"><a href=\"#\" (click)=\"backToCreate($event)\">Create schedule</a> ›</ng-container>\n Rows\n </div>\n </div>\n\n <div class=\"se-titlebar\">\n <div class=\"se-titletext\">\n <div class=\"se-name\">{{ name.trim() || 'Untitled schedule' }}</div>\n </div>\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" [disabled]=\"saving\" (click)=\"saveDraft()\">Save as draft</button>\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm se-publish\" [class.is-off]=\"!canPublish\" (click)=\"publish()\">\n {{ saving ? 'Saving…' : (published ? 'Save & publish' : 'Publish schedule') }}\n </button>\n </div>\n\n <div class=\"se-ready\" [class.is-ok]=\"readyOk\">\n <svg *ngIf=\"readyOk\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18z\"></path><path d=\"M8 12.5l2.7 2.7L16 9.5\"></path></svg>\n <svg *ngIf=\"!readyOk\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 4l9 16H3z\"></path><path d=\"M12 10v4M12 17h.01\"></path></svg>\n <span>{{ readyLabel }}</span>\n </div>\n\n <div class=\"se-metrics\">\n <div class=\"av2-ocard\" *ngFor=\"let m of metrics\">\n <div class=\"av2-ocard-head\">\n <div class=\"av2-ocard-count\">{{ m.value }}</div>\n <div class=\"av2-ocard-text\">{{ m.label }}</div>\n </div>\n </div>\n </div>\n\n <div class=\"se-card se-card--table\">\n <div class=\"se-tablehead\">\n <div class=\"se-titletext\">\n <div class=\"se-side-title\">Schedule rows</div>\n <div class=\"se-sub\">Every row is one user, at one store, on one date.</div>\n </div>\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"addRow()\">Add row</button>\n <label class=\"se-search se-search--sm\">\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\n <input type=\"text\" [(ngModel)]=\"rowQuery\" placeholder=\"Search rows\">\n </label>\n </div>\n\n <div class=\"se-scroll\" (scroll)=\"onViewportChange()\">\n <div class=\"se-grid se-grid--head\">\n <div class=\"se-center\" (click)=\"toggleAllRows()\" title=\"Select all rows\">\n <span class=\"se-box\" [class.is-on]=\"allRowsSelected\">\n <svg *ngIf=\"allRowsSelected\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n </div>\n <div>Schedule date</div><div>User email</div><div>Assigned store</div><div>Audit assigned</div><div>Visit window</div><div></div>\n </div>\n\n <div class=\"se-grid se-grid--row\" *ngFor=\"let r of shownRows; trackBy: trackByRow\" [class.is-selected]=\"r.selected\" [class.is-locked]=\"isLocked(r)\">\n <div class=\"se-center\" [class.is-off]=\"isLocked(r)\" [attr.title]=\"isLocked(r) ? 'Past visit: already raised, so it cannot be selected' : null\" (click)=\"toggleRow(r)\">\n <span class=\"se-box\" [class.is-on]=\"r.selected\">\n <svg *ngIf=\"r.selected\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n </div>\n\n <input type=\"date\" class=\"se-cell\" [class.is-bad]=\"cellError(r, 'date')\" [attr.title]=\"cellError(r, 'date') || null\" [attr.min]=\"today\"\n [disabled]=\"isLocked(r)\" [(ngModel)]=\"r.date\" (ngModelChange)=\"touch(r, 'date')\">\n\n <!-- User: search by name or email -->\n <div class=\"se-pick\" [class.is-open]=\"isOpen(r, 'userEmail')\">\n <input type=\"text\" class=\"se-cell se-cell--pick\" [class.is-bad]=\"cellError(r, 'userEmail')\" [attr.title]=\"cellError(r, 'userEmail') || null\"\n placeholder=\"Search user\" autocomplete=\"off\" [disabled]=\"isLocked(r)\" [(ngModel)]=\"r.userEmail\" (ngModelChange)=\"onPickerInput(r, 'userEmail')\"\n (focus)=\"openPicker(r, 'userEmail', $event)\" (click)=\"openPicker(r, 'userEmail', $event)\" (keydown)=\"onPickerKey(r, 'userEmail', $event)\">\n <div class=\"se-menu\" *ngIf=\"isOpen(r, 'userEmail')\" [style.top.px]=\"menuPos.top\" [style.bottom.px]=\"menuPos.bottom\"\n [style.left.px]=\"menuPos.left\" [style.min-width.px]=\"menuPos.width\">\n <div class=\"se-opt\" *ngFor=\"let u of userSuggestions(r); let i = index\" [class.is-active]=\"i === activeIndex\"\n [class.is-on]=\"u.email === r.userEmail.trim().toLowerCase()\" (mouseenter)=\"activeIndex = i\"\n (mousedown)=\"$event.preventDefault()\" (click)=\"pickUser(r, u, $event)\">\n <span class=\"se-opt-avatar\">{{ initials(u.name || u.email) }}</span>\n <span class=\"se-opt-text\">\n <span class=\"se-opt-main\">{{ u.name || u.email }}</span>\n <span class=\"se-opt-sub\">{{ u.email }}</span>\n </span>\n <svg class=\"se-opt-check\" *ngIf=\"u.email === r.userEmail.trim().toLowerCase()\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </div>\n <div class=\"se-menu-empty\" *ngIf=\"!userSuggestions(r).length\">{{ users.length ? 'No user matches “' + r.userEmail + '”' : 'Loading users…' }}</div>\n <div class=\"se-menu-note\" *ngIf=\"moreLabel(userSuggestions(r).length, userMatches(r).length, 'users')\">\n {{ moreLabel(userSuggestions(r).length, userMatches(r).length, 'users') }}\n </div>\n </div>\n </div>\n\n <!-- Store: search and show by store name (or city); the store code is never shown or asked for -->\n <div class=\"se-pick\" [class.is-open]=\"isOpen(r, 'storeId')\">\n <input type=\"text\" class=\"se-cell se-cell--pick\"\n [class.is-bad]=\"cellError(r, 'storeId')\" [attr.title]=\"cellError(r, 'storeId') || null\"\n placeholder=\"Search store\" autocomplete=\"off\" [disabled]=\"isLocked(r)\" [ngModel]=\"r.storeText\" (ngModelChange)=\"onStoreTyped(r, $event)\"\n (focus)=\"openPicker(r, 'storeId', $event)\" (click)=\"openPicker(r, 'storeId', $event)\" (keydown)=\"onPickerKey(r, 'storeId', $event)\">\n <div class=\"se-menu\" *ngIf=\"isOpen(r, 'storeId')\" [style.top.px]=\"menuPos.top\" [style.bottom.px]=\"menuPos.bottom\"\n [style.left.px]=\"menuPos.left\" [style.min-width.px]=\"menuPos.width\">\n <div class=\"se-opt\" *ngFor=\"let s of storeSuggestions(r); let i = index\" [class.is-active]=\"i === activeIndex\"\n [class.is-on]=\"s.storeId === r.storeId.trim()\" (mouseenter)=\"activeIndex = i\"\n (mousedown)=\"$event.preventDefault()\" (click)=\"pickStore(r, s, $event)\">\n <span class=\"se-opt-icon\">\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 9l1.5-5h15L21 9\"></path><path d=\"M4 9v11h16V9\"></path><path d=\"M9 20v-6h6v6\"></path></svg>\n </span>\n <span class=\"se-opt-text\">\n <span class=\"se-opt-main\">{{ s.storeName || s.storeId }}</span>\n <span class=\"se-opt-sub\" *ngIf=\"s.city\">{{ s.city }}</span>\n </span>\n <svg class=\"se-opt-check\" *ngIf=\"s.storeId === r.storeId.trim()\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </div>\n <div class=\"se-menu-empty\" *ngIf=\"!storeSuggestions(r).length\">{{ stores.length ? 'No store matches “' + r.storeText + '”' : 'Loading stores…' }}</div>\n <div class=\"se-menu-note\" *ngIf=\"moreLabel(storeSuggestions(r).length, storeMatches(r).length, 'stores')\">\n {{ moreLabel(storeSuggestions(r).length, storeMatches(r).length, 'stores') }}\n </div>\n </div>\n </div>\n\n <!-- Audit assigned: multi-select with search over the published audits (rowAuditOptions). Ticking another audit\n adds a row for it with the same date, user, store and window; unticking removes that row. No column when\n the schedule has one fixed audit. -->\n <div class=\"se-pick\" [class.is-open]=\"isOpen(r, 'checkListId')\">\n <button type=\"button\" class=\"se-cell se-select\" [class.is-bad]=\"cellError(r, 'checkListId')\" [attr.title]=\"cellError(r, 'checkListId') || null\"\n [disabled]=\"isLocked(r)\" (click)=\"openPicker(r, 'checkListId', $event)\" (keydown)=\"onPickerKey(r, 'checkListId', $event)\">\n <span class=\"se-ellipsis\" [class.se-placeholder]=\"!groupAuditFirst(r)\" [attr.title]=\"groupAuditLabel(r) || null\">{{ groupAuditFirst(r) || 'Select audits' }}</span>\n <span class=\"se-more\" *ngIf=\"groupAuditMore(r)\" [attr.title]=\"groupAuditLabel(r)\">+{{ groupAuditMore(r) }}</span>\n <svg class=\"se-chev\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\n </button>\n <div class=\"se-menu se-menu--multi\" *ngIf=\"isOpen(r, 'checkListId')\" [style.top.px]=\"menuPos.top\" [style.bottom.px]=\"menuPos.bottom\"\n [style.left.px]=\"menuPos.left\" [style.min-width.px]=\"menuPos.width\">\n <label class=\"se-menu-search\" (mousedown)=\"$event.stopPropagation()\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\n <input type=\"text\" placeholder=\"Search audits\" autocomplete=\"off\" [(ngModel)]=\"auditQuery\" (ngModelChange)=\"activeIndex = 0\"\n (keydown)=\"onPickerKey(r, 'checkListId', $event)\">\n </label>\n <div class=\"se-opt\" *ngFor=\"let a of auditMatches(); let i = index; trackBy: trackByAudit\" [class.is-active]=\"i === activeIndex\"\n [class.is-on]=\"auditTicked(r, a)\" (mouseenter)=\"activeIndex = i\"\n (mousedown)=\"$event.preventDefault()\" (click)=\"toggleAudit(r, a, $event)\">\n <span class=\"se-box\" [class.is-on]=\"auditTicked(r, a)\">\n <svg *ngIf=\"auditTicked(r, a)\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-opt-text\">\n <span class=\"se-opt-main\">{{ a.name }}</span>\n <span class=\"se-opt-sub\" *ngIf=\"a.questions\">{{ a.questions }} {{ a.questions === 1 ? 'question' : 'questions' }}</span>\n </span>\n </div>\n <div class=\"se-menu-empty\" *ngIf=\"!auditMatches().length\">{{ rowAuditOptions.length ? 'No audit matches “' + auditQuery + '”' : 'No published audits yet' }}</div>\n <div class=\"se-menu-note\" *ngIf=\"auditTickCount(r) > 1\">{{ auditTickCount(r) }} audits on this row · same user, store, date and window</div>\n </div>\n </div>\n\n <div class=\"se-window\" [attr.title]=\"cellError(r, 'window') || null\">\n <input type=\"time\" class=\"se-cell\" [class.is-bad]=\"cellError(r, 'window')\" [disabled]=\"isLocked(r)\" [(ngModel)]=\"r.start\" (ngModelChange)=\"touch(r, 'window')\">\n <span class=\"se-dash\">–</span>\n <input type=\"time\" class=\"se-cell\" [class.is-bad]=\"cellError(r, 'window')\" [disabled]=\"isLocked(r)\" [(ngModel)]=\"r.end\" (ngModelChange)=\"touch(r, 'window')\">\n </div>\n\n <div class=\"se-center\">\n <span class=\"se-lock\" *ngIf=\"isLocked(r)\" title=\"Past visit: already raised, so it cannot be edited or deleted\">\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"5\" y=\"11\" width=\"14\" height=\"10\" rx=\"2\"></rect><path d=\"M8 11V7a4 4 0 0 1 8 0v4\"></path></svg>\n </span>\n <a class=\"se-del\" *ngIf=\"!isLocked(r)\" title=\"Delete row\" (click)=\"deleteRow(r)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 7h16\"></path><path d=\"M7 7l1 13h8l1-13M9 7V4h6v3\"></path></svg>\n </a>\n </div>\n\n <!-- Why the row is red, in words. -->\n <ng-container *ngIf=\"rowMessages(r) as msgs\">\n <div class=\"se-rowerr\" *ngIf=\"msgs.length\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\n <span>{{ msgs.join(' · ') }}</span>\n <a class=\"se-invite-link\" *ngIf=\"inviteable(r)\" (click)=\"openInvite(newUserEmails(groupRows(r)))\">Invite user</a>\n </div>\n </ng-container>\n <!-- Hints: allowed (Publish is not blocked), e.g. the same visit in another schedule. -->\n <ng-container *ngIf=\"rowHints(r) as hints\">\n <div class=\"se-rowerr se-rowhint\" *ngIf=\"hints.length\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\n <span>{{ hints.join(' · ') }}</span>\n </div>\n </ng-container>\n </div>\n\n <div *ngIf=\"!shownRows.length\" class=\"av2-empty\">\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\n <div class=\"av2-empty-text\">\n <div class=\"av2-empty-title\">No data found</div>\n <div class=\"av2-empty-sub\">{{ rows.length ? 'No rows match this search.' : 'No rows yet. Add a row or import the template.' }}</div>\n </div>\n </div>\n </div>\n\n <div class=\"se-foot\">\n <!-- Row count + visit-window hint removed (user, 11 Oct); the count shows only while rows are selected. -->\n <span class=\"se-foot-text\" *ngIf=\"selectedCount\">{{ selectionLabel }}</span>\n <span class=\"se-foot-actions\">\n <button type=\"button\" class=\"se-bulk\" [class.is-off]=\"!selectedCount\" (click)=\"duplicateSelected()\">Duplicate</button>\n <button type=\"button\" class=\"se-bulk se-bulk--danger\" [class.is-off]=\"!selectedCount\" (click)=\"deleteSelected()\">Delete</button>\n </span>\n </div>\n </div>\n</ng-container>\n\n<!-- New User found (as the v1 checklist upload): emails with no user yet, after an import or from a row's Invite user. -->\n<ng-container *ngIf=\"inviteOpen\">\n <div class=\"se-inv-backdrop\" (click)=\"closeInvite()\"></div>\n <div class=\"se-inv\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"se-inv-title\">\n <span class=\"se-inv-icon\">\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10.3 3.9L1.8 18a2 2 0 0 0 1.7 3h17a2 2 0 0 0 1.7-3L13.7 3.9a2 2 0 0 0-3.4 0z\"></path><path d=\"M12 9v4M12 17h.01\"></path></svg>\n </span>\n <div class=\"se-inv-title\" id=\"se-inv-title\">{{ inviteEmails.length === 1 ? 'New user found' : 'New users found' }}</div>\n <div class=\"se-inv-text\">\n {{ inviteEmails.length === 1 ? 'This email is not a user yet.' : 'These emails are not users yet.' }}\n Invite them to add them as users of this client, or add them in User Management under the Manage menu.\n </div>\n\n <div class=\"se-inv-list\">\n <div class=\"se-pickrow se-pickrow--all\" *ngIf=\"inviteEmails.length > 1\" (click)=\"toggleAllInvite()\">\n <span class=\"se-box\" [class.is-on]=\"allInvitePicked\">\n <svg *ngIf=\"allInvitePicked\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-pickall\">Select all ({{ inviteEmails.length }})</span>\n </div>\n <div class=\"se-pickrow\" *ngFor=\"let e of inviteEmails\" [class.is-on]=\"invitePicked.has(e)\" (click)=\"toggleInvite(e)\">\n <span class=\"se-box\" [class.is-on]=\"invitePicked.has(e)\">\n <svg *ngIf=\"invitePicked.has(e)\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n </span>\n <span class=\"se-pickname\"><span class=\"se-ellipsis\">{{ e }}</span></span>\n </div>\n </div>\n\n <div class=\"se-inv-foot\">\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" [disabled]=\"inviting\" (click)=\"closeInvite()\">Skip</button>\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm\" [disabled]=\"inviting || !invitePicked.size\" (click)=\"inviteSelected()\">\n {{ inviting ? 'Inviting…' : 'Invite selected' + (invitePicked.size ? ' (' + invitePicked.size + ')' : '') }}\n </button>\n </div>\n </div>\n</ng-container>\n","import { ChangeDetectorRef, Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core';\nimport { Subject, takeUntil } from 'rxjs';\nimport { ToastService } from 'tango-app-ui-shared';\nimport dayjs from 'dayjs';\nimport { TraxService } from '../../../services/trax.service';\n\ntype VisitStatus = 'submitted' | 'live' | 'open' | 'missed';\n\ninterface DetailRow {\n date: string;\n /** YYYY-MM-DD, for sorting. */\n dateIso: string;\n /** Window start 'HH:mm' (the store's open time when blank), for sorting. */\n start: string;\n email: string;\n initials: string;\n storeId: string;\n storeName: string;\n window: string;\n /** Where a blank row's window comes from (store hours or the default); '' for the row's own window. */\n windowTip: string;\n hasWindow: boolean;\n audit: string;\n status: VisitStatus;\n note: string;\n}\n\nconst STATUS: Record<VisitStatus, { label: string; bg: string; fg: string; dot: string }> = {\n submitted: { label: 'Submitted', bg: '#ECFDF3', fg: '#027A48', dot: '#12B76A' },\n live: { label: 'In progress', bg: '#EFF8FF', fg: '#175CD3', dot: '#2E90FA' },\n open: { label: 'Not started', bg: '#F2F4F7', fg: '#344054', dot: '#98A2B3' },\n missed: { label: 'Missed', bg: '#FEF3F2', fg: '#B42318', dot: '#F04438' }\n};\n\n/**\n * Manage › Schedule Info › (schedule): every row of one schedule with the status of the audit\n * Trax raised for it (POST /trax/audit/schedule/detail). \"Edit rows\" hands over to the editor.\n */\n@Component({\n selector: 'lib-audit-v2-schedule-detail',\n templateUrl: './audit-v2-schedule-detail.component.html',\n styleUrl: './audit-v2-schedule-detail.component.scss'\n})\nexport class AuditV2ScheduleDetailComponent implements OnInit, OnDestroy {\n @Input() clientId = '';\n @Input() scheduleId = '';\n /** Edit rows needs the Checklist edit permission (Manage passes it in). */\n @Input() canEdit = false;\n /**\n * The header's date range (any dayjs-readable date): View shows the visits of these dates only (QA 10 Oct), with\n * \"Show all dates\" for the whole schedule. Without a range every row shows.\n */\n @Input() fromDate = '';\n @Input() toDate = '';\n @Output() back = new EventEmitter<void>();\n @Output() edit = new EventEmitter<string>();\n\n loading = true;\n name = '';\n /** The schedule's audits by name; the summary line shows a count when there are several (names in its tooltip). */\n auditNames: string[] = [];\n published = false;\n metrics = { visits: 0, users: 0, completed: 0, pending: 0 };\n rows: DetailRow[] = [];\n query = '';\n page = 1;\n pageSize = 10;\n readonly pageSizes = [10, 20, 30];\n private readonly destroy$ = new Subject<void>();\n\n constructor(\n private traxService: TraxService,\n private toast: ToastService,\n private cd: ChangeDetectorRef\n ) { }\n\n ngOnInit(): void {\n this.traxService.auditScheduleDetail({ clientId: this.clientId, scheduleId: this.scheduleId })\n .pipe(takeUntil(this.destroy$)).subscribe({\n next: (res: any) => {\n const d = res?.code === 200 ? res.data : null;\n this.loading = false;\n if (!d) { this.toast.getErrorToast('Could not load this schedule'); this.back.emit(); return; }\n this.name = d.schedule?.name || 'Schedule';\n this.published = !!d.schedule?.publish;\n this.auditNames = (d.schedule?.checkLists || []).map((c: any) => c.checkListName).filter(Boolean);\n this.metrics = { ...this.metrics, ...(d.metrics || {}) };\n this.rows = (d.rows || []).map((r: any) => {\n const email = String(r.userEmail || '');\n const hasWindow = !!(r.start && r.end);\n // No window on the row: the visit gets the store's open - close time, else 10:00 - 22:00 (the API's\n // windowStart / windowEnd; an older API without them leaves the default).\n const start = hasWindow ? String(r.start) : String(r.windowStart || '10:00');\n const end = hasWindow ? String(r.end) : String(r.windowEnd || '22:00');\n return {\n date: r.date ? dayjs(r.date).format('DD-MM-YYYY') : '—',\n dateIso: r.date ? dayjs(r.date).format('YYYY-MM-DD') : '',\n start,\n email: email || '—',\n initials: email.slice(0, 2).toUpperCase(),\n storeId: r.storeId || '—',\n storeName: r.storeName || '—',\n window: start + ' – ' + end,\n windowTip: hasWindow ? '' : (r.windowSource === 'store' ? 'Store open – close time' : 'Default window (the store has no open / close time)'),\n hasWindow,\n audit: r.checkListName || '—',\n status: (r.status as VisitStatus) || 'open',\n note: r.note || ''\n };\n });\n this.cd.detectChanges();\n },\n error: () => { this.loading = false; this.toast.getErrorToast('Could not load this schedule'); this.back.emit(); }\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /** \"Show all dates\": the whole schedule instead of the header's range. */\n showAll = false;\n\n private get rangeIso(): { from: string; to: string } | null {\n if (!this.fromDate) { return null; }\n const from = dayjs(this.fromDate);\n const to = this.toDate ? dayjs(this.toDate) : from;\n return from.isValid() && to.isValid() ? { from: from.format('YYYY-MM-DD'), to: to.format('YYYY-MM-DD') } : null;\n }\n\n /** The range is applied (given, and \"Show all dates\" not chosen). */\n get rangeOn(): boolean {\n return !this.showAll && !!this.rangeIso;\n }\n\n /** The header's range as the page shows dates. */\n get rangeText(): string {\n const r = this.rangeIso;\n if (!r) { return ''; }\n const f = dayjs(r.from).format('DD-MM-YYYY');\n const t = dayjs(r.to).format('DD-MM-YYYY');\n return f === t ? f : f + ' – ' + t;\n }\n\n toggleShowAll(): void {\n this.showAll = !this.showAll;\n this.page = 1;\n }\n\n /** The rows of the range (every row when it is off). */\n private get scoped(): DetailRow[] {\n const r = this.rangeIso;\n if (!this.rangeOn || !r) { return this.rows; }\n return this.rows.filter(x => !!x.dateIso && x.dateIso >= r.from && x.dateIso <= r.to);\n }\n\n /** The cards count the shown dates: the API's totals for the whole schedule, else the same sums over the range. */\n private get shownMetrics(): { visits: number; users: number; completed: number; pending: number } {\n if (!this.rangeOn) { return this.metrics; }\n const rows = this.scoped;\n const completed = rows.filter(x => x.status === 'submitted').length;\n return {\n visits: rows.length,\n users: new Set(rows.map(x => x.email.toLowerCase())).size,\n completed,\n pending: rows.length - completed\n };\n }\n\n get cards(): Array<{ label: string; value: string; head: string }> {\n const m = this.shownMetrics;\n return [\n { label: 'Visits', value: String(m.visits), head: '#F5FAFF' },\n { label: 'Users', value: String(m.users), head: '#F5FAFF' },\n { label: 'Completed', value: String(m.completed), head: '#F6FEF9' },\n { label: 'Pending', value: String(m.pending), head: '#FFFCF5' },\n { label: 'Status', value: this.published ? 'Live' : 'Draft', head: '#F9FAFB' }\n ];\n }\n\n get rangeLabel(): string {\n const m = this.shownMetrics;\n const n = this.auditNames.length;\n return m.visits + (m.visits === 1 ? ' visit' : ' visits') + ' · ' + m.users + (m.users === 1 ? ' user' : ' users')\n + (n === 1 ? ' · ' + this.auditNames[0] : n > 1 ? ' · ' + n + ' audits' : '');\n }\n\n /** Every audit name, as the summary line's tooltip when it shows only the count. */\n get auditsTip(): string | null {\n return this.auditNames.length > 1 ? this.auditNames.join(', ') : null;\n }\n\n /** Column sort ('' = the schedule's order); a header click toggles ascending / descending (QA 10 Oct). */\n sortKey = '';\n sortDir: 'asc' | 'desc' = 'asc';\n\n sortBy(key: string): void {\n this.sortDir = this.sortKey === key && this.sortDir === 'asc' ? 'desc' : 'asc';\n this.sortKey = key;\n this.page = 1;\n }\n\n get filtered(): DetailRow[] {\n const q = this.query.trim().toLowerCase();\n const base = this.scoped;\n const list = q\n ? base.filter(r => (r.email + ' ' + r.storeId + ' ' + r.storeName + ' ' + r.audit).toLowerCase().includes(q))\n : base;\n return this.sorted(list);\n }\n\n private sorted(list: DetailRow[]): DetailRow[] {\n if (!this.sortKey) { return list; }\n const dir = this.sortDir === 'asc' ? 1 : -1;\n const value = (r: DetailRow): string => {\n switch (this.sortKey) {\n case 'date': return r.dateIso;\n case 'email': return r.email;\n case 'store': return r.storeName;\n case 'window': return r.start;\n case 'audit': return r.audit;\n case 'status': return this.label(r.status);\n default: return '';\n }\n };\n return [...list].sort((a, b) => value(a).localeCompare(value(b), undefined, { numeric: true, sensitivity: 'base' }) * dir);\n }\n\n get paged(): DetailRow[] {\n const start = (this.page - 1) * this.pageSize;\n return this.filtered.slice(start, start + this.pageSize);\n }\n\n get countLabel(): string {\n return this.filtered.length + ' of ' + this.rows.length + (this.rows.length === 1 ? ' visit' : ' visits');\n }\n\n onQuery(): void {\n this.page = 1;\n }\n\n onPage(page: number): void {\n this.page = page;\n }\n\n onPageSize(size: any): void {\n this.pageSize = Number(size) || 10;\n this.page = 1;\n }\n\n goBack(event: Event): void {\n event.preventDefault();\n this.back.emit();\n }\n\n label(s: VisitStatus): string { return STATUS[s].label; }\n bg(s: VisitStatus): string { return STATUS[s].bg; }\n fg(s: VisitStatus): string { return STATUS[s].fg; }\n dot(s: VisitStatus): string { return STATUS[s].dot; }\n}\n","<ng-container *ngIf=\"loading\">\n <div class=\"sd-titlebar\">\n <div class=\"sd-titletext\">\n <span class=\"av2-sk sd-sk-crumb\"></span>\n <span class=\"av2-sk av2-sk--title sd-sk-name\"></span>\n </div>\n </div>\n\n <div class=\"sd-metrics\">\n <div class=\"av2-ocard\" *ngFor=\"let m of cards\">\n <div class=\"av2-ocard-head\">\n <div class=\"av2-ocard-count\"><span class=\"av2-sk av2-sk--value sd-sk-value\"></span></div>\n <div class=\"av2-ocard-text\">{{ m.label }}</div>\n </div>\n </div>\n </div>\n\n <div class=\"sd-card\">\n <lib-audit-v2-shimmer></lib-audit-v2-shimmer>\n </div>\n</ng-container>\n\n<ng-container *ngIf=\"!loading\">\n <div class=\"sd-titlebar\">\n <div class=\"sd-titletext\">\n <div class=\"sd-crumb\"><a href=\"#\" (click)=\"goBack($event)\">Schedule</a> › {{ name }}</div>\n <div class=\"sd-name\">{{ name }}</div>\n </div>\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" *ngIf=\"canEdit\" (click)=\"edit.emit(scheduleId)\">Edit rows</button>\n </div>\n\n <div class=\"sd-metrics\">\n <div class=\"av2-ocard\" *ngFor=\"let m of cards\">\n <div class=\"av2-ocard-head\">\n <div class=\"av2-ocard-count\">{{ m.value }}</div>\n <div class=\"av2-ocard-text\">{{ m.label }}</div>\n </div>\n </div>\n </div>\n\n <div class=\"sd-card\">\n <div class=\"sd-tablehead\">\n <div class=\"sd-titletext\">\n <div class=\"sd-card-title\">Scheduled info</div>\n <div class=\"sd-sub\">\n <span [attr.title]=\"auditsTip\">{{ rangeLabel }}</span>\n <ng-container *ngIf=\"rangeText\">\n · {{ rangeOn ? 'Visits on ' + rangeText : 'All dates' }}\n <a class=\"sd-range-link\" (click)=\"toggleShowAll()\">{{ rangeOn ? 'Show all dates' : 'Show ' + rangeText + ' only' }}</a>\n </ng-container>\n </div>\n </div>\n <label class=\"sd-search\">\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\n <input type=\"text\" [(ngModel)]=\"query\" (ngModelChange)=\"onQuery()\" placeholder=\"Search users or stores\">\n </label>\n </div>\n\n <div class=\"sd-scroll\">\n <div class=\"sd-grid sd-grid--head\">\n <div class=\"av2-sortable\" (click)=\"sortBy('date')\">Schedule date <lib-audit-v2-sort-icon [active]=\"sortKey === 'date'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></div>\n <div class=\"av2-sortable\" (click)=\"sortBy('email')\">User email <lib-audit-v2-sort-icon [active]=\"sortKey === 'email'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></div>\n <div class=\"av2-sortable\" (click)=\"sortBy('store')\">Store <lib-audit-v2-sort-icon [active]=\"sortKey === 'store'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></div>\n <div class=\"av2-sortable\" (click)=\"sortBy('window')\">Visit window <lib-audit-v2-sort-icon [active]=\"sortKey === 'window'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></div>\n <div class=\"av2-sortable\" (click)=\"sortBy('audit')\">Audit <lib-audit-v2-sort-icon [active]=\"sortKey === 'audit'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></div>\n <div class=\"av2-sortable\" (click)=\"sortBy('status')\">Status <lib-audit-v2-sort-icon [active]=\"sortKey === 'status'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></div>\n </div>\n <div class=\"sd-grid sd-grid--row\" *ngFor=\"let r of paged\">\n <div>{{ r.date }}</div>\n <div class=\"sd-user\">\n <span class=\"sd-avatar\">{{ r.initials }}</span>\n <span class=\"sd-ellipsis\" [av2Tip]=\"r.email\">{{ r.email }}</span>\n </div>\n <!-- Store name (QA: the store code was shown); the id only for a row without a name. -->\n <div class=\"sd-store sd-ellipsis\" [av2Tip]=\"r.storeName || ''\">{{ r.storeName || '—' }}</div>\n <div [class.sd-muted]=\"!r.hasWindow\" [class.sd-missed]=\"r.status === 'missed' && r.hasWindow\" [attr.title]=\"r.windowTip || null\">{{ r.window }}</div>\n <div class=\"sd-ellipsis\" [av2Tip]=\"r.audit\">{{ r.audit }}</div>\n <div>\n <span class=\"sd-pill\" [style.background]=\"bg(r.status)\" [style.color]=\"fg(r.status)\" [title]=\"r.note\">\n <span class=\"sd-dot\" [style.background]=\"dot(r.status)\"></span>{{ label(r.status) }}\n </span>\n </div>\n </div>\n <div *ngIf=\"!filtered.length\" class=\"av2-empty\">\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\n <div class=\"av2-empty-text\">\n <div class=\"av2-empty-title\">No data found</div>\n <div class=\"av2-empty-sub\">{{ rows.length ? 'No visits match this search.' : 'No rows yet. Use Edit rows to add users, stores and dates.' }}</div>\n </div>\n </div>\n </div>\n\n <div class=\"sd-foot\">\n <span>{{ countLabel }}</span>\n <lib-pagination *ngIf=\"filtered.length\" [itemsPerPage]=\"pageSize\" [pageSize]=\"pageSize\"\n [paginationSizes]=\"pageSizes\" [currentPage]=\"page\" [totalItems]=\"filtered.length\"\n (pageChange)=\"onPage($event)\" (pageSizeChange)=\"onPageSize($event)\"></lib-pagination>\n </div>\n </div>\n</ng-container>\n","import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { BehaviorSubject, Subject, debounceTime, distinctUntilChanged, takeUntil } from 'rxjs';\nimport { GlobalStateService } from 'tango-app-ui-global';\nimport { ToastService } from 'tango-app-ui-shared';\nimport dayjs from 'dayjs';\nimport utc from 'dayjs/plugin/utc';\nimport { TraxService } from '../../../services/trax.service';\nimport { ScheduleAudit, csvCell } from '../schedule/audit-v2-schedule-editor.component';\nimport { AuditAccess, auditAccess } from '../audit-v2-access';\nimport { PICKER_LOCALE, PickedDates, PickerRange, toPickerRange } from '../audit-v2-datepicker';\n\ndayjs.extend(utc);\n\nexport interface ManageRow {\n id: string;\n name: string;\n initials: string;\n owner: string;\n activeSchedules: string;\n visits: string;\n questions: string;\n status: 'Published' | 'Draft';\n published: boolean;\n /** The audit-mode programme is highlighted in the catalogue. */\n target: boolean;\n}\n\n/** A task row as returned by the trax task-list API. */\nexport interface TaskRow {\n id: string;\n name: string;\n initials: string;\n createdBy: string;\n priority: string;\n assigned: number;\n dueOn: string;\n status: 'Published' | 'Draft';\n published: boolean;\n /** Tasks sourced from the gallery cannot be edited here. */\n fromGallery: boolean;\n raw: any;\n}\n\nexport interface ScheduleRow {\n id: string;\n name: string;\n audits: string;\n users: number;\n visits: number;\n completed: number;\n pending: number;\n published: boolean;\n /** What the edit / duplicate dialog needs back. */\n checklistIds: string[];\n description: string;\n startDate: string;\n endDate: string;\n winStart: string;\n winEnd: string;\n}\n\nexport interface UnscheduledRow {\n id: string;\n name: string;\n initials: string;\n owner: string;\n questions: number;\n meta: string;\n picked: boolean;\n published: boolean;\n}\n\nexport interface VisitRow {\n window: string;\n note: string;\n user: string;\n store: string;\n audit: string;\n status: 'submitted' | 'live' | 'open' | 'missed';\n}\n\nexport interface ScheduleKpi {\n label: string;\n value: string;\n note: string;\n color: string;\n}\n\ntype ManageSubTab = 'info' | 'schedule';\ntype ScheduleTab = 'visits' | 'scheduled' | 'notScheduled';\ntype ModuleTab = 'audit' | 'task';\n\n/** Visit status presentation, per the prototype. */\nconst STATUS: Record<VisitRow['status'], { label: string; bg: string; fg: string; dot: string }> = {\n submitted: { label: 'Submitted', bg: '#ECFDF3', fg: '#027A48', dot: '#12B76A' },\n live: { label: 'In progress', bg: '#EFF8FF', fg: '#175CD3', dot: '#2E90FA' },\n open: { label: 'Not started', bg: '#F2F4F7', fg: '#344054', dot: '#98A2B3' },\n missed: { label: 'Missed', bg: '#FEF3F2', fg: '#B42318', dot: '#F04438' }\n};\n\n/** When an API record was created: its createdAt, else the timestamp in its Mongo id. */\nfunction createdTime(d: any): number {\n const at = d?.createdAt ? new Date(d.createdAt).getTime() : NaN;\n if (!isNaN(at)) { return at; }\n const id = String(d?._id || '');\n return /^[0-9a-f]{24}$/i.test(id) ? parseInt(id.slice(0, 8), 16) * 1000 : 0;\n}\n\n/**\n * Audits and schedules list newest created first (QA), the order the API sends since it was\n * fixed; sorted here too so the lists agree whichever API build answers. Header clicks re-sort.\n */\nfunction newestFirst<T>(list: T[]): T[] {\n return [...list].sort((a: any, b: any) => createdTime(b) - createdTime(a) || String(b?._id || '').localeCompare(String(a?._id || '')));\n}\n\n@Component({\n selector: 'lib-audit-v2-manage',\n templateUrl: './audit-v2-manage.component.html',\n styleUrl: './audit-v2-manage.component.scss'\n})\nexport class AuditV2ManageComponent implements OnInit, OnDestroy {\n /** Audit / Task switch in the page header. */\n moduleTab: ModuleTab = 'audit';\n\n /** ---- Task tab, served by the trax task API ---- */\n taskRows: TaskRow[] = [];\n taskState = new BehaviorSubject<'initial' | 'loading' | 'loaded'>('initial');\n taskSearch: FormControl = new FormControl('');\n taskTotal = 0;\n taskPage = 1;\n taskPageSize = 10;\n taskPaginationSizes: number[] = [10, 20, 30];\n /** Audit tab paging (client-side over the loaded rows; the list is at most 200). */\n auditPage = 1;\n auditPageSize = 10;\n auditPaginationSizes: number[] = [10, 20, 30];\n /** Schedule tab tables (Scheduled / Not scheduled / Visits): client-side pages, 10 / 20 / 30 like every audit list. */\n readonly schPageSizes = [10, 20, 30];\n schPager: Record<'scheduled' | 'unscheduled' | 'visits', { page: number; size: number }> = {\n scheduled: { page: 1, size: 10 },\n unscheduled: { page: 1, size: 10 },\n visits: { page: 1, size: 10 }\n };\n\n /** The current page of a schedule table; a search or filter that shrinks the list pulls the page back into range. */\n schPageOf<T>(key: 'scheduled' | 'unscheduled' | 'visits', list: T[]): T[] {\n const p = this.schPager[key];\n const pages = Math.max(1, Math.ceil(list.length / p.size));\n const page = Math.min(p.page, pages);\n return list.slice((page - 1) * p.size, page * p.size);\n }\n\n onSchPage(key: 'scheduled' | 'unscheduled' | 'visits', page: number): void {\n this.schPager = { ...this.schPager, [key]: { ...this.schPager[key], page: Number(page) || 1 } };\n }\n\n onSchPageSize(key: 'scheduled' | 'unscheduled' | 'visits', size: any): void {\n this.schPager = { ...this.schPager, [key]: { page: 1, size: Number(size) || 10 } };\n }\n taskSortColumn = '';\n taskSortDir: 1 | -1 = 1;\n headerData: any;\n /** Create (canAdd) and edit / delete / publish (canEdit) of audits and schedules, from the Checklist permissions. */\n access: AuditAccess = { canAdd: false, canEdit: false };\n readonly noAccessTitle = 'You do not have permission to change audits';\n private readonly destroy$ = new Subject<void>();\n\n constructor(\n private traxService: TraxService,\n private gs: GlobalStateService,\n private toast: ToastService,\n private router: Router,\n private cd: ChangeDetectorRef,\n private route: ActivatedRoute\n ) { }\n\n subTab: ManageSubTab = 'info';\n\n /** The first tab is named after the active module. */\n get subTabs(): Array<{ key: ManageSubTab; label: string }> {\n // Schedule Info: Manage Users -> Tango Trax -> Schedules (Add or Edit).\n return [\n { key: 'info' as ManageSubTab, label: this.isAuditTab ? 'Audit Info' : 'Task Info' },\n { key: 'schedule' as ManageSubTab, label: 'Schedule Info' }\n ].filter(t => t.key !== 'schedule' || !this.access.loaded || !!this.access.canViewSchedule);\n }\n\n /** Tab inside Schedule Info. */\n scheduleTab: ScheduleTab = 'scheduled';\n\n search = '';\n scheduleSearch = '';\n\n /** Create modal. */\n caOpen = false;\n caName = '';\n caDesc = '';\n caMode: 'individual' | 'bulk' = 'individual';\n statusFilter: 'all' | VisitRow['status'] = 'all';\n visitDate = dayjs().format('YYYY-MM-DD');\n /** Single-date picker model, kept in step with visitDate. */\n visitPick: PickerRange | null = toPickerRange(this.visitDate, this.visitDate);\n readonly pickerLocale = PICKER_LOCALE;\n\n private allRows: ManageRow[] = [];\n schedules: ScheduleRow[] = [];\n unscheduled: UnscheduledRow[] = [];\n visits: VisitRow[] = [];\n\n ngOnInit(): void {\n auditAccess(this.gs).pipe(takeUntil(this.destroy$)).subscribe(access => {\n this.access = access;\n // No Schedules permission: Schedule Info (also from a ?tab=schedule link) falls back to the info list.\n if (access.loaded && !access.canViewSchedule && this.subTab === 'schedule') {\n this.subTab = 'info';\n this.schScreen = 'list';\n }\n this.cd.detectChanges();\n });\n const qp = this.route.snapshot.queryParamMap;\n // ?module=task: back from the task builder / task setup opened from the Task tab.\n if (qp.get('module') === 'task') {\n this.moduleTab = 'task';\n }\n // Permissions already here (the access subscription above ran first): no Schedules permission, no Schedule Info.\n if (qp.get('tab') === 'schedule' && (!this.access.loaded || this.access.canViewSchedule)) {\n this.subTab = 'schedule';\n if (qp.get('schedule') === 'create') {\n // Only Configure opens this link (Publish with no stores yet): its audit is the schedule's\n // audit, fixed in the editor, and Back returns to that audit's Configure page.\n this.editorPreselect = qp.get('audit') ? [String(qp.get('audit'))] : [];\n this.editorFromConfigure = this.editorPreselect[0] || '';\n this.editorScheduleId = '';\n this.schScreen = 'editor';\n }\n }\n // The client comes from the global header filter; fall back to the stored\n // selection on a hard refresh, the same way the v1 task screen does.\n this.gs.dataRangeValue\n .pipe(takeUntil(this.destroy$), debounceTime(1000))\n .subscribe((data: any) => {\n this.headerData = data?.client\n ? data\n : JSON.parse(localStorage.getItem('header-filters') as string);\n this.loadAudits();\n this.loadSchedules();\n this.loadUnscheduled();\n this.loadVisits();\n if (this.moduleTab === 'task') { this.loadTasks(); }\n });\n\n this.taskSearch.valueChanges\n .pipe(takeUntil(this.destroy$), debounceTime(500), distinctUntilChanged())\n .subscribe(val => {\n if (val === null || val === undefined) { return; }\n this.taskPage = 1;\n this.loadTasks();\n });\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /**\n * Pull one page of the tasks raised from this client's audits. The task service's task-list\n * returns every task of the client (Create Task, checklist-raised), which put Checklist-menu\n * tasks in the Audit menu; /trax/audit/task/list keeps only the audit-raised ones.\n */\n loadTasks(): void {\n if (!this.headerData?.client) { return; }\n this.taskState.next('loading');\n\n this.traxService.auditTaskList({\n clientId: this.headerData.client,\n limit: this.taskPageSize,\n offset: this.taskPage,\n sortColumn: this.taskSortColumn,\n sortBy: this.taskSortDir,\n search: this.taskSearch.value || ''\n }).pipe(takeUntil(this.destroy$)).subscribe({\n next: (res: any) => {\n this.taskTotal = res?.data?.count || 0;\n this.taskRows = (res?.data?.result || []).map((r: any) => this.toTaskRow(r));\n this.taskState.next('loaded');\n this.cd.detectChanges();\n },\n error: () => {\n this.taskRows = [];\n this.taskTotal = 0;\n this.taskState.next('loaded');\n this.cd.detectChanges();\n }\n });\n }\n\n private toTaskRow(r: any): TaskRow {\n const name = r?.checkListName || '--';\n return {\n id: r?._id,\n name,\n initials: (r?.checkListChar || name.slice(0, 2)).toUpperCase(),\n createdBy: r?.createdByName || '--',\n priority: r?.priorityType ? this.titleCase(r.priorityType) : '--',\n assigned: r?.storeCount ?? 0,\n dueOn: r?.scheduleEndTimeISO\n ? dayjs(r.scheduleEndTimeISO).utc().format('hh:mm A, DD MMM YYYY')\n : '--',\n status: r?.publish ? 'Published' : 'Draft',\n published: !!r?.publish,\n fromGallery: r?.checkListFrom === 'gallery',\n raw: r\n };\n }\n\n private titleCase(v: string): string {\n return v.charAt(0).toUpperCase() + v.slice(1).toLowerCase();\n }\n\n sortTasks(column: string): void {\n if (this.taskSortColumn === column) {\n this.taskSortDir = this.taskSortDir === 1 ? -1 : 1;\n } else {\n this.taskSortColumn = column;\n this.taskSortDir = 1;\n }\n this.loadTasks();\n }\n\n onTaskPageChange(page: number): void {\n this.taskPage = page;\n this.loadTasks();\n }\n\n /** True while a task page is in flight, so the table can shimmer. */\n get taskLoading(): boolean {\n return this.taskState.value !== 'loaded';\n }\n\n onTaskPageSizeChange(size: any): void {\n this.taskPageSize = Number(size) || 10;\n this.taskPage = 1;\n this.loadTasks();\n }\n\n onAuditPageChange(page: number): void {\n this.auditPage = page;\n }\n\n onAuditPageSizeChange(size: any): void {\n this.auditPageSize = Number(size) || 10;\n this.auditPage = 1;\n }\n\n /** The audit rows of the current page; a search that shrinks the list pulls the page back into range. */\n get pagedRows(): ManageRow[] {\n const rows = this.filteredRows;\n const pages = Math.max(1, Math.ceil(rows.length / this.auditPageSize));\n if (this.auditPage > pages) { this.auditPage = pages; }\n const start = (this.auditPage - 1) * this.auditPageSize;\n return rows.slice(start, start + this.auditPageSize);\n }\n\n /** Publish / unpublish a task after a confirm, like the v1 Manage Task screen; the switch follows the reload. */\n onTaskPublish(row: TaskRow): void {\n if (!this.access.canEditTask) { return; }\n const next = !row.published;\n const title = next ? 'Publish task?' : 'Unpublish task?';\n const message = next\n ? `Publishing \"${row.name}\" makes it live, and changes take effect immediately.`\n : `Unpublishing \"${row.name}\" stops it from being raised to stores.`;\n this.askConfirm(title, message, next ? 'Publish' : 'Unpublish', () => {\n this.traxService.publishTask({\n publish: next,\n clientId: this.headerData?.client,\n checklistId: row.id\n }).pipe(takeUntil(this.destroy$)).subscribe({\n next: (res: any) => {\n if (res?.code === 200) {\n this.toast.getSuccessToast(`${row.name} has been ${next ? 'published' : 'unpublished'}.`);\n this.loadTasks();\n }\n },\n error: (e: any) => this.toast.getErrorToast(this.apiError(e))\n });\n }, false);\n }\n\n onTaskDuplicate(row: TaskRow): void {\n if (!this.access.canEditTask) { return; }\n if (row.fromGallery) { return; }\n this.askConfirm('Duplicate task?', `Duplicate \"${row.name}\"? The copy is saved as a draft task.`, 'Duplicate', () => {\n this.traxService.duplicateTask({\n checklistId: row.id,\n clientId: this.headerData?.client\n }).pipe(takeUntil(this.destroy$)).subscribe({\n next: (res: any) => {\n if (res?.code === 200) {\n this.toast.getSuccessToast(`${row.name} has been duplicated.`);\n this.loadTasks();\n }\n },\n error: (e: any) => this.toast.getErrorToast(this.apiError(e))\n });\n }, false);\n }\n\n /** Published tasks cannot be deleted, matching the v1 screen. */\n onTaskDelete(row: TaskRow): void {\n if (!this.access.canEditTask) { return; }\n if (row.published) { return; }\n this.askConfirm('Delete task?', `Delete \"${row.name}\"? This cannot be undone.`, 'Delete', () => {\n this.traxService.getTaskDelete({ taskId: row.id })\n .pipe(takeUntil(this.destroy$)).subscribe({\n next: (res: any) => {\n if (res?.code === 200) {\n this.toast.getSuccessToast(`${row.name} has been deleted.`);\n this.loadTasks();\n }\n },\n error: (e: any) => this.toast.getErrorToast(this.apiError(e))\n });\n });\n }\n\n // The task pages open inside the Audit shell (audit-v2 routes) and, with from=audit, return to\n // this tab (not Checklist > Task) after saving.\n onTaskView(row: TaskRow): void {\n if (!this.access.canEditTask) { return; }\n if (row.published || row.fromGallery) { return; }\n this.router.navigate(['/manage/trax/audit-v2/manage/task'], { queryParams: { id: row.id, from: 'audit' } });\n }\n\n onTaskEdit(row: TaskRow): void {\n // Task actions need TangoTrax/task edit (v1 manage-task); the template hides them otherwise.\n if (!this.access.canEditTask) { return; }\n if (row.fromGallery) { return; }\n this.router.navigate(['/manage/trax/audit-v2/manage/task-configure'], { queryParams: { taskId: row.id, from: 'audit' } });\n }\n\n trackByTask(_: number, row: TaskRow): string {\n return row.id;\n }\n\n /** ---- Audit row actions (same calls as the v1 Manage Checklist screen) ---- */\n\n /** Confirm dialog for row actions (delete = danger; duplicate / publish = primary), drawn like the prototype's modals. */\n confirmBox: { title: string; message: string; action: string; danger: boolean; run: () => void } | null = null;\n\n private askConfirm(title: string, message: string, action: string, run: () => void, danger = true): void {\n this.confirmBox = { title, message, action, danger, run };\n }\n\n confirmYes(): void {\n const run = this.confirmBox?.run;\n this.confirmBox = null;\n if (run) { run(); }\n }\n\n confirmNo(): void {\n this.confirmBox = null;\n }\n\n private apiError(e: any, fallback = 'Please try after sometimes'): string {\n return e?.error?.error?.message || e?.error?.error || e?.error?.message || fallback;\n }\n\n /**\n * Draft audits only: open the questions in the audit question editor. Same as the eye icon on the v1 Manage\n * Checklist screen (and dimmed on published rows in the prototype); published audits are edited from Configure.\n */\n onAuditView(row: ManageRow): void {\n if (row.published || !this.access.canEdit) { return; }\n this.router.navigate(['/manage/trax/audit-v2/manage/editor'], { queryParams: { checklistId: row.id } });\n }\n\n /** Copy the audit (GET /trax/audit/duplicateChecklist) after a confirm; the copy is an audit draft. */\n onAuditDuplicate(row: ManageRow): void {\n // Checklist edit, as the v1 list and the API (GET /audit/duplicateChecklist checks isEdit).\n if (!this.access.canEdit) { return; }\n this.askConfirm('Duplicate audit?', 'Duplicate \"' + row.name + '\"? The copy is saved as a draft audit.', 'Duplicate', () => {\n this.traxService.auditDuplicate({ checklistId: row.id, clientId: this.headerData?.client })\n .pipe(takeUntil(this.destroy$)).subscribe({\n next: (res: any) => {\n if (res?.code !== 200) { return; }\n this.toast.getSuccessToast('Duplicated \"' + row.name + '\" as a draft');\n this.afterAuditChange();\n },\n error: (e: any) => this.toast.getErrorToast(this.apiError(e))\n });\n }, false);\n }\n\n /** Published audits cannot be deleted, matching the v1 screen; unpublish first. */\n onAuditDelete(row: ManageRow): void {\n if (!this.access.canEdit) { return; }\n if (row.published) {\n this.toast.getErrorToast('Unpublish ' + row.name + ' before deleting it');\n return;\n }\n this.askConfirm('Delete audit?', 'Delete \"' + row.name + '\"? Its questions and assignments are removed. This cannot be undone.', 'Delete', () => {\n this.traxService.auditDelete({ id: row.id, clientId: this.headerData?.client })\n .pipe(takeUntil(this.destroy$)).subscribe({\n next: (res: any) => {\n if (res?.code === 200) {\n this.toast.getSuccessToast('Audit deleted');\n this.afterAuditChange();\n }\n },\n error: (e: any) => this.toast.getErrorToast(this.apiError(e))\n });\n });\n }\n\n private afterAuditChange(): void {\n this.loadAudits();\n this.loadUnscheduled();\n this.loadSchedules();\n }\n\n /** ---- Audit tab, served by GET /trax/checklist (the v1 Manage Checklist list) ---- */\n /** The loading flags start true so each list shimmers until its first response. */\n auditsLoading = true;\n auditTotal = 0;\n\n /**\n * Audits for the client via POST /trax/audit/list - the audit collection only, so a\n * checklist made under Checklist -> Manage never lists here - with active-schedule and\n * submitted-visit counts for the header date range.\n */\n loadAudits(): void {\n if (!this.headerData?.client) { return; }\n this.auditsLoading = true;\n this.traxService.auditList({\n clientId: this.headerData.client,\n fromDate: this.headerData.date?.startDate,\n toDate: this.headerData.date?.endDate,\n limit: 200,\n offset: 1,\n search: ''\n }).pipe(takeUntil(this.destroy$)).subscribe({\n next: (res: any) => {\n const list: any[] = res?.code === 200 ? (res.data?.result || []) : [];\n this.auditTotal = Number(res?.data?.count) || list.length;\n this.allRows = newestFirst(list).map((c: any) => this.toManageRow(c));\n this.buildEditorAudits();\n this.auditsLoading = false;\n this.cd.detectChanges();\n },\n error: () => {\n this.allRows = [];\n this.auditTotal = 0;\n this.auditsLoading = false;\n this.cd.detectChanges();\n }\n });\n }\n\n private toManageRow(c: any): ManageRow {\n const name = c?.checkListName || '—';\n return {\n id: c?._id,\n name,\n initials: name.replace(/[^A-Za-z]/g, '').slice(0, 2).toUpperCase(),\n owner: c?.createdByName || '—',\n activeSchedules: String(c?.activeSchedules ?? 0),\n visits: String(c?.visits ?? 0),\n questions: String(c?.questionCount ?? 0),\n status: c?.publish ? 'Published' : 'Draft',\n published: !!c?.publish,\n target: !!c?.isAudit\n };\n }\n\n /** ---- Schedule Info, served by /trax/audit/schedule/* (new auditschedule collection) ---- */\n schedulesLoading = true;\n unscheduledLoading = true;\n visitsLoading = true;\n\n /** Schedule Info shows the lists, the schedule editor (Create schedule › Rows) or one schedule. */\n schScreen: 'list' | 'editor' | 'detail' = 'list';\n editorPreselect: string[] = [];\n /** The audit whose Configure page opened the editor ('' when it was opened here). */\n editorFromConfigure = '';\n editorScheduleId = '';\n detailScheduleId = '';\n /** Audits offered by the editor: not-scheduled ones first. */\n editorAudits: ScheduleAudit[] = [];\n\n loadSchedules(): void {\n if (!this.headerData?.client) { return; }\n this.schedulesLoading = true;\n this.traxService.auditScheduleList({ clientId: this.headerData.client, search: '' })\n .pipe(takeUntil(this.destroy$)).subscribe({\n next: (res: any) => {\n const list: any[] = res?.code === 200 ? (res.data?.result || []) : [];\n this.schedules = newestFirst(list).map((s: any) => ({\n id: s._id,\n name: s.name || '—',\n audits: (s.checkLists || []).map((c: any) => c.checkListName).filter(Boolean).join(' · ') || '—',\n users: Number(s.users) || 0,\n visits: Number(s.visits) || 0,\n completed: Number(s.completed) || 0,\n pending: Number(s.pending) || 0,\n published: !!s.publish,\n checklistIds: (s.checkLists || []).map((c: any) => String(c.checkListId)).filter(Boolean),\n description: s.description || '',\n startDate: s.startDate ? dayjs.utc(s.startDate).format('YYYY-MM-DD') : '',\n endDate: s.endDate ? dayjs.utc(s.endDate).format('YYYY-MM-DD') : '',\n winStart: s.visitWindow?.start || '',\n winEnd: s.visitWindow?.end || ''\n }));\n this.schedulesLoading = false;\n this.cd.detectChanges();\n },\n error: () => { this.schedules = []; this.schedulesLoading = false; this.cd.detectChanges(); }\n });\n }\n\n loadUnscheduled(): void {\n if (!this.headerData?.client) { return; }\n this.unscheduledLoading = true;\n this.traxService.auditScheduleUnscheduled({ clientId: this.headerData.client, search: '' })\n .pipe(takeUntil(this.destroy$)).subscribe({\n next: (res: any) => {\n const list: any[] = res?.code === 200 ? (res.data?.result || []) : [];\n this.unscheduled = newestFirst(list).map((u: any) => {\n const name = u.checkListName || '—';\n return {\n id: u._id,\n name,\n initials: name.replace(/[^A-Za-z]/g, '').slice(0, 2).toUpperCase(),\n owner: u.createdByName || '—',\n questions: Number(u.questionCount) || 0,\n meta: (u.publish ? 'Published' : 'Draft') + ' · ' + (u.coverage || 'store') + ' coverage',\n picked: false,\n published: !!u.publish\n };\n });\n this.unscheduledLoading = false;\n this.buildEditorAudits();\n this.cd.detectChanges();\n },\n error: () => { this.unscheduled = []; this.unscheduledLoading = false; this.cd.detectChanges(); }\n });\n }\n\n /** Every audit instance raised on the monitored day, with a visit status from the API. */\n loadVisits(): void {\n if (!this.headerData?.client || !this.visitDate) { return; }\n this.visitsLoading = true;\n this.traxService.auditScheduleVisits({\n clientId: this.headerData.client,\n date: this.visitDate,\n storeId: (this.headerData.stores || []).filter((s: any) => s.checked).map((s: any) => s.storeId)\n }).pipe(takeUntil(this.destroy$)).subscribe({\n next: (res: any) => {\n const list: any[] = res?.code === 200 ? (res.data?.result || []) : [];\n this.visits = list.map((v: any) => ({\n window: v.scheduleStartTime && v.scheduleEndTime ? v.scheduleStartTime + ' – ' + v.scheduleEndTime : '',\n note: STATUS[(v.status as VisitRow['status']) || 'open'].label,\n user: v.userEmail || v.userName || '—',\n // Store name, not the store code (QA); the id only when a visit has no name.\n store: v.storeName || '—',\n audit: v.checkListName || '—',\n status: (v.status as VisitRow['status']) || 'open'\n }));\n this.visitsLoading = false;\n this.cd.detectChanges();\n },\n error: () => { this.visits = []; this.visitsLoading = false; this.cd.detectChanges(); }\n });\n }\n\n private buildEditorAudits(): void {\n const waiting = new Set(this.unscheduled.map(u => u.id));\n const fromList: ScheduleAudit[] = this.allRows.filter(r => r.target).map(r => ({\n id: r.id, name: r.name, questions: Number(r.questions) || 0,\n meta: r.status + (waiting.has(r.id) ? ' · not scheduled' : ' · in a schedule'),\n publish: r.published\n }));\n const known = new Set(fromList.map(a => a.id));\n const extra: ScheduleAudit[] = this.unscheduled.filter(u => !known.has(u.id)).map(u => ({\n id: u.id, name: u.name, questions: u.questions, meta: u.meta, publish: u.published\n }));\n const all = [...fromList, ...extra];\n this.editorAudits = [...all.filter(a => waiting.has(a.id)), ...all.filter(a => !waiting.has(a.id))];\n }\n\n /** Create schedule: blank, with the ticked Not-scheduled audits, or with the given audits. */\n openScheduleCreate(fromPicks = false, ids?: string[]): void {\n if (!this.access.canAddSchedule) { return; }\n this.editorScheduleId = '';\n this.editorFromConfigure = '';\n this.editorPreselect = ids || (fromPicks ? this.unscheduled.filter(u => u.picked).map(u => u.id) : []);\n if (fromPicks && !this.editorPreselect.length) {\n this.toast.getErrorToast('Select at least one audit');\n return;\n }\n this.buildEditorAudits();\n this.schScreen = 'editor';\n }\n\n /** Not scheduled › Schedule: Create schedule with that audit picked. */\n scheduleOne(row: UnscheduledRow): void {\n this.openScheduleCreate(false, [row.id]);\n }\n\n /** The gear icon: the schedule's rows in the editor. */\n openScheduleEdit(row: ScheduleRow): void {\n this.onDetailEdit(row.id);\n }\n\n onDetailEdit(scheduleId: string): void {\n if (!this.access.canEditSchedule) { return; }\n this.editorScheduleId = scheduleId;\n this.editorPreselect = [];\n this.editorFromConfigure = '';\n this.buildEditorAudits();\n this.schScreen = 'editor';\n }\n\n /** The eye icon and the schedule name: Schedule › (schedule). */\n onScheduleView(row: ScheduleRow): void {\n this.detailScheduleId = row.id;\n this.schScreen = 'detail';\n }\n\n onEditorClosed(saved: boolean): void {\n const fromConfigure = this.editorFromConfigure;\n this.editorFromConfigure = '';\n // Back from an editor that Configure opened returns to that audit's Configure page.\n if (!saved && fromConfigure) {\n this.router.navigate(['/manage/trax/audit-v2/manage/configure'], { queryParams: { checklistId: fromConfigure } });\n return;\n }\n this.schScreen = 'list';\n // Drop ?schedule=create&audit= so a reload shows the list, not the editor again.\n if (this.route.snapshot.queryParamMap.get('schedule')) {\n this.router.navigate([], { relativeTo: this.route, queryParams: { tab: 'schedule' }, replaceUrl: true });\n }\n if (saved) {\n this.scheduleTab = 'scheduled';\n this.unscheduled.forEach(u => u.picked = false);\n this.loadSchedules();\n this.loadUnscheduled();\n this.loadAudits();\n }\n }\n\n backToScheduleList(): void {\n this.schScreen = 'list';\n }\n\n /** A draft copy with the same audits and rows (POST /trax/audit/schedule/duplicate). */\n onScheduleDuplicate(row: ScheduleRow): void {\n if (!this.headerData?.client || !this.access.canAddSchedule) { return; }\n this.traxService.auditScheduleDuplicate({ clientId: this.headerData.client, scheduleId: row.id })\n .pipe(takeUntil(this.destroy$)).subscribe({\n next: (res: any) => {\n if (res?.code === 200) {\n this.toast.getSuccessToast('Duplicated \"' + row.name + '\" as a draft');\n this.loadSchedules();\n }\n },\n error: (e: any) => this.toast.getErrorToast(this.apiError(e))\n });\n }\n\n onScheduleDelete(row: ScheduleRow): void {\n if (!this.access.canEditSchedule) { return; }\n this.askConfirm('Delete schedule?', 'Delete \"' + row.name + '\"? It stops raising visits and its audits go back to Not scheduled.', 'Delete', () => {\n if (!this.headerData?.client) { return; }\n this.traxService.auditScheduleDelete(row.id, this.headerData.client)\n .pipe(takeUntil(this.destroy$)).subscribe({\n next: (res: any) => {\n if (res?.code === 200) {\n this.toast.getSuccessToast('Schedule deleted');\n this.loadSchedules();\n this.loadUnscheduled();\n this.loadAudits();\n }\n },\n error: (e: any) => this.toast.getErrorToast(this.apiError(e))\n });\n });\n }\n\n /**\n * Export the list of the open tab (Scheduled, Not scheduled or Visits) as a CSV file, as it is\n * filtered and sorted on screen. It used to export the Scheduled list whatever the tab.\n */\n exportSchedules(): void {\n const day = dayjs().format('YYYY-MM-DD');\n if (this.scheduleTab === 'notScheduled') {\n const rows = this.filteredUnscheduled;\n if (!rows.length) { this.toast.getErrorToast('No audits to export'); return; }\n this.downloadCsv('not-scheduled-audits-' + day + '.csv', [['Audit', 'Owner', 'Questions', 'Status']]\n .concat(rows.map(r => [r.name, r.owner, String(r.questions), this.unschedStatus(r)])));\n this.toast.getSuccessToast('Not scheduled audits exported');\n return;\n }\n if (this.scheduleTab === 'visits') {\n const rows = this.filteredVisits;\n if (!rows.length) { this.toast.getErrorToast('No visits to export'); return; }\n this.downloadCsv('visits-' + this.visitDate + '.csv', [['Date', 'Visit window', 'User', 'Store', 'Audit', 'Status']]\n .concat(rows.map(v => [this.visitDate, this.windowLabel(v), v.user, v.store, v.audit, this.statusLabel(v)])));\n this.toast.getSuccessToast('Visits exported');\n return;\n }\n const rows = this.filteredSchedules;\n if (!rows.length) { this.toast.getErrorToast('No schedules to export'); return; }\n this.downloadCsv('schedules-' + day + '.csv', [['Schedule name', 'Audits', 'Users', 'Visits', 'Completed', 'Pending', 'Status']]\n .concat(rows.map(r => [r.name, r.audits, String(r.users), String(r.visits), String(r.completed), String(r.pending), r.published ? 'Published' : 'Draft'])));\n this.toast.getSuccessToast('Schedule exported');\n }\n\n private downloadCsv(fileName: string, lines: string[][]): void {\n const csv = lines.map(l => l.map(csvCell).join(',')).join('\\r\\n');\n const url = URL.createObjectURL(new Blob([csv], { type: 'text/csv;charset=utf-8' }));\n const a = document.createElement('a');\n a.href = url;\n a.download = fileName;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n /** ---- Schedule Info table sorting (client-side; header click toggles ascending / descending) ---- */\n schSort: Record<ScheduleTab, { col: string; dir: 1 | -1 }> = {\n visits: { col: '', dir: 1 },\n scheduled: { col: '', dir: 1 },\n notScheduled: { col: '', dir: 1 }\n };\n\n sortSchedule(tab: ScheduleTab, col: string): void {\n const s = this.schSort[tab];\n if (s.col === col) {\n s.dir = s.dir === 1 ? -1 : 1;\n } else {\n s.col = col;\n s.dir = 1;\n }\n }\n\n /** Audit list sorting (client-side, the whole list is loaded); same toggle as the schedule tables. */\n auditSort: { col: string; dir: 1 | -1 } = { col: '', dir: 1 };\n\n sortAudits(col: string): void {\n this.auditSort = this.auditSort.col === col\n ? { col, dir: this.auditSort.dir === 1 ? -1 : 1 }\n : { col, dir: 1 };\n this.auditPage = 1;\n }\n\n private sortBy<T>(rows: T[], tab: ScheduleTab | { col: string; dir: 1 | -1 }): T[] {\n const { col, dir } = typeof tab === 'string' ? this.schSort[tab] : tab;\n if (!col) { return rows; }\n const value = (r: T): any => (r as any)[col];\n return [...rows].sort((a, b) => {\n const x = value(a);\n const y = value(b);\n if (typeof x === 'number' && typeof y === 'number') { return (x - y) * dir; }\n if (typeof x === 'boolean' && typeof y === 'boolean') { return (Number(x) - Number(y)) * dir; }\n return String(x ?? '').localeCompare(String(y ?? ''), undefined, { numeric: true, sensitivity: 'base' }) * dir;\n });\n }\n\n /** Stacked bar under the visit status cards (submitted / in progress / missed). */\n get visitBar(): Array<{ width: string; fill: string; title: string }> {\n const total = this.visits.length;\n if (!total) { return []; }\n const count = (s: VisitRow['status']) => this.visits.filter(v => v.status === s).length;\n return ([['submitted', '#12B76A', 'Submitted'], ['live', '#2E90FA', 'In progress'], ['missed', '#F04438', 'Missed']] as Array<[VisitRow['status'], string, string]>)\n .map(([s, fill, label]) => ({ n: count(s), fill, label }))\n .filter(x => x.n)\n .map(x => ({ width: (x.n / total * 100) + '%', fill: x.fill, title: x.label + ': ' + x.n }));\n }\n\n setModuleTab(tab: ModuleTab): void {\n this.moduleTab = tab;\n // Schedule Info exists for audits only, so the Task module always opens on its info list.\n if (tab === 'task') { this.subTab = 'info'; }\n // Tasks are served by the API, so fetch the first page on entering the tab.\n if (tab === 'task' && this.taskState.value === 'initial') { this.loadTasks(); }\n }\n\n get isAuditTab(): boolean {\n return this.moduleTab === 'audit';\n }\n\n setSubTab(tab: ManageSubTab): void {\n if (tab === 'schedule' && this.access.loaded && !this.access.canViewSchedule) { return; }\n this.subTab = tab;\n }\n\n setScheduleTab(tab: ScheduleTab): void {\n this.scheduleTab = tab;\n }\n\n /** Labels follow the selected module. */\n get nameCol(): string {\n return this.isAuditTab ? 'Audit' : 'Task';\n }\n\n get ownerCol(): string {\n return this.isAuditTab ? 'Audit Owner' : 'Task Owner';\n }\n\n get createLabel(): string {\n return '+ Create ' + (this.isAuditTab ? 'Audit' : 'Task');\n }\n\n get createCardLabel(): string {\n return this.isAuditTab ? 'Create New Audits' : 'Create New Tasks';\n }\n\n get predefLabel(): string {\n return this.isAuditTab ? 'Configure Predefined Audit' : 'Configure Predefined Task';\n }\n\n get aiPredefLabel(): string {\n return this.isAuditTab ? 'Configure your Predefined AI audit' : 'Configure your Predefined AI task';\n }\n\n get aiCardLabel(): string {\n return this.isAuditTab ? 'Choose from a library of AI Audits' : 'Choose from a library of AI Tasks';\n }\n\n get emptyHint(): string {\n return 'Audits created with Audit enabled appear here.';\n }\n\n /** Schedule tab labels carry live counts. */\n get scheduleTabs(): Array<{ key: ScheduleTab; label: string }> {\n return [\n { key: 'visits', label: 'Visits' },\n { key: 'scheduled', label: 'Scheduled (' + this.schedules.length + ')' },\n { key: 'notScheduled', label: 'Not scheduled (' + this.unscheduled.length + ')' }\n ];\n }\n\n get scheduleKpis(): ScheduleKpi[] {\n const active = this.schedules.filter(s => s.published).length;\n const visitTotal = this.schedules.reduce((a, s) => a + s.visits, 0);\n const completedTotal = this.schedules.reduce((a, s) => a + s.completed, 0);\n return [\n { label: 'Active Schedules', value: String(active), note: 'Publishing visits to Trax', color: '#12B76A' },\n { label: 'Scheduled Visits', value: String(visitTotal), note: 'Across all schedules', color: '#667085' },\n { label: 'Completed', value: String(completedTotal), note: 'Submitted by auditors', color: '#1570EF' },\n { label: 'Not Scheduled', value: String(this.unscheduled.length), note: 'Audits waiting to be scheduled', color: '#F04438' }\n ];\n }\n\n /** The audit tab lists only audit-mode programmes; the task tab is empty. */\n get filteredRows(): ManageRow[] {\n if (!this.isAuditTab) { return []; }\n const q = this.search.trim().toLowerCase();\n return this.sortBy(this.allRows\n .filter(r => r.target)\n .filter(r => !q || (r.name + ' ' + r.owner).toLowerCase().includes(q)), this.auditSort);\n }\n\n get rowCountLabel(): string {\n const n = this.filteredRows.length;\n return (n < 10 ? '0' + n : String(n));\n }\n\n /** \"A · B · C\" -> \"A +2\": the first audit and how many more (the full list stays in the tooltip, search and export). */\n auditsShort(audits: string): string {\n const names = String(audits || '').split(' · ').filter(n => n && n !== '—');\n return names.length > 1 ? names[0] + ' +' + (names.length - 1) : (names[0] || '—');\n }\n\n get filteredSchedules(): ScheduleRow[] {\n const q = this.scheduleSearch.trim().toLowerCase();\n const rows = q ? this.schedules.filter(r => (r.name + ' ' + r.audits).toLowerCase().includes(q)) : this.schedules;\n return this.sortBy(rows, 'scheduled');\n }\n\n get scheduleCountLabel(): string {\n return this.filteredSchedules.length + ' of ' + this.schedules.length + ' schedules';\n }\n\n get filteredUnscheduled(): UnscheduledRow[] {\n const q = this.scheduleSearch.trim().toLowerCase();\n const rows = q ? this.unscheduled.filter(r => (r.name + ' ' + r.owner).toLowerCase().includes(q)) : this.unscheduled;\n return this.sortBy(rows, 'notScheduled');\n }\n\n get pickedCount(): number {\n return this.unscheduled.filter(u => u.picked).length;\n }\n\n get scheduleSelectedLabel(): string {\n return this.pickedCount ? 'Schedule ' + this.pickedCount + ' selected' : 'Schedule selected';\n }\n\n togglePick(row: UnscheduledRow): void {\n row.picked = !row.picked;\n }\n\n get filteredVisits(): VisitRow[] {\n const q = this.scheduleSearch.trim().toLowerCase();\n return this.sortBy(this.visits\n .filter(v => this.statusFilter === 'all' || v.status === this.statusFilter)\n .filter(v => !q || (v.user + ' ' + v.store + ' ' + v.audit).toLowerCase().includes(q)), 'visits');\n }\n\n get visitSubtitle(): string {\n return this.visits.length + ' visits raised for the selected day';\n }\n\n /** Clickable status tiles above the visit list. */\n get visitStatusCards(): Array<{ key: VisitRow['status']; label: string; value: number; color: string; active: boolean }> {\n const keys: Array<[VisitRow['status'], string, string]> = [\n ['submitted', 'Submitted', '#039855'],\n ['live', 'In progress', '#1570EF'],\n ['open', 'Not started', '#344054'],\n ['missed', 'Missed', '#D92D20']\n ];\n return keys.map(k => ({\n key: k[0],\n label: k[1],\n value: this.visits.filter(v => v.status === k[0]).length,\n color: k[2],\n active: this.statusFilter === k[0]\n }));\n }\n\n /** Reset the monitor to the prototype's reference day. */\n /** Step the monitored day backwards or forwards (prototype's ← → controls). */\n shiftDay(delta: number): void {\n const d = dayjs(this.visitDate);\n if (!d.isValid()) { return; }\n this.setVisitDate(d.add(delta, 'day').format('YYYY-MM-DD'));\n }\n\n goToday(): void {\n this.setVisitDate(dayjs().format('YYYY-MM-DD'));\n }\n\n onVisitDatePicked(e: PickedDates | null): void {\n if (!e?.startDate) { return; }\n const day = e.startDate.format('YYYY-MM-DD');\n if (day !== this.visitDate) { this.setVisitDate(day); }\n }\n\n private setVisitDate(day: string): void {\n this.visitDate = day;\n this.visitPick = toPickerRange(day, day);\n this.loadVisits();\n }\n\n toggleStatus(key: VisitRow['status']): void {\n this.statusFilter = this.statusFilter === key ? 'all' : key;\n }\n\n /** Publish / unpublish a schedule via PUT /trax/audit/schedule/publish, reverting on failure. */\n togglePublish(row: ScheduleRow): void {\n if (!this.access.canEditSchedule) { return; }\n const next = !row.published;\n // Every row dated before today (the last date is past): the API refuses it, so say why here.\n if (next && row.endDate && row.endDate < dayjs().format('YYYY-MM-DD')) {\n this.toast.getErrorToast('\"' + row.name + '\" has only past dates (last ' + row.endDate + '). Edit its rows to today or later, then publish.');\n return;\n }\n row.published = next;\n this.traxService.auditSchedulePublish({ clientId: this.headerData?.client, scheduleId: row.id, publish: next })\n .pipe(takeUntil(this.destroy$)).subscribe({\n next: (res: any) => {\n if (res?.code !== 200) { row.published = !next; this.cd.detectChanges(); return; }\n const nowLive = (res?.data?.audits || []).filter((a: any) => a.publishedNow).length;\n this.toast.getSuccessToast((next ? 'Schedule published' : 'Schedule unpublished')\n + (nowLive ? ' · ' + nowLive + (nowLive === 1 ? ' audit' : ' audits') + ' published' : ''));\n this.loadAudits();\n this.loadUnscheduled();\n this.cd.detectChanges();\n },\n error: (e: any) => {\n row.published = !next;\n this.toast.getErrorToast(this.apiError(e));\n this.cd.detectChanges();\n }\n });\n }\n\n /** Publish / unpublish an audit via PUT /trax/audit/publish after a confirm (like the v1 Manage Checklist screen). */\n toggleRowPublish(row: ManageRow): void {\n if (!this.access.canEdit) { return; }\n const next = !row.published;\n const title = next ? 'Publish audit?' : 'Unpublish audit?';\n const message = next\n ? `Publishing \"${row.name}\" makes it live, and changes take effect immediately.`\n : `Unpublishing \"${row.name}\" stops new visits from being raised.`;\n this.askConfirm(title, message, next ? 'Publish' : 'Unpublish', () => this.publishAudit(row, next), false);\n }\n\n /** Flips the switch at once and reverts it when the call fails. */\n private publishAudit(row: ManageRow, next: boolean): void {\n row.published = next;\n row.status = next ? 'Published' : 'Draft';\n\n this.traxService.auditPublish({\n publish: next,\n clientId: this.headerData?.client,\n checklistId: row.id\n }).pipe(takeUntil(this.destroy$)).subscribe({\n next: (res: any) => {\n if (res?.code === 200) {\n this.toast.getSuccessToast(`${row.name} has been ${next ? 'published' : 'unpublished'}.`);\n this.loadAudits();\n } else {\n row.published = !next;\n row.status = row.published ? 'Published' : 'Draft';\n this.cd.detectChanges();\n }\n },\n error: (e: any) => {\n row.published = !next;\n row.status = row.published ? 'Published' : 'Draft';\n this.toast.getErrorToast(this.apiError(e));\n this.cd.detectChanges();\n }\n });\n }\n\n /** Dashes replace zeroes in the schedule table, per the prototype. */\n dash(n: number): string {\n return n > 0 ? String(n) : '—';\n }\n\n windowLabel(v: VisitRow): string {\n return v.window || 'No visit window';\n }\n\n statusLabel(v: VisitRow): string {\n return STATUS[v.status].label;\n }\n\n statusBg(v: VisitRow): string {\n return STATUS[v.status].bg;\n }\n\n statusFg(v: VisitRow): string {\n return STATUS[v.status].fg;\n }\n\n statusDot(v: VisitRow): string {\n return STATUS[v.status].dot;\n }\n\n rowStatusBg(row: ManageRow): string {\n return row.published ? '#ECFDF3' : '#EFF8FF';\n }\n\n rowStatusFg(row: ManageRow): string {\n return row.published ? '#027A48' : '#175CD3';\n }\n\n get caTitle(): string {\n return 'Create ' + (this.isAuditTab ? 'Audit' : 'Task');\n }\n\n get caNameLabel(): string {\n return (this.isAuditTab ? 'Audit' : 'Task') + ' Name';\n }\n\n /** Proceed stays disabled until a name is entered. */\n get caReady(): boolean {\n return this.caName.trim().length > 0;\n }\n\n openCreate(): void {\n // The Task tab creates a task: TangoTrax/task add (v1 manage-task); audits need checklist add.\n if (!(this.isAuditTab ? this.access.canAdd : this.access.canAddTask)) { return; }\n this.caOpen = true;\n this.caName = '';\n this.caDesc = '';\n this.caMode = 'individual';\n }\n\n cancelCreate(): void {\n this.caOpen = false;\n }\n\n caSaving = false;\n\n /**\n * Audits tab: create the audit (POST /trax/audit/create: checklist + default section +\n * auditconfig row), then open it in the audit question editor to add questions.\n * Tasks tab: open the task builder with the name/description filled in. It creates the task on\n * save; from=audit makes it tag the task as an audit task (POST /trax/audit/task/link) and come\n * back to this tab, so the task is listed here.\n */\n proceedCreate(): void {\n if (!this.caReady || !this.headerData?.client) { return; }\n if (!this.isAuditTab) {\n this.caOpen = false;\n this.router.navigate(['/manage/trax/audit-v2/manage/task'], {\n queryParams: { name: this.caName.trim(), description: this.caDesc.trim() || null, from: 'audit' }\n });\n return;\n }\n this.caSaving = true;\n this.traxService.auditCreate({\n clientId: this.headerData.client,\n checkListName: this.caName.trim(),\n checklistDescription: this.caDesc.trim(),\n passMark: 75\n }).pipe(takeUntil(this.destroy$)).subscribe({\n next: (res: any) => {\n this.caSaving = false;\n if (res?.code === 200 && res?.data?._id) {\n this.caOpen = false;\n this.toast.getSuccessToast(`${this.caName.trim()} has been created.`);\n // The audit question editor saves to the audit APIs and returns to Configure / Manage;\n // \"Add questions in bulk\" opens its bulk upload popup (audit APIs) once the audit loads.\n this.router.navigate(['/manage/trax/audit-v2/manage/editor'], {\n queryParams: { checklistId: res.data._id },\n state: { bulk: this.caMode === 'bulk' }\n });\n }\n this.cd.detectChanges();\n },\n error: (e: any) => {\n this.caSaving = false;\n this.toast.getErrorToast(e?.error?.error?.message || e?.error?.error || 'Please try after sometimes');\n this.cd.detectChanges();\n }\n });\n }\n\n setCaMode(mode: 'individual' | 'bulk'): void {\n this.caMode = mode;\n }\n\n /** Unscheduled rows carry their publish state in the meta string. */\n unschedStatus(row: UnscheduledRow): string {\n return row.meta.split(' · ')[0];\n }\n\n unschedStatusBg(row: UnscheduledRow): string {\n return this.unschedStatus(row) === 'Published' ? '#ECFDF3' : '#EFF8FF';\n }\n\n unschedStatusFg(row: UnscheduledRow): string {\n return this.unschedStatus(row) === 'Published' ? '#027A48' : '#175CD3';\n }\n\n trackByRow(_: number, row: ManageRow): string {\n return row.id;\n }\n\n trackBySchedule(_: number, row: ScheduleRow): string {\n return row.id;\n }\n\n trackByUnscheduled(_: number, row: UnscheduledRow): string {\n return row.id;\n }\n\n trackByVisit(index: number, row: VisitRow): string {\n return row.store + index;\n }\n}\n","<div class=\"av2-page audit-manage\">\n\n <!-- Title + Audit/Task switch -->\n <div class=\"ml-head\">\n <div class=\"ml-head-text\">\n <div class=\"ml-title\">Manage Your {{ isAuditTab ? 'Audits' : 'Tasks' }}</div>\n <div class=\"ml-sub\">You can create and manage your {{ isAuditTab ? 'audits' : 'tasks' }} here</div>\n </div>\n <div class=\"av2-grow\"></div>\n <div class=\"moduleswitch\">\n <button type=\"button\" class=\"moduletab\" [class.moduletab-on]=\"moduleTab === 'audit'\"\n (click)=\"setModuleTab('audit')\">Audit</button>\n <button type=\"button\" class=\"moduletab\" [class.moduletab-on]=\"moduleTab === 'task'\"\n (click)=\"setModuleTab('task')\">Task</button>\n </div>\n </div>\n\n\n <!-- Audit Info / Schedule Info (Audit module only) -->\n <div class=\"ml-subtabs\" *ngIf=\"isAuditTab\">\n <button type=\"button\" class=\"ml-subtab\" *ngFor=\"let t of subTabs\" [class.is-active]=\"subTab === t.key\"\n (click)=\"setSubTab(t.key)\">{{ t.label }}</button>\n </div>\n\n <!-- ============ AUDIT INFO ============ -->\n <section class=\"ml-card\" *ngIf=\"subTab === 'info' && isAuditTab\">\n <div class=\"ml-card-head\">\n <div class=\"ml-card-text\">\n <div class=\"ml-card-title\">{{ nameCol }} Info</div>\n <div class=\"ml-card-hint\">{{ emptyHint }}</div>\n </div>\n <div class=\"av2-grow\"></div>\n <label class=\"av2-search ml-search\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\n </svg>\n <input type=\"text\" placeholder=\"Search\" [(ngModel)]=\"search\">\n </label>\n <button type=\"button\" class=\"av2-btn ml-create\" *ngIf=\"access.canAdd\" (click)=\"openCreate()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\n stroke-linecap=\"round\">\n <path d=\"M12 5v14M5 12h14\"></path>\n </svg>\n Create {{ nameCol }}\n </button>\n </div>\n\n <lib-audit-v2-shimmer *ngIf=\"auditsLoading\"></lib-audit-v2-shimmer>\n\n <div class=\"av2-table-wrap\" *ngIf=\"!auditsLoading\">\n <table class=\"ml-table ml-table--audit\">\n <thead>\n <tr>\n <th class=\"sortable\" (click)=\"sortAudits('name')\">{{ nameCol }} <lib-audit-v2-sort-icon [active]=\"auditSort.col === 'name'\" [dir]=\"auditSort.dir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n <th class=\"sortable\" (click)=\"sortAudits('owner')\">{{ ownerCol }} <lib-audit-v2-sort-icon [active]=\"auditSort.col === 'owner'\" [dir]=\"auditSort.dir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n <th class=\"sortable\" (click)=\"sortAudits('visits')\">Visits <lib-audit-v2-sort-icon [active]=\"auditSort.col === 'visits'\" [dir]=\"auditSort.dir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n <th class=\"sortable\" (click)=\"sortAudits('questions')\">No. of questions <lib-audit-v2-sort-icon [active]=\"auditSort.col === 'questions'\" [dir]=\"auditSort.dir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n <th class=\"sortable\" (click)=\"sortAudits('status')\">Status <lib-audit-v2-sort-icon [active]=\"auditSort.col === 'status'\" [dir]=\"auditSort.dir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n <th>Actions</th>\n <th class=\"sortable\" (click)=\"sortAudits('published')\">Publish <lib-audit-v2-sort-icon [active]=\"auditSort.col === 'published'\" [dir]=\"auditSort.dir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of pagedRows; trackBy: trackByRow\">\n <td>\n <div class=\"namecell\">\n <span class=\"avatarcircle\">{{ row.initials }}</span>\n <a class=\"rowlink\" routerLink=\"/manage/trax/audit-v2/manage/configure\" [queryParams]=\"{ checklistId: row.id }\">{{ row.name }}</a>\n </div>\n </td>\n <td>{{ row.owner }}</td>\n <td>{{ row.visits }}</td>\n <td>{{ row.questions }}</td>\n <td>\n <span class=\"statuspill\" [style.background]=\"rowStatusBg(row)\" [style.color]=\"rowStatusFg(row)\">\n {{ row.status }}\n </span>\n </td>\n <td>\n <span class=\"rowicons\">\n <!-- Draft audits only: opens the questions in the audit editor (published: edit from Configure).\n Actions follow the Checklist permissions (access.canAdd / canEdit), like the v1 Checklist list. -->\n <a class=\"rowicon\" [class.rowicon-dim]=\"row.published || !access.canEdit\"\n [title]=\"!access.canEdit ? noAccessTitle : row.published ? 'Unpublish to edit the questions' : 'View questions'\" (click)=\"onAuditView(row)\">\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\n </svg>\n </a>\n <!-- Configure and Duplicate need checklist edit, as the v1 list (and the API: both routes check isEdit). -->\n <a class=\"rowicon\" [class.rowicon-target]=\"row.target\" [class.rowicon-dim]=\"!access.canEdit\"\n [title]=\"access.canEdit ? 'Configure audit' : noAccessTitle\"\n [routerLink]=\"access.canEdit ? '/manage/trax/audit-v2/manage/configure' : null\" [queryParams]=\"{ checklistId: row.id }\">\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\n <path d=\"M19.4 15a1.7 1.7 0 0 0 .3 1.9l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-2.9 1.2v.2a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1.1-1.5 1.7 1.7 0 0 0-1.9.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.9 1.7 1.7 0 0 0-1.5-1H4a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1.1 1.7 1.7 0 0 0-.3-1.9l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.9.3H10a1.7 1.7 0 0 0 1-1.5V4a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.9-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.9V10a1.7 1.7 0 0 0 1.5 1h.1a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1z\"></path>\n </svg>\n </a>\n <a class=\"rowicon\" [class.rowicon-dim]=\"!access.canEdit\" [title]=\"access.canEdit ? 'Duplicate' : noAccessTitle\"\n (click)=\"onAuditDuplicate(row)\">\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"9\" y=\"9\" width=\"12\" height=\"12\" rx=\"2\"></rect>\n <path d=\"M15 5H5v10\"></path>\n </svg>\n </a>\n <a class=\"rowicon\" [class.rowicon-dim]=\"row.published || !access.canEdit\"\n [title]=\"!access.canEdit ? noAccessTitle : row.published ? 'Unpublish before deleting' : 'Delete'\"\n (click)=\"onAuditDelete(row)\">\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M4 7h16\"></path>\n <path d=\"M7 7l1 13h8l1-13M9 7V4h6v3\"></path>\n </svg>\n </a>\n </span>\n </td>\n <td>\n <button type=\"button\" class=\"pubtoggle\" [class.pub-on]=\"row.published\" [disabled]=\"!access.canEdit\"\n [title]=\"access.canEdit ? '' : noAccessTitle\" (click)=\"toggleRowPublish(row)\">\n <span class=\"pubknob\"></span>\n </button>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <div *ngIf=\"!auditsLoading && filteredRows.length\" class=\"ml-pager\">\n <lib-pagination [itemsPerPage]=\"auditPageSize\" [pageSize]=\"auditPageSize\" [paginationSizes]=\"auditPaginationSizes\"\n [currentPage]=\"auditPage\" [totalItems]=\"filteredRows.length\" (pageChange)=\"onAuditPageChange($event)\"\n (pageSizeChange)=\"onAuditPageSizeChange($event)\"></lib-pagination>\n </div>\n\n <div *ngIf=\"!auditsLoading && !filteredRows.length\" class=\"av2-empty\">\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\n <div class=\"av2-empty-text\">\n <div class=\"av2-empty-title\">No data found</div>\n <div class=\"av2-empty-sub\">{{ emptyHint }}</div>\n </div>\n </div>\n </section>\n\n <!-- ============ TASK INFO (served by the trax task API) ============ -->\n <section class=\"ml-card\" *ngIf=\"!isAuditTab\">\n <div class=\"ml-card-head\">\n <div class=\"ml-card-text\">\n <div class=\"ml-card-title\">Task Info</div>\n <!-- Audit tasks only: the ones created here (tagged checkListFrom 'audit' when the builder saves)\n and the ones raised automatically from audit flags (Configure → Auto Create Task for Flags). -->\n <div class=\"ml-card-hint\">{{ taskTotal }} audit tasks · created here or raised automatically from audit flags</div>\n </div>\n <div class=\"av2-grow\"></div>\n <label class=\"av2-search ml-search\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\n </svg>\n <input type=\"text\" placeholder=\"Search\" [formControl]=\"taskSearch\">\n </label>\n <!-- Task permissions, as the v1 Manage -> Task list: Create needs TangoTrax/task add. -->\n <button type=\"button\" class=\"av2-btn ml-create\" *ngIf=\"access.canAddTask\" (click)=\"openCreate()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\"\n stroke-linecap=\"round\">\n <path d=\"M12 5v14M5 12h14\"></path>\n </svg>\n Create Task\n </button>\n </div>\n\n <div class=\"av2-table-wrap\" *ngIf=\"!taskLoading\">\n <table class=\"ml-table\">\n <thead>\n <tr>\n <th class=\"sortable\" (click)=\"sortTasks('checkListName')\">Task <lib-audit-v2-sort-icon [active]=\"taskSortColumn === 'checkListName'\" [dir]=\"taskSortDir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n <th class=\"sortable\" (click)=\"sortTasks('createdByName')\">Created By <lib-audit-v2-sort-icon [active]=\"taskSortColumn === 'createdByName'\" [dir]=\"taskSortDir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n <th class=\"sortable\" (click)=\"sortTasks('priorityType')\">Priority <lib-audit-v2-sort-icon [active]=\"taskSortColumn === 'priorityType'\" [dir]=\"taskSortDir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n <th class=\"sortable\" (click)=\"sortTasks('storeCount')\">Assigned To <lib-audit-v2-sort-icon [active]=\"taskSortColumn === 'storeCount'\" [dir]=\"taskSortDir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n <th class=\"sortable\" (click)=\"sortTasks('scheduleEndTimeISO')\">Due On <lib-audit-v2-sort-icon [active]=\"taskSortColumn === 'scheduleEndTimeISO'\" [dir]=\"taskSortDir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n <th class=\"sortable\" (click)=\"sortTasks('publish')\">Status <lib-audit-v2-sort-icon [active]=\"taskSortColumn === 'publish'\" [dir]=\"taskSortDir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n <!-- v1: Actions and Publish only with TangoTrax/task edit. -->\n <th *ngIf=\"access.canEditTask\">Actions</th>\n <th *ngIf=\"access.canEditTask\">Publish</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of taskRows; trackBy: trackByTask\">\n <td>\n <div class=\"namecell\">\n <span class=\"avatarcircle\">{{ row.initials }}</span>\n <a class=\"rowlink\" *ngIf=\"access.canEditTask\" (click)=\"onTaskEdit(row)\">{{ row.name }}</a>\n <span *ngIf=\"!access.canEditTask\">{{ row.name }}</span>\n </div>\n </td>\n <td>{{ row.createdBy }}</td>\n <td>{{ row.priority }}</td>\n <td>{{ row.assigned }}</td>\n <td>{{ row.dueOn }}</td>\n <td>\n <span class=\"statuspill\" [style.background]=\"row.published ? '#ECFDF3' : '#EFF8FF'\"\n [style.color]=\"row.published ? '#027A48' : '#175CD3'\">{{ row.status }}</span>\n </td>\n <td *ngIf=\"access.canEditTask\">\n <span class=\"rowicons\">\n <!-- Draft tasks only: opens the task in the builder. -->\n <a class=\"rowicon\" [class.rowicon-off]=\"row.published || row.fromGallery\"\n [attr.title]=\"row.published ? 'Published tasks cannot be opened as drafts' : 'View'\"\n (click)=\"onTaskView(row)\">\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\n </svg>\n </a>\n <a class=\"rowicon\" title=\"Configure\" [class.rowicon-off]=\"row.fromGallery\" (click)=\"onTaskEdit(row)\">\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\n <path d=\"M19.4 15a1.7 1.7 0 0 0 .3 1.9l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-2.9 1.2v.2a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1.1-1.5 1.7 1.7 0 0 0-1.9.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.9 1.7 1.7 0 0 0-1.5-1H4a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1.1 1.7 1.7 0 0 0-.3-1.9l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.9.3H10a1.7 1.7 0 0 0 1-1.5V4a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.9-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.9V10a1.7 1.7 0 0 0 1.5 1h.1a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1z\"></path>\n </svg>\n </a>\n <a class=\"rowicon\" title=\"Duplicate\" [class.rowicon-off]=\"row.fromGallery\" (click)=\"onTaskDuplicate(row)\">\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"9\" y=\"9\" width=\"12\" height=\"12\" rx=\"2\"></rect>\n <path d=\"M15 5H5v10\"></path>\n </svg>\n </a>\n <!-- Published tasks cannot be deleted. -->\n <a class=\"rowicon\" [class.rowicon-off]=\"row.published\"\n [attr.title]=\"row.published ? 'Published tasks cannot be deleted' : 'Delete'\"\n (click)=\"onTaskDelete(row)\">\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M4 7h16\"></path>\n <path d=\"M7 7l1 13h8l1-13M9 7V4h6v3\"></path>\n </svg>\n </a>\n </span>\n </td>\n <td *ngIf=\"access.canEditTask\">\n <button type=\"button\" class=\"pubtoggle\" [class.pub-on]=\"row.published\" (click)=\"onTaskPublish(row)\">\n <span class=\"pubknob\"></span>\n </button>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <div *ngIf=\"taskTotal && !taskLoading\" class=\"ml-pagination\">\n <!-- No [collection]: the shared paginator renders one bullet per item. -->\n <lib-pagination [itemsPerPage]=\"taskPageSize\" [currentPage]=\"taskPage\" [totalItems]=\"taskTotal\"\n [paginationSizes]=\"taskPaginationSizes\" [pageSize]=\"taskPageSize\" (pageChange)=\"onTaskPageChange($event)\"\n (pageSizeChange)=\"onTaskPageSizeChange($event)\"></lib-pagination>\n </div>\n\n <!-- Shimmer while a page is in flight, so rows never show stale data. -->\n <lib-audit-v2-shimmer *ngIf=\"taskLoading\"></lib-audit-v2-shimmer>\n\n <div *ngIf=\"!taskLoading && !taskRows.length\" class=\"av2-empty\">\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\n <div class=\"av2-empty-text\">\n <div class=\"av2-empty-title\">No data found</div>\n <div class=\"av2-empty-sub\">{{ taskSearch.value ? 'No audit task matches your search.' : 'No audit tasks yet. Create a task, or turn on Auto Create Task for Flags in an audit\\'s Configure.' }}</div>\n </div>\n </div>\n </section>\n\n <!-- ============ SCHEDULE INFO ============ -->\n <!-- Schedule › Create schedule / › Rows / › (schedule) -->\n <lib-audit-v2-schedule-editor *ngIf=\"subTab === 'schedule' && isAuditTab && schScreen === 'editor' && headerData?.client\"\n [clientId]=\"headerData.client\" [audits]=\"editorAudits\" [preselect]=\"editorPreselect\" [scheduleId]=\"editorScheduleId\"\n [lockAudits]=\"!!editorFromConfigure\" [backLabel]=\"editorFromConfigure ? 'Back to Configure' : 'Back to Schedule'\"\n (closed)=\"onEditorClosed($event)\"></lib-audit-v2-schedule-editor>\n <lib-audit-v2-schedule-detail *ngIf=\"subTab === 'schedule' && isAuditTab && schScreen === 'detail' && headerData?.client\"\n [clientId]=\"headerData.client\" [scheduleId]=\"detailScheduleId\" [canEdit]=\"!!access.canEditSchedule\"\n [fromDate]=\"headerData.date?.startDate || ''\" [toDate]=\"headerData.date?.endDate || ''\"\n (back)=\"backToScheduleList()\" (edit)=\"onDetailEdit($event)\"></lib-audit-v2-schedule-detail>\n\n <ng-container *ngIf=\"subTab === 'schedule' && isAuditTab && schScreen === 'list'\">\n <!-- Sub tabs + search + actions -->\n <div class=\"sch-toolbar\">\n <div class=\"segmented\">\n <button type=\"button\" class=\"segtab\" *ngFor=\"let t of scheduleTabs\" [class.segtab-on]=\"scheduleTab === t.key\"\n (click)=\"setScheduleTab(t.key)\">{{ t.label }}</button>\n </div>\n <label class=\"av2-search sch-search\">\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\n </svg>\n <input type=\"text\" placeholder=\"Search schedules or audits\" [(ngModel)]=\"scheduleSearch\">\n </label>\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"exportSchedules()\">Export</button>\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm\" *ngIf=\"access.canAddSchedule\" (click)=\"openScheduleCreate()\">Create schedule</button>\n </div>\n\n <!-- Scheduled -->\n <ng-container *ngIf=\"scheduleTab === 'scheduled'\">\n <div class=\"kpigrid\">\n <!-- Old Checklist summary card: figure + label in the gradient strip, note below. -->\n <div class=\"av2-ocard\" *ngFor=\"let kpi of scheduleKpis\">\n <div class=\"av2-ocard-head\">\n <div class=\"av2-ocard-count\">\n <span *ngIf=\"schedulesLoading\" class=\"av2-sk av2-sk--value ml-sk-value\"></span>\n <ng-container *ngIf=\"!schedulesLoading\">{{ kpi.value }}</ng-container>\n </div>\n <div class=\"av2-ocard-text\">{{ kpi.label }}</div>\n </div>\n <div class=\"av2-ocard-body\">\n <span *ngIf=\"schedulesLoading\" class=\"av2-sk av2-sk--note\"></span>\n <div *ngIf=\"!schedulesLoading\" class=\"av2-ocard-note\">{{ kpi.note }}</div>\n </div>\n </div>\n </div>\n\n <section class=\"av2-card sch-card\">\n <div class=\"sch-card-head\">\n <div class=\"sch-card-title\">Scheduled visits</div>\n <div class=\"sch-card-sub\">{{ scheduleCountLabel }}</div>\n </div>\n\n <lib-audit-v2-shimmer *ngIf=\"schedulesLoading\"></lib-audit-v2-shimmer>\n\n <div class=\"av2-table-wrap\" *ngIf=\"!schedulesLoading\">\n <table class=\"sch-table sch-table--scheduled\">\n <thead>\n <tr>\n <th class=\"sortable\" (click)=\"sortSchedule('scheduled', 'name')\">Schedule name <lib-audit-v2-sort-icon [active]=\"schSort['scheduled'].col === 'name'\" [dir]=\"schSort['scheduled'].dir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right sortable\" (click)=\"sortSchedule('scheduled', 'users')\">Users <lib-audit-v2-sort-icon [active]=\"schSort['scheduled'].col === 'users'\" [dir]=\"schSort['scheduled'].dir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right sortable\" (click)=\"sortSchedule('scheduled', 'visits')\">Visits <lib-audit-v2-sort-icon [active]=\"schSort['scheduled'].col === 'visits'\" [dir]=\"schSort['scheduled'].dir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right sortable\" (click)=\"sortSchedule('scheduled', 'completed')\">Completed <lib-audit-v2-sort-icon [active]=\"schSort['scheduled'].col === 'completed'\" [dir]=\"schSort['scheduled'].dir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right sortable\" (click)=\"sortSchedule('scheduled', 'pending')\">Pending <lib-audit-v2-sort-icon [active]=\"schSort['scheduled'].col === 'pending'\" [dir]=\"schSort['scheduled'].dir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n <th>Action</th>\n <th class=\"t-right sortable\" (click)=\"sortSchedule('scheduled', 'published')\">Publish <lib-audit-v2-sort-icon [active]=\"schSort['scheduled'].col === 'published'\" [dir]=\"schSort['scheduled'].dir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of schPageOf('scheduled', filteredSchedules); trackBy: trackBySchedule\">\n <td>\n <div class=\"sch-name\">\n <a class=\"sch-link\" (click)=\"onScheduleView(row)\">{{ row.name }}</a>\n <!-- First audit and \"+N\" (QA 11 Oct, as the schedule editor); hover lists every audit. -->\n <span class=\"sch-audits\" [attr.title]=\"row.audits\">{{ auditsShort(row.audits) }}</span>\n </div>\n </td>\n <td class=\"t-right\">{{ row.users }}</td>\n <td class=\"t-right\">{{ row.visits }}</td>\n <td class=\"t-right\">{{ dash(row.completed) }}</td>\n <td class=\"t-right\">{{ dash(row.pending) }}</td>\n <td>\n <span class=\"sch-icons\">\n <a class=\"sch-icon\" title=\"View\" (click)=\"onScheduleView(row)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M1.5 12S5 5.5 12 5.5 22.5 12 22.5 12 19 18.5 12 18.5 1.5 12 1.5 12z\"></path>\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\n </svg>\n </a>\n <a class=\"sch-icon\" [class.sch-icon-off]=\"!access.canEditSchedule\" [title]=\"access.canEditSchedule ? 'Edit rows' : noAccessTitle\"\n (click)=\"openScheduleEdit(row)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"3\"></circle>\n <path d=\"M19.4 15a1.7 1.7 0 0 0 .3 1.9l.1.1a2 2 0 1 1-2.8 2.8l-.1-.1a1.7 1.7 0 0 0-2.9 1.2v.2a2 2 0 1 1-4 0v-.1a1.7 1.7 0 0 0-1.1-1.5 1.7 1.7 0 0 0-1.9.3l-.1.1a2 2 0 1 1-2.8-2.8l.1-.1a1.7 1.7 0 0 0 .3-1.9 1.7 1.7 0 0 0-1.5-1H4a2 2 0 1 1 0-4h.1a1.7 1.7 0 0 0 1.5-1.1 1.7 1.7 0 0 0-.3-1.9l-.1-.1a2 2 0 1 1 2.8-2.8l.1.1a1.7 1.7 0 0 0 1.9.3H10a1.7 1.7 0 0 0 1-1.5V4a2 2 0 1 1 4 0v.1a1.7 1.7 0 0 0 1 1.5 1.7 1.7 0 0 0 1.9-.3l.1-.1a2 2 0 1 1 2.8 2.8l-.1.1a1.7 1.7 0 0 0-.3 1.9V10a1.7 1.7 0 0 0 1.5 1h.1a2 2 0 1 1 0 4h-.1a1.7 1.7 0 0 0-1.5 1z\"></path>\n </svg>\n </a>\n <a class=\"sch-icon\" [class.sch-icon-off]=\"!access.canAddSchedule\" [title]=\"access.canAddSchedule ? 'Duplicate' : noAccessTitle\"\n (click)=\"onScheduleDuplicate(row)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <rect x=\"9\" y=\"9\" width=\"12\" height=\"12\" rx=\"2\"></rect>\n <path d=\"M15 5H5v10\"></path>\n </svg>\n </a>\n <a class=\"sch-icon\" [class.sch-icon-off]=\"!access.canEditSchedule\" [title]=\"access.canEditSchedule ? 'Delete' : noAccessTitle\"\n (click)=\"onScheduleDelete(row)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M4 7h16\"></path>\n <path d=\"M7 7l1 13h8l1-13M9 7V4h6v3\"></path>\n </svg>\n </a>\n </span>\n </td>\n <td class=\"t-right\">\n <button type=\"button\" class=\"pubtoggle pubtoggle--sm\" [class.pub-on]=\"row.published\"\n [disabled]=\"!access.canEditSchedule\" [title]=\"access.canEditSchedule ? '' : noAccessTitle\" (click)=\"togglePublish(row)\">\n <span class=\"pubknob\"></span>\n </button>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <div *ngIf=\"!schedulesLoading && !filteredSchedules.length\" class=\"av2-empty\">\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\n <div class=\"av2-empty-text\">\n <div class=\"av2-empty-title\">No data found</div>\n <div class=\"av2-empty-sub\">No schedules match this search.</div>\n </div>\n </div>\n\n <div class=\"ml-pager\" *ngIf=\"!schedulesLoading && filteredSchedules.length\">\n <lib-pagination [itemsPerPage]=\"schPager.scheduled.size\" [pageSize]=\"schPager.scheduled.size\" [paginationSizes]=\"schPageSizes\"\n [currentPage]=\"schPager.scheduled.page\" [totalItems]=\"filteredSchedules.length\"\n (pageChange)=\"onSchPage('scheduled', $event)\" (pageSizeChange)=\"onSchPageSize('scheduled', $event)\"></lib-pagination>\n </div>\n </section>\n </ng-container>\n\n <!-- Not scheduled -->\n <div class=\"sch-banner\" *ngIf=\"scheduleTab === 'notScheduled' && !unscheduledLoading && unscheduled.length\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 4l9 16H3z\"></path><path d=\"M12 10v4M12 17h.01\"></path></svg>\n <span class=\"sch-banner-text\">\n <span class=\"sch-banner-title\">{{ unscheduled.length }} {{ unscheduled.length === 1 ? 'audit is' : 'audits are' }} waiting to be scheduled</span>\n <span>They are configured, but nothing is raised and they stay drafts until a schedule is published.</span>\n </span>\n </div>\n <section class=\"av2-card sch-card\" *ngIf=\"scheduleTab === 'notScheduled'\">\n <div class=\"sch-card-head sch-card-head--row\">\n <div>\n <div class=\"sch-card-title\">Not scheduled</div>\n <div class=\"sch-card-sub\">Audits configured and waiting for a schedule</div>\n </div>\n <div class=\"av2-grow\"></div>\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" *ngIf=\"access.canAddSchedule\" [class.sch-btn-off]=\"!pickedCount\" (click)=\"openScheduleCreate(true)\">\n {{ scheduleSelectedLabel }}\n </button>\n </div>\n\n <lib-audit-v2-shimmer *ngIf=\"unscheduledLoading\"></lib-audit-v2-shimmer>\n\n <div class=\"av2-table-wrap\" *ngIf=\"!unscheduledLoading\">\n <table class=\"sch-table\">\n <thead>\n <tr>\n <th class=\"t-check\"></th>\n <th class=\"sortable\" (click)=\"sortSchedule('notScheduled', 'name')\">Audit <lib-audit-v2-sort-icon [active]=\"schSort['notScheduled'].col === 'name'\" [dir]=\"schSort['notScheduled'].dir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n <th class=\"sortable\" (click)=\"sortSchedule('notScheduled', 'owner')\">Owner <lib-audit-v2-sort-icon [active]=\"schSort['notScheduled'].col === 'owner'\" [dir]=\"schSort['notScheduled'].dir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right sortable\" (click)=\"sortSchedule('notScheduled', 'questions')\">Questions <lib-audit-v2-sort-icon [active]=\"schSort['notScheduled'].col === 'questions'\" [dir]=\"schSort['notScheduled'].dir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n <th class=\"sortable\" (click)=\"sortSchedule('notScheduled', 'meta')\">Status <lib-audit-v2-sort-icon [active]=\"schSort['notScheduled'].col === 'meta'\" [dir]=\"schSort['notScheduled'].dir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right\">Action</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of schPageOf('unscheduled', filteredUnscheduled); trackBy: trackByUnscheduled\" [class.is-picked]=\"row.picked\">\n <td class=\"t-check\">\n <span class=\"sch-check\" [class.is-on]=\"row.picked\" (click)=\"togglePick(row)\">\n <svg *ngIf=\"row.picked\" width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\"></polyline>\n </svg>\n </span>\n </td>\n <td>\n <div class=\"namecell\">\n <span class=\"avatarcircle avatarcircle--sm\">{{ row.initials }}</span>\n <span class=\"sch-namestack\">\n <a class=\"sch-link\" routerLink=\"/manage/trax/audit-v2/manage/configure\" [queryParams]=\"{ checklistId: row.id, from: 'schedule' }\">{{ row.name }}</a>\n <span class=\"sch-audits\">{{ row.meta }}</span>\n </span>\n </div>\n </td>\n <td>{{ row.owner }}</td>\n <td class=\"t-right\">{{ row.questions }}</td>\n <td>\n <span class=\"statuspill\" [style.background]=\"unschedStatusBg(row)\"\n [style.color]=\"unschedStatusFg(row)\">{{ unschedStatus(row) }}</span>\n </td>\n <td class=\"t-right\">\n <a class=\"sch-action\" *ngIf=\"access.canAddSchedule\" (click)=\"scheduleOne(row)\">Schedule</a>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <div *ngIf=\"!unscheduledLoading && !filteredUnscheduled.length\" class=\"av2-empty\">\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\n <div class=\"av2-empty-text\">\n <div class=\"av2-empty-title\">No data found</div>\n <div class=\"av2-empty-sub\">There is no result for this search.</div>\n </div>\n </div>\n\n <div class=\"ml-pager\" *ngIf=\"!unscheduledLoading && filteredUnscheduled.length\">\n <lib-pagination [itemsPerPage]=\"schPager.unscheduled.size\" [pageSize]=\"schPager.unscheduled.size\" [paginationSizes]=\"schPageSizes\"\n [currentPage]=\"schPager.unscheduled.page\" [totalItems]=\"filteredUnscheduled.length\"\n (pageChange)=\"onSchPage('unscheduled', $event)\" (pageSizeChange)=\"onSchPageSize('unscheduled', $event)\"></lib-pagination>\n </div>\n </section>\n\n <!-- Visits -->\n <section class=\"av2-card sch-card sch-card--visits\" *ngIf=\"scheduleTab === 'visits'\">\n <div class=\"sch-card-head sch-card-head--row\">\n <div>\n <div class=\"sch-card-title sch-card-title--visits\">Monitor Visits</div>\n <div class=\"sch-card-sub sch-card-sub--sm\">{{ visitSubtitle }}</div>\n </div>\n <div class=\"av2-grow\"></div>\n <div class=\"datenav\">\n <button type=\"button\" class=\"datenav-btn\" title=\"Previous day\" (click)=\"shiftDay(-1)\">\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 6 9 12 15 18\"></polyline></svg>\n </button>\n <div class=\"av2-datepick\">\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\n <input type=\"text\" class=\"av2-datepick-input dateinput\" ngxDaterangepickerMd readonly autocomplete=\"off\"\n [singleDatePicker]=\"true\" [(ngModel)]=\"visitPick\" [locale]=\"pickerLocale\" [autoApply]=\"true\"\n [showCancel]=\"false\" [drops]=\"'down'\" [opens]=\"'left'\" (datesUpdated)=\"onVisitDatePicked($event)\">\n </div>\n <button type=\"button\" class=\"datenav-btn\" title=\"Next day\" (click)=\"shiftDay(1)\">\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"9 6 15 12 9 18\"></polyline></svg>\n </button>\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"goToday()\">Today</button>\n </div>\n </div>\n\n <div class=\"statusrow\">\n <button type=\"button\" class=\"statuscard\" *ngFor=\"let c of visitStatusCards\" [class.statuscard-on]=\"c.active\"\n (click)=\"toggleStatus(c.key)\">\n <span class=\"av2-sk ml-sk-status\" *ngIf=\"visitsLoading\"></span>\n <span class=\"statusvalue\" [style.color]=\"c.color\" *ngIf=\"!visitsLoading\">{{ c.value }}</span>\n <span class=\"statuslabel\">{{ c.label }}</span>\n </button>\n </div>\n\n <span class=\"sch-visitbar\" *ngIf=\"!visitsLoading && visitBar.length\">\n <span *ngFor=\"let b of visitBar\" [title]=\"b.title\" [style.width]=\"b.width\" [style.background]=\"b.fill\"></span>\n </span>\n\n <lib-audit-v2-shimmer *ngIf=\"visitsLoading\"></lib-audit-v2-shimmer>\n\n <div class=\"av2-table-wrap sch-visits-wrap\" *ngIf=\"!visitsLoading\">\n <table class=\"sch-table sch-table--visits\">\n <thead>\n <tr>\n <th class=\"sortable\" (click)=\"sortSchedule('visits', 'window')\">Visit window <lib-audit-v2-sort-icon [active]=\"schSort['visits'].col === 'window'\" [dir]=\"schSort['visits'].dir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n <th class=\"sortable\" (click)=\"sortSchedule('visits', 'user')\">User <lib-audit-v2-sort-icon [active]=\"schSort['visits'].col === 'user'\" [dir]=\"schSort['visits'].dir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n <th class=\"sortable\" (click)=\"sortSchedule('visits', 'store')\">Store <lib-audit-v2-sort-icon [active]=\"schSort['visits'].col === 'store'\" [dir]=\"schSort['visits'].dir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n <th class=\"sortable\" (click)=\"sortSchedule('visits', 'audit')\">Audit <lib-audit-v2-sort-icon [active]=\"schSort['visits'].col === 'audit'\" [dir]=\"schSort['visits'].dir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n <th class=\"sortable\" (click)=\"sortSchedule('visits', 'status')\">Status <lib-audit-v2-sort-icon [active]=\"schSort['visits'].col === 'status'\" [dir]=\"schSort['visits'].dir === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let v of schPageOf('visits', filteredVisits); trackBy: trackByVisit\">\n <td>\n <div class=\"sch-name\">\n <span>{{ windowLabel(v) }}</span>\n <span class=\"sch-audits\">{{ v.note }}</span>\n </div>\n </td>\n <td class=\"av2-ellipsis\">{{ v.user }}</td>\n <td class=\"sch-strong\">{{ v.store }}</td>\n <td class=\"av2-ellipsis\">{{ v.audit }}</td>\n <td>\n <span class=\"statuspill statuspill--dot\" [style.background]=\"statusBg(v)\" [style.color]=\"statusFg(v)\">\n <span class=\"statusdot\" [style.background]=\"statusDot(v)\"></span>\n {{ statusLabel(v) }}\n </span>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <div *ngIf=\"!visitsLoading && !filteredVisits.length\" class=\"av2-empty\">\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\n <div class=\"av2-empty-text\">\n <div class=\"av2-empty-title\">No data found</div>\n <div class=\"av2-empty-sub\">No visits match the selected day and status.</div>\n </div>\n </div>\n\n <div class=\"ml-pager\" *ngIf=\"!visitsLoading && filteredVisits.length\">\n <lib-pagination [itemsPerPage]=\"schPager.visits.size\" [pageSize]=\"schPager.visits.size\" [paginationSizes]=\"schPageSizes\"\n [currentPage]=\"schPager.visits.page\" [totalItems]=\"filteredVisits.length\"\n (pageChange)=\"onSchPage('visits', $event)\" (pageSizeChange)=\"onSchPageSize('visits', $event)\"></lib-pagination>\n </div>\n </section>\n </ng-container>\n\n <!-- Create audit modal -->\n <div class=\"ca-backdrop\" *ngIf=\"caOpen\" (click)=\"cancelCreate()\"></div>\n <div class=\"ca-modal\" *ngIf=\"caOpen\">\n <div class=\"ca-head\">\n <span class=\"ca-icon\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\"><path d=\"M12 5v14M5 12h14\"></path></svg>\n </span>\n <span class=\"ca-title\">{{ caTitle }}</span>\n </div>\n\n <label class=\"ca-field\">\n <span class=\"ca-label\">{{ caNameLabel }}</span>\n <input type=\"text\" class=\"ca-input\" [(ngModel)]=\"caName\">\n </label>\n\n <label class=\"ca-field\">\n <span class=\"ca-label\">Description</span>\n <textarea class=\"ca-input ca-textarea\" [(ngModel)]=\"caDesc\"></textarea>\n </label>\n\n <!-- Bulk upload exists for audits only; the task builder adds questions one by one. -->\n <div class=\"ca-modes\" *ngIf=\"isAuditTab\">\n <button type=\"button\" class=\"ca-mode\" [class.ca-mode-on]=\"caMode === 'individual'\" (click)=\"setCaMode('individual')\">\n <span>Add questions individually</span>\n <span class=\"ca-dot\" [class.ca-dot-on]=\"caMode === 'individual'\"><span></span></span>\n </button>\n <button type=\"button\" class=\"ca-mode\" [class.ca-mode-on]=\"caMode === 'bulk'\" (click)=\"setCaMode('bulk')\">\n <span>Add questions in bulk</span>\n <span class=\"ca-dot\" [class.ca-dot-on]=\"caMode === 'bulk'\"><span></span></span>\n </button>\n </div>\n\n <div class=\"ca-foot\">\n <button type=\"button\" class=\"av2-btn av2-btn--ghost ca-btn\" (click)=\"cancelCreate()\">Cancel</button>\n <button type=\"button\" class=\"av2-btn av2-btn--primary ca-btn\" [disabled]=\"!caReady || caSaving\" (click)=\"proceedCreate()\">\n {{ caSaving ? 'Creating…' : 'Proceed' }}\n </button>\n </div>\n </div>\n\n <!-- Create schedule modal (same shell as the create-audit modal) -->\n <!-- Confirm (delete = danger; duplicate / publish = primary) -->\n <div class=\"ca-backdrop\" *ngIf=\"confirmBox\" (click)=\"confirmNo()\"></div>\n <div class=\"ca-modal cf-modal\" *ngIf=\"confirmBox\">\n <div class=\"ca-head\">\n <span class=\"ca-icon\" [class.cf-icon--danger]=\"confirmBox.danger\">\n <svg *ngIf=\"confirmBox.danger\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 7h16\"></path><path d=\"M7 7l1 13h8l1-13M9 7V4h6v3\"></path></svg>\n <svg *ngIf=\"!confirmBox.danger\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"></circle><path d=\"M12 8h.01M11 12h1v4h1\"></path></svg>\n </span>\n <span class=\"ca-title\">{{ confirmBox.title }}</span>\n </div>\n <div class=\"cf-message\">{{ confirmBox.message }}</div>\n <div class=\"ca-foot\">\n <button type=\"button\" class=\"av2-btn av2-btn--ghost ca-btn\" (click)=\"confirmNo()\">Cancel</button>\n <button type=\"button\" class=\"av2-btn ca-btn\" [ngClass]=\"confirmBox.danger ? 'cf-danger' : 'av2-btn--primary'\"\n (click)=\"confirmYes()\">{{ confirmBox.action }}</button>\n </div>\n </div>\n\n</div>\n","import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { Subject, debounceTime, takeUntil } from 'rxjs';\r\nimport { GlobalStateService } from 'tango-app-ui-global';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport dayjs from 'dayjs';\r\nimport { TraxService } from '../../../services/trax.service';\r\nimport { PICKER_LOCALE, PickedDates, PickerRange, fromPickerRange, pickerRanges, toPickerRange } from '../audit-v2-datepicker';\r\nimport { AuditSelectOption } from '../select/audit-v2-select.component';\r\n\r\nexport interface ReportKpi {\r\n label: string;\r\n value: string;\r\n note: string;\r\n /** Figure colour: green / red against the pass mark, or plain. */\r\n tone: '' | 'good' | 'bad';\r\n}\r\n\r\n/** One row of the roll-up table (circle head / zone manager / area manager). */\r\nexport interface ReportRow {\r\n key: string;\r\n level: ReportLevel;\r\n name: string;\r\n email: string;\r\n total: number;\r\n audited: number;\r\n notAudited: number;\r\n failed: number;\r\n scoreSum: number;\r\n coverage: string;\r\n avgScore: string;\r\n failedPct: string;\r\n raw?: any;\r\n}\r\n\r\n/** One store of the Store view (and of the User view's deepest level). */\r\nexport interface StoreRow {\r\n key: string;\r\n name: string;\r\n cluster: string;\r\n circle: string;\r\n zone: string;\r\n aom: string;\r\n circleKey: string;\r\n zoneKey: string;\r\n aomKey: string;\r\n audited: boolean;\r\n /** 0-100, null when the store has no scored audit in the period. */\r\n score: number | null;\r\n status: 'pass' | 'fail' | 'na';\r\n /** \"DD MMM YYYY\"; '' when none. */\r\n lastAudit: string;\r\n /** YYYY-MM-DD of the last audit, for sorting; '' when none. */\r\n lastAuditIso: string;\r\n}\r\n\r\ntype ReportLevel = 'circle' | 'zone' | 'aom' | 'store';\r\ntype ViewMode = 'store' | 'user';\r\ntype ResultFilter = 'all' | 'pass' | 'fail';\r\ntype FilterCat = 'date' | 'mode' | 'scope' | 'result';\r\n\r\n/** Pass mark shown until the API answers (it sends the real one in summary.passMark). */\r\nconst PASS_MARK = 75;\r\n\r\n/** Rows without a circle head in the store hierarchy are grouped under this key. */\r\nconst UNASSIGNED = '__unassigned';\r\n\r\n/** Visits per /audit/dashboard/detail call when exporting (the API's max limit). */\r\nconst EXPORT_PAGE = 5000;\r\n\r\n/**\r\n * Reports (\"Reports — Store audit report\" prototype), read from POST /trax/audit/reports: one call returns every\r\n * store of the header scope with its score, result, last audit, cluster and hierarchy line, plus the circle head /\r\n * zone manager / area manager roll-ups. Everything below the date range is filtered in the browser:\r\n * View by Store - one row per store, narrowed by the Stores pick and the Result filter.\r\n * View by User - circle head -> zone manager -> area manager -> stores, by clicking rows or the Hierarchy picks.\r\n */\r\n@Component({\r\n selector: 'lib-audit-v2-reports',\r\n templateUrl: './audit-v2-reports.component.html',\r\n styleUrl: './audit-v2-reports.component.scss'\r\n})\r\nexport class AuditV2ReportsComponent implements OnInit, OnDestroy {\r\n passMark = PASS_MARK;\r\n\r\n from = dayjs().startOf('month').format('YYYY-MM-DD');\r\n to = dayjs().format('YYYY-MM-DD');\r\n preset = 'This month';\r\n readonly presets = ['This month', 'Last month', 'Last 30 days'];\r\n /** Range picker model, kept in step with from / to. */\r\n range: PickerRange | null = toPickerRange(this.from, this.to);\r\n readonly pickerLocale = PICKER_LOCALE;\r\n readonly ranges = pickerRanges();\r\n readonly today = dayjs();\r\n\r\n /** View by: Store (prototype default) or User (hierarchy roll-up). */\r\n mode: ViewMode = 'store';\r\n result: ResultFilter = 'all';\r\n /** Stores picked in Filters -> Stores; null = every store in scope. */\r\n storeSel: Set<string> | null = null;\r\n storeQuery = '';\r\n\r\n search = '';\r\n\r\n // User view position.\r\n level: ReportLevel = 'circle';\r\n circleKey = '';\r\n zoneKey = '';\r\n aomKey = '';\r\n /** One store picked under an area manager (Filters -> Store hierarchy -> Store). */\r\n storeKey = '';\r\n circleHead = '';\r\n zoneManager = '';\r\n aom = '';\r\n\r\n /**\r\n * Filter drawer (QA 9 Oct): the drawer edits a draft, and the page behind changes only on Apply (or Reset all).\r\n * The draft is Object.create(this): it reads the loaded report through the component, so every getter the\r\n * drawer shows (store pick, hierarchy options, readings) works on the draft's own filter values.\r\n */\r\n filtersOpen = false;\r\n draft: AuditV2ReportsComponent | null = null;\r\n /** Set on the draft only: date picks wait for Apply instead of refetching. */\r\n private isDraft = false;\r\n activeCat: FilterCat = 'scope';\r\n\r\n /** Starts true so the first paint shimmers instead of showing zero KPIs and an empty table. */\r\n loading = true;\r\n\r\n /** Column sort ('' = the API's order); a header click toggles ascending / descending. */\r\n sortKey = '';\r\n sortDir: 'asc' | 'desc' = 'asc';\r\n\r\n /** Table pager (shared lib-pagination, 10 / 20 / 30 like every audit list); back to page 1 on any filter change. */\r\n page = 1;\r\n pageSize = 10;\r\n readonly pageSizes = [10, 20, 30];\r\n\r\n private data: any = null;\r\n private allStores: StoreRow[] = [];\r\n private headerData: any;\r\n private readonly destroy$ = new Subject<void>();\r\n\r\n constructor(\r\n private traxService: TraxService,\r\n private gs: GlobalStateService,\r\n private toast: ToastService,\r\n private cd: ChangeDetectorRef\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n this.gs.dataRangeValue\r\n .pipe(takeUntil(this.destroy$), debounceTime(300))\r\n .subscribe((data: any) => {\r\n if (!data?.client) { return; }\r\n const clientChanged = this.headerData?.client !== data.client;\r\n this.headerData = data;\r\n if (clientChanged) {\r\n this.goToLevel('circle');\r\n this.storeSel = null;\r\n }\r\n this.load();\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n /** The API rejects unknown keys, so only the scope is sent. */\r\n private load(): void {\r\n if (!this.headerData?.client) { return; }\r\n this.loading = true;\r\n this.traxService.auditReports({\r\n clientId: this.headerData.client,\r\n fromDate: this.from,\r\n toDate: this.to,\r\n storeId: (this.headerData.stores || []).filter((s: any) => s.checked).map((s: any) => s.storeId)\r\n }).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (res: any) => {\r\n this.data = res?.code === 200 ? (res.data || null) : null;\r\n this.passMark = Number(this.data?.summary?.passMark) || PASS_MARK;\r\n this.allStores = (this.data?.stores || []).map((s: any) => this.toStore(s));\r\n // A pick of stores that left the scope is dropped.\r\n if (this.storeSel) {\r\n const ids = new Set(this.allStores.map(s => s.key));\r\n const kept = [...this.storeSel].filter(id => ids.has(id));\r\n this.storeSel = kept.length && kept.length < this.allStores.length ? new Set(kept) : null;\r\n }\r\n this.loading = false;\r\n this.cd.detectChanges();\r\n },\r\n error: () => {\r\n this.data = null;\r\n this.allStores = [];\r\n this.loading = false;\r\n this.cd.detectChanges();\r\n }\r\n });\r\n }\r\n\r\n private toStore(s: any): StoreRow {\r\n const score = s?.score === null || s?.score === undefined || isNaN(Number(s.score)) ? null : Math.round(Number(s.score));\r\n const status = s?.status === 'pass' || s?.status === 'fail' ? s.status : 'na';\r\n const last = s?.lastAuditDate && dayjs(s.lastAuditDate).isValid() ? dayjs(s.lastAuditDate) : null;\r\n return {\r\n key: String(s?.key ?? ''),\r\n name: s?.name || '—',\r\n cluster: s?.cluster || '',\r\n circle: s?.circleName || this.nameOf(this.data?.circles, s?.circleKey),\r\n zone: s?.zoneName || this.nameOf(this.data?.zones, s?.zoneKey),\r\n aom: s?.aomName || this.nameOf(this.data?.aoms, s?.aomKey),\r\n circleKey: s?.circleKey || '',\r\n zoneKey: s?.zoneKey || '',\r\n aomKey: s?.aomKey || '',\r\n audited: score !== null,\r\n score,\r\n status: score === null ? 'na' : status,\r\n lastAudit: last ? last.format('DD MMM YYYY') : '',\r\n lastAuditIso: last ? last.format('YYYY-MM-DD') : ''\r\n };\r\n }\r\n\r\n private nameOf(list: any[], key: string): string {\r\n return key ? ((list || []).find((r: any) => r.key === key)?.name || '') : '';\r\n }\r\n\r\n get isStoreMode(): boolean {\r\n return this.mode === 'store';\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Store view\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Stores of the Stores pick, then the Result filter (what the KPIs and the table read). */\r\n get storeScope(): StoreRow[] {\r\n const picked = this.storeSel ? this.allStores.filter(s => this.storeSel!.has(s.key)) : this.allStores;\r\n return this.result === 'all' ? picked : picked.filter(s => s.status === this.result);\r\n }\r\n\r\n /** Store table rows: the scope, narrowed by the search box, in the column sort. */\r\n get storeRows(): StoreRow[] {\r\n const q = this.search.trim().toLowerCase();\r\n const list = q\r\n ? this.storeScope.filter(s => (s.name + ' ' + s.key + ' ' + s.cluster + ' ' + s.aom).toLowerCase().includes(q))\r\n : this.storeScope;\r\n return this.sortStores(list);\r\n }\r\n\r\n get storePageRows(): StoreRow[] {\r\n return this.pageOf(this.storeRows);\r\n }\r\n\r\n get storeLabel(): string {\r\n if (this.storeSel && !this.storeSel.size) { return 'No stores selected'; }\r\n return this.storeSel\r\n ? this.storeSel.size + (this.storeSel.size === 1 ? ' store' : ' stores') + ' selected'\r\n : 'All stores (' + this.allStores.length + ')';\r\n }\r\n\r\n scoreText(s: StoreRow): string {\r\n return s.score === null ? '—' : s.score + '%';\r\n }\r\n\r\n resultText(s: StoreRow): string {\r\n return s.status === 'pass' ? 'Pass' : s.status === 'fail' ? 'Fail' : 'Not audited';\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // User view (roll-up)\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Roll-up rows of the current level, narrowed to the selected parent (stores at the deepest level). */\r\n get rows(): ReportRow[] {\r\n if (!this.data) { return []; }\r\n let list: any[];\r\n if (this.level === 'circle') {\r\n list = [...(this.data.circles || [])];\r\n const orphans = (this.data.stores || []).filter((s: any) => !s.circleKey);\r\n if (orphans.length) { list.push(this.rollup(UNASSIGNED, 'Not in hierarchy', orphans)); }\r\n } else if (this.level === 'zone') {\r\n list = (this.data.zones || []).filter((z: any) => z.circleKey === this.circleKey);\r\n } else if (this.level === 'aom') {\r\n list = (this.data.aoms || []).filter((a: any) => a.zoneKey === this.zoneKey);\r\n } else {\r\n list = (this.data.stores || []).filter((s: any) =>\r\n (this.aomKey ? s.aomKey === this.aomKey : this.circleKey === UNASSIGNED ? !s.circleKey : true)\r\n && (!this.storeKey || s.key === this.storeKey));\r\n }\r\n return list.map((r: any) => this.toRow(r));\r\n }\r\n\r\n /** Stores of the User view's deepest level (Store, Area manager, Zone manager, Audited, Score). */\r\n get userStores(): StoreRow[] {\r\n const keys = new Set(this.rows.map(r => r.key));\r\n const q = this.search.trim().toLowerCase();\r\n return this.sortStores(this.allStores.filter(s => keys.has(s.key) && (!q || (s.name + ' ' + s.key).toLowerCase().includes(q))));\r\n }\r\n\r\n get userStorePageRows(): StoreRow[] {\r\n return this.pageOf(this.userStores);\r\n }\r\n\r\n /** Client-side roll-up (same maths as the API) for stores the hierarchy does not list. */\r\n private rollup(key: string, name: string, stores: any[]): any {\r\n const audited = stores.filter(s => s.audited);\r\n const failed = stores.filter(s => s.failed).length;\r\n const scoreSum = audited.reduce((a, s) => a + (Number(s.avgScore) || 0), 0);\r\n return {\r\n level: 'circle', key, name, email: '', circleKey: '', zoneKey: '', aomKey: '',\r\n total: stores.length, audited: audited.length, notAudited: stores.length - audited.length, failed, scoreSum,\r\n coverage: stores.length ? Math.round(audited.length / stores.length * 100) : null,\r\n avgScore: audited.length ? Math.round(scoreSum / audited.length) : null,\r\n failedPct: audited.length ? Math.round(failed / audited.length * 100) : null\r\n };\r\n }\r\n\r\n private toRow(r: any): ReportRow {\r\n return {\r\n key: String(r?.key ?? ''),\r\n level: r?.level || this.level,\r\n name: r?.name || '—',\r\n email: r?.email || '',\r\n total: Number(r?.total) || 0,\r\n audited: Number(r?.audited) || 0,\r\n notAudited: Number(r?.notAudited) || 0,\r\n failed: Number(r?.failed) || 0,\r\n scoreSum: Number(r?.scoreSum) || 0,\r\n coverage: this.pctText(r?.coverage),\r\n avgScore: this.pctText(r?.avgScore),\r\n failedPct: this.pctText(r?.failedPct),\r\n raw: r\r\n };\r\n }\r\n\r\n private pctText(v: any): string {\r\n return v === null || v === undefined || v === '' || isNaN(Number(v)) ? '—' : Math.round(Number(v)) + '%';\r\n }\r\n\r\n get crumbs(): Array<{ label: string; level: ReportLevel }> {\r\n const trail: Array<{ label: string; level: ReportLevel }> = [{ label: 'All circles', level: 'circle' }];\r\n if (this.circleHead) { trail.push({ label: this.circleHead, level: 'zone' }); }\r\n if (this.zoneManager) { trail.push({ label: this.zoneManager, level: 'aom' }); }\r\n if (this.aom) { trail.push({ label: this.aom, level: 'store' }); }\r\n return trail;\r\n }\r\n\r\n get hint(): string {\r\n if (this.level === 'circle') { return 'Click a circle head to open their zone managers'; }\r\n if (this.level === 'zone') { return 'Click a zone manager to open their area managers'; }\r\n if (this.level === 'aom') { return 'Click an area manager to open their stores'; }\r\n return 'Store level · the deepest view';\r\n }\r\n\r\n /** Column heading for the current level. */\r\n get levelLabel(): string {\r\n if (this.level === 'circle') { return 'Circle head'; }\r\n if (this.level === 'zone') { return 'Zone manager'; }\r\n return this.level === 'aom' ? 'Area manager' : 'Store';\r\n }\r\n\r\n get tableTitle(): string {\r\n return this.level === 'store' ? 'Store report' : this.levelLabel + ' summary';\r\n }\r\n\r\n get tableMeta(): string {\r\n if (this.level === 'store') {\r\n const n = this.userStores.length;\r\n return n + (n === 1 ? ' store' : ' stores') + ' · rolled up from store audits in the period';\r\n }\r\n const n = this.filteredRows.length;\r\n return n + (n === 1 ? ' row' : ' rows') + ' · rolled up from store audits in the period';\r\n }\r\n\r\n get filteredRows(): ReportRow[] {\r\n const q = this.search.trim().toLowerCase();\r\n const rows = q ? this.rows.filter(r => (r.name + ' ' + r.email).toLowerCase().includes(q)) : this.rows;\r\n return this.sortRows(rows);\r\n }\r\n\r\n get pageRows(): ReportRow[] {\r\n return this.pageOf(this.filteredRows);\r\n }\r\n\r\n /** Drill one level down into the clicked row. */\r\n openRow(row: ReportRow): void {\r\n if (this.level === 'circle') {\r\n this.circleKey = row.key;\r\n this.circleHead = row.name;\r\n // Stores outside the hierarchy have no zone / AOM to drill through.\r\n this.level = row.key === UNASSIGNED ? 'store' : 'zone';\r\n } else if (this.level === 'zone') {\r\n this.zoneKey = row.key;\r\n this.zoneManager = row.name;\r\n this.level = 'aom';\r\n } else if (this.level === 'aom') {\r\n this.aomKey = row.key;\r\n this.aom = row.name;\r\n this.level = 'store';\r\n }\r\n this.search = '';\r\n this.page = 1;\r\n }\r\n\r\n goToLevel(level: ReportLevel): void {\r\n this.level = level;\r\n if (level === 'circle') { this.circleKey = ''; this.circleHead = ''; }\r\n if (level === 'circle' || level === 'zone') { this.zoneKey = ''; this.zoneManager = ''; }\r\n if (level !== 'store') { this.aomKey = ''; this.aom = ''; }\r\n this.storeKey = '';\r\n this.search = '';\r\n this.page = 1;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Sorting (every table)\r\n // ---------------------------------------------------------------------------\r\n\r\n sortBy(key: string): void {\r\n this.sortDir = this.sortKey === key && this.sortDir === 'asc' ? 'desc' : 'asc';\r\n this.sortKey = key;\r\n this.page = 1;\r\n }\r\n\r\n /** Numbers as numbers, text as text, empty values (\"—\") always last. */\r\n private sortList<T>(rows: T[], value: (r: T) => number | string | null): T[] {\r\n if (!this.sortKey) { return rows; }\r\n const dir = this.sortDir === 'asc' ? 1 : -1;\r\n return [...rows].sort((a, b) => {\r\n const x = value(a);\r\n const y = value(b);\r\n if (x === null || x === '' || y === null || y === '') {\r\n const xe = x === null || x === '';\r\n const ye = y === null || y === '';\r\n return xe === ye ? 0 : xe ? 1 : -1;\r\n }\r\n if (typeof x === 'number' && typeof y === 'number') { return (x - y) * dir; }\r\n return String(x).localeCompare(String(y), undefined, { numeric: true, sensitivity: 'base' }) * dir;\r\n });\r\n }\r\n\r\n /** Roll-up rows: counts as numbers, the % columns by their number, the name as text. */\r\n private sortRows(rows: ReportRow[]): ReportRow[] {\r\n const key = this.sortKey as keyof ReportRow;\r\n return this.sortList(rows, (r) => {\r\n const v = r[key];\r\n if (typeof v === 'number') { return v; }\r\n if (key === 'name') { return String(v || ''); }\r\n const n = parseFloat(String(v));\r\n return isNaN(n) ? null : n;\r\n });\r\n }\r\n\r\n private sortStores(rows: StoreRow[]): StoreRow[] {\r\n const key = this.sortKey;\r\n const rank = { pass: 2, fail: 1, na: null } as const;\r\n return this.sortList(rows, (s) => {\r\n switch (key) {\r\n case 'name': return s.name;\r\n case 'cluster': return s.cluster;\r\n case 'aom': return s.aom;\r\n case 'zone': return s.zone;\r\n case 'audited': return s.audited ? 1 : 0;\r\n case 'score': return s.score;\r\n case 'status': return rank[s.status];\r\n case 'lastAudit': return s.lastAuditIso;\r\n default: return null;\r\n }\r\n });\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Scope header + KPIs (both views)\r\n // ---------------------------------------------------------------------------\r\n\r\n get dateLine(): string {\r\n return this.formatDate(this.from) + ' to ' + this.formatDate(this.to);\r\n }\r\n\r\n private formatDate(iso: string): string {\r\n return iso ? dayjs(iso).format('DD MMM YYYY') : iso;\r\n }\r\n\r\n get hierarchyTitle(): string {\r\n const store = this.storeKey ? this.allStores.find(s => s.key === this.storeKey) : null;\r\n return store?.name || this.aom || this.zoneManager || this.circleHead || 'All circles';\r\n }\r\n\r\n get scopeTitle(): string {\r\n return this.isStoreMode ? this.storeLabel : this.hierarchyTitle;\r\n }\r\n\r\n get scopeMeta(): string {\r\n const n = this.totals.total;\r\n return this.dateLine + ' · ' + n + (n === 1 ? ' store' : ' stores') + ' in scope';\r\n }\r\n\r\n /** Totals of what is on screen: the Store view's scope, or the User view's current level. */\r\n get totals(): { total: number; audited: number; failed: number; scoreSum: number } {\r\n if (this.isStoreMode) {\r\n const list = this.storeScope;\r\n const audited = list.filter(s => s.audited);\r\n return {\r\n total: list.length,\r\n audited: audited.length,\r\n failed: audited.filter(s => s.status === 'fail').length,\r\n scoreSum: audited.reduce((a, s) => a + (s.score || 0), 0)\r\n };\r\n }\r\n const rows = this.rows;\r\n return {\r\n total: rows.reduce((a, r) => a + r.total, 0),\r\n audited: rows.reduce((a, r) => a + r.audited, 0),\r\n failed: rows.reduce((a, r) => a + r.failed, 0),\r\n scoreSum: rows.reduce((a, r) => a + r.scoreSum, 0)\r\n };\r\n }\r\n\r\n get coverageNum(): number | null {\r\n const t = this.totals;\r\n return t.total ? Math.round(t.audited / t.total * 100) : null;\r\n }\r\n\r\n get averageNum(): number | null {\r\n const t = this.totals;\r\n return t.audited ? Math.round(t.scoreSum / t.audited) : null;\r\n }\r\n\r\n get failedPctNum(): number | null {\r\n const t = this.totals;\r\n return t.audited ? Math.round(t.failed / t.audited * 100) : null;\r\n }\r\n\r\n private pct(v: number | null): string {\r\n return v === null ? '—' : v + '%';\r\n }\r\n\r\n get kpis(): ReportKpi[] {\r\n const t = this.totals;\r\n const avg = this.averageNum;\r\n const failed = this.failedPctNum;\r\n return [\r\n { label: 'Total stores', value: String(t.total), note: 'In this scope', tone: '' },\r\n { label: 'Audited stores', value: String(t.audited), note: (t.total - t.audited) + ' not audited', tone: '' },\r\n { label: 'Audit coverage', value: this.pct(this.coverageNum), note: 'Stores with a submitted audit', tone: '' },\r\n {\r\n label: 'Average audit score', value: this.pct(avg), note: 'Across audited stores',\r\n tone: avg === null ? '' : avg < this.passMark ? 'bad' : 'good'\r\n },\r\n {\r\n label: 'Failed store %', value: this.pct(failed), note: t.failed + ' below the ' + this.passMark + '% pass mark',\r\n tone: failed !== null && failed > 50 ? 'bad' : ''\r\n }\r\n ];\r\n }\r\n\r\n /** Total row texts. */\r\n get totalAuditedOf(): string {\r\n const t = this.totals;\r\n return t.audited + ' of ' + t.total;\r\n }\r\n\r\n get totalAverage(): string {\r\n return this.pct(this.averageNum);\r\n }\r\n\r\n get totalCoverage(): string {\r\n return this.pct(this.coverageNum);\r\n }\r\n\r\n get totalFailedPct(): string {\r\n return this.pct(this.failedPctNum);\r\n }\r\n\r\n /** A roll-up row where more than half of the audited stores failed reads red (prototype). */\r\n isHighFail(row: ReportRow): boolean {\r\n const n = parseInt(row.failedPct, 10);\r\n return !isNaN(n) && n > 50;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Paging\r\n // ---------------------------------------------------------------------------\r\n\r\n private pageOf<T>(list: T[]): T[] {\r\n const pages = Math.max(1, Math.ceil(list.length / this.pageSize));\r\n const page = Math.min(this.page, pages);\r\n return list.slice((page - 1) * this.pageSize, page * this.pageSize);\r\n }\r\n\r\n /** Rows of the table on screen (for the pager and the empty state). */\r\n get tableCount(): number {\r\n if (this.isStoreMode) { return this.storeRows.length; }\r\n return this.level === 'store' ? this.userStores.length : this.filteredRows.length;\r\n }\r\n\r\n onPageChange(page: number): void {\r\n this.page = Number(page) || 1;\r\n }\r\n\r\n onPageSizeChange(size: any): void {\r\n this.pageSize = Number(size) || 10;\r\n this.page = 1;\r\n }\r\n\r\n onSearchChange(): void {\r\n this.page = 1;\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Filters (drawer + chips)\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Date and View by always count; the scope pick and the Result filter when set (prototype). */\r\n get filterCount(): number {\r\n return 2 + (this.scopeDirty ? 1 : 0) + (this.isStoreMode && this.result !== 'all' ? 1 : 0);\r\n }\r\n\r\n private get scopeDirty(): boolean {\r\n return this.isStoreMode ? !!this.storeSel : !!(this.circleKey || this.storeKey);\r\n }\r\n\r\n get resultLabel(): string {\r\n return this.result === 'pass' ? 'Pass' : this.result === 'fail' ? 'Fail' : 'All results';\r\n }\r\n\r\n get chips(): Array<{ key: FilterCat; label: string; value: string }> {\r\n const chips: Array<{ key: FilterCat; label: string; value: string }> = [\r\n { key: 'date', label: 'Date', value: this.dateLine },\r\n { key: 'mode', label: 'View by', value: this.isStoreMode ? 'Store' : 'User' },\r\n { key: 'scope', label: this.isStoreMode ? 'Stores' : 'Hierarchy', value: this.isStoreMode ? this.storeLabel : this.hierarchyTitle }\r\n ];\r\n if (this.isStoreMode) { chips.push({ key: 'result', label: 'Result', value: this.resultLabel }); }\r\n return chips;\r\n }\r\n\r\n get filterCats(): Array<{ key: FilterCat; label: string; value: string; dirty: boolean }> {\r\n const cats: Array<{ key: FilterCat; label: string; value: string; dirty: boolean }> = [\r\n { key: 'date', label: 'Date', value: this.dateLine, dirty: this.preset !== 'This month' },\r\n { key: 'mode', label: 'View by', value: this.isStoreMode ? 'Store' : 'User', dirty: !this.isStoreMode },\r\n {\r\n key: 'scope', label: this.isStoreMode ? 'Stores' : 'Store hierarchy',\r\n value: this.isStoreMode ? this.storeLabel : this.hierarchyTitle, dirty: this.scopeDirty\r\n }\r\n ];\r\n if (this.isStoreMode) { cats.push({ key: 'result', label: 'Result', value: this.resultLabel, dirty: this.result !== 'all' }); }\r\n return cats;\r\n }\r\n\r\n get paneTitle(): string {\r\n if (this.activeCat === 'date') { return 'Date'; }\r\n if (this.activeCat === 'mode') { return 'View by'; }\r\n if (this.activeCat === 'result') { return 'Result'; }\r\n return this.isStoreMode ? 'Stores' : 'Store hierarchy';\r\n }\r\n\r\n get paneSub(): string {\r\n if (this.activeCat === 'date') { return 'Pick the window the whole report reads.'; }\r\n if (this.activeCat === 'mode') { return 'Read the report store by store, or rolled up by user.'; }\r\n if (this.activeCat === 'result') { return 'Show every store, or only the ones that passed or failed.'; }\r\n return this.isStoreMode ? 'Search and select the stores the report reads.' : 'Pick the circle, zone, AOM or store the whole report reads.';\r\n }\r\n\r\n openFilters(cat?: FilterCat): void {\r\n this.activeCat = cat || this.activeCat;\r\n if (this.activeCat === 'result' && !this.isStoreMode) { this.activeCat = 'scope'; }\r\n const draft = Object.create(this) as AuditV2ReportsComponent;\r\n draft.isDraft = true;\r\n draft.storeQuery = '';\r\n this.draft = draft;\r\n this.filtersOpen = true;\r\n }\r\n\r\n /** Close (x, backdrop): the draft is dropped, the page is as it was. */\r\n closeFilters(): void {\r\n this.filtersOpen = false;\r\n this.draft = null;\r\n this.storeQuery = '';\r\n }\r\n\r\n /** Apply: the draft's filters become the page's; a new date range refetches. */\r\n applyFilters(): void {\r\n const d = this.draft;\r\n if (d && d.mode === 'store' && d.storeSel && !d.storeSel.size) {\r\n this.activeCat = 'scope';\r\n this.toast.getErrorToast('Select at least one store');\r\n return;\r\n }\r\n if (d) {\r\n const datesChanged = d.from !== this.from || d.to !== this.to;\r\n this.from = d.from;\r\n this.to = d.to;\r\n this.preset = d.preset;\r\n this.range = d.range;\r\n this.mode = d.mode;\r\n this.result = d.result;\r\n this.storeSel = d.storeSel;\r\n this.level = d.level;\r\n this.circleKey = d.circleKey;\r\n this.zoneKey = d.zoneKey;\r\n this.aomKey = d.aomKey;\r\n this.storeKey = d.storeKey;\r\n this.circleHead = d.circleHead;\r\n this.zoneManager = d.zoneManager;\r\n this.aom = d.aom;\r\n this.search = d.search;\r\n this.sortKey = d.sortKey;\r\n this.page = 1;\r\n if (datesChanged) { this.load(); }\r\n }\r\n this.closeFilters();\r\n }\r\n\r\n selectCat(cat: FilterCat): void {\r\n this.activeCat = cat;\r\n }\r\n\r\n setMode(mode: ViewMode): void {\r\n if (this.mode === mode) { return; }\r\n this.mode = mode;\r\n this.search = '';\r\n this.sortKey = '';\r\n this.page = 1;\r\n if (mode === 'user') { this.goToLevel('circle'); }\r\n }\r\n\r\n setResult(result: ResultFilter): void {\r\n this.result = result;\r\n this.page = 1;\r\n }\r\n\r\n /** Reset all: the prototype's defaults (this month, Store view, every store, all results). */\r\n resetFilters(): void {\r\n // From the drawer: reset the page itself (the drawer's draft is dropped).\r\n if (this.isDraft) { Object.getPrototypeOf(this).resetFilters(); return; }\r\n this.mode = 'store';\r\n this.result = 'all';\r\n this.storeSel = null;\r\n this.storeQuery = '';\r\n this.sortKey = '';\r\n this.goToLevel('circle');\r\n if (this.preset !== 'This month') { this.setPreset('This month'); }\r\n this.closeFilters();\r\n }\r\n\r\n // Stores pick (Store view).\r\n\r\n get storePickItems(): Array<{ store: StoreRow; checked: boolean }> {\r\n const q = this.storeQuery.trim().toLowerCase();\r\n return this.allStores\r\n .filter(s => !q || (s.name + ' ' + s.key).toLowerCase().includes(q))\r\n .map(s => ({ store: s, checked: !this.storeSel || this.storeSel.has(s.key) }));\r\n }\r\n\r\n get storePickAllChecked(): boolean {\r\n const items = this.storePickItems;\r\n return items.length > 0 && items.every(i => i.checked);\r\n }\r\n\r\n get storePickReading(): string {\r\n const n = this.storeScope.length;\r\n return this.storeLabel + ' · ' + n + (n === 1 ? ' store' : ' stores') + ' in scope';\r\n }\r\n\r\n /** null = every store; an empty set = none ticked (Select All unticked), which Apply does not accept. */\r\n private applyPick(ids: string[]): void {\r\n const uniq = [...new Set(ids)];\r\n this.storeSel = uniq.length >= this.allStores.length ? null : new Set(uniq);\r\n this.page = 1;\r\n }\r\n\r\n private get pickedIds(): string[] {\r\n return this.storeSel ? [...this.storeSel] : this.allStores.map(s => s.key);\r\n }\r\n\r\n toggleStorePick(s: StoreRow): void {\r\n const ids = this.pickedIds;\r\n this.applyPick(ids.includes(s.key) ? ids.filter(id => id !== s.key) : ids.concat(s.key));\r\n }\r\n\r\n /** Select All works on the stores the search shows, like the prototype. */\r\n toggleStorePickAll(): void {\r\n const visible = this.storePickItems.map(i => i.store.key);\r\n const ids = this.pickedIds;\r\n this.applyPick(this.storePickAllChecked ? ids.filter(id => !visible.includes(id)) : ids.concat(visible));\r\n }\r\n\r\n resetStorePick(): void {\r\n this.storeSel = null;\r\n this.storeQuery = '';\r\n this.page = 1;\r\n }\r\n\r\n // Store hierarchy pick (User view).\r\n\r\n get circleOptions(): AuditSelectOption[] {\r\n return [{ value: '', label: 'All circles' }].concat((this.data?.circles || []).map((c: any) => ({ value: c.key, label: c.name })));\r\n }\r\n\r\n get zoneOptions(): AuditSelectOption[] {\r\n return [{ value: '', label: 'All zones' }].concat((this.data?.zones || [])\r\n .filter((z: any) => z.circleKey === this.circleKey).map((z: any) => ({ value: z.key, label: z.name })));\r\n }\r\n\r\n get aomOptions(): AuditSelectOption[] {\r\n return [{ value: '', label: 'All AOMs' }].concat((this.data?.aoms || [])\r\n .filter((a: any) => a.zoneKey === this.zoneKey).map((a: any) => ({ value: a.key, label: a.name })));\r\n }\r\n\r\n get storeOptions(): AuditSelectOption[] {\r\n return [{ value: '', label: 'All stores' }].concat(this.allStores\r\n .filter(s => s.aomKey === this.aomKey).map(s => ({ value: s.key, label: s.name })));\r\n }\r\n\r\n /** Zone / AOM picks follow the circle pick (\"Not in hierarchy\" has none). */\r\n get showZonePick(): boolean {\r\n return !!this.circleKey && this.circleKey !== UNASSIGNED;\r\n }\r\n\r\n pickCircle(key: string): void {\r\n const row = (this.data?.circles || []).find((c: any) => c.key === key);\r\n this.goToLevel('circle');\r\n if (row) { this.openRow(this.toRow(row)); }\r\n }\r\n\r\n pickZone(key: string): void {\r\n const row = (this.data?.zones || []).find((z: any) => z.key === key);\r\n this.goToLevel('zone');\r\n if (row) { this.openRow(this.toRow(row)); }\r\n }\r\n\r\n pickAom(key: string): void {\r\n const row = (this.data?.aoms || []).find((a: any) => a.key === key);\r\n this.goToLevel('aom');\r\n if (row) { this.openRow(this.toRow(row)); }\r\n }\r\n\r\n pickStore(key: string): void {\r\n this.storeKey = key || '';\r\n this.page = 1;\r\n }\r\n\r\n get hierarchyReading(): string {\r\n const n = this.totals.total;\r\n return this.hierarchyTitle + ' · ' + n + (n === 1 ? ' store' : ' stores');\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Dates\r\n // ---------------------------------------------------------------------------\r\n\r\n /** Presets set the date range and refetch. */\r\n setPreset(p: string): void {\r\n this.preset = p;\r\n const today = dayjs();\r\n if (p === 'This month') {\r\n this.from = today.startOf('month').format('YYYY-MM-DD');\r\n this.to = today.format('YYYY-MM-DD');\r\n } else if (p === 'Last month') {\r\n const lm = today.subtract(1, 'month');\r\n this.from = lm.startOf('month').format('YYYY-MM-DD');\r\n this.to = lm.endOf('month').format('YYYY-MM-DD');\r\n } else {\r\n this.from = today.subtract(30, 'day').format('YYYY-MM-DD');\r\n this.to = today.format('YYYY-MM-DD');\r\n }\r\n this.range = toPickerRange(this.from, this.to);\r\n this.page = 1;\r\n // In the drawer the range waits for Apply.\r\n if (!this.isDraft) { this.load(); }\r\n }\r\n\r\n /** A range picked by hand refetches too and is no longer one of the presets. */\r\n onRangePicked(e: PickedDates | null): void {\r\n const picked = fromPickerRange(e);\r\n if (!picked || (picked.from === this.from && picked.to === this.to)) { return; }\r\n this.from = picked.from;\r\n this.to = picked.to;\r\n this.preset = '';\r\n this.page = 1;\r\n if (!this.isDraft) { this.load(); }\r\n }\r\n\r\n // ---------------------------------------------------------------------------\r\n // Export (QA 12 Oct): every export on this page is the Dashboard detail (Monthly Performance) \"Audit Info\"\r\n // workbook - one row per audit visit of the chosen stores in the report period - read from\r\n // POST /trax/audit/dashboard/detail with by 'scope' (no single audit / store / user), 5000 rows a call.\r\n // ---------------------------------------------------------------------------\r\n\r\n /** True while an export is being fetched; a second click waits for it. */\r\n exporting = false;\r\n\r\n /** Top Export: the report as filtered (every page): its stores in the Store view, the stores under the current level in the User view. */\r\n exportAll(): void {\r\n if (this.loading) { return; }\r\n if (this.isStoreMode || this.level === 'store') {\r\n const list = this.isStoreMode ? this.storeRows : this.userStores;\r\n this.exportVisits(list.map(s => s.key), this.isStoreMode ? 'Store report' : 'User report - ' + this.hierarchyTitle);\r\n return;\r\n }\r\n const stores = this.filteredRows.reduce((all: StoreRow[], row) => all.concat(this.storesUnder(row)), []);\r\n this.exportVisits(stores.map(s => s.key), 'User report - ' + this.hierarchyTitle);\r\n }\r\n\r\n /** Row Export in a store table: that store's visits. */\r\n exportStore(s: StoreRow): void {\r\n this.exportVisits([s.key], s.name);\r\n }\r\n\r\n /** Row Export in the roll-up table: the visits of every store under that row. */\r\n exportRow(row: ReportRow): void {\r\n this.exportVisits(this.storesUnder(row).map(s => s.key), row.name);\r\n }\r\n\r\n private storesUnder(row: ReportRow): StoreRow[] {\r\n return this.allStores.filter(s => {\r\n if (row.key === UNASSIGNED) { return !s.circleKey; }\r\n if (row.level === 'circle') { return s.circleKey === row.key; }\r\n if (row.level === 'zone') { return s.zoneKey === row.key; }\r\n return s.aomKey === row.key;\r\n });\r\n }\r\n\r\n private exportVisits(storeIds: string[], title: string): void {\r\n const ids = [...new Set(storeIds.filter(Boolean))];\r\n if (!ids.length) {\r\n this.toast.getErrorToast('No stores to export');\r\n return;\r\n }\r\n if (this.exporting) { return; }\r\n this.exporting = true;\r\n const visits: any[] = [];\r\n const done = (error?: string) => {\r\n this.exporting = false;\r\n if (error) {\r\n this.toast.getErrorToast(error);\r\n } else if (!visits.length) {\r\n this.toast.getErrorToast('No audit visits to export for ' + title);\r\n } else {\r\n this.traxService.exportWorkbook([{ name: 'Audit Info', rows: visits.map(r => this.visitLine(r)) }],\r\n `${title} - audit info - ${this.from} to ${this.to}`);\r\n this.toast.getSuccessToast('Report exported for ' + title);\r\n }\r\n this.cd.detectChanges();\r\n };\r\n const fetchPage = (offset: number) => {\r\n this.traxService.auditDashboardDetail({\r\n clientId: this.headerData?.client,\r\n fromDate: this.from,\r\n toDate: this.to,\r\n storeId: ids,\r\n by: 'scope',\r\n status: 'all',\r\n searchValue: '',\r\n limit: EXPORT_PAGE,\r\n offset\r\n }).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (res: any) => {\r\n if (res?.code !== 200) { done('Unable to export'); return; }\r\n const page = res.data?.rows || [];\r\n visits.push(...page);\r\n if (page.length === EXPORT_PAGE && visits.length < (res.data?.totalCount || 0)) {\r\n fetchPage(offset + 1);\r\n return;\r\n }\r\n done();\r\n },\r\n error: () => done('Unable to export')\r\n });\r\n };\r\n fetchPage(1);\r\n }\r\n\r\n /** The Dashboard detail export's columns (audit-v2-detail exportRows), one visit per row. */\r\n private visitLine(r: any): Record<string, any> {\r\n const status = r.status === 'submit' ? 'Submitted' : (r.status === 'inprogress' ? 'In Progress' : 'Open');\r\n const time = (v: string | null) => (v ? dayjs(v).format('hh:mm A, DD MMM YYYY') : '--');\r\n return {\r\n 'Date': r.date ? dayjs(r.date).format('DD MMM YYYY') : '--',\r\n 'Audit Name': r.checkListName,\r\n 'Store ID': r.storeId,\r\n 'Store Name': r.storeName,\r\n 'User Name': r.userName,\r\n 'Submitted By': r.userEmail,\r\n 'Status': status + (r.redo ? ' (Redo)' : ''),\r\n 'Submitted On': time(r.submittedOn),\r\n 'Submission Count': r.submissionCount,\r\n 'Flags': r.flags,\r\n 'Approved By': r.approvedBy || '--',\r\n 'Approved On': time(r.approvedOn)\r\n };\r\n }\r\n\r\n trackByRow(_: number, row: ReportRow): string {\r\n return row.key || row.name;\r\n }\r\n\r\n trackByKey(_: number, s: StoreRow): string {\r\n return s.key;\r\n }\r\n\r\n trackByPick(_: number, item: { store: StoreRow }): string {\r\n return item.store.key;\r\n }\r\n\r\n trackByChip(_: number, c: { key: string }): string {\r\n return c.key;\r\n }\r\n}\r\n","<div class=\"av2-page audit-reports\">\n\n <!-- Breadcrumb + title -->\n <div class=\"rp-head\">\n <div class=\"rp-crumb\">Audits › <span class=\"rp-crumb-current\">Reports</span></div>\n <div class=\"rp-title\">Store audit report</div>\n </div>\n\n <!-- Filter chips, Filter button at the right end (QA 9 Oct); Export moved to the table head beside its search. -->\n <div class=\"rp-controls\">\n <button type=\"button\" class=\"rp-chip\" *ngFor=\"let c of chips; trackBy: trackByChip\" (click)=\"openFilters(c.key)\"\n [title]=\"c.label + ': ' + c.value\">\n <span class=\"rp-chip-key\">{{ c.label }}</span><span class=\"rp-chip-value\">{{ c.value }}</span>\n </button>\n <div class=\"av2-grow\"></div>\n <button type=\"button\" class=\"av2-btn av2-btn--ghost rp-filterbtn\" (click)=\"openFilters()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\"></polygon></svg>\n Filter\n <span class=\"rp-countpill\">{{ filterCount }}</span>\n </button>\n </div>\n\n <!-- User view: where in the hierarchy -->\n <div class=\"rp-drillbar\" *ngIf=\"!isStoreMode\">\n <ng-container *ngFor=\"let c of crumbs; let last = last; let first = first\">\n <div class=\"rp-drillcrumb\" [class.is-current]=\"last\" (click)=\"goToLevel(c.level)\">\n <span class=\"rp-drillsep\" *ngIf=\"!first\">›</span>{{ c.label }}\n </div>\n </ng-container>\n <div class=\"av2-grow\"></div>\n <div class=\"rp-hint\">{{ hint }}</div>\n </div>\n\n <!-- Scope -->\n <div class=\"rp-scope\">\n <div class=\"rp-scope-title\">{{ scopeTitle }}</div>\n <div class=\"rp-scope-meta\">{{ scopeMeta }}</div>\n </div>\n\n <!-- KPIs -->\n <div class=\"rp-kpis\">\n <!-- Old Checklist summary card: figure + label in the gradient strip, note below. -->\n <div class=\"av2-ocard\" *ngFor=\"let kpi of kpis\">\n <div class=\"av2-ocard-head\">\n <div class=\"av2-ocard-count rp-kpi-value\" [class.is-good]=\"kpi.tone === 'good'\" [class.is-bad]=\"kpi.tone === 'bad'\">\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--value rp-sk-value\"></span>\n <ng-container *ngIf=\"!loading\">{{ kpi.value }}</ng-container>\n </div>\n <div class=\"av2-ocard-text\">{{ kpi.label }}</div>\n </div>\n <div class=\"av2-ocard-body\">\n <span *ngIf=\"loading\" class=\"av2-sk av2-sk--note\"></span>\n <div *ngIf=\"!loading\" class=\"av2-ocard-note\">{{ kpi.note }}</div>\n </div>\n </div>\n </div>\n\n <!-- Report table -->\n <section class=\"rp-card\">\n <div class=\"rp-card-head\">\n <div class=\"rp-card-text\">\n <ng-container *ngIf=\"isStoreMode\">\n <div class=\"rp-card-title\">Store report</div>\n <div class=\"rp-card-meta\">{{ storeRows.length }} {{ storeRows.length === 1 ? 'store' : 'stores' }} · audits submitted in the period</div>\n </ng-container>\n <ng-container *ngIf=\"!isStoreMode\">\n <div class=\"rp-card-title\">{{ tableTitle }}</div>\n <div class=\"rp-card-meta\">{{ tableMeta }}</div>\n </ng-container>\n </div>\n <div class=\"av2-grow\"></div>\n <label class=\"av2-search rp-search\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\n </svg>\n <input type=\"text\" [placeholder]=\"isStoreMode ? 'Search store' : 'Search ' + levelLabel.toLowerCase()\"\n [(ngModel)]=\"search\" (ngModelChange)=\"onSearchChange()\">\n </label>\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" [disabled]=\"loading || exporting\" (click)=\"exportAll()\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 16V4\"></path><polyline points=\"7 9 12 4 17 9\"></polyline><path d=\"M4 16v4h16v-4\"></path></svg>\n Export\n </button>\n </div>\n\n <lib-audit-v2-shimmer *ngIf=\"loading\"></lib-audit-v2-shimmer>\n\n <!-- Store view: one row per store -->\n <div class=\"av2-table-wrap\" *ngIf=\"!loading && isStoreMode && tableCount\">\n <table class=\"rp-table rp-table--stores\">\n <thead>\n <tr>\n <th class=\"av2-sortable\" (click)=\"sortBy('name')\">Store <lib-audit-v2-sort-icon [active]=\"sortKey === 'name'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"av2-sortable\" (click)=\"sortBy('cluster')\">Cluster <lib-audit-v2-sort-icon [active]=\"sortKey === 'cluster'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"av2-sortable\" (click)=\"sortBy('aom')\">Area manager <lib-audit-v2-sort-icon [active]=\"sortKey === 'aom'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('audited')\">Audited <lib-audit-v2-sort-icon [active]=\"sortKey === 'audited'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('score')\">Score <lib-audit-v2-sort-icon [active]=\"sortKey === 'score'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('status')\">Result <lib-audit-v2-sort-icon [active]=\"sortKey === 'status'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('lastAudit')\">Last audit <lib-audit-v2-sort-icon [active]=\"sortKey === 'lastAudit'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right\">Export</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let s of storePageRows; trackBy: trackByKey\">\n <td class=\"is-strong rp-cell-name\" [av2Tip]=\"s.name\">{{ s.name }}</td>\n <td class=\"av2-ellipsis\" [av2Tip]=\"s.cluster\">{{ s.cluster || '—' }}</td>\n <td class=\"av2-ellipsis\" [av2Tip]=\"s.aom\">{{ s.aom || '—' }}</td>\n <td class=\"t-right\" [class.is-muted]=\"!s.audited\">{{ s.audited ? 'Yes' : 'No' }}</td>\n <td class=\"t-right is-strong\" [class.is-pass]=\"s.status === 'pass'\" [class.is-fail]=\"s.status === 'fail'\"\n [class.is-muted]=\"s.score === null\">{{ scoreText(s) }}</td>\n <td class=\"t-right\">\n <span class=\"rp-result\" [class.is-pass]=\"s.status === 'pass'\" [class.is-fail]=\"s.status === 'fail'\">{{ resultText(s) }}</span>\n </td>\n <td class=\"t-right\" [class.is-muted]=\"!s.lastAudit\">{{ s.lastAudit || 'No audit' }}</td>\n <td class=\"t-right\">\n <button type=\"button\" class=\"rp-export\" [disabled]=\"exporting\" (click)=\"exportStore(s)\">Export</button>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr class=\"rp-total\">\n <td>Total</td>\n <td></td>\n <td></td>\n <td class=\"t-right\">{{ totalAuditedOf }}</td>\n <td class=\"t-right\">{{ totalAverage }}</td>\n <td class=\"t-right\">{{ totals.failed }} fail</td>\n <td></td>\n <td></td>\n </tr>\n </tfoot>\n </table>\n </div>\n\n <!-- User view: circle head / zone manager / area manager roll-up -->\n <div class=\"av2-table-wrap\" *ngIf=\"!loading && !isStoreMode && level !== 'store' && tableCount\">\n <table class=\"rp-table\">\n <thead>\n <tr>\n <th class=\"av2-sortable\" (click)=\"sortBy('name')\">{{ levelLabel }} <lib-audit-v2-sort-icon [active]=\"sortKey === 'name'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('total')\">Total stores <lib-audit-v2-sort-icon [active]=\"sortKey === 'total'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('audited')\">Audited <lib-audit-v2-sort-icon [active]=\"sortKey === 'audited'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('notAudited')\">Not audited <lib-audit-v2-sort-icon [active]=\"sortKey === 'notAudited'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('coverage')\">Coverage <lib-audit-v2-sort-icon [active]=\"sortKey === 'coverage'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('avgScore')\">Avg audit score <lib-audit-v2-sort-icon [active]=\"sortKey === 'avgScore'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('failedPct')\">Failed store % <lib-audit-v2-sort-icon [active]=\"sortKey === 'failedPct'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right\">Report</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let row of pageRows; trackBy: trackByRow\" class=\"rp-row\" (click)=\"openRow(row)\">\n <td>\n <div class=\"rp-name\">\n <span class=\"rp-name-main\">{{ row.name }}</span>\n <span class=\"rp-name-sub\" *ngIf=\"row.email\">{{ row.email }}</span>\n </div>\n </td>\n <td class=\"t-right\">{{ row.total }}</td>\n <td class=\"t-right\">{{ row.audited }}</td>\n <td class=\"t-right\" [class.is-muted]=\"!row.notAudited\">{{ row.notAudited }}</td>\n <td class=\"t-right\">{{ row.coverage }}</td>\n <td class=\"t-right is-strong\">{{ row.avgScore }}</td>\n <td class=\"t-right is-strong\" [class.is-fail]=\"isHighFail(row)\">{{ row.failedPct }}</td>\n <td class=\"t-right\">\n <button type=\"button\" class=\"rp-export\" [disabled]=\"exporting\" (click)=\"exportRow(row); $event.stopPropagation()\">Export</button>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr class=\"rp-total\">\n <td>Total</td>\n <td class=\"t-right\">{{ totals.total }}</td>\n <td class=\"t-right\">{{ totals.audited }}</td>\n <td class=\"t-right\">{{ totals.total - totals.audited }}</td>\n <td class=\"t-right\">{{ totalCoverage }}</td>\n <td class=\"t-right\">{{ totalAverage }}</td>\n <td class=\"t-right\">{{ totalFailedPct }}</td>\n <td></td>\n </tr>\n </tfoot>\n </table>\n </div>\n\n <!-- User view, deepest level: the area manager's stores -->\n <div class=\"av2-table-wrap\" *ngIf=\"!loading && !isStoreMode && level === 'store' && tableCount\">\n <table class=\"rp-table rp-table--userstores\">\n <thead>\n <tr>\n <th class=\"av2-sortable\" (click)=\"sortBy('name')\">Store <lib-audit-v2-sort-icon [active]=\"sortKey === 'name'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"av2-sortable\" (click)=\"sortBy('aom')\">Area manager <lib-audit-v2-sort-icon [active]=\"sortKey === 'aom'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"av2-sortable\" (click)=\"sortBy('zone')\">Zone manager <lib-audit-v2-sort-icon [active]=\"sortKey === 'zone'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('audited')\">Audited <lib-audit-v2-sort-icon [active]=\"sortKey === 'audited'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right av2-sortable\" (click)=\"sortBy('score')\">Score <lib-audit-v2-sort-icon [active]=\"sortKey === 'score'\" [dir]=\"sortDir\"></lib-audit-v2-sort-icon></th>\n <th class=\"t-right\">Export</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let s of userStorePageRows; trackBy: trackByKey\">\n <td class=\"is-strong rp-cell-name\" [av2Tip]=\"s.name\">{{ s.name }}</td>\n <td class=\"av2-ellipsis\" [av2Tip]=\"s.aom\">{{ s.aom || '—' }}</td>\n <td class=\"av2-ellipsis\" [av2Tip]=\"s.zone\">{{ s.zone || '—' }}</td>\n <td class=\"t-right\" [class.is-muted]=\"!s.audited\">{{ s.audited ? 'Yes' : 'No' }}</td>\n <td class=\"t-right is-strong\" [class.is-pass]=\"s.status === 'pass'\" [class.is-fail]=\"s.status === 'fail'\"\n [class.is-muted]=\"s.score === null\">{{ scoreText(s) }}</td>\n <td class=\"t-right\">\n <button type=\"button\" class=\"rp-export\" [disabled]=\"exporting\" (click)=\"exportStore(s)\">Export</button>\n </td>\n </tr>\n </tbody>\n <tfoot>\n <tr class=\"rp-total\">\n <td>Total</td>\n <td></td>\n <td></td>\n <td class=\"t-right\">{{ totalAuditedOf }}</td>\n <td class=\"t-right\">{{ totalAverage }}</td>\n <td></td>\n </tr>\n </tfoot>\n </table>\n </div>\n\n <div *ngIf=\"!loading && !tableCount\" class=\"av2-empty\">\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\n <div class=\"av2-empty-text\">\n <div class=\"av2-empty-title\">No data found</div>\n <div class=\"av2-empty-sub\">{{ search ? 'No rows match \"' + search + '\"' : 'No stores match the current filters' }}</div>\n </div>\n </div>\n\n <!-- Shared pager (10 / 20 / 30), as on the other audit lists. -->\n <div class=\"rp-pager\" *ngIf=\"!loading && tableCount\">\n <lib-pagination [itemsPerPage]=\"pageSize\" [pageSize]=\"pageSize\" [paginationSizes]=\"pageSizes\" [currentPage]=\"page\"\n [totalItems]=\"tableCount\" (pageChange)=\"onPageChange($event)\" (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\n </div>\n </section>\n\n <!-- ============ FILTER DRAWER ============ -->\n <div class=\"filter-backdrop\" *ngIf=\"filtersOpen\" (click)=\"closeFilters()\"></div>\n\n <!-- Every control edits the drawer's draft (dr); the page behind changes only on Apply or Reset all. -->\n <div class=\"filter-drawer\" *ngIf=\"filtersOpen && draft as dr\">\n <div class=\"drawer-head\">\n <span class=\"drawer-title\">Filters</span>\n <span class=\"rp-countpill\">{{ dr.filterCount }}</span>\n <div class=\"av2-grow\"></div>\n <button type=\"button\" class=\"closebtn\" (click)=\"closeFilters()\" title=\"Close\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\n </button>\n </div>\n\n <div class=\"drawer-body\">\n <div class=\"drawer-nav\">\n <!-- trackBy: filterCats is rebuilt on every check, and lib-audit-v2-select's document:mousedown runs one\n between press and release; without it the button was replaced mid-click and the click never landed. -->\n <button type=\"button\" class=\"drawer-navitem\" *ngFor=\"let c of dr.filterCats; trackBy: trackByChip\" [class.navitem-active]=\"activeCat === c.key\"\n (click)=\"selectCat(c.key)\">\n <span class=\"navtext\">\n <span class=\"navtitle\">{{ c.label }}</span>\n <span class=\"navvalue\" [class.is-dirty]=\"c.dirty\">{{ c.value }}</span>\n </span>\n <span class=\"dirtydot\" *ngIf=\"c.dirty\"></span>\n </button>\n </div>\n\n <div class=\"drawer-pane\">\n <div class=\"panetitle\">{{ dr.paneTitle }}</div>\n <div class=\"panehint\">{{ dr.paneSub }}</div>\n\n <!-- Date -->\n <div class=\"pane-stack\" *ngIf=\"activeCat === 'date'\">\n <div class=\"av2-datepick\">\n <svg class=\"av2-datepick-icon\" width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\"></rect>\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\"></line><line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\"></line><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"></line></svg>\n <input type=\"text\" class=\"av2-datepick-input rp-daterange\" ngxDaterangepickerMd readonly autocomplete=\"off\"\n placeholder=\"Select date range\" [(ngModel)]=\"dr.range\" [locale]=\"pickerLocale\" [maxDate]=\"today\"\n [ranges]=\"ranges\" [showCustomRangeLabel]=\"true\" [alwaysShowCalendars]=\"false\"\n [keepCalendarOpeningWithRange]=\"true\" [autoApply]=\"true\" [showCancel]=\"false\"\n [drops]=\"'down'\" [opens]=\"'right'\" (datesUpdated)=\"dr.onRangePicked($event)\">\n </div>\n <div class=\"rp-presets\">\n <button type=\"button\" class=\"rp-preset\" *ngFor=\"let p of presets\" [class.is-on]=\"dr.preset === p\"\n (click)=\"dr.setPreset(p)\">{{ p }}</button>\n </div>\n </div>\n\n <!-- View by -->\n <div class=\"pane-options\" *ngIf=\"activeCat === 'mode'\">\n <div class=\"pane-option\" [class.is-on]=\"dr.isStoreMode\" (click)=\"dr.setMode('store')\">\n <span class=\"pane-radio\" [class.is-on]=\"dr.isStoreMode\"><span></span></span>\n <span class=\"pane-option-text\">\n <span class=\"pane-option-label\">Store</span>\n <span class=\"pane-option-help\">One row per store with score, result and last audit date.</span>\n </span>\n </div>\n <div class=\"pane-option\" [class.is-on]=\"!dr.isStoreMode\" (click)=\"dr.setMode('user')\">\n <span class=\"pane-radio\" [class.is-on]=\"!dr.isStoreMode\"><span></span></span>\n <span class=\"pane-option-text\">\n <span class=\"pane-option-label\">User</span>\n <span class=\"pane-option-help\">Rolled up by circle head, zone manager and AOM, drillable down to stores.</span>\n </span>\n </div>\n </div>\n\n <!-- Stores (Store view) -->\n <div class=\"pane-stack\" *ngIf=\"activeCat === 'scope' && dr.isStoreMode\">\n <label class=\"av2-search rp-pick-search\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\n <input type=\"text\" placeholder=\"Search store\" [(ngModel)]=\"dr.storeQuery\">\n </label>\n <div class=\"rp-picklist\">\n <ng-container *ngIf=\"dr.storePickItems.length\">\n <label class=\"rp-pick is-all\">\n <input type=\"checkbox\" [checked]=\"dr.storePickAllChecked\" (change)=\"dr.toggleStorePickAll()\">\n <span>Select All</span>\n </label>\n <label class=\"rp-pick\" *ngFor=\"let it of dr.storePickItems; trackBy: trackByPick\">\n <input type=\"checkbox\" [checked]=\"it.checked\" (change)=\"dr.toggleStorePick(it.store)\">\n <span class=\"rp-pick-label\">{{ it.store.name }}</span>\n <span class=\"rp-pick-sub\">{{ it.store.cluster || it.store.aom }}</span>\n </label>\n </ng-container>\n <div class=\"rp-pick-empty\" *ngIf=\"!dr.storePickItems.length\">\n {{ dr.storeQuery ? 'No stores match \"' + dr.storeQuery + '\"' : 'No stores in scope' }}\n </div>\n </div>\n <div class=\"rp-reading\">\n <span>Reading</span>\n <strong>{{ dr.storePickReading }}</strong>\n <span class=\"av2-grow\"></span>\n <button type=\"button\" class=\"av2-link rp-reset\" (click)=\"dr.resetStorePick()\">Reset to all stores</button>\n </div>\n </div>\n\n <!-- Store hierarchy (User view) -->\n <div class=\"pane-stack\" *ngIf=\"activeCat === 'scope' && !dr.isStoreMode\">\n <div class=\"rp-field\">\n <div class=\"rp-field-label\">Circle Head <span>{{ dr.circleOptions.length - 1 }} users</span></div>\n <lib-audit-v2-select [value]=\"dr.circleKey\" [options]=\"dr.circleOptions\" placeholder=\"All circles\"\n ariaLabel=\"Circle Head\" (changed)=\"dr.pickCircle($event.target.value)\"></lib-audit-v2-select>\n </div>\n <div class=\"rp-field\" *ngIf=\"dr.showZonePick\">\n <div class=\"rp-field-label\">Zone Manager <span>{{ dr.zoneOptions.length - 1 }} {{ dr.zoneOptions.length === 2 ? 'user' : 'users' }}</span></div>\n <lib-audit-v2-select [value]=\"dr.zoneKey\" [options]=\"dr.zoneOptions\" placeholder=\"All zones\"\n ariaLabel=\"Zone Manager\" (changed)=\"dr.pickZone($event.target.value)\"></lib-audit-v2-select>\n </div>\n <div class=\"rp-field\" *ngIf=\"dr.zoneKey\">\n <div class=\"rp-field-label\">AOM <span>{{ dr.aomOptions.length - 1 }} {{ dr.aomOptions.length === 2 ? 'user' : 'users' }}</span></div>\n <lib-audit-v2-select [value]=\"dr.aomKey\" [options]=\"dr.aomOptions\" placeholder=\"All AOMs\"\n ariaLabel=\"AOM\" (changed)=\"dr.pickAom($event.target.value)\"></lib-audit-v2-select>\n </div>\n <div class=\"rp-field\" *ngIf=\"dr.aomKey\">\n <div class=\"rp-field-label\">Store <span>{{ dr.storeOptions.length - 1 }} stores</span></div>\n <lib-audit-v2-select [value]=\"dr.storeKey\" [options]=\"dr.storeOptions\" placeholder=\"All stores\"\n ariaLabel=\"Store\" (changed)=\"dr.pickStore($event.target.value)\"></lib-audit-v2-select>\n </div>\n <div class=\"rp-reading\">\n <span>Reading</span>\n <strong>{{ dr.hierarchyReading }}</strong>\n <span class=\"av2-grow\"></span>\n <button type=\"button\" class=\"av2-link rp-reset\" (click)=\"dr.goToLevel('circle')\">Reset to all circles</button>\n </div>\n </div>\n\n <!-- Result (Store view) -->\n <div class=\"pane-options\" *ngIf=\"activeCat === 'result' && dr.isStoreMode\">\n <div class=\"pane-option\" [class.is-on]=\"dr.result === 'all'\" (click)=\"dr.setResult('all')\">\n <span class=\"pane-radio\" [class.is-on]=\"dr.result === 'all'\"><span></span></span>\n <span class=\"pane-option-text\">\n <span class=\"pane-option-label\">All</span>\n <span class=\"pane-option-help\">Every store in scope, audited or not.</span>\n </span>\n </div>\n <div class=\"pane-option\" [class.is-on]=\"dr.result === 'pass'\" (click)=\"dr.setResult('pass')\">\n <span class=\"pane-radio\" [class.is-on]=\"dr.result === 'pass'\"><span></span></span>\n <span class=\"pane-option-text\">\n <span class=\"pane-option-label\">Pass</span>\n <span class=\"pane-option-help\">Only stores scoring at or above the {{ passMark }}% pass mark.</span>\n </span>\n </div>\n <div class=\"pane-option\" [class.is-on]=\"dr.result === 'fail'\" (click)=\"dr.setResult('fail')\">\n <span class=\"pane-radio\" [class.is-on]=\"dr.result === 'fail'\"><span></span></span>\n <span class=\"pane-option-text\">\n <span class=\"pane-option-label\">Fail</span>\n <span class=\"pane-option-help\">Only stores scoring below the {{ passMark }}% pass mark.</span>\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"drawer-foot\">\n <button type=\"button\" class=\"av2-link rp-reset\" (click)=\"resetFilters()\">Reset all</button>\n <div class=\"av2-grow\"></div>\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--wide\" (click)=\"applyFilters()\">Apply</button>\n </div>\n </div>\n\n</div>\n","/**\r\n * Predefined audit templates (Manage -> Predefined Audit). \"Use template\" creates an audit with the\r\n * template's name and opens it in the question editor with these questions filled in, to review and\r\n * save like any audit. Questions are written in the shape the editor loads (auditquestion rows).\r\n */\r\n\r\nexport interface TemplateQuestion {\r\n qname: string;\r\n answerType: 'yes/no' | 'multiplechoicesingle' | 'descriptive';\r\n /** Option texts (yes/no and single choice). */\r\n options?: string[];\r\n /** Options raised as a flag (non-compliant). */\r\n flagged?: string[];\r\n}\r\n\r\nexport interface AuditTemplate {\r\n key: string;\r\n title: string;\r\n desc: string;\r\n sections: Array<{ name: string; questions: TemplateQuestion[] }>;\r\n}\r\n\r\nconst YES_NO = (qname: string, flagged = 'No'): TemplateQuestion => ({ qname, answerType: 'yes/no', options: ['Yes', 'No'], flagged: [flagged] });\r\nconst RATING = (qname: string): TemplateQuestion => ({ qname, answerType: 'multiplechoicesingle', options: ['Good', 'Average', 'Poor'], flagged: ['Poor'] });\r\nconst NOTE = (qname: string): TemplateQuestion => ({ qname, answerType: 'descriptive' });\r\n\r\nexport const AUDIT_TEMPLATES: AuditTemplate[] = [\r\n {\r\n key: 'daily-store-manager',\r\n title: 'Daily Store Manager Audit',\r\n desc: 'Audit to streamline daily tasks, covering inventory, cleanliness, and customer service to ensure a well-organized store and improved',\r\n sections: [\r\n { name: 'Store Readiness', questions: [\r\n YES_NO('Is the store opened on time with all lights and displays on?'),\r\n YES_NO('Is the staff present in uniform as per the roster?'),\r\n RATING('Rate the overall cleanliness of the shop floor')\r\n ] },\r\n { name: 'Inventory & Customer Service', questions: [\r\n YES_NO('Are fast-moving products available on the shelves?'),\r\n YES_NO('Are customers greeted within 30 seconds of entering?'),\r\n NOTE('Note anything that needs the area manager\\'s attention')\r\n ] }\r\n ]\r\n },\r\n {\r\n key: 'cashier',\r\n title: 'Cashier Audit',\r\n desc: 'To ensure that cashiers follow consistent procedures, provide excellent customer service, and handle transactions accurately and efficiently.',\r\n sections: [\r\n { name: 'Billing Counter', questions: [\r\n YES_NO('Is the cash drawer balanced at the start of the shift?'),\r\n YES_NO('Is every sale billed and the receipt handed to the customer?'),\r\n YES_NO('Are the card machine and UPI scanner working?'),\r\n RATING('Rate the cashier\\'s courtesy with customers'),\r\n NOTE('Describe any billing issue seen during the visit')\r\n ] }\r\n ]\r\n },\r\n {\r\n key: 'opening-closing',\r\n title: 'Store Opening & Closing Audit',\r\n desc: 'To ensure that your store operations are consistently efficient,safe and compliant with all relevant regulations',\r\n sections: [\r\n { name: 'Opening', questions: [\r\n YES_NO('Was the store opened at the scheduled time?'),\r\n YES_NO('Are the shutter, locks and alarm working?'),\r\n YES_NO('Are the CCTV cameras recording?')\r\n ] },\r\n { name: 'Closing', questions: [\r\n YES_NO('Is the cash deposited / locked away before closing?'),\r\n YES_NO('Are all lights and equipment switched off?'),\r\n NOTE('Note any safety issue found at opening or closing')\r\n ] }\r\n ]\r\n },\r\n {\r\n key: 'store-hygiene',\r\n title: 'Store Hygiene Audit',\r\n desc: 'Enhance your CCTV system with AI-powered mobile usage detection, gaining insights into customer behavior and optimizing',\r\n sections: [\r\n { name: 'Hygiene', questions: [\r\n RATING('Rate the cleanliness of the floor and display areas'),\r\n YES_NO('Are the washrooms clean and stocked?'),\r\n YES_NO('Are dustbins emptied and covered?'),\r\n YES_NO('Is the trial / testing area sanitised?'),\r\n NOTE('Describe anything that needs cleaning')\r\n ] }\r\n ]\r\n }\r\n];\r\n\r\n/** The template's sections as the question editor loads them (same fields as a saved audit's sections). */\r\nexport function templateSections(t: AuditTemplate): any[] {\r\n return t.sections.map((s, si) => ({\r\n name: s.name,\r\n sectionNumber: si + 1,\r\n questions: s.questions.map((q, qi) => {\r\n const scored = q.answerType !== 'descriptive';\r\n const options = q.options?.length ? q.options : [''];\r\n return {\r\n qno: qi + 1,\r\n qname: q.qname,\r\n answerType: q.answerType,\r\n runAI: false,\r\n runAIDescription: '',\r\n allowUploadfromGallery: false,\r\n linkType: false,\r\n multiQuestionReferenceImage: [],\r\n questionReferenceImage: '',\r\n descriptivetype: 'text',\r\n compliance: scored,\r\n answers: options.map((answer, ai) => {\r\n const flag = !!q.flagged?.includes(answer);\r\n return {\r\n answer,\r\n answeroptionNumber: ai + 1,\r\n sopFlag: flag,\r\n validation: false,\r\n validationType: '',\r\n validationAnswer: '',\r\n multiReferenceImage: [],\r\n referenceImage: '',\r\n showLinked: false,\r\n linkedQuestion: 0,\r\n nestedQuestion: [],\r\n descriptivetype: 'text',\r\n complianceScore: scored && !flag ? 1 : 0\r\n };\r\n })\r\n };\r\n })\r\n }));\r\n}\r\n","import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { Subject, takeUntil } from 'rxjs';\r\nimport { GlobalStateService } from 'tango-app-ui-global';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport { TraxService } from '../../../services/trax.service';\r\nimport { AuditAccess, auditAccess } from '../audit-v2-access';\r\nimport { AUDIT_TEMPLATES, AuditTemplate } from './audit-v2-templates';\r\n\r\n/**\r\n * Template library (Manage -> Predefined Audit). \"Use template\" creates an audit with the template's\r\n * name (POST /trax/audit/create; \"(2)\", \"(3)\" … when the name is taken) and opens it in the question\r\n * editor with the template's questions filled in (router state { template }), to review and save.\r\n */\r\n@Component({\r\n selector: 'lib-audit-v2-predefined',\r\n templateUrl: './audit-v2-predefined.component.html',\r\n styleUrl: './audit-v2-predefined.component.scss'\r\n})\r\nexport class AuditV2PredefinedComponent implements OnInit, OnDestroy {\r\n readonly cards: AuditTemplate[] = AUDIT_TEMPLATES;\r\n access: AuditAccess = { canAdd: false, canEdit: false };\r\n /** Template being created (button shows a spinner state). */\r\n creating = '';\r\n\r\n private clientId = '';\r\n private readonly destroy$ = new Subject<void>();\r\n\r\n constructor(\r\n private traxService: TraxService,\r\n private gs: GlobalStateService,\r\n private router: Router,\r\n private toast: ToastService,\r\n private cd: ChangeDetectorRef\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n auditAccess(this.gs).pipe(takeUntil(this.destroy$)).subscribe(access => { this.access = access; this.cd.detectChanges(); });\r\n this.gs.dataRangeValue.pipe(takeUntil(this.destroy$)).subscribe((data: any) => {\r\n this.clientId = data?.client || JSON.parse(localStorage.getItem('header-filters') || '{}')?.client || '';\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n questionCount(t: AuditTemplate): number {\r\n return t.sections.reduce((n, s) => n + s.questions.length, 0);\r\n }\r\n\r\n useTemplate(t: AuditTemplate): void {\r\n if (!this.access.canAdd) { this.toast.getErrorToast('You do not have permission to create audits'); return; }\r\n if (this.creating || !this.clientId) { return; }\r\n this.creating = t.key;\r\n this.create(t, 1);\r\n }\r\n\r\n /** Try the template name, then \"Name (2)\", \"Name (3)\" … while the name is already used. */\r\n private create(t: AuditTemplate, attempt: number): void {\r\n const name = attempt === 1 ? t.title : t.title + ' (' + attempt + ')';\r\n this.traxService.auditCreate({ clientId: this.clientId, checkListName: name, checklistDescription: t.desc, passMark: 75 })\r\n .pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (res: any) => {\r\n if (res?.code === 200 && res?.data?._id) {\r\n this.creating = '';\r\n this.toast.getSuccessToast('Loaded template · ' + t.title + '. Review the questions and save.');\r\n this.router.navigate(['/manage/trax/audit-v2/manage/editor'], {\r\n queryParams: { checklistId: res.data._id },\r\n state: { template: t.key }\r\n });\r\n return;\r\n }\r\n this.fail('Could not create the audit');\r\n },\r\n error: (e: any) => {\r\n const msg = e?.error?.error?.message || e?.error?.error || e?.error?.message || '';\r\n if (/already exists/i.test(String(msg)) && attempt < 20) { this.create(t, attempt + 1); return; }\r\n this.fail(msg || 'Could not create the audit');\r\n }\r\n });\r\n }\r\n\r\n private fail(message: string): void {\r\n this.creating = '';\r\n this.toast.getErrorToast(message);\r\n this.cd.detectChanges();\r\n }\r\n\r\n trackByKey(_: number, card: AuditTemplate): string {\r\n return card.key;\r\n }\r\n}\r\n","<div class=\"av2-page audit-predefined\">\r\n <section class=\"pd-card\">\r\n <div class=\"pd-head\">\r\n <a class=\"pd-back\" routerLink=\"/manage/trax/audit-v2/manage\" title=\"Back to Manage\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"19\" y1=\"12\" x2=\"5\" y2=\"12\"></line>\r\n <polyline points=\"12 19 5 12 12 5\"></polyline>\r\n </svg>\r\n </a>\r\n <div class=\"pd-title\">Predefined Audit</div>\r\n </div>\r\n\r\n <div class=\"pd-grid\">\r\n <div class=\"pd-tpl\" *ngFor=\"let card of cards; trackBy: trackByKey\">\r\n <div class=\"pd-tile\">\r\n <span class=\"pd-tile-part\">{{ card.sections.length }} {{ card.sections.length === 1 ? 'section' : 'sections' }}</span>\r\n <span class=\"pd-tile-head\">{{ questionCount(card) }} questions</span>\r\n </div>\r\n <div class=\"pd-tpl-head\">\r\n <div class=\"pd-tpl-title\">{{ card.title }}</div>\r\n <a class=\"pd-edit\" [class.is-busy]=\"creating === card.key\" [class.is-off]=\"!access.canAdd\"\r\n [title]=\"access.canAdd ? 'Use this template' : 'You do not have permission to create audits'\" (click)=\"useTemplate(card)\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M11 4H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-5\"></path>\r\n <path d=\"M18.5 2.5a2.1 2.1 0 0 1 3 3L12 15l-4 1 1-4z\"></path>\r\n </svg>\r\n </a>\r\n </div>\r\n <div class=\"pd-tpl-desc\">{{ card.desc }}</div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm pd-use\" [disabled]=\"!access.canAdd || !!creating\"\r\n (click)=\"useTemplate(card)\">{{ creating === card.key ? 'Creating…' : 'Use template' }}</button>\r\n </div>\r\n </div>\r\n </section>\r\n</div>\r\n","import { ChangeDetectorRef, Component, HostListener, OnDestroy, OnInit } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { Observable, Subject, forkJoin, of, takeUntil } from 'rxjs';\r\nimport { catchError, map } from 'rxjs/operators';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport { GlobalStateService } from 'tango-app-ui-global';\r\nimport dayjs from 'dayjs';\r\nimport utc from 'dayjs/plugin/utc';\r\nimport timezone from 'dayjs/plugin/timezone';\r\nimport * as XLSX from 'xlsx';\r\nimport { TraxService } from '../../../services/trax.service';\r\nimport { AuditAccess, auditAccess } from '../audit-v2-access';\r\nimport { AuditSelectOption } from '../select/audit-v2-select.component';\r\n\r\ndayjs.extend(utc);\r\ndayjs.extend(timezone);\r\n\r\n/** A user chip: initials, display name, email. Stored on the checklist as { name, value }. */\r\nexport interface ChipUser {\r\n i: string;\r\n n: string;\r\n e: string;\r\n}\r\n\r\nexport interface ConfigSection {\r\n label: string;\r\n items: string[];\r\n open: boolean;\r\n}\r\n\r\nexport interface SelectOption {\r\n value: number;\r\n label: string;\r\n}\r\n\r\ntype ChipList = 'owners' | 'approvers' | 'notifyUsers' | 'recurringUsers' | 'dailyUsers' | 'preSubmissionUsers' | 'editUsers';\r\n\r\n/** Reminder intervals offered, in minutes before the audit end time (as the Checklist Configure page). */\r\nconst REMINDER_MINUTES = [30, 45, 60, 75, 90];\r\n/** The Checklist Configure page allows up to three reminders. */\r\nconst MAX_REMINDERS = 3;\r\ntype SelectKey = 'recurringThreshold' | 'redoValidFor' | 'respDelay' | 'disputeWindow' | 'redoExtension';\r\n/** \"Send To > Approver\" ticks that need at least one approver to send to. */\r\ntype SendApproverKey = 'notifySendApprover' | 'recurringSendApprover' | 'dailySendApprover';\r\n\r\n/**\r\n * Manage -> Configure for one audit (`?checklistId=`).\r\n *\r\n * The audit is a checklist, so this page reads and writes the SAME fields the Checklist\r\n * Configure page uses (GET /trax/getConfigDetails, POST /trax/checklistConfigurev1):\r\n * owner, approver, remainder, notifyFlags, recurringFlag, autoEmail, export, redoValidity,\r\n * redoExtension, autoCreateTask, userVerification, showApprovedResponse, responseVisibility(+Hours),\r\n * shareReportPostApproval, checkListDescription. Audit-only settings that the checklist schema\r\n * has no field for (pass mark, dispute window, pre-submission access, edit-submission users)\r\n * are kept on auditconfig via POST /trax/audit/config/save.\r\n */\r\n@Component({\r\n selector: 'lib-audit-v2-configure',\r\n templateUrl: './audit-v2-configure.component.html',\r\n styleUrl: './audit-v2-configure.component.scss'\r\n})\r\nexport class AuditV2ConfigureComponent implements OnInit, OnDestroy {\r\n checklistId = '';\r\n auditName = '';\r\n description = '';\r\n published = false;\r\n schedule = '—';\r\n scheduleWindow = '—';\r\n sections: ConfigSection[] = [];\r\n\r\n // ---- checklist fields (saved on checklistconfig) ----\r\n owners: ChipUser[] = [];\r\n approverOn = false;\r\n approvers: ChipUser[] = [];\r\n /** The client's superadmin (from the user list), the v1 default approver for Tango users and role 'user'. */\r\n private superAdmin: ChipUser | null = null;\r\n reminderOn = false;\r\n /** checklist.remainder: minutes before the end time at which the auditor gets a push reminder. */\r\n reminders: number[] = [];\r\n /** Options per reminder row: every interval not already used by another row. */\r\n reminderOpts: AuditSelectOption[][] = [];\r\n readonly maxReminders = MAX_REMINDERS;\r\n // Notify Flags (checklist.notifyFlags): who gets the flag emails.\r\n notifyFlagsOn = false;\r\n notifySendApprover = true;\r\n notifySendCustom = false;\r\n notifyUsers: ChipUser[] = [];\r\n // Notify on Recurring Flags (checklist.recurringFlag): threshold + its own recipients.\r\n recurringFlagsOn = false;\r\n recurringThreshold = 3;\r\n recurringSendApprover = true;\r\n recurringSendCustom = false;\r\n /** Stored as notifyType 'sameAsNotify': the server mails whoever Notify Flags mails at send time. */\r\n recurringSameAsNotify = false;\r\n recurringUsers: ChipUser[] = [];\r\n dailyReportOn = false;\r\n dailySendApprover = true;\r\n dailySendCustom = false;\r\n dailyUsers: ChipUser[] = [];\r\n /** Daily Report > Custom bulk upload popup (as the Checklist Configure page's). */\r\n dailyBulkOpen = false;\r\n /** Row errors of the last upload; any error rejects the whole file, so nothing partial is applied. */\r\n dailyBulkErrors: string[] = [];\r\n sharePostApproval = false;\r\n exportSubmissionOn = false;\r\n redoValidFor = 7;\r\n autoCreateTaskOn = false;\r\n /** Auto-task settings (as the Checklist Configure page): who gets the task and for how many days. */\r\n taskAssignee: 'submitter' | 'store' = 'submitter';\r\n taskValidity = 10;\r\n readonly taskValidityOptions = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30].map(d => ({ value: d, label: String(d) }));\r\n showResponseInApp = true;\r\n responseVisibility: 'pre' | 'post' = 'post';\r\n respDelay = 2;\r\n requirePhoto = false;\r\n requireAcknowledgment = false;\r\n redoExtension = 1;\r\n\r\n // ---- audit-only fields (saved on auditconfig) ----\r\n passFailOn = true;\r\n passThreshold = 75;\r\n disputeOn = true;\r\n disputeWindow = 48;\r\n preSubmissionAccessOn = false;\r\n preSubmissionUsers: ChipUser[] = [];\r\n editSubmittedOn = false;\r\n editUsers: ChipUser[] = [];\r\n\r\n passLabel = 'Pass';\r\n failLabel = 'Fail';\r\n\r\n /** Client users offered by the chip pickers. */\r\n users: ChipUser[] = [];\r\n drafts: Record<ChipList, string> = { owners: '', approvers: '', notifyUsers: '', recurringUsers: '', dailyUsers: '', preSubmissionUsers: '', editUsers: '' };\r\n /** Which chip box is showing suggestions, and which dropdown is open. */\r\n openChips: ChipList | null = null;\r\n openSelect: SelectKey | null = null;\r\n\r\n /** Stores / users already assigned to the checklist. Audits get them from a schedule\r\n * (Manage › Schedule Info), so this page only reads the count. */\r\n assignedCount = 0;\r\n /** Publish with nothing assigned saves first, then opens Create schedule for this audit. */\r\n private scheduleAfterSave = false;\r\n /** Publish state before the current save, so the toast can say \"published\" vs \"saved and published\". */\r\n private wasPublished = false;\r\n\r\n readonly thresholdOpts: SelectOption[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(n => ({ value: n, label: String(n) }));\r\n readonly redoDayOpts: SelectOption[] = [1, 2, 3, 4, 5, 6, 7, 10, 14, 21, 30].map(n => ({ value: n, label: String(n) }));\r\n readonly respDelayOpts: SelectOption[] = [0, 2, 6, 12, 24, 48].map(n => ({ value: n, label: n === 0 ? 'Immediately' : n + ' hours' }));\r\n readonly dispWindowOpts: SelectOption[] = [6, 12, 24, 48, 72, 168].map(n => ({ value: n, label: n === 168 ? '7 days' : n + ' hours' }));\r\n readonly redoExtensionOpts: SelectOption[] = [1, 2, 3, 4, 5, 6, 7].map(n => ({ value: n, label: String(n) }));\r\n\r\n /** Starts true so the settings shimmer instead of showing defaults that then jump. */\r\n loading = true;\r\n saving = false;\r\n loadError = '';\r\n /** /audit/config/get failed: saving now would overwrite the stored pass mark / access settings with defaults. */\r\n auditSettingsLoadFailed = false;\r\n\r\n private clientId = '';\r\n /** The getConfigDetails payload, sent back whole on save (as the Checklist Configure page does). */\r\n private configData: any = null;\r\n /** Publish / Save need the Checklist edit permission (the save APIs check it too). */\r\n access: AuditAccess = { canAdd: false, canEdit: false };\r\n private readonly destroy$ = new Subject<void>();\r\n\r\n constructor(\r\n private traxService: TraxService,\r\n private gs: GlobalStateService,\r\n private route: ActivatedRoute,\r\n private router: Router,\r\n private toast: ToastService,\r\n private cd: ChangeDetectorRef\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n auditAccess(this.gs).pipe(takeUntil(this.destroy$)).subscribe(access => {\r\n this.access = access;\r\n this.cd.detectChanges();\r\n });\r\n document.addEventListener('pointerdown', this.onOutside, true);\r\n document.addEventListener('focusin', this.onOutside, true);\r\n this.checklistId = this.route.snapshot.queryParamMap.get('checklistId') || '';\r\n this.fromSchedule = this.route.snapshot.queryParamMap.get('from') === 'schedule';\r\n this.gs.dataRangeValue.pipe(takeUntil(this.destroy$)).subscribe((data: any) => {\r\n if (!data?.client || data.client === this.clientId) { return; }\r\n this.clientId = data.client;\r\n this.load();\r\n });\r\n }\r\n\r\n /** Opened from Schedule Info (?from=schedule): Back returns to that tab, else to Audit Info (QA 6 Oct). */\r\n fromSchedule = false;\r\n\r\n get backLabel(): string {\r\n return this.fromSchedule ? 'Back to Schedule' : 'Back to Manage';\r\n }\r\n\r\n back(event?: Event): void {\r\n event?.preventDefault();\r\n this.router.navigate(['/manage/trax/audit-v2/manage'], this.fromSchedule ? { queryParams: { tab: 'schedule' } } : {});\r\n }\r\n\r\n ngOnDestroy(): void {\r\n document.removeEventListener('pointerdown', this.onOutside, true);\r\n document.removeEventListener('focusin', this.onOutside, true);\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n /** Escape closes the open dropdown / suggestion list / bulk upload popup. */\r\n @HostListener('document:keydown.escape')\r\n onEscape(): void {\r\n this.dailyBulkOpen = false;\r\n this.openSelect = null;\r\n this.openChips = null;\r\n }\r\n\r\n /**\r\n * A press or focus outside the open dropdown / suggestion list closes it. Listened to in the\r\n * capture phase, so no element that stops click propagation can keep it open.\r\n */\r\n private readonly onOutside = (event: Event): void => {\r\n if (!this.openSelect && !this.openChips) { return; }\r\n const target = event.target as HTMLElement | null;\r\n const inside = target && typeof target.closest === 'function' && target.closest('.cf-select.is-open, .cf-chipbox.is-open');\r\n if (inside) { return; }\r\n this.openSelect = null;\r\n this.openChips = null;\r\n this.cd.detectChanges();\r\n };\r\n\r\n // ---- load ------------------------------------------------------------------------------\r\n\r\n private load(): void {\r\n if (!this.checklistId) {\r\n this.loading = false;\r\n this.loadError = 'No audit selected. Open Configure from the Manage page.';\r\n return;\r\n }\r\n this.loading = true;\r\n this.loadError = '';\r\n this.auditSettingsLoadFailed = false;\r\n // A failed call resolves to { failed: error } so each part can say what went wrong.\r\n const safe = (o: any) => o.pipe(catchError((e: any) => of({ failed: e })));\r\n forkJoin({\r\n details: safe(this.traxService.auditGetConfig({ checkListId: this.checklistId, clientId: this.clientId })),\r\n audit: safe(this.traxService.auditConfigGet({ clientId: this.clientId, checklistId: this.checklistId })),\r\n users: safe(this.traxService.getClientUser(this.clientId)),\r\n labels: safe(this.traxService.auditSettingsGet(this.clientId))\r\n }).pipe(takeUntil(this.destroy$)).subscribe(({ details, audit, users, labels }: any) => {\r\n const clientUsers: any[] = users?.code === 200 ? users.data || [] : [];\r\n // The client's superadmin: the default approver for Tango users and role 'user' (v1 Configure).\r\n const superAdmin = clientUsers.find((u: any) => u?.role === 'superadmin' && u?.email);\r\n this.superAdmin = superAdmin ? this.chip(superAdmin.userName, superAdmin.email) : null;\r\n this.users = clientUsers\r\n .map((u: any) => this.chip(u.userName, u.email))\r\n .filter((u: ChipUser) => u.e);\r\n this.passLabel = labels?.data?.passLabel || 'Pass';\r\n this.failLabel = labels?.data?.failLabel || 'Fail';\r\n\r\n const d = details?.code === 200 ? details.data?.checkListDetails : null;\r\n if (!d) {\r\n this.loading = false;\r\n // The API answers 204 (no body) when the audit does not exist or belongs to another client.\r\n this.loadError = details?.failed\r\n ? this.apiError(details.failed, 'Could not load this audit. Reload the page to try again.', false)\r\n : 'This audit was not found. It may have been deleted. Open Configure again from the Manage page.';\r\n this.cd.detectChanges();\r\n return;\r\n }\r\n this.configData = details.data;\r\n this.applyChecklist(d);\r\n this.applyAssignment(d);\r\n this.auditSettingsLoadFailed = audit?.code !== 200;\r\n this.applyAudit(this.auditSettingsLoadFailed ? null : audit.data?.config);\r\n this.loading = false;\r\n if (this.auditSettingsLoadFailed) {\r\n this.toast.getErrorToast('Could not load the scoring, dispute and access settings of this audit. Reload the page before saving, so they are not reset.');\r\n } else if (users?.failed) {\r\n this.toast.getWarningToast('Could not load the users of this client, so the user pickers have no suggestions. You can still add a user by typing their full email.');\r\n }\r\n this.cd.detectChanges();\r\n });\r\n }\r\n\r\n /** getConfigDetails lists the assignment as { id, type } pairs (stores / clusters or users / teams). */\r\n private applyAssignment(d: any): void {\r\n const count = (list: any) => (Array.isArray(list) ? list.length : 0);\r\n this.assignedCount = count(d.singleAssign) + count(d.groupAssign);\r\n }\r\n\r\n private applyChecklist(d: any): void {\r\n // Never configured yet: no schedule window has been saved (checked before the defaults below fill it).\r\n const firstConfigure = !d.scheduleStartTime;\r\n // A new audit has no schedule window, and checklistConfigurev1 cannot store an empty one;\r\n // same defaults the Checklist Configure page applies on load.\r\n if (!d.scheduleStartTime) { d.scheduleStartTime = '10:00 AM'; }\r\n if (!d.scheduleEndTime) { d.scheduleEndTime = '10:00 PM'; }\r\n this.auditName = d.checkListName || '—';\r\n this.description = d.checkListDescription || '';\r\n this.published = !!d.publish;\r\n this.schedule = d.scheduleRepeatedType || d.schedule ? this.titleCase(d.scheduleRepeatedType || d.schedule) : '—';\r\n this.scheduleWindow = d.scheduleStartTime && d.scheduleEndTime ? d.scheduleStartTime + ' to ' + d.scheduleEndTime : '—';\r\n this.sections = (d.sections || []).map((sec: any, i: number) => ({\r\n label: sec.name || 'Section ' + (i + 1),\r\n items: (sec.questions || []).map((q: any) => q?.qname || String(q)),\r\n open: i === 0\r\n }));\r\n\r\n this.owners = this.chips(d.owner);\r\n // No owner yet (audits created before the creator was stored as one): the logged-in user, saved with the page.\r\n if (!this.owners.length) {\r\n const me = JSON.parse(localStorage.getItem('user-info') || '{}');\r\n if (me?.email) { this.owners = [this.chip(me.userName, me.email)]; }\r\n }\r\n this.approvers = this.chips(d.approver);\r\n // v1 Configure default approver, on the first Configure only (later an empty list means Approver was turned\r\n // off on purpose): Tango users and client users with role 'user' get the client's superadmin, others themselves.\r\n if (firstConfigure && !this.approvers.length) {\r\n const me = JSON.parse(localStorage.getItem('user-info') || '{}');\r\n const toSuperAdmin = me?.userType === 'tango' || (me?.userType === 'client' && me?.role === 'user');\r\n const fallback = toSuperAdmin ? this.superAdmin : (me?.email ? this.chip(me.userName, me.email) : null);\r\n if (fallback) { this.approvers = [fallback]; }\r\n }\r\n this.approverOn = this.approvers.length > 0;\r\n // Stored as minutes (numbers); keep the known intervals, unique, at most three.\r\n const stored: number[] = (Array.isArray(d.remainder) ? d.remainder : []).map((m: any) => Number(m));\r\n this.reminders = stored.filter((m, i) => REMINDER_MINUTES.includes(m) && stored.indexOf(m) === i).slice(0, MAX_REMINDERS);\r\n this.reminderOn = this.reminders.length > 0;\r\n this.refreshReminderOpts();\r\n\r\n const nf = d.notifyFlags || {};\r\n const nfTypes: string[] = Array.isArray(nf.notifyType) ? nf.notifyType : [];\r\n this.notifyFlagsOn = nfTypes.length > 0;\r\n this.notifySendApprover = nfTypes.includes('approver') || !this.notifyFlagsOn;\r\n this.notifySendCustom = nfTypes.includes('custom');\r\n this.notifyUsers = this.chips(nf.users);\r\n\r\n const rf = d.recurringFlag || {};\r\n const rfTypes: string[] = Array.isArray(rf.notifyType) ? rf.notifyType : [];\r\n this.recurringFlagsOn = rfTypes.length > 0;\r\n this.recurringSendApprover = rfTypes.includes('approver') || !this.recurringFlagsOn;\r\n this.recurringSendCustom = rfTypes.includes('custom');\r\n this.recurringSameAsNotify = rfTypes.includes('sameAsNotify');\r\n this.recurringUsers = this.chips(rf.users);\r\n this.recurringThreshold = Number(rf.threshold) || 3;\r\n\r\n const ae = d.autoEmail || {};\r\n const aeTypes: string[] = Array.isArray(ae.type) ? ae.type : [];\r\n this.dailyReportOn = aeTypes.length > 0;\r\n this.dailySendApprover = aeTypes.includes('approver') || !this.dailyReportOn;\r\n this.dailySendCustom = aeTypes.includes('custom');\r\n this.dailyUsers = this.chips(ae.users);\r\n this.sharePostApproval = !!d.shareReportPostApproval;\r\n\r\n this.exportSubmissionOn = !!d.export;\r\n this.redoValidFor = Number(d.redoValidity) || 7;\r\n this.autoCreateTaskOn = !!d.autoCreateTask;\r\n // Defaults like the Checklist Configure page; without an assignee the approval raises no task.\r\n this.taskAssignee = d.taskAssignee === 'store' || d.taskAssignee === 'storeuser' ? 'store' : 'submitter';\r\n this.taskValidity = Number(d.taskValidity) || 10;\r\n this.showResponseInApp = d.showApprovedResponse !== false;\r\n this.responseVisibility = d.responseVisibility === 'preApproval' ? 'pre' : 'post';\r\n this.respDelay = d.responseVisibilityHours ?? 2;\r\n this.requirePhoto = !!d.userVerification?.requirePhotoCapture;\r\n this.requireAcknowledgment = !!d.userVerification?.requireUserAcknowledgment;\r\n this.redoExtension = Number(d.redoExtension) || 1;\r\n }\r\n\r\n private applyAudit(cfg: any): void {\r\n const s = cfg?.settings || {};\r\n this.passThreshold = Number(cfg?.passMark) || 75;\r\n this.passFailOn = s.passFailOn !== false;\r\n this.disputeOn = s.disputeOn !== false;\r\n this.disputeWindow = Number(s.disputeWindow) || 48;\r\n this.preSubmissionAccessOn = !!s.preSubmissionAccessOn;\r\n this.preSubmissionUsers = this.chips(s.preSubmissionUsers);\r\n this.editSubmittedOn = !!s.editSubmittedOn;\r\n this.editUsers = this.chips(s.editUsers);\r\n }\r\n\r\n /** Accepts both the checklist shape { name, value } and the audit shape { n, e }. */\r\n private chips(list: any): ChipUser[] {\r\n return (Array.isArray(list) ? list : [])\r\n .map((u: any) => this.chip(u?.name ?? u?.n, u?.value ?? u?.e ?? u?.email))\r\n .filter((u: ChipUser) => u.e || u.n);\r\n }\r\n\r\n private chip(name: string, email: string): ChipUser {\r\n const n = String(name || email || '').trim();\r\n const parts = n.split(/\\s+/);\r\n const i = ((parts[0]?.[0] || '') + (parts[1]?.[0] || parts[0]?.[1] || '')).toUpperCase();\r\n return { i, n, e: String(email || '').trim().toLowerCase() };\r\n }\r\n\r\n private titleCase(v: string): string {\r\n return v ? v.charAt(0).toUpperCase() + v.slice(1) : v;\r\n }\r\n\r\n toggleSection(section: ConfigSection): void {\r\n section.open = !section.open;\r\n }\r\n\r\n // ---- reminder ---------------------------------------------------------------------------\r\n\r\n /** Turning Reminder on starts with one 30-minute reminder, as the Checklist Configure page does. */\r\n toggleReminder(): void {\r\n this.reminderOn = !this.reminderOn;\r\n if (this.reminderOn && !this.reminders.length) {\r\n this.reminders = [REMINDER_MINUTES[0]];\r\n }\r\n this.refreshReminderOpts();\r\n }\r\n\r\n setReminder(index: number, value: any): void {\r\n const minutes = Number(value);\r\n if (!REMINDER_MINUTES.includes(minutes)) { return; }\r\n this.reminders = this.reminders.map((m, i) => (i === index ? minutes : m));\r\n this.refreshReminderOpts();\r\n }\r\n\r\n /** Adds the first interval not used yet. */\r\n addReminder(): void {\r\n const next = REMINDER_MINUTES.find(m => !this.reminders.includes(m));\r\n if (next === undefined || this.reminders.length >= MAX_REMINDERS) { return; }\r\n this.reminders = [...this.reminders, next];\r\n this.refreshReminderOpts();\r\n }\r\n\r\n removeReminder(index: number): void {\r\n if (this.reminders.length <= 1) { return; }\r\n this.reminders = this.reminders.filter((_, i) => i !== index);\r\n this.refreshReminderOpts();\r\n }\r\n\r\n /** \"30, 45 and 60 mins\" for the summary line. */\r\n get reminderSummary(): string {\r\n const list = [...this.reminders].sort((a, b) => a - b).map(String);\r\n return list.length > 1 ? list.slice(0, -1).join(', ') + ' and ' + list[list.length - 1] : (list[0] || '');\r\n }\r\n\r\n /** Each row offers its own value plus every interval no other row uses (rebuilt only on change). */\r\n private refreshReminderOpts(): void {\r\n this.reminderOpts = this.reminders.map((own, index) => REMINDER_MINUTES\r\n .filter(m => m === own || !this.reminders.some((other, i) => i !== index && other === m))\r\n .map(m => ({ value: m, label: m + ' mins' })));\r\n }\r\n\r\n // ---- approver ---------------------------------------------------------------------------------\r\n\r\n /** Approver is on and has at least one user: the only state in which anything can go \"to the approver\". */\r\n get hasApprovers(): boolean {\r\n return this.approverOn && this.approvers.length > 0;\r\n }\r\n\r\n /** Why \"approver\" cannot be used right now ('' when it can). */\r\n private get approverMissingText(): string {\r\n if (!this.approverOn) { return 'Approver is turned off. Turn on Approver and add at least one approver first.'; }\r\n if (!this.approvers.length) { return 'No approver has been added yet. Add at least one approver under Approver first.'; }\r\n return '';\r\n }\r\n\r\n /** Shown under the approver picker while it is on but empty (Save as Draft still works; Publish does not). */\r\n get approverError(): string {\r\n return this.approverOn && !this.approvers.length ? 'Add at least one approver, or turn Approver off to publish without approval.' : '';\r\n }\r\n\r\n /** The parts of the page that send to / rely on the approvers and are switched on now. */\r\n private get approverDependents(): string[] {\r\n const list: string[] = [];\r\n if (this.notifyFlagsOn && this.notifySendApprover) { list.push('Notify Flags'); }\r\n if (this.recurringFlagsOn && this.recurringSendApprover) { list.push('Notify on Recurring Flags'); }\r\n if (this.dailyReportOn && this.dailySendApprover) { list.push('Daily Report'); }\r\n if (this.editSubmittedOn) { list.push('Edit Submitted Audit'); }\r\n return list;\r\n }\r\n\r\n /** Turning Approver off warns about every setting that still sends to / relies on the approvers. */\r\n toggleApprover(): void {\r\n this.approverOn = !this.approverOn;\r\n const dependents = this.approverDependents;\r\n if (!this.approverOn && dependents.length) {\r\n this.toast.getWarningToast('Approver is turned off, but ' + dependents.join(', ') + ' still use the approvers. Turn Approver back on or change those settings before saving.');\r\n }\r\n }\r\n\r\n /** Send To > Approver can only be ticked when there is an approver to send to. */\r\n toggleSendApprover(key: SendApproverKey): void {\r\n if (!this[key] && !this.hasApprovers) {\r\n this.toast.getErrorToast(this.approverMissingText);\r\n return;\r\n }\r\n this[key] = !this[key];\r\n }\r\n\r\n /** Switching a flag / report email on ticks Approver only when there is an approver to send to. */\r\n toggleNotifyFlags(): void {\r\n this.notifyFlagsOn = !this.notifyFlagsOn;\r\n if (this.notifyFlagsOn && !this.hasApprovers) { this.notifySendApprover = false; }\r\n }\r\n\r\n toggleRecurringFlags(): void {\r\n this.recurringFlagsOn = !this.recurringFlagsOn;\r\n if (this.recurringFlagsOn && !this.hasApprovers) { this.recurringSendApprover = false; }\r\n }\r\n\r\n toggleDailyReport(): void {\r\n this.dailyReportOn = !this.dailyReportOn;\r\n if (this.dailyReportOn && !this.hasApprovers) { this.dailySendApprover = false; }\r\n }\r\n\r\n /** Edit Submitted Audit lets approvers change submissions before approving, so it needs approvers. */\r\n toggleEditSubmitted(): void {\r\n if (!this.editSubmittedOn && !this.hasApprovers) {\r\n this.toast.getErrorToast('Edit Submitted Audit is for approvers. ' + this.approverMissingText);\r\n return;\r\n }\r\n this.editSubmittedOn = !this.editSubmittedOn;\r\n }\r\n\r\n get editSubmittedError(): string {\r\n if (!this.editSubmittedOn) { return ''; }\r\n if (!this.hasApprovers) { return 'Edit Submitted Audit is for approvers. ' + this.approverMissingText + ' Or turn Edit Submitted Audit off.'; }\r\n if (!this.editUsers.length) { return 'Add at least one user who can edit submitted audits'; }\r\n return '';\r\n }\r\n\r\n // ---- notify / recurring flag recipients ---------------------------------------------------\r\n\r\n /**\r\n * Ticking Custom under Recurring Flags starts its user list from the Notify Flags custom users,\r\n * so the same people are used by default; the list stays editable.\r\n */\r\n toggleRecurringCustom(): void {\r\n this.recurringSendCustom = !this.recurringSendCustom;\r\n if (this.recurringSendCustom && !this.recurringUsers.length && this.notifyFlagsOn && this.notifySendCustom) {\r\n this.recurringUsers = [...this.notifyUsers];\r\n }\r\n }\r\n\r\n /** Who \"Use same users from Notify Flags\" resolves to (shown read-only under the option). */\r\n get notifyRecipientsLabel(): string {\r\n if (!this.notifyFlagsOn) { return 'Notify Flags is off, so no one is added from it'; }\r\n const parts: string[] = [];\r\n if (this.notifySendApprover) { parts.push(this.approvers.length ? 'the approvers' : 'the approvers (none set)'); }\r\n if (this.notifySendCustom && this.notifyUsers.length) { parts.push(this.notifyUsers.map(u => u.n).join(', ')); }\r\n return parts.length ? 'Also sends to ' + parts.join(' and ') : 'Notify Flags has no recipients yet';\r\n }\r\n\r\n get notifyFlagsError(): string {\r\n if (!this.notifyFlagsOn) { return ''; }\r\n if (!this.notifySendApprover && !this.notifySendCustom) { return 'Choose who receives the flag emails'; }\r\n if (this.notifySendApprover && !this.hasApprovers) { return 'Notify Flags sends to the approver. ' + this.approverMissingText + ' Or untick Approver here.'; }\r\n if (this.notifySendCustom && !this.notifyUsers.length) { return 'Add at least one custom user for Notify Flags'; }\r\n return '';\r\n }\r\n\r\n get recurringFlagsError(): string {\r\n if (!this.recurringFlagsOn) { return ''; }\r\n if (!this.recurringSendApprover && !this.recurringSendCustom && !this.recurringSameAsNotify) { return 'Choose who receives the recurring flag emails'; }\r\n if (this.recurringSendApprover && !this.hasApprovers) { return 'Recurring Flags sends to the approver. ' + this.approverMissingText + ' Or untick Approver here.'; }\r\n if (this.recurringSendCustom && !this.recurringUsers.length) { return 'Add at least one custom user for Recurring Flags'; }\r\n // As the Checklist Configure page: \"same users\" needs Notify Flags on, else it would mail no one.\r\n if (this.recurringSameAsNotify && !this.notifyFlagsOn) { return '\"Use same users from Notify Flags\" needs Notify Flags on. Turn Notify Flags on, or untick this option.'; }\r\n return '';\r\n }\r\n\r\n get dailyReportError(): string {\r\n if (!this.dailyReportOn) { return ''; }\r\n if (!this.dailySendApprover && !this.dailySendCustom) { return 'Choose who receives the daily report'; }\r\n if (this.dailySendApprover && !this.hasApprovers) { return 'The daily report is sent to the approver. ' + this.approverMissingText + ' Or untick Approver here.'; }\r\n if (this.dailySendCustom && !this.dailyUsers.length) { return 'Add at least one custom user for the daily report'; }\r\n return '';\r\n }\r\n\r\n // ---- dropdowns --------------------------------------------------------------------------\r\n\r\n toggleSelect(key: SelectKey, event: Event): void {\r\n event.stopPropagation();\r\n this.openSelect = this.openSelect === key ? null : key;\r\n this.openChips = null;\r\n }\r\n\r\n pick(key: SelectKey, option: SelectOption, event: Event): void {\r\n event.stopPropagation();\r\n this[key] = option.value;\r\n this.openSelect = null;\r\n }\r\n\r\n selectLabel(key: SelectKey, options: SelectOption[]): string {\r\n const value = this[key];\r\n return options.find(o => o.value === value)?.label ?? String(value);\r\n }\r\n\r\n isPicked(key: SelectKey, option: SelectOption): boolean {\r\n return this[key] === option.value;\r\n }\r\n\r\n // Typed accessors for the shared templates (their context variables are untyped, and the\r\n // root app's strict template check rejects `this[list]` / `drafts[list]`).\r\n chipsOf(list: ChipList): ChipUser[] {\r\n return this[list];\r\n }\r\n\r\n draftOf(list: ChipList): string {\r\n return this.drafts[list];\r\n }\r\n\r\n setDraft(list: ChipList, value: string): void {\r\n this.drafts[list] = value ?? '';\r\n }\r\n\r\n // ---- chip pickers -------------------------------------------------------------------------\r\n\r\n /** Client users matching the typed text, minus the ones already in the list. */\r\n suggestions(list: ChipList): ChipUser[] {\r\n const q = this.drafts[list].trim().toLowerCase();\r\n const chosen = new Set(this[list].map(u => u.e));\r\n return this.users\r\n .filter(u => !chosen.has(u.e) && (!q || u.n.toLowerCase().includes(q) || u.e.includes(q)))\r\n .slice(0, 8);\r\n }\r\n\r\n focusChips(list: ChipList, event: Event): void {\r\n event.stopPropagation();\r\n this.openChips = list;\r\n this.openSelect = null;\r\n }\r\n\r\n /** Approvers can only be added while Approver is on (the picker is hidden otherwise; this guards it). */\r\n private approverListLocked(list: ChipList): boolean {\r\n if (list !== 'approvers' || this.approverOn) { return false; }\r\n this.toast.getErrorToast('Approver is turned off. Turn on Approver to add approvers.');\r\n return true;\r\n }\r\n\r\n addSuggestion(list: ChipList, user: ChipUser, event: Event): void {\r\n event.stopPropagation();\r\n if (this.approverListLocked(list)) { return; }\r\n if (!this[list].some(u => u.e === user.e)) {\r\n this[list] = [...this[list], user];\r\n }\r\n this.drafts[list] = '';\r\n this.openChips = null;\r\n }\r\n\r\n /** Enter takes the first suggestion; an exact email works even for a user not in the list. */\r\n addChip(list: ChipList): void {\r\n const q = this.drafts[list].trim().toLowerCase();\r\n if (!q || this.approverListLocked(list)) { return; }\r\n const typed = this.esc(this.drafts[list].trim());\r\n const isEmail = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(q);\r\n const match = this.suggestions(list)[0] || (isEmail ? this.chip(q, q) : null);\r\n if (!match) {\r\n this.toast.getErrorToast(q.includes('@')\r\n ? '\"' + typed + '\" is not a valid email address.'\r\n : 'No user matches \"' + typed + '\". Pick a user from the list or type their full email.');\r\n return;\r\n }\r\n if (this[list].some(u => u.e === match.e)) {\r\n this.toast.getErrorToast(this.esc(match.n || match.e) + ' is already added.');\r\n return;\r\n }\r\n this[list] = [...this[list], match];\r\n this.drafts[list] = '';\r\n this.openChips = null;\r\n }\r\n\r\n removeChip(list: ChipList, index: number): void {\r\n this[list] = this[list].filter((_, i) => i !== index);\r\n }\r\n\r\n // ---- Daily Report custom users: bulk upload ----------------------------------------------\r\n\r\n openDailyBulk(): void {\r\n this.dailyBulkErrors = [];\r\n this.dailyBulkOpen = true;\r\n this.openChips = null;\r\n this.openSelect = null;\r\n }\r\n\r\n closeDailyBulk(): void {\r\n this.dailyBulkOpen = false;\r\n this.dailyBulkErrors = [];\r\n }\r\n\r\n /** Username + Email template, pre-filled with the current Daily Report custom users (as the Checklist one). */\r\n downloadDailyTemplate(): void {\r\n const rows = this.dailyUsers.length ? this.dailyUsers.map(u => [u.n, u.e]) : [['', '']];\r\n const sheet = XLSX.utils.aoa_to_sheet([['Username', 'Email'], ...rows]);\r\n sheet['!cols'] = [{ wch: 28 }, { wch: 36 }];\r\n const book = XLSX.utils.book_new();\r\n XLSX.utils.book_append_sheet(book, sheet, 'Users');\r\n XLSX.writeFile(book, 'dailyReportTemplate.xlsx');\r\n }\r\n\r\n /**\r\n * Replaces the Daily Report custom users with the uploaded sheet, as the Checklist Configure page does:\r\n * only the Email column counts (the name comes from the client's user list), and every row must be an\r\n * existing user. Any invalid row rejects the whole file.\r\n */\r\n onDailyBulkFile(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n const file = input.files?.[0];\r\n input.value = '';\r\n if (!file) { return; }\r\n this.dailyBulkErrors = [];\r\n if (!/\\.xlsx$/i.test(file.name)) {\r\n this.dailyBulkErrors = ['Please upload a valid .xlsx file.'];\r\n this.cd.detectChanges();\r\n return;\r\n }\r\n if (!this.users.length) {\r\n this.dailyBulkErrors = ['The users of this client could not be loaded. Reload the page and try again.'];\r\n this.cd.detectChanges();\r\n return;\r\n }\r\n file.arrayBuffer().then(buffer => {\r\n this.dailyBulkErrors = this.applyDailyBulk(buffer);\r\n if (!this.dailyBulkErrors.length) {\r\n this.dailyBulkOpen = false;\r\n this.toast.getSuccessToast('File uploaded successfully. ' + this.dailyUsers.length\r\n + (this.dailyUsers.length === 1 ? ' user' : ' users') + ' added to the daily report.');\r\n }\r\n this.cd.detectChanges();\r\n }).catch(() => {\r\n this.dailyBulkErrors = ['Could not read this file. Upload the downloaded template as .xlsx.'];\r\n this.cd.detectChanges();\r\n });\r\n }\r\n\r\n /** Applies the sheet to dailyUsers and returns [] on success, else the reasons it was rejected. */\r\n private applyDailyBulk(buffer: ArrayBuffer): string[] {\r\n let rows: any[][];\r\n try {\r\n const book = XLSX.read(buffer, { type: 'array' });\r\n rows = XLSX.utils.sheet_to_json(book.Sheets[book.SheetNames[0]], { header: 1, defval: '', blankrows: true });\r\n } catch {\r\n return ['Could not read this file. Upload the downloaded template as .xlsx.'];\r\n }\r\n const emailCol = (rows[0] || []).findIndex(h => String(h ?? '').trim().toLowerCase() === 'email');\r\n if (emailCol < 0) { return [\"The template must contain an 'Email' column.\"]; }\r\n\r\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n const byEmail = new Map(this.users.map(u => [u.e, u]));\r\n const matched: ChipUser[] = [];\r\n const errors: string[] = [];\r\n let dataRows = 0;\r\n rows.slice(1).forEach((row, i) => {\r\n // Skip fully blank rows (any column, not just Email).\r\n if (!row.some(v => String(v ?? '').trim() !== '')) { return; }\r\n dataRows++;\r\n const rowNo = i + 2; // +1 header, +1 to 1-based\r\n const email = String(row[emailCol] ?? '').trim().toLowerCase();\r\n if (!email) { errors.push('Row ' + rowNo + ': Email is required'); return; }\r\n if (!emailRegex.test(email)) { errors.push('Row ' + rowNo + ': \"' + email + '\" is not a valid email'); return; }\r\n const user = byEmail.get(email);\r\n if (!user) { errors.push('Row ' + rowNo + ': \"' + email + '\" is not an existing user'); return; }\r\n if (!matched.some(u => u.e === user.e)) { matched.push(user); }\r\n });\r\n if (!dataRows) { return ['The uploaded file has no data rows.']; }\r\n if (errors.length) { return errors; }\r\n\r\n this.dailyUsers = matched;\r\n this.dailySendCustom = true;\r\n return [];\r\n }\r\n\r\n /** What the checklist keeps as assignedUsers, exactly as the Checklist Configure page sends it. */\r\n private assignedUsers(): { id: string; type: string }[] {\r\n const d = this.configData?.checkListDetails || {};\r\n return [...(d.singleAssign || []), ...(d.groupAssign || [])];\r\n }\r\n\r\n get preSubmissionEmpty(): boolean {\r\n return this.preSubmissionAccessOn && this.preSubmissionUsers.length === 0;\r\n }\r\n\r\n get disputeAvailable(): boolean {\r\n return this.responseVisibility === 'pre' && this.disputeOn;\r\n }\r\n\r\n /** Why Publish / Save are disabled (button title), '' when they are not. */\r\n get saveBlockedReason(): string {\r\n if (!this.access.canEdit) { return 'You do not have permission to change audits'; }\r\n if (this.auditSettingsLoadFailed) { return 'The scoring and access settings could not be loaded. Reload the page before saving.'; }\r\n if (this.passFailOn && (this.passThreshold < 1 || this.passThreshold > 100)) { return 'Pass mark must be between 1 and 100'; }\r\n if (this.preSubmissionEmpty) { return 'Add at least one user for pre-submission access'; }\r\n return this.editSubmittedError || this.notifyFlagsError || this.recurringFlagsError || this.dailyReportError;\r\n }\r\n\r\n /** Why Publish would be refused ('' when it would not); checked on click so the toast can say so. */\r\n get publishBlockedReason(): string {\r\n // Approvers are needed only while Approver is on; with it off the audit publishes without approval.\r\n if (this.approverOn && !this.approvers.length) { return 'Approver is turned on. Add at least one approver, or turn Approver off.'; }\r\n if (!this.sections.some(s => s.items.length)) { return 'This audit has no questions. Add at least one question before publishing.'; }\r\n return '';\r\n }\r\n\r\n get canSave(): boolean {\r\n if (this.saving || this.loading || !this.checklistId || !this.configData) { return false; }\r\n return !this.saveBlockedReason;\r\n }\r\n\r\n // ---- save / publish -----------------------------------------------------------------------\r\n\r\n saveDraft(): void {\r\n this.save(false);\r\n }\r\n\r\n publish(): void {\r\n if (!this.canSave) { return; }\r\n const blocked = this.publishBlockedReason;\r\n if (blocked) {\r\n this.toast.getErrorToast(blocked);\r\n return;\r\n }\r\n if (!this.assignedCount) {\r\n // Stores and auditors come from schedule rows; publishing the schedule publishes the audit.\r\n this.scheduleAfterSave = true;\r\n this.save(false);\r\n return;\r\n }\r\n this.save(true);\r\n }\r\n\r\n private save(publish: boolean): void {\r\n if (!this.canSave) { this.scheduleAfterSave = false; return; }\r\n this.wasPublished = this.published;\r\n this.saving = true;\r\n this.saveChecklist(publish);\r\n }\r\n\r\n /** \"publish Store Audit\" / \"save Store Audit\", for the error toasts. */\r\n private actionText(publish: boolean): string {\r\n return (publish ? 'publish ' : 'save ') + this.esc(this.auditName);\r\n }\r\n\r\n /** A save step failed: stop, and do not open Create schedule on the next plain save. */\r\n private failSave(message: string): void {\r\n this.saving = false;\r\n this.scheduleAfterSave = false;\r\n this.toast.getErrorToast(message);\r\n this.cd.detectChanges();\r\n }\r\n\r\n /**\r\n * The checklist part (checklistConfigurev1: notifications, approvers, publish) and the audit-only settings\r\n * (config/save: scoring, dispute, access) do not depend on each other, so both are sent at once instead of one\r\n * after the other (QA: save / publish took long). Outcomes are reported as before: the checklist part first.\r\n */\r\n private saveChecklist(publish: boolean): void {\r\n const fallback = 'Could not ' + this.actionText(publish) + '. Please try again.';\r\n const settle = (call: Observable<any>) => call.pipe(map((res: any) => ({ res, err: null })), catchError((err: any) => of({ res: null, err })));\r\n forkJoin([\r\n settle(this.traxService.auditConfigUpdate(this.checklistPayload(publish))),\r\n settle(this.traxService.auditConfigSave(this.extrasPayload()))\r\n ]).pipe(takeUntil(this.destroy$)).subscribe(([main, extras]) => {\r\n if (main.err) {\r\n this.failSave(this.apiError(main.err, fallback, true, 'Could not ' + this.actionText(publish) + ': '));\r\n return;\r\n }\r\n if (main.res?.code !== 200) {\r\n // 204 (no body) = the audit no longer exists for this client.\r\n this.failSave(main.res ? fallback : 'Could not ' + this.actionText(publish) + ': the audit was not found. It may have been deleted.');\r\n return;\r\n }\r\n if (publish) { this.published = true; }\r\n if (extras.err || extras.res?.code !== 200) {\r\n const reason = extras.err ? this.apiError(extras.err, '', true) : '';\r\n this.failSave((publish ? this.esc(this.auditName) + ' was published' : 'The notification and approver settings were saved')\r\n + ', but the scoring, dispute and access settings were not' + (reason ? ' (' + reason + ')' : '') + '. Save again to keep them.');\r\n return;\r\n }\r\n this.finishSave(publish);\r\n });\r\n }\r\n\r\n /** The audit-only settings saved by config/save. */\r\n private extrasPayload(): Record<string, any> {\r\n const toStored = (list: ChipUser[]) => list.map(u => ({ n: u.n, e: u.e }));\r\n return {\r\n clientId: this.clientId,\r\n checklistId: this.checklistId,\r\n passMark: this.passFailOn ? Number(this.passThreshold) : 75,\r\n settings: {\r\n passFailOn: this.passFailOn,\r\n disputeOn: this.disputeOn,\r\n disputeWindow: this.disputeWindow,\r\n preSubmissionAccessOn: this.preSubmissionAccessOn,\r\n preSubmissionUsers: toStored(this.preSubmissionUsers),\r\n editSubmittedOn: this.editSubmittedOn,\r\n editUsers: toStored(this.editUsers)\r\n }\r\n };\r\n }\r\n\r\n private finishSave(publish: boolean): void {\r\n this.saving = false;\r\n const name = this.esc(this.auditName);\r\n if (this.scheduleAfterSave) {\r\n this.scheduleAfterSave = false;\r\n this.toast.getSuccessToast(name + (this.published ? ' saved.' : ' saved as draft.') + ' It has no stores yet: add schedule rows, then publish the schedule to publish the audit.');\r\n this.router.navigate(['/manage/trax/audit-v2/manage'], { queryParams: { tab: 'schedule', schedule: 'create', audit: this.checklistId } });\r\n this.cd.detectChanges();\r\n return;\r\n }\r\n if (publish) {\r\n this.toast.getSuccessToast(this.wasPublished ? 'Changes to ' + name + ' saved and published.' : name + ' has been published.');\r\n this.router.navigate(['/manage/trax/audit-v2/manage']);\r\n } else {\r\n // A draft save never unpublishes (the API keeps the publish state), so do not call a live audit a draft.\r\n this.toast.getSuccessToast(this.published ? 'Changes to ' + name + ' saved. The audit stays published.' : name + ' saved as draft.');\r\n // Reload so the page shows exactly what the server kept.\r\n this.load();\r\n }\r\n this.cd.detectChanges();\r\n }\r\n\r\n /**\r\n * The message to show for a failed call: the API's own text for a 4xx (production sends it as\r\n * `error` (text or { message }), the local dev helper as `error` text plus `details`), else `fallback`.\r\n * 5xx bodies carry raw exceptions, so they get the fallback. `prefix` is put before an API text.\r\n */\r\n private apiError(e: any, fallback: string, escape = true, prefix = ''): string {\r\n const status = Number(e?.status) || 0;\r\n if (status === 403) { return 'You do not have permission to view or change this audit.'; }\r\n if (status === 0) { return fallback ? 'Could not reach the server. Check your connection and try again.' : ''; }\r\n if (status >= 500) { return fallback; }\r\n const body = e?.error;\r\n const err = body?.error;\r\n const raw = (typeof err === 'string' ? err : err?.message) || body?.details?.message || body?.message || '';\r\n const text = String(raw).trim();\r\n if (!text) { return fallback; }\r\n return prefix + (escape ? this.esc(text) : text);\r\n }\r\n\r\n /** Toasts render their message as HTML, so names, typed text and API messages are escaped. */\r\n private esc(value: unknown): string {\r\n const map: Record<string, string> = { '&': '&', '<': '<', '>': '>', '\"': '"', '\\'': ''' };\r\n return String(value ?? '').replace(/[&<>\"']/g, c => map[c]);\r\n }\r\n\r\n /** The getConfigDetails payload with this page's fields written back, in the checklist's own shape. */\r\n private checklistPayload(publish: boolean): any {\r\n const toStored = (list: ChipUser[]) => list.map(u => ({ name: u.n, value: u.e }));\r\n const data = this.configData;\r\n const d = data.checkListDetails;\r\n\r\n d.checkListDescription = this.description.trim();\r\n d.owner = toStored(this.owners);\r\n d.approver = this.approverOn ? toStored(this.approvers) : [];\r\n // Minutes before the audit end time, as the Checklist Configure page stores them.\r\n d.remainder = this.reminderOn ? [...this.reminders] : [];\r\n\r\n const nfTypes: string[] = [];\r\n if (this.notifyFlagsOn && this.notifySendApprover) { nfTypes.push('approver'); }\r\n if (this.notifyFlagsOn && this.notifySendCustom) { nfTypes.push('custom'); }\r\n d.notifyFlags = { notifyType: nfTypes, users: this.notifyFlagsOn && this.notifySendCustom ? toStored(this.notifyUsers) : [] };\r\n\r\n const rfTypes: string[] = [];\r\n if (this.recurringFlagsOn && this.recurringSendApprover) { rfTypes.push('approver'); }\r\n if (this.recurringFlagsOn && this.recurringSendCustom) { rfTypes.push('custom'); }\r\n // The server resolves 'sameAsNotify' to the Notify Flags recipients when it sends the email.\r\n if (this.recurringFlagsOn && this.recurringSameAsNotify) { rfTypes.push('sameAsNotify'); }\r\n const rfUsers = this.recurringFlagsOn && this.recurringSendCustom ? toStored(this.recurringUsers) : [];\r\n d.recurringFlag = { notifyType: rfTypes, users: rfUsers, threshold: this.recurringFlagsOn ? this.recurringThreshold : 0 };\r\n\r\n const aeTypes: string[] = [];\r\n if (this.dailyReportOn && this.dailySendApprover) { aeTypes.push('approver'); }\r\n if (this.dailyReportOn && this.dailySendCustom) { aeTypes.push('custom'); }\r\n d.autoEmail = { type: aeTypes, users: this.dailySendCustom ? toStored(this.dailyUsers) : [] };\r\n d.shareReportPostApproval = this.dailyReportOn && this.sharePostApproval;\r\n\r\n d.export = this.exportSubmissionOn;\r\n d.redoValidity = this.redoValidFor;\r\n d.autoCreateTask = this.autoCreateTaskOn;\r\n d.taskAssignee = this.taskAssignee;\r\n d.taskValidity = Number(this.taskValidity) || 10;\r\n d.showApprovedResponse = this.showResponseInApp;\r\n d.responseVisibility = this.responseVisibility === 'pre' ? 'preApproval' : 'postApproval';\r\n d.responseVisibilityHours = this.respDelay;\r\n d.userVerification = { requirePhotoCapture: this.requirePhoto, requireUserAcknowledgment: this.requireAcknowledgment };\r\n d.redoExtension = this.redoExtension;\r\n\r\n // What the Checklist Configure page sends: everyone currently assigned, and the publish state.\r\n d.assignedUsers = this.assignedUsers();\r\n d.storeCount = d.assignedUsers.length;\r\n if (!d.coverage) { d.coverage = 'store'; }\r\n d.publish = publish ? true : !!d.publish;\r\n\r\n data.clientId = this.clientId;\r\n data.submitType = publish ? 'publish' : 'save';\r\n data.showEdit = false;\r\n data.updateConfigure = false;\r\n data.timeZone = dayjs.tz.guess();\r\n // Assignment diff for the activity log; this page never changes assignments.\r\n data.added = [];\r\n data.removed = { user: [], store: [] };\r\n return data;\r\n }\r\n}\r\n","<div class=\"av2-page audit-configure\">\r\n\r\n <!-- Back + breadcrumb (as the schedule editor's back bar) -->\r\n <div class=\"cf-backbar\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm cf-back\" (click)=\"back()\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 6 9 12 15 18\"></polyline></svg>\r\n {{ backLabel }}\r\n </button>\r\n <div class=\"cf-crumb\">\r\n <a href=\"#\" (click)=\"back($event)\">Manage Audit</a> › Configure\r\n </div>\r\n </div>\r\n\r\n <!-- Title + actions -->\r\n <div class=\"cf-header\">\r\n <div class=\"cf-header-text\">\r\n <span class=\"av2-sk av2-sk--title cf-sk-title\" *ngIf=\"loading\"></span>\r\n <div class=\"cf-title\" *ngIf=\"!loading\">{{ auditName || 'Audit' }}</div>\r\n <input type=\"text\" class=\"cf-desc\" placeholder=\"Enter Audit Description\" [(ngModel)]=\"description\">\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary cf-publish\" [disabled]=\"!canSave\" [title]=\"saveBlockedReason || publishBlockedReason\" (click)=\"publish()\">\r\n {{ saving ? 'Saving…' : (published ? 'Save & Publish' : 'Publish') }}\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost cf-draft\" [disabled]=\"!canSave\" [title]=\"saveBlockedReason\" (click)=\"saveDraft()\">Save as Draft</button>\r\n </div>\r\n\r\n <div class=\"cf-error cf-error--page\" *ngIf=\"loadError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ loadError }}\r\n </div>\r\n\r\n <!-- Chip picker: chips + input + suggestion list (one template, used for every user list) -->\r\n <ng-template #chipPicker let-list=\"list\" let-large=\"large\">\r\n <div class=\"cf-chipbox\" [class.cf-chipbox--lg]=\"large\" [class.is-open]=\"openChips === list\" (click)=\"focusChips(list, $event)\">\r\n <span class=\"cf-chip\" [class.cf-chip--lg]=\"large\" *ngFor=\"let u of chipsOf(list); let i = index\" [title]=\"u.e\">\r\n <span [class]=\"large ? 'cf-chip-tag' : 'cf-chip-ini'\">{{ u.i }}</span>{{ u.n }}\r\n <a class=\"cf-chip-x\" (click)=\"removeChip(list, i); $event.stopPropagation()\">\r\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </a>\r\n </span>\r\n <input type=\"text\" class=\"cf-chip-input\" [class.cf-chip-input--lg]=\"large\" placeholder=\"Add user...\"\r\n [ngModel]=\"draftOf(list)\" (ngModelChange)=\"setDraft(list, $event)\" (focus)=\"focusChips(list, $event)\" (keyup.enter)=\"addChip(list)\">\r\n <div class=\"cf-suggest\" *ngIf=\"openChips === list\">\r\n <div class=\"cf-suggest-item\" *ngFor=\"let u of suggestions(list)\" (click)=\"addSuggestion(list, u, $event)\">\r\n <span class=\"cf-chip-ini\">{{ u.i }}</span>\r\n <span class=\"cf-suggest-name\">{{ u.n }}</span>\r\n <span class=\"cf-suggest-mail\">{{ u.e }}</span>\r\n </div>\r\n <div class=\"cf-suggest-empty\" *ngIf=\"!suggestions(list).length\">\r\n {{ users.length ? 'No matching user' : 'No users for this client' }}\r\n </div>\r\n </div>\r\n </div>\r\n </ng-template>\r\n\r\n <!-- Dropdown: styled like the prototype instead of the browser's native select -->\r\n <ng-template #dropdown let-key=\"key\" let-options=\"options\">\r\n <span class=\"cf-select\" [class.is-open]=\"openSelect === key\">\r\n <button type=\"button\" class=\"cf-select-btn\" (click)=\"toggleSelect(key, $event)\">\r\n {{ selectLabel(key, options) }}\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </button>\r\n <div class=\"cf-select-menu\" *ngIf=\"openSelect === key\">\r\n <div class=\"cf-select-item\" *ngFor=\"let o of options\" [class.is-on]=\"isPicked(key, o)\"\r\n (click)=\"pick(key, o, $event)\">{{ o.label }}</div>\r\n </div>\r\n </span>\r\n </ng-template>\r\n\r\n <div class=\"cf-body\" *ngIf=\"!loadError\">\r\n <!-- Section tree -->\r\n <aside class=\"cf-left\">\r\n <lib-audit-v2-shimmer *ngIf=\"loading\" [rows]=\"3\"></lib-audit-v2-shimmer>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n <div class=\"cf-left-title\">{{ auditName || 'Audit' }}</div>\r\n\r\n <div class=\"cf-hint\" *ngIf=\"!sections.length\">No questions yet</div>\r\n <ng-container *ngFor=\"let s of sections\">\r\n <div class=\"cf-section\" [class.is-open]=\"s.open\" (click)=\"toggleSection(s)\">\r\n {{ s.label }}\r\n <span class=\"cf-rule\"></span>\r\n <span class=\"cf-chev\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" [class.rotate]=\"!s.open\">\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </span>\r\n </div>\r\n <div class=\"cf-items\" *ngIf=\"s.open && s.items.length\">\r\n <div *ngFor=\"let it of s.items\">{{ it }}</div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- No Schedule block (QA 10 Oct): audits have no one-time / repeat schedule here; visits come from Schedules. -->\r\n </ng-container>\r\n </aside>\r\n\r\n <!-- Configuration -->\r\n <div class=\"cf-right\">\r\n\r\n <section class=\"cf-card\" *ngIf=\"loading\">\r\n <lib-audit-v2-shimmer [rows]=\"4\"></lib-audit-v2-shimmer>\r\n </section>\r\n\r\n <ng-container *ngIf=\"!loading\">\r\n\r\n <!-- ===== Advance Configuration ===== -->\r\n <section class=\"cf-card\">\r\n <div class=\"cf-block-head\">\r\n <span class=\"cf-block-title\">Advance Configuration</span>\r\n <span class=\"cf-rule\"></span>\r\n <span class=\"cf-chev\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </span>\r\n </div>\r\n\r\n <!-- Audit Owner -->\r\n <div>\r\n <div class=\"cf-label\">Audit Owner</div>\r\n <div class=\"cf-hint\">Owners get access to manage the audit</div>\r\n </div>\r\n <div class=\"cf-row\">\r\n <span class=\"cf-field\">Can be managed by</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'owners', large: false }\"></ng-container>\r\n </div>\r\n\r\n <!-- Approver -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Approver</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"approverOn\" (click)=\"toggleApprover()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, the users will be able to approve the audit</div>\r\n <div class=\"cf-row\" *ngIf=\"approverOn\">\r\n <span class=\"cf-field\">To be approved by</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'approvers', large: false }\"></ng-container>\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"approverError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ approverError }}\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\" *ngIf=\"!approverOn && approvers.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Approver is off, so the {{ approvers.length }} approver{{ approvers.length === 1 ? '' : 's' }} added will be removed when you save. Turn Approver back on to keep {{ approvers.length === 1 ? 'it' : 'them' }}.\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\" *ngIf=\"!approverOn && !approvers.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Approver is off, so submitted audits are not sent for approval. Turn it on to add approvers or to send flags and reports to them.\r\n </div>\r\n\r\n <!-- Reminder -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Reminder</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"reminderOn\" (click)=\"toggleReminder()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, the users will be reminded in the selected interval</div>\r\n <div class=\"cf-inner\" *ngIf=\"reminderOn\">\r\n <div class=\"cf-inline\">\r\n Notify user before\r\n <span class=\"cf-reminder\" *ngFor=\"let m of reminders; let i = index\">\r\n <lib-audit-v2-select class=\"cf-reminder-select\" [value]=\"m\" [options]=\"reminderOpts[i] || []\" [searchable]=\"false\"\r\n [ariaLabel]=\"'Reminder ' + (i + 1) + ' in minutes'\" (changed)=\"setReminder(i, $event.target.value)\"></lib-audit-v2-select>\r\n <a class=\"cf-chip-x\" *ngIf=\"reminders.length > 1\" title=\"Remove reminder\" (click)=\"removeReminder(i)\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\"\r\n stroke-linecap=\"round\"><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line></svg>\r\n </a>\r\n </span>\r\n <button type=\"button\" class=\"cf-icon-btn\" *ngIf=\"reminders.length < maxReminders\" title=\"Add reminder\" (click)=\"addReminder()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"></line><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line></svg>\r\n </button>\r\n </div>\r\n <div class=\"cf-info\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Send alerts {{ reminderSummary }} mins before the audit end time\r\n </div>\r\n </div>\r\n\r\n <!-- Notify Flags -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Notify Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"notifyFlagsOn\" (click)=\"toggleNotifyFlags()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, all flags will be sent as an email</div>\r\n <ng-container *ngIf=\"notifyFlagsOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !notifySendApprover\" (click)=\"toggleSendApprover('notifySendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"notifySendApprover\">\r\n <svg *ngIf=\"notifySendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"notifySendCustom = !notifySendCustom\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"notifySendCustom\">\r\n <svg *ngIf=\"notifySendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"notifySendCustom\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'notifyUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <div class=\"cf-error\" *ngIf=\"notifyFlagsError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ notifyFlagsError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Notify on Recurring Flags -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Notify on Recurring Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"recurringFlagsOn\" (click)=\"toggleRecurringFlags()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">When enabled, emails are sent for recurring flags based on the configured threshold</div>\r\n\r\n <div class=\"cf-inner\" *ngIf=\"recurringFlagsOn\">\r\n <div class=\"cf-inline\">\r\n Send Email if the same question is flagged\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'recurringThreshold', options: thresholdOpts }\"></ng-container>\r\n times by the same store\r\n </div>\r\n <div class=\"cf-info\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Once the threshold is reached and an email is sent, the flag count resets to zero\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"recurringFlagsOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !recurringSendApprover\" (click)=\"toggleSendApprover('recurringSendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSendApprover\">\r\n <svg *ngIf=\"recurringSendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"toggleRecurringCustom()\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSendCustom\">\r\n <svg *ngIf=\"recurringSendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n <label class=\"cf-check\" (click)=\"recurringSameAsNotify = !recurringSameAsNotify\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"recurringSameAsNotify\">\r\n <svg *ngIf=\"recurringSameAsNotify\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Use same users from Notify Flags\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"recurringSendCustom\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'recurringUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <div class=\"cf-info\" *ngIf=\"recurringSameAsNotify\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n {{ notifyRecipientsLabel }}\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"recurringFlagsError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ recurringFlagsError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Daily report -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Enable - Daily Report</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"dailyReportOn\" (click)=\"toggleDailyReport()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By Enabling, compliance score will be sent as an email to the above users</div>\r\n <ng-container *ngIf=\"dailyReportOn\">\r\n <div class=\"cf-checks\">\r\n <span class=\"cf-checks-label\">Send To</span>\r\n <label class=\"cf-check\" [class.is-blocked]=\"!hasApprovers && !dailySendApprover\" (click)=\"toggleSendApprover('dailySendApprover')\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"dailySendApprover\">\r\n <svg *ngIf=\"dailySendApprover\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Approver\r\n </label>\r\n <label class=\"cf-check\" (click)=\"dailySendCustom = !dailySendCustom\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"dailySendCustom\">\r\n <svg *ngIf=\"dailySendCustom\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Custom\r\n </label>\r\n </div>\r\n <ng-container *ngIf=\"dailySendCustom\">\r\n <div class=\"cf-bulkbar\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"openDailyBulk()\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"></path></svg>\r\n Bulk Upload\r\n </button>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'dailyUsers', large: false }\"></ng-container>\r\n </ng-container>\r\n <label class=\"cf-check\" (click)=\"sharePostApproval = !sharePostApproval\">\r\n <span class=\"cf-check-box\" [class.is-on]=\"sharePostApproval\">\r\n <svg *ngIf=\"sharePostApproval\" width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </span>Share Report Post Approval\r\n </label>\r\n <div class=\"cf-error\" *ngIf=\"dailyReportError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ dailyReportError }}\r\n </div>\r\n </ng-container>\r\n\r\n <!-- Export submission: Tango users only, as the v1 Configure (its stored value is kept for everyone else). -->\r\n <div class=\"cf-grid2\" *ngIf=\"access.isTango\">\r\n <div class=\"cf-stack cf-stack--tight\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Export Submission</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"exportSubmissionOn\" (click)=\"exportSubmissionOn = !exportSubmissionOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint\">Enable this to allow audit submitters to download their submission as a PDF file</div>\r\n </div>\r\n </div>\r\n\r\n <!-- Redo validity -->\r\n <div class=\"cf-grid2\">\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-label\">Redo Validity</div>\r\n <div class=\"cf-inline\">\r\n Redo valid for\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'redoValidFor', options: redoDayOpts }\"></ng-container>\r\n Day from Redo creation\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Auto create task -->\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Auto Create Task for Flags</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"autoCreateTaskOn\" (click)=\"autoCreateTaskOn = !autoCreateTaskOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">By enabling, a task is automatically created for every flagged question in the audit</div>\r\n\r\n <!-- Who gets the task and how long it stays open (as the Checklist Configure page) -->\r\n <div class=\"cf-autotask\" *ngIf=\"autoCreateTaskOn\">\r\n <div class=\"cf-autotask-title\">Task Assignee</div>\r\n <div class=\"cf-hint cf-hint--tight\">Choose who the flagged task is assigned to</div>\r\n <div class=\"cf-autotask-choices\">\r\n <button type=\"button\" class=\"cf-choice\" [class.is-on]=\"taskAssignee === 'submitter'\" (click)=\"taskAssignee = 'submitter'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"taskAssignee === 'submitter'\"><span></span></span>\r\n <span class=\"cf-choice-text\">\r\n <span class=\"cf-choice-title\">Audit Submitter</span>\r\n <span class=\"cf-choice-sub\">Task is assigned to the user who filled the audit</span>\r\n </span>\r\n </button>\r\n <button type=\"button\" class=\"cf-choice\" [class.is-on]=\"taskAssignee === 'store'\" (click)=\"taskAssignee = 'store'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"taskAssignee === 'store'\"><span></span></span>\r\n <span class=\"cf-choice-text\">\r\n <span class=\"cf-choice-title\">Store User</span>\r\n <span class=\"cf-choice-sub\">Task is assigned to the user mapped to the flagged store</span>\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"cf-autotask-title\">Task Validity</div>\r\n <div class=\"cf-autotask-validity\">\r\n <span>Task valid for</span>\r\n <lib-audit-v2-select class=\"cf-validity-select\" [(ngModel)]=\"taskValidity\" [options]=\"taskValidityOptions\"\r\n [searchable]=\"false\" ariaLabel=\"Task validity in days\"></lib-audit-v2-select>\r\n <span>days from task creation</span>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Audit Configuration ===== -->\r\n <div class=\"cf-divider-head\">\r\n <span class=\"cf-block-title\">Audit Configuration</span>\r\n <span class=\"cf-rule\"></span>\r\n </div>\r\n\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Submission & Visibility</div>\r\n\r\n <!-- cf-box--open: the dispute-window and response-delay menus must not be clipped by the box -->\r\n <div class=\"cf-box cf-box--open\">\r\n <div class=\"cf-box-row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"showResponseInApp\"\r\n (click)=\"showResponseInApp = !showResponseInApp\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Show Response in Mobile App</div>\r\n <div class=\"cf-hint\">By enabling this option, store users can view the audit response in the Mobile App.</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"cf-box-sub\" *ngIf=\"showResponseInApp\">\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label-sm\">Response Visibility</div>\r\n <div class=\"cf-hint\">Choose when the response becomes visible to store users</div>\r\n </div>\r\n\r\n <div class=\"cf-options\">\r\n <div class=\"cf-option\" [class.is-on]=\"responseVisibility === 'pre'\" (click)=\"responseVisibility = 'pre'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"responseVisibility === 'pre'\"><span></span></span>\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm\">Pre-approval</div>\r\n <div class=\"cf-hint\">The audit response will be visible to store users before it is approved.</div>\r\n <div class=\"cf-inline cf-inline--top\">\r\n Show response\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'respDelay', options: respDelayOpts }\"></ng-container>\r\n after submission\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"cf-option\" [class.is-on]=\"responseVisibility === 'post'\" (click)=\"responseVisibility = 'post'\">\r\n <span class=\"cf-radio\" [class.is-on]=\"responseVisibility === 'post'\"><span></span></span>\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm\" [class.cf-muted]=\"responseVisibility !== 'post'\">Post-approval</div>\r\n <div class=\"cf-hint\">Once the response is approved, it will automatically be displayed in the Mobile App. Store users cannot raise a dispute.</div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"cf-box-sep\">\r\n <ng-container *ngIf=\"responseVisibility === 'pre'\">\r\n <div class=\"cf-box-row cf-box-row--flush\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"disputeOn\" (click)=\"disputeOn = !disputeOn\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label-sm\">Dispute Configuration</div>\r\n <div class=\"cf-hint cf-hint--wrap\">When enabled, the store team can raise a dispute against the auditor's submission once the response becomes visible to them.</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-box cf-box--nested\" *ngIf=\"disputeOn\">\r\n <div class=\"cf-inline\">\r\n Dispute window\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'disputeWindow', options: dispWindowOpts }\"></ng-container>\r\n from when the response becomes visible\r\n </div>\r\n <div class=\"cf-info cf-info--wrap\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Disputes raised inside this window go to the approver. Approved disputes revise the answer and the compliance score.\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"!hasApprovers\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n No approver is set, so no one can review disputes. Turn on Approver and add an approver.\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"responseVisibility === 'post'\">\r\n <div class=\"cf-stack cf-stack--sm\">\r\n <div class=\"cf-label-sm cf-muted\">Dispute Configuration</div>\r\n <div class=\"cf-info cf-info--wrap\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"></line></svg>\r\n Disputes are not available when responses are shown post-approval.\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Pre-submission access -->\r\n <div class=\"cf-box cf-box--pad\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Pre-Submission Access</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"preSubmissionAccessOn\" (click)=\"preSubmissionAccessOn = !preSubmissionAccessOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--wrap\">Users added here can view Open and In Progress audits until submission. The Schedule Info tab is also visible only to these users.</div>\r\n <ng-container *ngIf=\"preSubmissionAccessOn\">\r\n <div class=\"cf-row cf-row--top\">\r\n <span class=\"cf-field\">Visible to</span>\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'preSubmissionUsers', large: false }\"></ng-container>\r\n </div>\r\n <div class=\"cf-error cf-error--indent\" *ngIf=\"preSubmissionEmpty\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n Add at least one user\r\n </div>\r\n </ng-container>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Scoring ===== -->\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Scoring</div>\r\n <div class=\"cf-box cf-box--pad\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Pass/Fail Score Setup</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"passFailOn\" (click)=\"passFailOn = !passFailOn\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--wrap\">Set the compliance score an audit must reach to be marked {{ passLabel }}. Anything below it is marked {{ failLabel }}.</div>\r\n <div class=\"cf-row cf-row--wrap cf-row--top\" *ngIf=\"passFailOn\">\r\n <span class=\"cf-field\">Minimum score to {{ passLabel }}</span>\r\n <label class=\"cf-num\">\r\n <input type=\"number\" min=\"1\" max=\"100\" [(ngModel)]=\"passThreshold\">\r\n <span>%</span>\r\n </label>\r\n <span class=\"cf-pill cf-pill--pass\">{{ passLabel }} ≥ {{ passThreshold }}%</span>\r\n <span class=\"cf-pill cf-pill--fail\">{{ failLabel }} < {{ passThreshold }}%</span>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== Approver Controls ===== -->\r\n <section class=\"cf-card cf-card--lg\">\r\n <div class=\"cf-block-title\">Approver Controls</div>\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-toggle-row\">\r\n <span class=\"cf-label\">Edit Submitted Audit</span>\r\n <button type=\"button\" class=\"cf-switch\" [class.is-on]=\"editSubmittedOn\" (click)=\"toggleEditSubmitted()\"><span></span></button>\r\n </div>\r\n <div class=\"cf-hint cf-hint--tight\">Allow Approvers to edit submitted Audit</div>\r\n <ng-container *ngIf=\"editSubmittedOn\">\r\n <ng-container *ngTemplateOutlet=\"chipPicker; context: { list: 'editUsers', large: true }\"></ng-container>\r\n <div class=\"cf-error\" *ngIf=\"editSubmittedError\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n {{ editSubmittedError }}\r\n </div>\r\n </ng-container>\r\n </div>\r\n <div class=\"cf-grid2\">\r\n <div class=\"cf-stack\">\r\n <div class=\"cf-label\">Redo Extension</div>\r\n <div class=\"cf-inline\">\r\n Extend redo up to\r\n <ng-container *ngTemplateOutlet=\"dropdown; context: { key: 'redoExtension', options: redoExtensionOpts }\"></ng-container>\r\n Days till approval\r\n </div>\r\n </div>\r\n </div>\r\n </section>\r\n\r\n <!-- ===== User Verification ===== -->\r\n <section class=\"cf-card\">\r\n <div class=\"cf-block-title\">User Verification Configuration</div>\r\n <div class=\"cf-box cf-box--row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"requirePhoto\" (click)=\"requirePhoto = !requirePhoto\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Require Photo Capture</div>\r\n <div class=\"cf-hint\">By enabling, users must capture their photo to complete submission</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-box cf-box--row\">\r\n <button type=\"button\" class=\"cf-switch cf-switch--top\" [class.is-on]=\"requireAcknowledgment\" (click)=\"requireAcknowledgment = !requireAcknowledgment\"><span></span></button>\r\n <div class=\"cf-stack cf-stack--xs\">\r\n <div class=\"cf-label\">Require User Acknowledgment</div>\r\n <div class=\"cf-hint\">By enabling, users must type their name as acknowledgment to complete submission</div>\r\n </div>\r\n </div>\r\n </section>\r\n </ng-container>\r\n\r\n </div>\r\n </div>\r\n\r\n <!-- Daily Report > Custom: bulk upload users (as the Checklist Configure page's popup) -->\r\n <ng-container *ngIf=\"dailyBulkOpen\">\r\n <div class=\"cf-dlg-backdrop\" (click)=\"closeDailyBulk()\"></div>\r\n <div class=\"cf-dlg\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"cf-dlg-title\">\r\n <span class=\"cf-dlg-icon\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M17.5 12.5V15.8333C17.5 16.2754 17.3244 16.6993 17.0118 17.0118C16.6993 17.3244 16.2754 17.5 15.8333 17.5H4.16667C3.72464 17.5 3.30072 17.3244 2.98816 17.0118C2.67559 16.6993 2.5 16.2754 2.5 15.8333V12.5M14.1667 6.66667L10 2.5M10 2.5L5.83333 6.66667M10 2.5V12.5\"></path></svg>\r\n </span>\r\n <div class=\"cf-dlg-title\" id=\"cf-dlg-title\">Bulk Upload</div>\r\n <div class=\"cf-dlg-steps\">\r\n <div>Step 1 - <a href=\"#\" (click)=\"$event.preventDefault(); downloadDailyTemplate()\">Download the template here</a></div>\r\n <div>Step 2 - Add the Email of existing users to the template</div>\r\n <div>Step 3 - Upload it below for processing</div>\r\n </div>\r\n <div class=\"cf-dlg-note\">\r\n **Note : Only the Email column is considered - the Username is taken from the existing user list.\r\n Only existing users of this client are accepted. On upload, all the existing data will be replaced.\r\n </div>\r\n <div class=\"cf-error\" *ngIf=\"dailyBulkErrors.length\">\r\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"></circle><line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line><line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line></svg>\r\n <div class=\"cf-dlg-errors\">\r\n <div>The file was not uploaded. Fix {{ dailyBulkErrors.length === 1 ? 'this row' : 'these rows' }} and upload again:</div>\r\n <div *ngFor=\"let e of dailyBulkErrors.slice(0, 5)\">{{ e }}</div>\r\n <div *ngIf=\"dailyBulkErrors.length > 5\">+{{ dailyBulkErrors.length - 5 }} more</div>\r\n </div>\r\n </div>\r\n <div class=\"cf-dlg-foot\">\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost av2-btn--sm\" (click)=\"closeDailyBulk()\">Cancel</button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--primary av2-btn--sm\" (click)=\"dailyBulkFile.click()\">Upload</button>\r\n <input #dailyBulkFile type=\"file\" accept=\".xlsx\" hidden (change)=\"onDailyBulkFile($event)\">\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n</div>\r\n","import { ChangeDetectorRef, Component } from '@angular/core';\r\nimport { FormBuilder } from '@angular/forms';\r\nimport { Router } from '@angular/router';\r\nimport { NgbActiveModal, NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport * as XLSX from 'xlsx';\r\nimport { TraxService } from '../../../../services/trax.service';\r\nimport { ChecklistPopupComponent } from '../../../add-checklist/checklist-popup/checklist-popup.component';\r\n\r\n/** Answer type labels used by the question template (same as the checklist export, POST /trax/exportQuestions). */\r\nconst ANSWER_TYPE_LABELS: Record<string, string> = {\r\n 'descriptive': 'Descriptive Answer',\r\n 'yes/no': 'A/B Question',\r\n 'multiplechoicesingle': 'Multiple Choice Single',\r\n 'multiplechoicemultiple': 'Multiple Choice Multiple',\r\n 'descriptiveImage': 'Capture Image with Description',\r\n 'image': 'Capture Image as answer',\r\n 'video': 'Capture video as answer',\r\n 'multipleImage': 'Capture Multiple Image',\r\n 'date': 'Date',\r\n 'linearscale': 'Linear Scale',\r\n 'image/video': 'Capture Image/Video as Answer',\r\n 'time': 'Time',\r\n 'dropdown': 'Dropdown',\r\n};\r\n\r\n/** Optional column C of the question template (as in the static template and the checklist export); upload saves it as qdescription. */\r\nconst QDESCRIPTION_COLUMN = 'Question Description (Optional)';\r\n\r\n/**\r\n * Column D (Answer Type) is a dropdown of the labels above, over the same range as the static template\r\n * (src/assets/files/checklistQuestion.xlsx). The community xlsx build cannot write data validation, so it is\r\n * added to the generated sheet XML (CT_Worksheet order: dataValidations follows sheetData).\r\n */\r\nconst ANSWER_TYPE_VALIDATION =\r\n '<dataValidations count=\"1\"><dataValidation type=\"list\" allowBlank=\"1\" showInputMessage=\"1\" showErrorMessage=\"1\" sqref=\"D2:D80516\">'\r\n + `<formula1>\"${Object.values(ANSWER_TYPE_LABELS).join(',')}\"</formula1></dataValidation></dataValidations>`;\r\n\r\n/** The workbook as xlsx bytes, with the Answer Type dropdown on column D of the first sheet. */\r\nfunction withAnswerTypeDropdown(book: XLSX.WorkBook): Uint8Array {\r\n const bytes = new Uint8Array(XLSX.write(book, { bookType: 'xlsx', type: 'array' }));\r\n const CFB = (XLSX as any).CFB;\r\n const zip = CFB.read(bytes, { type: 'array' });\r\n const entry = zip.FileIndex[zip.FullPaths.findIndex((p: string) => p.endsWith('xl/worksheets/sheet1.xml'))];\r\n if (!entry?.content) { return bytes; }\r\n const xml: string = new TextDecoder().decode(entry.content);\r\n entry.content = new TextEncoder().encode(xml.replace('</sheetData>', '</sheetData>' + ANSWER_TYPE_VALIDATION));\r\n entry.size = entry.content.length;\r\n return new Uint8Array(CFB.write(zip, { fileType: 'zip', type: 'array' }));\r\n}\r\n\r\n/**\r\n * Bulk Upload Questions for an audit. Same popup, xlsx parsing and validation as the checklist one, but the\r\n * questions are saved with PUT /trax/audit/checklist/update/:id and the template holds the audit's own questions,\r\n * so the Checklist APIs never see an audit (audits live in auditchecklist / auditquestion).\r\n */\r\n@Component({\r\n selector: 'lib-audit-v2-bulk-upload',\r\n templateUrl: '../../../add-checklist/checklist-popup/checklist-popup.component.html',\r\n styleUrl: '../../../add-checklist/checklist-popup/checklist-popup.component.scss',\r\n})\r\nexport class AuditV2BulkUploadComponent extends ChecklistPopupComponent {\r\n constructor(\r\n fb: FormBuilder,\r\n private auditToast: ToastService,\r\n private auditService: TraxService,\r\n router: Router,\r\n dialogRef: NgbActiveModal,\r\n dialog: NgbModal,\r\n cd: ChangeDetectorRef,\r\n ) {\r\n super(fb, auditToast, auditService, router, dialogRef, dialog, cd);\r\n }\r\n\r\n /** The audit's saved questions as an xlsx; a new audit with no questions gets the blank template. */\r\n override downloadTemplate(): void {\r\n const { checklistId, clientId } = this.checklistData;\r\n this.auditService.auditGetConfig({ checkListId: checklistId, clientId }).subscribe({\r\n next: (res: any) => {\r\n const sections: any[] = res?.data?.checkListDetails?.sections || [];\r\n const rows: string[][] = [];\r\n sections.forEach((section: any) => (section?.questions || []).forEach((qn: any) => rows.push([\r\n section.name,\r\n qn.qname,\r\n qn.qdescription || '',\r\n ANSWER_TYPE_LABELS[qn.answerType] || '',\r\n ['multiplechoicesingle', 'multiplechoicemultiple', 'dropdown'].includes(qn.answerType)\r\n ? (qn.answers || []).map((ans: any) => ans.answer).toString()\r\n : '',\r\n ])));\r\n if (!rows.length) {\r\n const link = document.createElement('a');\r\n link.href = '/assets/files/checklistQuestion.xlsx';\r\n link.download = 'Audit Question.xlsx';\r\n link.click();\r\n return;\r\n }\r\n const sheet = XLSX.utils.aoa_to_sheet([['Section Name', 'Question', QDESCRIPTION_COLUMN, 'Answer Type', 'Answer Options'], ...rows]);\r\n sheet['!cols'] = [0, 1, 2, 3, 4].map(col => ({\r\n wch: Math.max(12, ...rows.map(r => (r[col] || '').length)) + 2,\r\n }));\r\n const book = XLSX.utils.book_new();\r\n XLSX.utils.book_append_sheet(book, sheet, 'Questions');\r\n const file = new Blob([withAnswerTypeDropdown(book)], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });\r\n const url = URL.createObjectURL(file);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = 'Audit Question.xlsx';\r\n link.click();\r\n setTimeout(() => URL.revokeObjectURL(url));\r\n },\r\n error: () => this.auditToast.getErrorToast('Unable to download template!'),\r\n });\r\n }\r\n\r\n /** Replaces the audit's questions with the uploaded sheet; the editor reloads on \"reload\". */\r\n override updateChecklist(): void {\r\n if (!this.checklistData.checkListName) {\r\n this.auditToast.getErrorToast('Audit Name is missing');\r\n return;\r\n }\r\n if (!this.excelData.length) {\r\n this.auditToast.getErrorToast('Please upload a valid file');\r\n return;\r\n }\r\n this.auditService.auditChecklistUpdate(this.checklistData.checklistId, {\r\n checklistName: this.checklistData.checkListName?.trim(),\r\n checklistDescription: this.checklistData.checkListDescription?.trim(),\r\n sections: this.sectionDetails,\r\n clientId: this.checklistData.clientId,\r\n submitType: 'save',\r\n }).subscribe({\r\n next: (res: any) => {\r\n if (res?.code == 200) {\r\n this.dialogRef.close('reload');\r\n this.auditToast.getSuccessToast('Questions uploaded successfully');\r\n } else {\r\n this.auditToast.getErrorToast('Unable to upload questions!');\r\n }\r\n },\r\n error: (error: any) => {\r\n this.auditToast.getErrorToast(error?.error?.error?.message || 'Unable to upload questions!Server Error!');\r\n },\r\n });\r\n }\r\n}\r\n","<div class=\"checklist-card\">\r\n\r\n <!-- Header -->\r\n <div *ngIf=\"!excelData.length\">\r\n <div class=\"d-flex align-items-center mb-3\">\r\n <div class=\"title-icon me-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\">\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#DAF1FF\"/>\r\n <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#EAF8FF\" stroke-width=\"8\"/>\r\n <path d=\"M28 21V35M21 28H35\" stroke=\"#009BF3\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n </div>\r\n <div class=\"mb-0 titleText\">{{type == 'create' ? 'Create Checklist' : 'Bulk Upload'}}</div>\r\n </div>\r\n \r\n <form [formGroup]=\"checklistForm\">\r\n \r\n <!-- Checklist Name -->\r\n <div class=\"mb-3\" *ngIf=\"type == 'create'\">\r\n <label class=\"form-label\">Checklist Name</label>\r\n <input type=\"text\" class=\"form-control\" formControlName=\"name\">\r\n </div>\r\n \r\n <!-- Description -->\r\n <div class=\"mb-3\" *ngIf=\"type == 'create'\">\r\n <label class=\"form-label\">Description</label>\r\n <textarea class=\"form-control\" rows=\"3\" formControlName=\"description\"></textarea>\r\n </div>\r\n \r\n <!-- Mode Selection -->\r\n <div class=\"row g-2 my-3\" *ngIf=\"type == 'create'\">\r\n \r\n <div class=\"col-md-6\">\r\n <div\r\n class=\"option-box\"\r\n [class.option-active]=\"mode==='individual'\"\r\n (click)=\"selectMode('individual')\">\r\n \r\n <span>Add questions individually</span>\r\n <input type=\"radio\" value=\"individual\" formControlName=\"mode\" style=\"width:15px;height:15px\">\r\n </div>\r\n </div>\r\n \r\n <div class=\"col-md-6\">\r\n <div\r\n class=\"option-box\"\r\n [class.option-active]=\"mode==='bulk'\"\r\n (click)=\"selectMode('bulk')\">\r\n \r\n <span>Add questions in bulk</span>\r\n <input type=\"radio\" value=\"bulk\" formControlName=\"mode\" style=\"width:15px;height:15px\">\r\n </div>\r\n </div>\r\n \r\n </div>\r\n \r\n <!-- Bulk Upload Section -->\r\n <div *ngIf=\"mode === 'bulk'\" class=\"bulkText\">\r\n \r\n <div class=\"my-5\">\r\n \r\n <div class=\"mb-2\">1. Use the template to upload multiple questions at once</div>\r\n \r\n <div class=\"mb-2\">\r\n 2. Download the template here -\r\n @if(type == 'create') {\r\n <a class=\"download-link\" href=\"/assets/files/checklistQuestion.xlsx\" download>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"17\" height=\"17\" viewBox=\"0 0 17 17\" fill=\"none\">\r\n <path d=\"M15.8359 10.8359V14.1693C15.8359 14.6113 15.6603 15.0352 15.3478 15.3478C15.0352 15.6603 14.6113 15.8359 14.1693 15.8359H2.5026C2.06058 15.8359 1.63665 15.6603 1.32409 15.3478C1.01153 15.0352 0.835938 14.6113 0.835938 14.1693V10.8359M4.16927 6.66927L8.33594 10.8359M8.33594 10.8359L12.5026 6.66927M8.33594 10.8359V0.835938\" stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> Download Template\r\n </a>\r\n }\r\n @else {\r\n <span class=\"download-link\" (click)=\"downloadTemplate()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"17\" height=\"17\" viewBox=\"0 0 17 17\" fill=\"none\">\r\n <path d=\"M15.8359 10.8359V14.1693C15.8359 14.6113 15.6603 15.0352 15.3478 15.3478C15.0352 15.6603 14.6113 15.8359 14.1693 15.8359H2.5026C2.06058 15.8359 1.63665 15.6603 1.32409 15.3478C1.01153 15.0352 0.835938 14.6113 0.835938 14.1693V10.8359M4.16927 6.66927L8.33594 10.8359M8.33594 10.8359L12.5026 6.66927M8.33594 10.8359V0.835938\" stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> Download Template\r\n </span>\r\n }\r\n </div>\r\n \r\n <div class=\"mb-2\">3. Add your data to the template</div>\r\n <div class=\"mb-2\">4. Upload it for processing</div>\r\n \r\n </div>\r\n \r\n <!-- Upload Area -->\r\n <div class=\"upload-box cursor-pointer\" (click)=\"fileInput.click()\">\r\n \r\n <div class=\"upload-icon mb-2\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"46\" height=\"46\" viewBox=\"0 0 46 46\" fill=\"none\">\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" fill=\"#DAF1FF\"/>\r\n <rect x=\"3\" y=\"3\" width=\"40\" height=\"40\" rx=\"20\" stroke=\"#EAF8FF\" stroke-width=\"6\"/>\r\n <g clip-path=\"url(#clip0_19034_66996)\">\r\n <path d=\"M26.3326 26.3313L22.9992 22.998M22.9992 22.998L19.6659 26.3313M22.9992 22.998V30.498M29.9909 28.323C30.8037 27.8798 31.4458 27.1787 31.8158 26.3301C32.1858 25.4816 32.2627 24.534 32.0344 23.6369C31.8061 22.7397 31.2855 21.9442 30.5548 21.3758C29.8241 20.8074 28.925 20.4986 27.9992 20.498H26.9492C26.697 19.5223 26.2269 18.6166 25.5742 17.8488C24.9215 17.081 24.1033 16.4712 23.181 16.0651C22.2587 15.6591 21.2564 15.4674 20.2493 15.5045C19.2423 15.5416 18.2568 15.8065 17.3669 16.2793C16.477 16.7521 15.7058 17.4205 15.1114 18.2343C14.517 19.048 14.1148 19.9859 13.9351 20.9774C13.7553 21.969 13.8027 22.9884 14.0736 23.959C14.3445 24.9296 14.8319 25.8262 15.4992 26.5813\" stroke=\"#009BF3\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_19034_66996\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" transform=\"translate(13 13)\"/>\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n \r\n <div class=\"text-primary fw-semibold uploadText\">Click To Upload</div>\r\n \r\n <!-- Hidden File Input -->\r\n <input\r\n #fileInput\r\n type=\"file\"\r\n hidden\r\n (change)=\"onFileSelected($event)\"\r\n >\r\n \r\n </div>\r\n \r\n <!-- Uploaded File -->\r\n <div *ngIf=\"fileName\" class=\"upload-file\">\r\n \r\n <div class=\"d-flex align-items-center\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\">\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" fill=\"#DAF1FF\"/>\r\n <rect x=\"2\" y=\"2\" width=\"32\" height=\"32\" rx=\"16\" stroke=\"#EAF8FF\" stroke-width=\"4\"/>\r\n <path d=\"M18.668 11.3359H14.0013C13.6477 11.3359 13.3085 11.4764 13.0585 11.7265C12.8084 11.9765 12.668 12.3156 12.668 12.6693V23.3359C12.668 23.6896 12.8084 24.0287 13.0585 24.2787C13.3085 24.5288 13.6477 24.6693 14.0013 24.6693H22.0013C22.3549 24.6693 22.6941 24.5288 22.9441 24.2787C23.1942 24.0287 23.3346 23.6896 23.3346 23.3359V16.0026M18.668 11.3359L23.3346 16.0026M18.668 11.3359V16.0026H23.3346\" stroke=\"#00A3FF\" stroke-width=\"1.33333\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n \r\n <div class=\"d-flex flex-column align-items-start ms-5\">\r\n <div>{{fileName}}</div>\r\n <div class=\"successText\">\r\n {{fileSize}} KB – Uploaded\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\">\r\n <path d=\"M29.3346 14.7705V15.9972C29.333 18.8724 28.402 21.6701 26.6804 23.973C24.9589 26.2758 22.539 27.9605 19.7818 28.7757C17.0245 29.591 14.0776 29.4931 11.3806 28.4967C8.68354 27.5002 6.38084 25.6587 4.81592 23.2466C3.25099 20.8346 2.50769 17.9813 2.69687 15.1123C2.88605 12.2433 3.99758 9.51232 5.86568 7.32665C7.73377 5.14097 10.2583 3.61772 13.0629 2.98408C15.8674 2.35043 18.8017 2.64033 21.428 3.81055M29.3346 5.33055L16.0013 18.6772L12.0013 14.6772\" stroke=\"#12B76A\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n \r\n </div>\r\n \r\n </div>\r\n \r\n <!-- Buttons -->\r\n <div class=\"d-flex justify-content-end mt-4\">\r\n \r\n <button type=\"button\" class=\"btn btn-light me-2\" (click)=\"dialogRef.close()\">\r\n Cancel\r\n </button>\r\n \r\n <button class=\"btn btn-primary\" (click)=\"type == 'create' ? createChecklist() : updateChecklist()\">\r\n Proceed\r\n </button>\r\n \r\n </div>\r\n \r\n </form>\r\n </div>\r\n\r\n <div class=\"border-0 validateBox\" *ngIf=\"excelData.length\">\r\n <div class=\"card-header border-0 mt-0\">\r\n <div class=\"card-title mt-3\"><span class=\"config-heading fw-semibold w-auto\">Assign Stores</span></div>\r\n </div>\r\n <div class=\"card-body pt-0\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{excelData?.length}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Total Records</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div class=\"fw-semibold config-heading w-100\">{{excelData?.length}}</div>\r\n <div class=\"fw-semibold subtitle mt-1\">Rows processed</div>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-4\">\r\n <div class=\"popup-card rounded-3 p-3 flex-column h-80px\">\r\n <div [ngClass]=\"excelError ? 'error-heading':''\" class=\"fw-semibold config-heading w-100\">{{excelError?.error?.length || 0}}</div>\r\n <div [ngClass]=\"excelError ? 'excel-error':''\" class=\"fw-semibold subtitle mt-1\">Error</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!excelError\" class=\"table-header mt-5\" style=\"font-weight: 400;\">\r\n <div>You're about to assign {{excelData?.length}} stores to the checklist. Are you sure want to proceed?</div>\r\n </div>\r\n <div *ngIf=\"excelError\" class=\"flex-column mt-5\">\r\n <div class=\"config-heading fw-bold\">Invalid Details !</div>\r\n <div class=\"subtitle mt-5\">Please provide correct and complete layout information.</div>\r\n <div class=\"p-5 w-100 rounded-3 border-error mt-5 flex-column\">\r\n <div *ngFor=\"let error of excelError?.error; let i = index; let last = last\" [ngClass]=\"!last ? 'mb-2' : ''\" class=\"text-error\">{{i + 1}}) {{error}}</div>\r\n </div>\r\n </div>\r\n\r\n <input style=\"visibility: hidden;\" #fileInput1 type=\"file\" id=\"kt_account_team_size_select_2\" (change)=\"onFileSelected($event)\" />\r\n </div>\r\n \r\n <div class=\"d-flex justify-content-end mt-4\">\r\n <button type=\"button\" class=\"btn btn-light me-2\" (click)=\"dialogRef.dismiss()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary\" *ngIf=\"!excelError\" (click)=\"type == 'create' ? createChecklist() : updateChecklist()\">\r\n Proceed\r\n </button>\r\n <button type=\"button\" *ngIf=\"excelError\" class=\"btn py-3 ms-3 btn-danger\" (click)=\"Reupload();\">Reupload</button>\r\n </div>\r\n </div>\r\n\r\n</div>","// Audit copy of components/add-checklist/counter (declared only in the main trax module).\r\nimport { Component, EventEmitter, forwardRef, Input, Output } from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: \"lib-audit-v2-counter\",\r\n templateUrl: \"./audit-v2-counter.component.html\",\r\n styleUrl: \"./audit-v2-counter.component.scss\",\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => AuditV2CounterComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class AuditV2CounterComponent implements ControlValueAccessor {\r\n @Input() step: number = 1;\r\n @Input() placeholder: string = \"0\";\r\n @Input() max: number = 2;\r\n @Input() type: string = \"number\";\r\n\r\n @Output() onIncrement = new EventEmitter<any>();\r\n @Output() onDecrement = new EventEmitter<any>();\r\n\r\n value: number = 0;\r\n /** When user types incomplete value like \"-\" or \".\", keep it for display until valid */\r\n displayValue: string | null = null;\r\n disabled = false;\r\n\r\n onChange = (value: number) => {};\r\n onTouched = () => {};\r\n\r\n /** Min/max per type: percentage 0-100, whole 0-infinity, degree -273.15-infinity */\r\n private readonly DEGREE_MIN = -273.15;\r\n\r\n increment() {\r\n if (!this.disabled) {\r\n if (this.type === \"percentage\" && this.value >= 100) return;\r\n this.value += this.step;\r\n this.onChange(this.value);\r\n this.onTouched();\r\n this.onIncrement.emit(this.value);\r\n }\r\n }\r\n\r\n decrement() {\r\n if (!this.disabled) {\r\n if (this.type === \"percentage\" && this.value <= 0) return;\r\n if (this.type === \"number\" && this.value <= 0) return;\r\n if (this.type === \"degree\" && this.value <= this.DEGREE_MIN) return;\r\n this.value -= this.step;\r\n this.onChange(this.value);\r\n this.onTouched();\r\n this.onDecrement.emit(this.value);\r\n }\r\n }\r\n\r\n onInput(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n if (this.type === \"percentage\") {\r\n input.value = input.value.replace(/[^0-9]/g, \"\");\r\n const num = Number(input.value);\r\n if (num > 100) input.value = \"100\";\r\n this.value = Math.min(100, Math.max(0, num));\r\n } else if (this.type === \"number\") {\r\n input.value = input.value.replace(/[^0-9]/g, \"\");\r\n const num = Number(input.value);\r\n this.value = Math.max(0, num);\r\n } else if (this.type === \"degree\") {\r\n const regex = /^-?\\d*\\.?\\d*$/;\r\n if (!regex.test(input.value)) {\r\n this.displayValue = null;\r\n input.value = String(this.value);\r\n return;\r\n }\r\n const num = Number(input.value);\r\n if (Number.isNaN(num)) {\r\n // Incomplete input like \"-\" or \".\" - keep display, don't update value\r\n this.displayValue = input.value;\r\n return;\r\n }\r\n this.displayValue = null;\r\n this.value = Math.max(this.DEGREE_MIN, num);\r\n if (num < this.DEGREE_MIN) {\r\n input.value = String(this.DEGREE_MIN);\r\n }\r\n } else {\r\n const regex = /^\\d*\\.?\\d*$/;\r\n if (!regex.test(input.value)) {\r\n input.value = \"0\";\r\n }\r\n this.value = Number(input.value) || 0;\r\n }\r\n this.onChange(this.value);\r\n }\r\n\r\n // ControlValueAccessor interface methods\r\n writeValue(value: number): void {\r\n this.value = value || 0;\r\n this.displayValue = null;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState?(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n }\r\n\r\n onBlur(): void {\r\n if (this.displayValue != null) {\r\n this.displayValue = null;\r\n this.value = Math.max(this.DEGREE_MIN, this.value);\r\n this.onChange(this.value);\r\n }\r\n this.onTouched();\r\n }\r\n}\r\n","<div class=\"counter-container\" [class.disable-counter]=\"disabled\">\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"decrement()\"\r\n >\r\n <path d=\"M3.76294 7H11.9296\" stroke=\"#667085\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n <input\r\n type=\"text\"\r\n [attr.inputmode]=\"type === 'degree' ? 'text' : 'numeric'\"\r\n [attr.pattern]=\"type === 'degree' ? null : '[0-9]*'\"\r\n [value]=\"displayValue ?? value\"\r\n [placeholder]=\"placeholder\"\r\n [disabled]=\"disabled\"\r\n (input)=\"onInput($event)\"\r\n (blur)=\"onBlur()\"\r\n class=\"center\"\r\n />\r\n\r\n <svg\r\n role=\"button\"\r\n width=\"15\"\r\n height=\"14\"\r\n viewBox=\"0 0 15 14\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n (click)=\"increment()\"\r\n >\r\n <path\r\n d=\"M7.15389 2.9165V11.0832M3.07056 6.99984H11.2372\"\r\n stroke=\"#667085\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n</div>\r\n","/*\r\n * Audit question editor: the audit copy of AddChecklistComponent (components/add-checklist).\r\n * Same screen, but it loads and saves through the audit APIs (/trax/audit/getConfigDetails,\r\n * /trax/audit/checklist/update/:id), so an audit's questions are stored in the audit collections.\r\n * Run AI is offered on image answers to Tango users, as in the checklist builder (saved on the answer:\r\n * runAI / runAIFeatures / runAIDescription); bulk upload uses AuditV2BulkUploadComponent (audit APIs), and\r\n * ?bulk=true (Create Audit -> \"Add questions in bulk\") opens it on load. The checklist editor is unchanged.\r\n */\r\nimport { ChangeDetectorRef, Component, ElementRef, OnDestroy, OnInit, ViewChild } from '@angular/core';\r\nimport { FormGroup, FormControl, Validators, FormArray, FormBuilder, Form, AbstractControl } from '@angular/forms';\r\nimport { GlobalStateService, PageInfoService } from 'tango-app-ui-global';\r\nimport { CdkDragDrop, moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';\r\nimport { timer,takeUntil, Subject, throwError } from 'rxjs';\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap';\r\nimport { TraxpopupComponent } from '../../traxpopup/traxpopup.component';\r\nimport { ActivatedRoute,Router } from '@angular/router';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport { TraxService } from '../../../services/trax.service';\r\nimport { noWhitespaceValidator } from '../../create-task/validators/whitespace-validator';\r\nimport { uniqueStringValidator } from '../../create-task/validators/unique-string-validator';\r\nimport { rangeValidator } from '../../create-task/validators/ascending-validator';\r\nimport { TraxRunAIPopupComponent } from '../../trax-run-ai-popup/trax-run-ai-popup.component';\r\nimport dayjs from 'dayjs';\r\nimport { AuditV2BulkUploadComponent } from './bulk-upload/audit-v2-bulk-upload.component';\r\nimport { AuditAccess, auditAccess } from '../audit-v2-access';\r\nimport { AuditSelectOption } from '../select/audit-v2-select.component';\r\nimport { AUDIT_TEMPLATES, templateSections } from '../predefined/audit-v2-templates';\r\nimport { AutoTaskPopupComponent } from '../../add-checklist/auto-task-popup/auto-task-popup.component';\r\nimport customParseFormat from 'dayjs/plugin/customParseFormat';\r\nimport utc from 'dayjs/plugin/utc.js';\r\nimport timeZone from 'dayjs/plugin/timezone.js';\r\ndayjs.extend(timeZone);\r\ndayjs.extend(utc);\r\ndayjs.extend(customParseFormat);\r\n\r\n\r\n@Component({\r\n selector: 'lib-audit-v2-question-editor',\r\n templateUrl: './audit-v2-question-editor.component.html',\r\n styleUrl: './audit-v2-question-editor.component.scss'\r\n})\r\nexport class AuditV2QuestionEditorComponent implements OnInit,OnDestroy {\r\n @ViewChild('formRef') formRef: ElementRef;\r\n\r\n ChecklistForm!: FormGroup;\r\n show: number = 0;\r\n sectionIndex: number = 0;\r\n getobject: any;\r\n editvalue: any;\r\n /** Opened from Audit -> Manage -> Create Audit (?audit=true): return to the audit-v2 pages after saving. */\r\n // Always the audit editor: it saves to the audit APIs and returns to the audit-v2 pages.\r\n fromAudit = true;\r\n nosection:boolean = false;\r\n showvalue: string;\r\n refImgQIdx: number = 0;\r\n checklistLoading: boolean = false;\r\n popupCount:number = 0;\r\n clientId:any;\r\n deletedList:any = [];\r\n environment:any;\r\n userType: any;\r\n maxSectionNumber: any;\r\n dropdownValue:any =[-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10];\r\n // Options of the custom dropdowns (lib-audit-v2-select). Values are strings, as a native <select> gives.\r\n readonly scoreOptions: AuditSelectOption[] = [-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10].map(v => ({ value: String(v), label: String(v) }));\r\n readonly answerTypeOptions: AuditSelectOption[] = [\r\n { value: 'descriptive', label: 'Descriptive Answer' },\r\n { value: 'yes/no', label: 'A/B Question' },\r\n { value: 'multiplechoicesingle', label: 'Multiple Choice Question - Single Answer' },\r\n { value: 'multiplechoicemultiple', label: 'Multiple Choice Question - Multiple Answer' },\r\n { value: 'descriptiveImage', label: 'Capture Image with Description' },\r\n { value: 'image', label: 'Capture Image as answer' },\r\n { value: 'video', label: 'Capture video as answer' },\r\n { value: 'multipleImage', label: 'Capture Multiple Image' },\r\n { value: 'date', label: 'Date - DD/MM/YYYY' },\r\n { value: 'linearscale', label: 'Linear Scale' },\r\n { value: 'time', label: 'Time' },\r\n { value: 'image/video', label: 'Capture Image/Video as Answer' },\r\n { value: 'dropdown', label: 'Dropdown as an answer' }\r\n ];\r\n readonly linearTypeOptions: AuditSelectOption[] = [\r\n { value: 'degree', label: 'Degree °C' },\r\n { value: 'number', label: 'Whole Number' },\r\n { value: 'percentage', label: 'Percentage' }\r\n ];\r\n readonly limitOptions: AuditSelectOption[] = ['1', '2', '3', '4', '5'].map(v => ({ value: v, label: v }));\r\n\r\n /** Validation types of an answer; the image option depends on the question's answer type. */\r\n validationOptions(answerType: string): AuditSelectOption[] {\r\n return [\r\n { value: 'Descriptive Answer', label: 'Descriptive Answer' },\r\n answerType === 'multiplechoicesingle'\r\n ? { value: 'Capture Multiple Image with description', label: 'Capture Multiple Image/Video with Description' }\r\n : { value: 'Capture Image', label: 'Capture Image' },\r\n { value: 'Capture Video', label: 'Capture Video' }\r\n ];\r\n }\r\n\r\n /** \"Link a question\" dropdown of one answer: none, or a later question of the section. */\r\n linkedOptions(i: number, j: number, k: number): AuditSelectOption[] {\r\n return [{ value: '', label: 'Select Question' }]\r\n .concat((this.getQuestionList(i, j, k) || []).map((q: any) => ({ value: String(q), label: 'Question ' + q })));\r\n }\r\n dayjs = dayjs;\r\n // ===== Auto-task (per-answer flag) state =====\r\n autoTaskGlobalConfigured: boolean = false;\r\n globalTaskAssignee: string = 'submitter';\r\n globalTaskValidity: number = 10;\r\n firstAutoTaskRef: { i: number; j: number; k: number } | null = null;\r\n // \"+ Question description\" button + input (saved as question-level qdescription), same as the checklist builder. false hides them.\r\n readonly showQdescription = true;\r\n // Questions whose description input was opened via \"+ Question description\" (keyed by the question FormGroup, so it survives reorder/clone/delete).\r\n private openedQdescriptions = new WeakSet<AbstractControl>();\r\n private detach = new Subject();\r\n /** Create Audit -> \"Add questions in bulk\" navigates here with state { bulk: true }: open bulk upload once loaded. */\r\n private bulkOnLoad = !!history.state?.bulk;\r\n /** Predefined Audit -> Use template navigates here with state { template: key }. */\r\n private templateOnLoad: string = history.state?.template || '';\r\n\r\n /**\r\n * Fill a new audit (no saved questions yet) with the picked template's questions, once; the user\r\n * reviews them and saves as usual. An audit that already has questions is never overwritten.\r\n */\r\n private applyTemplateOnLoad(): void {\r\n if (!this.templateOnLoad) { return; }\r\n const key = this.templateOnLoad;\r\n this.templateOnLoad = '';\r\n history.replaceState({ ...history.state, template: '' }, '');\r\n const tpl = AUDIT_TEMPLATES.find(t => t.key === key);\r\n if (!tpl || Number(this.getobject?.questionCount) > 0) { return; }\r\n this.getobject = { ...this.getobject, sections: templateSections(tpl) };\r\n this.toast.getSuccessToast('Template questions added. Review them and click Save as Draft or Configure.');\r\n }\r\n /** Saving questions needs the Checklist edit permission (the audit update API checks it too). */\r\n access: AuditAccess = { canAdd: false, canEdit: false };\r\n constructor(private pageInfo:PageInfoService,private fb: FormBuilder,private changedetector:ChangeDetectorRef,private dialog:NgbModal,private route:ActivatedRoute,private toast:ToastService,private router:Router,private sopService:TraxService,private gs:GlobalStateService) {\r\n }\r\n \r\n ngOnInit(): void {\r\n auditAccess(this.gs).pipe(takeUntil(this.detach)).subscribe(access => {\r\n this.access = access;\r\n this.changedetector.detectChanges();\r\n });\r\n this.initChecklist();\r\n this.setPageData();\r\n let storageDetails = JSON.parse(localStorage.getItem('header-filters') || '{}');\r\n\r\n let userInfo = JSON.parse(localStorage.getItem('user-info') || '{}')\r\n if(userInfo.userType){\r\n this.userType = userInfo.userType; \r\n } \r\n\r\n if(!storageDetails?.client) {\r\n storageDetails = JSON.parse(localStorage.getItem('client-details') || '{}');\r\n storageDetails.client = storageDetails.clientId;\r\n }\r\n if(storageDetails?.client) {\r\n this.clientId = storageDetails.client;\r\n this.route.queryParams.subscribe((params: any) => {\r\n this.editvalue = params.checklistId;\r\n this.fromAudit = true;\r\n if (params.checklistId) {\r\n this.showvalue = 'edit';\r\n } else {\r\n // Open Popup for Get Checklist Name //\r\n \r\n this.showvalue = 'add'\r\n }\r\n if (this.showvalue == 'edit' || params.type) {\r\n let obj: any = {};\r\n if (params.checklistId) {\r\n obj.checkListId = params.checklistId\r\n } else {\r\n obj.type = params.type;\r\n }\r\n obj.clientId = this.clientId;\r\n this.checklistLoading = true;\r\n this.sopService.auditGetConfig(obj).pipe(takeUntil(this.detach))\r\n .subscribe((res: any) => {\r\n if(res) {\r\n if(res.code == 200) {\r\n this.getobject = res.data.checkListDetails;\r\n this.applyTemplateOnLoad();\r\n this.formChecklistQuestions();\r\n if (this.bulkOnLoad) {\r\n // Consume the flag so a refresh does not reopen the popup.\r\n this.bulkOnLoad = false;\r\n history.replaceState({ ...history.state, bulk: false }, '');\r\n this.bulkUploadQuestion();\r\n }\r\n } else {\r\n this.checklistLoading = false;\r\n }\r\n } else {\r\n this.checklistLoading = false;\r\n }\r\n },(error) => {\r\n this.checklistLoading = false;\r\n });\r\n } else {\r\n this.initChecklist();\r\n }\r\n });\r\n }\r\n this.gs.environment.pipe(takeUntil(this.detach)).subscribe((env) => {\r\n if (env) {\r\n this.environment = env;\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.detach.next(true);\r\n this.detach.complete();\r\n }\r\n\r\n setPageData() {\r\n // An audit page: audit wording, breadcrumbs back to Audit -> Manage (not the Checklist dashboard).\r\n this.pageInfo.setTitle(\"Manage Audit\");\r\n this.pageInfo.setDescription(\"Create and edit the questions of your audit\");\r\n this.pageInfo.setBreadcrumbs([\r\n { title: \"Tango Trax\", path: \"/manage/trax/audit-v2/manage\", isActive: false, isSeparator: false },\r\n { title: \"Tango Trax\", path: \"/manage/trax/audit-v2/manage\", isActive: false, isSeparator: true }\r\n ]);\r\n }\r\n \r\n updateInputValue(sectionIndex: number,sectionName: string): void {\r\n if (sectionName.trim() === '') {\r\n this.getSectionFormControl(sectionIndex,'name')?.setValue(`Section ${sectionIndex+1}`);\r\n }\r\n }\r\n scrollToQuestion(sectionIndex: number, questionIndex: number): void {\r\n const questionId = `q-${sectionIndex}-${questionIndex}`;\r\n setTimeout(() => {\r\n const questionElement = this.formRef.nativeElement.querySelector(`#${questionId}`);\r\n \r\n if (questionElement) {\r\n questionElement.scrollIntoView({ block: 'center', behavior: 'smooth' });\r\n }\r\n }, 100);\r\n }\r\n\r\n formChecklistQuestions() { \r\n let sectionsarray: any = [];\r\n let sections: any[] = [];\r\n sectionsarray = this.getobject.sections\r\n\r\n this.maxSectionNumber = Math.max(...sectionsarray.map((ele:any) => ele.sectionNumber ));\r\n // console.log(\"this.maxSectionNumber 1=>\", this.maxSectionNumber)\r\n sectionsarray.forEach((i: any,sectionIndex: number) => {\r\n let questions: any[] = [];\r\n let sectionNumber = i?.sectionNumber || (sectionIndex + 1)\r\n i.questions.forEach((j: any,questionIndex: number) => {\r\n let answer: any[] = [];\r\n // Normalize stale data: runAI cannot be true without features. Strip the orphan flag so\r\n // the question doesn't get locked (disableRunAI) by data that can no longer be re-edited.\r\n j.answers?.forEach((k: any) => {\r\n if (k?.runAI && (!Array.isArray(k.runAIFeatures) || !k.runAIFeatures.length)) {\r\n k.runAI = false;\r\n }\r\n });\r\n if (j?.runAI && !j.answers?.some((a: any) => a?.runAI)) {\r\n j.runAI = false;\r\n }\r\n let runAI:any[] = j.answers.filter((ele:any) => ele.runAI);\r\n // console.log(\"runAI =>\", runAI)\r\n j.answers?.forEach((k: any,answerIndex: number) => {\r\n // if(typeof k?.referenceImage =='string' && k?.referenceImage != '' && k.multiReferenceImage.length) {\r\n // k.multiReferenceImage = [{imageURL:k?.referenceImage,runAI:false}]\r\n // }\r\n answer.push(\r\n this.fb.group({\r\n ...(!['image','descriptiveImage','multipleImage','linearscale','time','date','image/video'].includes(j?.answerType) && j?.answerType != 'video'? { 'answer': this.fb.control({value:k?.answer,disabled: (this.userType === 'client' ? runAI.length : false) }, [Validators.required,noWhitespaceValidator()]) } : {}),\r\n 'answeroptionNumber': this.fb.control(answerIndex),\r\n ...(!['image','descriptiveImage','multipleImage','linearscale'].includes(j?.answerType) && j?.answerType != 'video'? { 'sopFlag': this.fb.control(k?.sopFlag ? k?.sopFlag : false, [Validators.required]) } : {}),\r\n ...(!['image','descriptiveImage','multipleImage','linearscale'].includes(j?.answerType) && j?.answerType != 'video'? { 'validation': this.fb.control({value:k?.validation,disabled: (this.userType === 'client' ? runAI.length : false) }, [Validators.required]) } : {}),\r\n ...(!['image','descriptiveImage','multipleImage','linearscale'].includes(j?.answerType) && j?.answerType != 'video'? { 'validationType': this.fb.control({value:k?.validationType,disabled: (this.userType === 'client' ? runAI.length : false) }, this.allowedValuesValidator([\"Capture Image\", \"Capture Multiple Image with description\", \"Descriptive Answer\", \"Capture Video\"])) } : {}),\r\n ...(['image','descriptiveImage','multipleImage'].includes(j?.answerType) ? { \"multiReferenceImage\": this.fb.array(k?.multiReferenceImage || [] ) } : {}),\r\n ...((['image','descriptiveImage','multipleImage','image/video'].includes(j?.answerType) || j?.answerType == 'video') ? { 'allowUploadfromGallery': this.fb.control({value:j?.allowUploadfromGallery ? true : false,disabled:!!runAI.length}) } : {}),\r\n ...(['image','descriptiveImage','multipleImage','image/video'].includes(j?.answerType) ? { 'runAI': this.fb.control({value:(k?.runAI) ? k?.runAI : false,disabled: (this.userType === 'client' ? runAI.length : false) }) } : {}),\r\n ...(['multiplechoicesingle','yes/no'].includes(j?.answerType) ? { 'showLinked': this.fb.control((k?.showLinked) ? k?.showLinked : false) } : {}),\r\n ...(['multiplechoicesingle','yes/no'].includes(j?.answerType) ? { 'linkedQuestion': this.fb.control((k?.linkedQuestion) ? k?.linkedQuestion : 0) } : {}),\r\n ...(!['descriptive','image', 'descriptiveImage','multipleImage','date'].includes(j?.answerType) ? { \"multiReferenceImage\": this.fb.array(k?.multiReferenceImage || [] ) } : {}),\r\n ...((!['descriptive','image', 'descriptiveImage','video','multipleImage','date','image/video'].includes(j?.answerType)) ? { 'allowUploadfromGallery': this.fb.control({value:k?.allowUploadfromGallery ? true : false,disabled:!!runAI.length}) } : {}),\r\n ...(!['descriptive','image', 'descriptiveImage','multipleImage','date','image/video'].includes(j?.answerType) ? { 'runAI': this.fb.control({value:(k?.runAI) ? k?.runAI : false,disabled: (this.userType === 'client' ? runAI.length : false) }) } : {}),\r\n ...(!['date','linearscale','time'].includes(j?.answerType) ? { 'descriptivetype':this.fb.control(k.descriptivetype) } : {}),\r\n ...(['linearscale'].includes(j?.answerType) ? { 'rangeStart':this.fb.control(k.rangeStart),'rangeEnd':this.fb.control(k.rangeEnd),'minValue':this.fb.control(k.minValue),'maxValue':this.fb.control(k.maxValue),'linearType':this.fb.control(k.linearType) } : {}),\r\n ...(['date'].includes(j?.answerType) ? { 'historicDate':this.fb.control(k.historicDate),'startDate':this.fb.control(k.startDate),'endDate':this.fb.control(k.endDate)} : {}),\r\n referenceImage:k?.referenceImage ?? '',\r\n ...(['image/video'].includes(j?.answerType) && { 'limit':this.fb.control(k.limit),'imageLimit':this.fb.control(k.imageLimit),'videoLimit':this.fb.control(k.videoLimit)}),\r\n ...(['image','image/video','linearscale','date'].includes(j?.answerType) && { 'matchedCount':this.fb.control(parseInt(k.matchedCount)),'notMatchedCount':this.fb.control(parseInt(k.notMatchedCount))}),\r\n ...(['multiplechoicesingle','yes/no','multiplechoicemultiple'].includes(j?.answerType) ? { 'complianceScore': this.fb.control(parseInt(k?.complianceScore)) } : {}),\r\n \r\n \"runAIFeatures\":this.fb.array(k?.runAIFeatures || []),\r\n 'runAIDescription': this.fb.control(k?.runAIDescription || ''),\r\n ...(['date'].includes(j?.answerType) && {\r\n \"qnStartDate\": [{\r\n \"startDate\": this.dayjs(k.startDate,'DD-MM-YYYY'),\r\n \"endDate\": this.dayjs(k.startDate,'DD-MM-YYYY')\r\n }],\r\n \"qnEndDate\": [{\r\n \"startDate\": this.dayjs(k.endDate,'DD-MM-YYYY'),\r\n \"endDate\": this.dayjs(k.endDate,'DD-MM-YYYY')\r\n }]\r\n })\r\n }, (['linearscale'].includes(j?.answerType) ? { validators: [rangeValidator()] } : {})));\r\n });\r\n // if(typeof j.questionReferenceImage == 'string' && j.questionReferenceImage != '') {\r\n // j.multiQuestionReferenceImage = [{imageURL:j.questionReferenceImage,runAI:false}];\r\n // }\r\n questions.push(\r\n this.fb.group({\r\n \"qno\": this.fb.control(questionIndex+1),\r\n 'qname': this.fb.control({value:j?.qname,disabled:runAI.length}, [Validators.required,noWhitespaceValidator()]),\r\n 'qdescription': this.fb.control(this.savedQuestionDescription(j)),\r\n \"oldQname\":this.fb.control(j?.qname, [Validators.required,noWhitespaceValidator()]),\r\n 'answerType': this.fb.control({value:j?.answerType,disabled:runAI.length}, this.allowedValuesValidator([\"descriptive\", \"yes/no\", \"multiplechoicesingle\", \"multiplechoicemultiple\", \"image\", \"video\",\"descriptiveImage\",\"multipleImage\",'date','linearscale','time','image/video','dropdown'])),\r\n ...(!['descriptive'].includes(j?.answerType)) ? { 'answers': (['image','descriptiveImage', 'video','multipleImage','time','linearscale','date','image/video'].includes(j?.answerType)) ? answer[0] : this.fb.array(answer,[uniqueStringValidator()]) } : {},\r\n 'runAI': this.fb.control({value:(['image','descriptiveImage',\"multipleImage\",\"image/video\"].includes(j?.answerType)) ? (j?.runAI) ? true : false : false,disabled: !!runAI.length}, [Validators.required]),\r\n 'runAIDefault':this.fb.control(j?.runAI || false),\r\n 'allowUploadfromGallery': this.fb.control({value:(['image','descriptiveImage','video','multipleImage','image/video'].includes(j?.answerType)) ? (j?.allowUploadfromGallery) ? true : false : false,disabled:!!runAI.length}, [Validators.required]),\r\n // 'runAIDescription': this.fb.control((['image','descriptiveImage','multipleImage'].includes(j?.answerType)) ? (j?.runAIDescription) : ''),\r\n 'linkType': this.fb.control(j?.linkType),\r\n \"multiQuestionReferenceImage\":this.fb.array(j?.multiQuestionReferenceImage || []),\r\n // \"multiQuestionReferenceImage\": [[j?.questionReferenceImage ?? '']],\r\n 'descriptivetype': this.fb.control({ value: j?.descriptivetype,disabled:!!runAI.length}),\r\n questionReferenceImage:j?.questionReferenceImage ?? '',\r\n \"runAIFeatures\":this.fb.array(j?.runAIFeatures || []),\r\n disableRunAI:runAI.length ? true : false,\r\n 'runAIDescription': this.fb.control(j?.runAIDescription || ''),\r\n \"uniqueqno\": this.fb.control(j?.uniqueqno || 0),\r\n \"uniqueqid\": this.fb.control(j?.uniqueqid || ''),\r\n 'allowMultiple':this.fb.control(j?.allowMultiple ?? false),\r\n 'compliance':this.fb.control({\r\n value: j?.compliance ?? false,\r\n disabled: ['image','image/video'].includes(j?.answerType) ? !j?.runAI : false\r\n }),\r\n \r\n })\r\n );\r\n });\r\n sections.push(\r\n this.fb.group({\r\n \"name\": this.fb.control(i?.name, [Validators.required, Validators.minLength(1),noWhitespaceValidator()]),\r\n \"oldName\":this.fb.control(i?.name, [Validators.required, Validators.minLength(1),noWhitespaceValidator()]),\r\n \"sectionNumber\": this.fb.control(sectionNumber),\r\n \"questions\": this.fb.array(questions),\r\n \"maxQuestionNumber\": this.fb.control(i?.maxQuestionNumber || 0),\r\n }));\r\n questions = [];\r\n });\r\n\r\n this.ChecklistForm = this.fb.group({\r\n 'checklistName': this.fb.control(this.getobject.checkListName, [Validators.required,noWhitespaceValidator()]),\r\n 'checklistDescription': this.fb.control(this.getobject.checkListDescription),\r\n 'sections': this.fb.array(sections)\r\n });\r\n sectionsarray.forEach((_: any, sectionIndex: number) => {\r\n this.getobject.sections[sectionIndex]?.questions?.forEach((_: any, questionIndex: number) => {\r\n if (this.hasValidationEnabled(sectionIndex, questionIndex)) {\r\n ((((this.ChecklistForm.get('sections') as FormArray).at(sectionIndex) as FormGroup).get('questions') as FormArray).at(questionIndex) as FormGroup)?.get('compliance')?.patchValue(false);\r\n ((((this.ChecklistForm.get('sections') as FormArray).at(sectionIndex) as FormGroup).get('questions') as FormArray).at(questionIndex) as FormGroup)?.get('compliance')?.disable({ emitEvent: false });\r\n }\r\n });\r\n });\r\n this.lockNotApplicableComplianceScores();\r\n this.hydrateAutoTaskState();\r\n this.ChecklistForm.updateValueAndValidity();\r\n this.checklistLoading = false;\r\n\r\n console.log(this.ChecklistForm.value)\r\n\r\n // console.log(this.ChecklistForm,'form');\r\n }\r\n\r\n initChecklist() {\r\n this.ChecklistForm = this.fb.group({\r\n 'checklistName': this.fb.control('', [Validators.required,noWhitespaceValidator()]),\r\n 'checklistDescription': this.fb.control(''),\r\n 'sections': this.fb.array([\r\n this.fb.group({\r\n \"name\": this.fb.control('Section 1', [Validators.required,Validators.minLength(1),noWhitespaceValidator()]),\r\n \"sectionNumber\": this.fb.control(1, [Validators.required]),\r\n \"questions\": this.fb.array([\r\n this.fb.group({\r\n \"qno\": this.fb.control(1, [Validators.required]),\r\n 'qname': this.fb.control('', [Validators.required,noWhitespaceValidator()]),\r\n 'qdescription': this.fb.control(''),\r\n 'answerType': this.fb.control('descriptive',\r\n this.allowedValuesValidator([\"descriptive\", \"yes/no\", \"multiplechoicesingle\", \"multiplechoicemultiple\",\"descriptiveImage\", \"image\", \"video\",'multipleImage','date','linearscale','time','image/video','dropdown'])),\r\n 'runAI': this.fb.control(false, [Validators.required]),\r\n 'runAIDescription': this.fb.control(''),\r\n 'allowUploadfromGallery': this.fb.control(false, [Validators.required]),\r\n 'linkType': this.fb.control(false, [Validators.required]),\r\n \"multiQuestionReferenceImage\":this.fb.array([]),\r\n 'descriptivetype':this.fb.control('text'),\r\n 'questionReferenceImage':this.fb.control(''), \r\n \"runAIFeatures\":this.fb.array([]),\r\n \"uniqueqno\": this.fb.control(0),\r\n \"uniqueqid\": this.fb.control(''),\r\n 'allowMultiple':this.fb.control(false),\r\n 'compliance':this.fb.control(false),\r\n })\r\n ]),\r\n \"maxQuestionNumber\": this.fb.control(0),\r\n })\r\n ])\r\n });\r\n this.checklistLoading = false;\r\n }\r\n\r\n allowedValuesValidator(allowedValues: string[]) {\r\n return (control: any) => {\r\n const value = control.value;\r\n if (value && allowedValues.indexOf(value) === -1) {\r\n return { invalidValue: true };\r\n }\r\n return null;\r\n };\r\n }\r\n\r\n addNewSection() {\r\n let sections = this.ChecklistForm.get('sections') as FormArray;\r\n let sectionLength = sections.length;\r\n if(this.maxSectionNumber){\r\n this.maxSectionNumber++;\r\n }else{\r\n this.maxSectionNumber = Math.max(...sections.value.map((ele:any) => ele.sectionNumber ))+1;\r\n }\r\n // console.log(\"this.maxSectionNumber =>\", this.maxSectionNumber);\r\n\r\n (this.ChecklistForm.get('sections') as FormArray).push(\r\n this.fb.group({\r\n \"name\": this.fb.control(`Section ${sectionLength + 1}`, [Validators.required,Validators.minLength(1),noWhitespaceValidator()]),\r\n \"sectionNumber\": this.fb.control(this.maxSectionNumber, [Validators.required]),\r\n // \"sectionNumber\": this.fb.control(findSecNum + 1, [Validators.required]),\r\n \"questions\": this.fb.array([\r\n this.fb.group({\r\n \"qno\": this.fb.control(1, [Validators.required]),\r\n 'qname': this.fb.control('', [Validators.required,noWhitespaceValidator()]),\r\n 'qdescription': this.fb.control(''),\r\n 'answerType': this.fb.control('descriptive',\r\n this.allowedValuesValidator([\"descriptive\", \"yes/no\", \"multiplechoicesingle\", \"multiplechoicemultiple\",\"descriptiveImage\", \"image\", \"video\",'multipleImage','date','linearscale','time','image/video','dropdown'])),\r\n 'runAI': this.fb.control(false, [Validators.required]),\r\n 'runAIDescription': this.fb.control(''),\r\n 'allowUploadfromGallery': this.fb.control(false, [Validators.required]),\r\n 'linkType': this.fb.control(false, [Validators.required]),\r\n \"multiQuestionReferenceImage\":this.fb.array([]),\r\n 'descriptivetype':this.fb.control('text'),\r\n 'questionReferenceImage':this.fb.control(''),\r\n 'runAIFeatures':this.fb.array([]), \r\n \"uniqueqno\": this.fb.control(0),\r\n \"uniqueqid\": this.fb.control(''),\r\n 'allowMultiple':this.fb.control(false),\r\n 'compliance':this.fb.control(false)\r\n })\r\n ]),\r\n \"maxQuestionNumber\": this.fb.control(0),\r\n })\r\n );\r\n if(sectionLength == 0) {\r\n this.show = -1;\r\n }\r\n this.accordian(sectionLength);\r\n this.swalToast('New section added!');\r\n }\r\n\r\n removeSection(sectionIndex: number) {\r\n (this.ChecklistForm.get('sections') as FormArray).removeAt(sectionIndex);\r\n }\r\n\r\n dragDrop(sectionIndex: any, event: CdkDragDrop<any[]>) {\r\n if (event.previousContainer === event.container) {\r\n moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\r\n // this.updatelinkedQuestionNo(sectionIndex,event.previousIndex,event.currentIndex)\r\n this.updateQuestionQnos(sectionIndex);\r\n } else {\r\n transferArrayItem(\r\n event.previousContainer.data,\r\n event.container.data,\r\n event.previousIndex,\r\n event.currentIndex\r\n );\r\n }\r\n }\r\n\r\n updatelinkedQuestionNo(secIdx:number,prevIdx:number,qnIdx:number) {\r\n let questions = (this.getSectionFormArray().at(secIdx).get('questions') as FormArray);\r\n for(let i=0;i<questions.length-1;i++) {\r\n let answers = ((questions.at(i) as FormGroup).get('answers') as FormArray);\r\n for(let j=0;j<answers?.length -1;j++) {\r\n let linked = (answers.at(j) as FormGroup).get('showLinked')?.value;\r\n if(linked) {\r\n let linkedNo = (answers.at(j) as FormGroup).get('linkedQuestion')?.value;\r\n if(linkedNo == prevIdx + 1) {\r\n (answers.at(j) as FormGroup).get('linkedQuestion')?.setValue(qnIdx + 1);\r\n }\r\n else if(linkedNo <= qnIdx + 1) {\r\n (answers.at(j) as FormGroup).get('linkedQuestion')?.setValue(linkedNo - 1);\r\n }\r\n\r\n }\r\n\r\n }\r\n }\r\n\r\n }\r\n\r\n answerTypeSelection(sectionIndex: any, questionIndex: any, event: any) {\r\n let selectvalue: string = event.target.value;\r\n \r\n (((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(sectionIndex) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(questionIndex) as FormGroup).get(\"multiQuestionReferenceImage\") as FormArray)?.clear();\r\n if(!['descriptive','multipleImage'].includes(selectvalue)) {\r\n ((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(sectionIndex) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(questionIndex) as FormGroup).get('descriptivetype')?.setValue('');\r\n }\r\n else {\r\n ((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(sectionIndex) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(questionIndex) as FormGroup).get('descriptivetype')?.setValue('text');\r\n }\r\n ((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(sectionIndex) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(questionIndex) as FormGroup).get('compliance')?.setValue(false);\r\n this.removeQuestionLinked(sectionIndex,questionIndex);\r\n if (['yes/no','multiplechoicesingle','multiplechoicemultiple','dropdown'].includes(selectvalue)) {\r\n this.setAnswerAsFormArray(sectionIndex, questionIndex,selectvalue);\r\n } else if (selectvalue == 'descriptive') {\r\n // A Descriptive question has no answers control (as when loaded or added). Drop the previous type's one:\r\n // its hidden options (e.g. blank Multiple Choice answers, which are required) would keep the form invalid.\r\n ((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(sectionIndex) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(questionIndex) as FormGroup).removeControl('answers');\r\n } else if (['descriptiveImage','image','video','multipleImage',,'image/video'].includes(selectvalue)) {\r\n this.setAnswerAsFormGroup(sectionIndex, questionIndex, selectvalue);\r\n } else if (['date','time','linearscale'].includes(selectvalue)) { \r\n this.setAnswerAsTime(sectionIndex, questionIndex, selectvalue);\r\n }\r\n }\r\n\r\n setAnswerAsTime(secIdx:number,qnIdx:number,type:string) {\r\n let question = ((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(secIdx) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(qnIdx) as FormGroup);\r\n if(type == 'time') {\r\n question.setControl('answers',\r\n this.fb.group({\r\n 'answer': this.fb.control(''),\r\n 'answeroptionNumber': this.fb.control(1),\r\n 'sopFlag': this.fb.control(false),\r\n 'validation': this.fb.control(false),\r\n 'validationType': this.fb.control(''),\r\n 'linkedQuestion':this.fb.control(0),\r\n 'showLinked':this.fb.control(false),\r\n \"multiReferenceImage\": this.fb.array([]),\r\n 'runAI': this.fb.control(false),\r\n 'allowUploadfromGallery': this.fb.control(false),\r\n 'descriptivetype':this.fb.control(''),\r\n 'runAIFeatures':this.fb.array([]),\r\n 'runAIDescription': this.fb.control(''),\r\n }),\r\n );\r\n } else if(type == 'linearscale') {\r\n const answersGroup = this.fb.group({\r\n 'answer': this.fb.control(''),\r\n 'answeroptionNumber': this.fb.control(1),\r\n 'sopFlag': this.fb.control(false),\r\n 'validation': this.fb.control(false),\r\n 'validationType': this.fb.control(''),\r\n 'linkedQuestion':this.fb.control(0),\r\n 'showLinked':this.fb.control(false),\r\n \"multiReferenceImage\": this.fb.array([]),\r\n 'runAI': this.fb.control(false),\r\n 'allowUploadfromGallery': this.fb.control(false),\r\n 'descriptivetype':this.fb.control('number'),\r\n 'rangeStart':this.fb.control(0),\r\n 'rangeEnd':this.fb.control(100),\r\n 'runAIFeatures':this.fb.array([]),\r\n 'runAIDescription': this.fb.control(''),\r\n 'linearType':this.fb.control('number'),\r\n 'minValue':this.fb.control(0),\r\n 'maxValue':this.fb.control(100),\r\n 'matchedCount':this.fb.control(0),\r\n 'notMatchedCount':this.fb.control(0),\r\n }, { validators: rangeValidator() });\r\n question.setControl('answers', answersGroup);\r\n } else {\r\n question.setControl('answers',\r\n this.fb.group({\r\n 'answer': this.fb.control(''),\r\n 'answeroptionNumber': this.fb.control(1),\r\n 'sopFlag': this.fb.control(false),\r\n 'validation': this.fb.control(false),\r\n 'validationType': this.fb.control(''),\r\n 'linkedQuestion':this.fb.control(0),\r\n 'showLinked':this.fb.control(false),\r\n \"multiReferenceImage\": this.fb.array([]),\r\n 'runAI': this.fb.control(false),\r\n 'allowUploadfromGallery': this.fb.control(false),\r\n 'historicDate': this.fb.control(false),\r\n 'descriptivetype':this.fb.control('number'),\r\n 'runAIFeatures':this.fb.array([]),\r\n 'runAIDescription': this.fb.control(''),\r\n 'startDate': this.fb.control(this.dayjs().format('DD-MM-YYYY')),\r\n 'endDate': this.fb.control(this.dayjs().format('DD-MM-YYYY')),\r\n 'matchedCount':this.fb.control(0),\r\n 'notMatchedCount':this.fb.control(0),\r\n // The range pickers show the default range (today) that startDate / endDate hold.\r\n 'qnStartDate': this.fb.control(this.pickerDate(this.dayjs().format('DD-MM-YYYY'))),\r\n 'qnEndDate': this.fb.control(this.pickerDate(this.dayjs().format('DD-MM-YYYY'))),\r\n }),\r\n );\r\n }\r\n \r\n \r\n\r\n // console.log(question);\r\n \r\n }\r\n\r\n removeQuestionLinked(secIdx:any,qnIdx:any) {\r\n let answers = (((this.getSectionFormArray().at(secIdx).get('questions') as FormArray).at(qnIdx) as FormGroup).get('answers') as FormArray);\r\n if(answers) {\r\n for(let i=0;i<answers.length;i++){\r\n let qn = (answers.at(i) as FormGroup).get('linkedQuestion')?.value;\r\n if(qn) {\r\n ((this.getSectionFormArray().at(secIdx).get('questions') as FormArray).at(qn - 1) as FormGroup).get('linkType')?.setValue(false);\r\n }\r\n \r\n }\r\n }\r\n }\r\n\r\n updateValidationType(event:any,section:number,question:number,answer:number) {\r\n let questionInfo = ((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(section) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(question) as FormGroup).get('compliance')?.value;\r\n let answers = (((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(section) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(question) as FormGroup).get('answers') as FormArray)?.value;\r\n // if(!answers.some((ele:any) => ele.runAI) && questionInfo) {\r\n // const dialogRef = this.dialog.open(TraxpopupComponent,{centered: true, size: 'md'});\r\n // dialogRef.componentInstance.data = {\r\n // imagesrc: `<span><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\">\r\n // <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#FEF0C7\"/>\r\n // <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#FFFAEB\" stroke-width=\"8\"/>\r\n // <path d=\"M27.9988 24.0012V28.0012M27.9988 32.0012H28.0088M26.2888 18.8612L17.8188 33.0012C17.6442 33.3036 17.5518 33.6465 17.5508 33.9957C17.5498 34.3449 17.6403 34.6883 17.8132 34.9917C17.9862 35.2951 18.2355 35.5479 18.5365 35.725C18.8375 35.9021 19.1796 35.9973 19.5288 36.0012H36.4688C36.818 35.9973 37.1601 35.9021 37.4611 35.725C37.7621 35.5479 38.0114 35.2951 38.1844 34.9917C38.3573 34.6883 38.4478 34.3449 38.4468 33.9957C38.4458 33.6465 38.3534 33.3036 38.1788 33.0012L29.7088 18.8612C29.5305 18.5673 29.2795 18.3243 28.98 18.1557C28.6805 17.987 28.3425 17.8984 27.9988 17.8984C27.6551 17.8984 27.3171 17.987 27.0176 18.1557C26.7181 18.3243 26.4671 18.5673 26.2888 18.8612Z\" stroke=\"#DC6803\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n // </svg></span>`,\r\n // title: `Disabling Compliance Score`,\r\n // content: `By clicking and enable the validate response, the compliance score configured will be disabled since it works only for Capture Image with Run AI enabled. Are you sure to proceed?`,\r\n // buttontype: \"compliance\",\r\n // };\r\n // dialogRef.result.then((res) => {\r\n // if(res == 'confirm') {\r\n // ((((this.ChecklistForm.get('sections') as FormArray).at(section) as FormGroup).get('questions') as FormArray).at(question) as FormGroup)?.get('compliance')?.patchValue(false);\r\n // ((((this.ChecklistForm.get('sections') as FormArray).at(section) as FormGroup).get('questions') as FormArray).at(question) as FormGroup)?.get('compliance')?.disable({emitEvent:false});\r\n // ((((this.ChecklistForm.get('sections') as FormArray).at(section) as FormGroup).get('questions') as FormArray).at(question) as FormGroup)?.get('complianceScore')?.patchValue(0);\r\n // }\r\n // });\r\n // }\r\n // if(answers.some((ele:any) => ele.runAI) && !this.hasValidationEnabled(section, question)) {\r\n // ((((this.ChecklistForm.get('sections') as FormArray).at(section) as FormGroup).get('questions') as FormArray).at(question) as FormGroup)?.get('compliance')?.enable();\r\n // }\r\n const answerGroup = ((((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(section) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(question) as FormGroup).get('answers') as FormArray).at(answer) as FormGroup);\r\n const validationTypeValue = answerGroup.get('validationType')?.value;\r\n if(validationTypeValue === 'Descriptive Answer') {\r\n answerGroup.get('descriptivetype')?.setValue('text');\r\n }\r\n ((((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(section) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(question) as FormGroup).get('answers') as FormArray).at(answer) as FormGroup).get('allowUploadfromGallery')?.setValue(false);\r\n ((((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(section) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(question) as FormGroup).get('answers') as FormArray).at(answer) as FormGroup).get('runAI')?.setValue(false);\r\n ((((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(section) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(question) as FormGroup).get('answers') as FormArray).at(answer) as FormGroup).get('runAIDescription')?.setValue('');\r\n (((((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(section) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(question) as FormGroup).get('answers') as FormArray).at(answer) as FormGroup).get('runAIFeatures') as FormArray)?.clear();\r\n (((((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(section) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(question) as FormGroup).get('answers') as FormArray).at(answer) as FormGroup).get('multiReferenceImage') as FormArray)?.clear();\r\n }\r\n\r\n setAnswerAsFormArray(sectionIndex: number, questionIndex: number,selectvalue: string) {\r\n let question = ((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(sectionIndex) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(questionIndex) as FormGroup);\r\n \r\n if (selectvalue == 'yes/no') {\r\n question.setControl('answers',\r\n this.fb.array([\r\n this.fb.group({\r\n 'answer': this.fb.control('Yes', [Validators.required,noWhitespaceValidator()]),\r\n 'answeroptionNumber': this.fb.control(1),\r\n 'sopFlag': this.fb.control(false, [Validators.required]),\r\n // 'linkQuestion':this.fb.control(false,[Validators.required]),\r\n // 'answerInputStyle': this.fb.control('radio',[Validators.required]),\r\n 'validation': this.fb.control(false, [Validators.required]),\r\n 'validationType': this.fb.control('Capture Image', this.allowedValuesValidator([\"Capture Image\", \"Capture Multiple Image with description\", \"Descriptive Answer\",\"Capture Video\"])),\r\n 'linkedQuestion':this.fb.control(0, [Validators.required]),\r\n 'showLinked':this.fb.control(false, [Validators.required]),\r\n \"multiReferenceImage\": this.fb.array([]),\r\n 'runAI': this.fb.control(false),\r\n 'allowUploadfromGallery': this.fb.control(false),\r\n 'descriptivetype':this.fb.control(''),\r\n \"referenceImage\":this.fb.control(''), \r\n \"runAIFeatures\":this.fb.array([]),\r\n 'runAIDescription': this.fb.control(''),\r\n 'complianceScore':this.fb.control(0)\r\n }),\r\n this.fb.group({\r\n 'answer': this.fb.control('No', [Validators.required,noWhitespaceValidator()]),\r\n 'answeroptionNumber': this.fb.control(2),\r\n 'sopFlag': this.fb.control(false, [Validators.required]),\r\n 'validation': this.fb.control(false, [Validators.required]),\r\n 'validationType': this.fb.control('Capture Image', this.allowedValuesValidator([\"Capture Image\", \"Capture Multiple Image with description\", \"Descriptive Answer\",\"Capture Video\"])),\r\n 'linkedQuestion':this.fb.control(0, [Validators.required]),\r\n 'showLinked':this.fb.control(false, [Validators.required]),\r\n \"multiReferenceImage\": this.fb.array([]),\r\n 'runAI': this.fb.control(false),\r\n 'allowUploadfromGallery': this.fb.control(false),\r\n 'descriptivetype':this.fb.control(''),\r\n \"referenceImage\":this.fb.control(''), \r\n \"runAIFeatures\":this.fb.array([]),\r\n 'runAIDescription': this.fb.control(''),\r\n 'complianceScore':this.fb.control(0)\r\n })\r\n ],uniqueStringValidator())\r\n );\r\n } else {\r\n let validationValue = \"Capture Image\";\r\n if(selectvalue == 'multiplechoicesingle') {\r\n validationValue = \"Capture Multiple Image with description\"\r\n }\r\n question.setControl(\r\n \"answers\",\r\n this.fb.array(\r\n [\r\n this.fb.group({\r\n answer: this.fb.control(\"\", [\r\n Validators.required,\r\n noWhitespaceValidator(),\r\n ]),\r\n answeroptionNumber: this.fb.control(1),\r\n sopFlag: this.fb.control(false, [Validators.required]),\r\n validation: this.fb.control(false, [Validators.required]),\r\n validationType: this.fb.control(\r\n validationValue,\r\n this.allowedValuesValidator([\r\n \"Capture Image\",\r\n \"Capture Multiple Image with description\",\r\n \"Descriptive Answer\",\r\n \"Capture Video\",\r\n ]),\r\n ),\r\n ...(selectvalue == \"multiplechoicesingle\"\r\n ? {\r\n linkedQuestion: this.fb.control(0, [Validators.required]),\r\n showLinked: this.fb.control(false, [Validators.required]),\r\n }\r\n : {}),\r\n multiReferenceImage: this.fb.array([]),\r\n runAI: this.fb.control(false),\r\n allowUploadfromGallery: this.fb.control(false),\r\n descriptivetype: this.fb.control(\"\"),\r\n referenceImage: this.fb.control(\"\"),\r\n runAIFeatures: this.fb.array([]),\r\n runAIDescription: this.fb.control(\"\"),\r\n complianceScore: this.fb.control(0),\r\n }),\r\n this.fb.group({\r\n answer: this.fb.control(\"\", [\r\n Validators.required,\r\n noWhitespaceValidator(),\r\n ]),\r\n answeroptionNumber: this.fb.control(1),\r\n sopFlag: this.fb.control(false, [Validators.required]),\r\n validation: this.fb.control(false, [Validators.required]),\r\n validationType: this.fb.control(\r\n validationValue,\r\n this.allowedValuesValidator([\r\n \"Capture Image\",\r\n \"Capture Multiple Image with description\",\r\n \"Descriptive Answer\",\r\n \"Capture Video\",\r\n ]),\r\n ),\r\n ...(selectvalue == \"multiplechoicesingle\"\r\n ? {\r\n linkedQuestion: this.fb.control(0, [Validators.required]),\r\n showLinked: this.fb.control(false, [Validators.required]),\r\n }\r\n : {}),\r\n multiReferenceImage: this.fb.array([]),\r\n runAI: this.fb.control(false),\r\n allowUploadfromGallery: this.fb.control(false),\r\n descriptivetype: this.fb.control(\"\"),\r\n referenceImage: this.fb.control(\"\"),\r\n runAIFeatures: this.fb.array([]),\r\n runAIDescription: this.fb.control(\"\"),\r\n complianceScore: this.fb.control(0),\r\n }),\r\n ],\r\n uniqueStringValidator(),\r\n ),\r\n );\r\n }\r\n this.ChecklistForm.updateValueAndValidity();\r\n }\r\n\r\n setAnswerAsFormGroup(sectionIndex: number, questionIndex: number, answerType: string) {\r\n let question = ((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(sectionIndex) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(questionIndex) as FormGroup)\r\n if (['image', 'descriptiveImage','multipleImage','image/video'].includes(answerType)) {\r\n if(['image','image/video'].includes(answerType)) {\r\n question.get('compliance')?.disable({ emitEvent: false });\r\n }\r\n ((((this.ChecklistForm.get('sections') as FormArray).at(sectionIndex) as FormGroup)\r\n .get('questions') as FormArray).at(questionIndex) as FormGroup)\r\n .setControl('answers', \r\n this.fb.group({\r\n \"multiReferenceImage\": this.fb.array([]),\r\n \"referenceImage\":this.fb.control(''),\r\n 'runAI': this.fb.control(false),\r\n 'allowUploadfromGallery': this.fb.control(false),\r\n ...(answerType == 'multipleImage' ? {'descriptivetype':this.fb.control('text')}:{}),\r\n \"runAIFeatures\":this.fb.array([]),\r\n 'runAIDescription': this.fb.control(''),\r\n ...(answerType == 'image/video' && {limit:this.fb.control(false),videoLimit:this.fb.control(1),imageLimit:this.fb.control(1)}),\r\n ...(['image','image/video'].includes(answerType) && {matchedCount:this.fb.control(0),notMatchedCount:this.fb.control(0)})\r\n }));\r\n } else {\r\n question.setControl('answers', this.fb.group({\r\n 'allowUploadfromGallery': this.fb.control(false),\r\n })\r\n )\r\n }\r\n this.ChecklistForm.updateValueAndValidity();\r\n }\r\n\r\n loadImageFromDevice(secIdx: number,qIdx: number,event: any,ansIdx:number=-1,ctrlName:string = '',imgIdx:number=-1) {\r\n if (event.target.files != undefined && event.target.files.length) {\r\n }\r\n const input = event.target as HTMLInputElement;\r\n let formData = new FormData();\r\n let file: File = event.target.files[0];\r\n formData.append('file', file, file.name);\r\n formData.append('clientId',this.clientId)\r\n this.sopService.imageupload(formData).pipe(takeUntil(this.detach)).subscribe((res: any) => {\r\n input.value = '';\r\n const sections = this.ChecklistForm.get('sections') as FormArray | null;\r\n if (!sections) return null;\r\n \r\n const section = sections.at(secIdx) as FormGroup | null;\r\n if (!section) return null;\r\n \r\n const questions = section.get('questions') as FormArray | null;\r\n if (!questions) return null;\r\n \r\n const question = questions.at(qIdx) as FormGroup | null;\r\n\r\n if (!question) return null;\r\n if(ctrlName) {\r\n let refImages;\r\n if(ctrlName == \"multiQuestionReferenceImage\") {\r\n refImages = question.get(ctrlName) as FormArray;\r\n }\r\n else {\r\n let answers\r\n if(ansIdx != -1) {\r\n answers = ((question.get('answers') as FormArray).at(ansIdx) as FormGroup); \r\n }\r\n else {\r\n answers = question.get('answers') as FormGroup;\r\n }\r\n refImages = answers?.get(\"multiReferenceImage\") as FormArray;\r\n }\r\n if(refImages) {\r\n if(imgIdx != -1) {\r\n (refImages?.at(imgIdx) as FormGroup)?.setValue({imageURL:res.data.imgUrl,runAI:false})\r\n }\r\n else {\r\n refImages?.push(this.fb.group({imageURL:res.data.imgUrl,runAI:false}))\r\n }\r\n }\r\n }\r\n else{\r\n this.getAnswerFormGroup_FormControl(secIdx,qIdx,\"multiReferenceImage\",ansIdx)?.setValue(res.data.imgUrl);\r\n }\r\n \r\n this.ChecklistForm.updateValueAndValidity();\r\n this.changedetector.detectChanges(); \r\n })\r\n }\r\n\r\n clearReferenceImage(secIdx: number,qIdx: number,ansIdx:number=-1,imageIndex:number=-1,ctrlName:string=\"\") {\r\n // this.getAnswerFormGroup_FormControl(secIdx,qIdx,\"referenceImage\",ansIdx)?.setValue('');\r\n // this.getAnswerFormGroup_FormControl(secIdx,qIdx,'runAI',ansIdx)?.setValue(false);\r\n const sections = this.ChecklistForm.get('sections') as FormArray | null;\r\n if (!sections) return null;\r\n \r\n const section = sections.at(secIdx) as FormGroup | null;\r\n if (!section) return null;\r\n \r\n const questions = section.get('questions') as FormArray | null;\r\n if (!questions) return null;\r\n \r\n const question = questions.at(qIdx) as FormGroup | null;\r\n if (!question) return null;\r\n if(imageIndex != -1 && ctrlName) {\r\n let refImages;\r\n if(ctrlName == \"multiQuestionReferenceImage\") {\r\n refImages = question.get(ctrlName) as FormArray;\r\n }\r\n else {\r\n let answers;\r\n if(ansIdx != -1) {\r\n answers = ((question.get('answers') as FormArray).at(ansIdx) as FormGroup)\r\n }\r\n else {\r\n answers = question.get('answers') as FormGroup;\r\n }\r\n refImages = answers.get(ctrlName) as FormArray;\r\n }\r\n refImages.removeAt(imageIndex);\r\n\r\n }\r\n else {\r\n (question.get(\"multiReferenceImage\") as FormArray)?.clear();\r\n (question.get(\"multiQuestionReferenceImage\") as FormArray)?.clear();\r\n }\r\n }\r\n\r\n getvalidation(sectionIndex: any, questionIndex: any, addmoreqnIndex: any, event: any) {\r\n ((((((this.ChecklistForm.get('sections') as FormArray).at(sectionIndex) as FormGroup).get('questions') as FormArray).at(questionIndex) as FormGroup).get('answers') as FormArray).at(addmoreqnIndex) as FormGroup).get('validation')?.setValue(event.target.checked);\r\n if(!event.target.checked) {\r\n this.runAIOff(sectionIndex, questionIndex, false, addmoreqnIndex);\r\n (((((((this.ChecklistForm.get('sections') as FormArray).at(sectionIndex) as FormGroup).get('questions') as FormArray).at(questionIndex) as FormGroup).get('answers') as FormArray).at(addmoreqnIndex) as FormGroup).get('multiReferenceImage') as FormArray).clear();\r\n ((((((this.ChecklistForm.get('sections') as FormArray).at(sectionIndex) as FormGroup).get('questions') as FormArray).at(questionIndex) as FormGroup).get('answers') as FormArray).at(addmoreqnIndex) as FormGroup).get('runAIDescription')?.setValue('');\r\n }\r\n // let answers = (((((this.ChecklistForm.get('sections') as FormArray).at(sectionIndex) as FormGroup).get('questions') as FormArray).at(questionIndex) as FormGroup).get('answers') as FormArray).value;\r\n // let compliance = ((((this.ChecklistForm.get('sections') as FormArray).at(sectionIndex) as FormGroup).get('questions') as FormArray).at(questionIndex) as FormGroup)?.get('compliance')?.value;\r\n // if(!answers.some((ele:any) => ele.runAI) && compliance) {\r\n // const dialogRef = this.dialog.open(TraxpopupComponent,{centered: true, size: 'md'});\r\n // dialogRef.componentInstance.data = {\r\n // imagesrc: `<span><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\">\r\n // <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#FEF0C7\"/>\r\n // <rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#FFFAEB\" stroke-width=\"8\"/>\r\n // <path d=\"M27.9988 24.0012V28.0012M27.9988 32.0012H28.0088M26.2888 18.8612L17.8188 33.0012C17.6442 33.3036 17.5518 33.6465 17.5508 33.9957C17.5498 34.3449 17.6403 34.6883 17.8132 34.9917C17.9862 35.2951 18.2355 35.5479 18.5365 35.725C18.8375 35.9021 19.1796 35.9973 19.5288 36.0012H36.4688C36.818 35.9973 37.1601 35.9021 37.4611 35.725C37.7621 35.5479 38.0114 35.2951 38.1844 34.9917C38.3573 34.6883 38.4478 34.3449 38.4468 33.9957C38.4458 33.6465 38.3534 33.3036 38.1788 33.0012L29.7088 18.8612C29.5305 18.5673 29.2795 18.3243 28.98 18.1557C28.6805 17.987 28.3425 17.8984 27.9988 17.8984C27.6551 17.8984 27.3171 17.987 27.0176 18.1557C26.7181 18.3243 26.4671 18.5673 26.2888 18.8612Z\" stroke=\"#DC6803\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n // </svg></span>`,\r\n // title: `Disabling Compliance Score`,\r\n // content: `By clicking and enable the validate response, the compliance score configured will be disabled since it works only for Capture Image with Run AI enabled. Are you sure to proceed?`,\r\n // buttontype: \"compliance\",\r\n // };\r\n // dialogRef.result.then((res) => {\r\n // if(res == 'confirm') {\r\n // ((((this.ChecklistForm.get('sections') as FormArray).at(sectionIndex) as FormGroup).get('questions') as FormArray).at(questionIndex) as FormGroup)?.get('compliance')?.patchValue(false);\r\n // ((((this.ChecklistForm.get('sections') as FormArray).at(sectionIndex) as FormGroup).get('questions') as FormArray).at(questionIndex) as FormGroup)?.get('compliance')?.disable({emitEvent:false});\r\n // ((((this.ChecklistForm.get('sections') as FormArray).at(sectionIndex) as FormGroup).get('questions') as FormArray).at(questionIndex) as FormGroup)?.get('complianceScore')?.patchValue(0);\r\n // }\r\n // else {\r\n // ((((((this.ChecklistForm.get('sections') as FormArray).at(sectionIndex) as FormGroup).get('questions') as FormArray).at(questionIndex) as FormGroup).get('answers') as FormArray).at(addmoreqnIndex) as FormGroup).get('validation')?.setValue(false);\r\n // }\r\n // });\r\n\r\n // }\r\n // if(!answers.some((ele:any) => ele.runAI) && !compliance) {\r\n // if(event.target.checked) {\r\n // ((((this.ChecklistForm.get('sections') as FormArray).at(sectionIndex) as FormGroup).get('questions') as FormArray).at(questionIndex) as FormGroup)?.get('compliance')?.disable({emitEvent:false})\r\n // }\r\n // else if(!answers.some((ele:any) => ele.validation)) {\r\n // ((((this.ChecklistForm.get('sections') as FormArray).at(sectionIndex) as FormGroup).get('questions') as FormArray).at(questionIndex) as FormGroup)?.get('compliance')?.enable({emitEvent:false})\r\n // }\r\n // }\r\n }\r\n\r\n addNewQuestion(sectionIndex: number) {\r\n const sectionList = this.ChecklistForm.get('sections') as FormArray;\r\n if (!(sectionIndex >= 0 && sectionIndex < (sectionList?.length || 0))) {\r\n // No open section (all collapsed, or the open one was deleted): add to the last section and open it.\r\n if (!sectionList?.length) {\r\n this.swalToast('Please add a section first!', 'error');\r\n return;\r\n }\r\n sectionIndex = sectionList.length - 1;\r\n this.show = sectionIndex;\r\n this.sectionIndex = sectionIndex;\r\n }\r\n if (this.sectionIndex > -1) {\r\n if (!(((this.ChecklistForm.get('sections') as FormArray).at(sectionIndex) as FormGroup).get('questions'))) {\r\n ((this.ChecklistForm.get('sections') as FormArray).at(sectionIndex) as FormGroup).setControl('questions', this.fb.array([]));\r\n }\r\n let questions = (((this.ChecklistForm.get('sections') as FormArray).at(sectionIndex) as FormGroup).get('questions') as FormArray);\r\n\r\n let questionsLength = questions.length;\r\n questions.push(this.fb.group({\r\n \"qno\": this.fb.control(questionsLength + 1,),\r\n 'qname': this.fb.control('', [Validators.required,noWhitespaceValidator()]),\r\n 'qdescription': this.fb.control(''),\r\n 'answerType': this.fb.control('descriptive',\r\n this.allowedValuesValidator([\"descriptive\", \"yes/no\", \"multiplechoicesingle\", \"multiplechoicemultiple\",\"descriptiveImage\", \"image\", \"video\",'multipleImage','date','linearscale','time','image/video','dropdown'])),\r\n 'runAI': this.fb.control(false, [Validators.required]),\r\n 'runAIDescription': this.fb.control(''),\r\n 'allowUploadfromGallery': this.fb.control(false, [Validators.required]),\r\n 'linkType': this.fb.control(false, [Validators.required]),\r\n \"multiQuestionReferenceImage\":this.fb.array([]),\r\n 'descriptivetype':this.fb.control('text'),\r\n 'questionReferenceImage':this.fb.control(''),\r\n \"runAIFeatures\":this.fb.array([]), \r\n \"uniqueqno\": this.fb.control(0),\r\n \"uniqueqid\": this.fb.control(''),\r\n \"allowMultiple\":this.fb.control(false),\r\n 'compliance':this.fb.control(false)\r\n })); \r\n this.changedetector.detectChanges();\r\n this.swalToast('New question added!');\r\n setTimeout(()=> {\r\n this.scrollToQuestion(sectionIndex,questionsLength);\r\n },100);\r\n }\r\n }\r\n\r\n deleteQuestion(sectionIndex: any, questionIndex: any) {\r\n this.deletedList = [];\r\n let question = this.getQuestionFormControl(sectionIndex, questionIndex, 'qname')?.value || '';\r\n let qno = this.getQuestionFormControl(sectionIndex, questionIndex, 'qno')?.value;\r\n question = question ? question : `Question ${this.getQuestionFormControl(sectionIndex, questionIndex, 'qno')?.value || ''}`;\r\n question = question.length > 20 ? question.slice(0,20) + '...' : question;\r\n const dialogRef = this.dialog.open(TraxpopupComponent,{centered: true, size: 'md'});\r\n dialogRef.componentInstance.data = {\r\n imagesrc: `<span><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\"><rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#FEE4E2\"/><path d=\"M28 24V28M28 32H28.01M38 28C38 33.5228 33.5228 38 28 38C22.4772 38 18 33.5228 18 28C18 22.4772 22.4772 18 28 18C33.5228 18 38 22.4772 38 28Z\" stroke=\"#D92D20\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#FEF3F2\" stroke-width=\"8\"/></svg></span>`,\r\n title: `Delete '${question}'?`,\r\n content: `Are you sure you want to delete <b>'${question}'</b>? This action cannot be undone.`,\r\n buttontype: 'delete'\r\n }\r\n dialogRef.result.then((res) => {\r\n if (res == 'delete') {\r\n let linkedQuestion:any = (((this.getSectionFormArray().at(sectionIndex).get('questions') as FormArray).at(questionIndex) as FormGroup).get('answers') as FormArray);\r\n let type:any = ((this.getSectionFormArray().at(sectionIndex).get('questions') as FormArray).at(questionIndex) as FormGroup).get('answerType')?.value;\r\n if(!['descriptive','image', 'descriptiveImage','multipleImage','video','linearscale','time','date'].includes(type)) {\r\n for(let i=0;i<linkedQuestion?.length;i++) {\r\n let linkedQn = ((linkedQuestion.at(i) as FormGroup).get('linkedQuestion')?.value);\r\n if(linkedQn) {\r\n let no = linkedQn -1;\r\n ((this.getSectionFormArray().at(sectionIndex).get('questions') as FormArray).at(no) as FormGroup).get('linkType')?.setValue(false);\r\n if(linkedQn && parseInt(linkedQn) > questionIndex) {\r\n this.subtractQuestionno(sectionIndex,linkedQn-1)\r\n }\r\n }\r\n }\r\n }\r\n (this.getSectionFormControl(sectionIndex, 'questions') as FormArray).removeAt(questionIndex);\r\n this.removedNestedQuestion(sectionIndex,qno);\r\n this.updateQuestionQnos(sectionIndex);\r\n this.swalToast(`${question} has been deleted!`);\r\n this.changedetector.detectChanges();\r\n }\r\n });\r\n\r\n }\r\n\r\n subtractQuestionno(sectionIndex:number,questionIndex:any) {\r\n let linkedQuestionAnswers = (((this.getSectionFormArray().at(sectionIndex).get('questions') as FormArray).at(questionIndex) as FormGroup).get('answers') as FormArray);\r\n let no = ((this.getSectionFormArray().at(sectionIndex).get('questions') as FormArray).at(questionIndex) as FormGroup).get('qno')?.value;\r\n this.deletedList.push(no);\r\n for(let j=0;j<linkedQuestionAnswers?.length;j++) {\r\n let linkedQn = ((linkedQuestionAnswers.at(j) as FormGroup).get('linkedQuestion')?.value);\r\n if(linkedQn && parseInt(linkedQn) > questionIndex) {\r\n ((linkedQuestionAnswers.at(j) as FormGroup).get('linkedQuestion'))?.setValue(linkedQn - 1);\r\n this.subtractQuestionno(sectionIndex,linkedQn-1);\r\n }\r\n }\r\n }\r\n\r\n raiseflag(sectionIndex: number, questionIndex: number, ansIdx: number,value: boolean,linkIndex:number = -1,linkAnsIndex:number = -1) {\r\n let question = ((((this.ChecklistForm.get('sections') as FormArray)?.at(sectionIndex) as FormGroup).get('questions') as FormArray).at(questionIndex) as FormGroup);\r\n if(value == true) {\r\n let answers = (question.get('answers') as FormArray).value;\r\n if(linkIndex == -1) {\r\n if(answers.filter((x:any)=> x.sopFlag == true).length == (answers.length -1)) {\r\n ((question.get('answers') as FormArray).at(ansIdx) as FormGroup).addControl('showSOPFlagError',this.fb.control(true));\r\n timer(5000).subscribe(() => {\r\n ((question.get('answers') as FormArray).at(ansIdx) as FormGroup).removeControl('showSOPFlagError');\r\n });\r\n return;\r\n }\r\n }\r\n else {\r\n let answers = ((question.get('answers') as FormArray).at(ansIdx) as FormGroup);\r\n let linkQuestion = ((answers.get('linkQuestionAnswers') as FormArray).at(linkIndex) as FormGroup);\r\n let linkAnswers = (linkQuestion.get('answers') as FormArray).value\r\n if(linkAnswers.filter((x:any)=> x.sopFlag == true).length == (linkAnswers.length -1)) {\r\n ((linkQuestion.get('answers') as FormArray).at(linkAnsIndex) as FormGroup).addControl('showSOPFlagError',this.fb.control(true));\r\n timer(5000).subscribe(() => {\r\n ((linkQuestion.get('answers') as FormArray).at(linkAnsIndex) as FormGroup).removeControl('showSOPFlagError');\r\n });\r\n return;\r\n }\r\n }\r\n }\r\n if(linkIndex == -1) {\r\n const topAnswer = ((question.get('answers') as FormArray)?.at(ansIdx) as FormGroup);\r\n (topAnswer?.get('sopFlag') as FormControl)?.setValue(value);\r\n // Unflagging removes any auto task on this answer so no stale stub is saved.\r\n if (value === false && topAnswer?.get('autoTask')) {\r\n topAnswer.removeControl('autoTask');\r\n this.reassignFirstAutoTaskRef(sectionIndex, questionIndex, ansIdx);\r\n }\r\n }\r\n else {\r\n let answers = ((question.get('answers') as FormArray).at(ansIdx) as FormGroup);\r\n let linkQuestion = ((answers.get('linkQuestionAnswers') as FormArray).at(linkIndex) as FormGroup);\r\n ((((linkQuestion.get('answers') as FormArray)?.at(linkAnsIndex) as FormGroup)?.get('sopFlag') as FormControl))?.setValue(value);\r\n }\r\n }\r\n\r\n // ===== Auto-task creation flow (triggered when a flag is turned ON) =====\r\n // Turning a flag ON asks whether to create an auto task. \"No\" just flags the\r\n // answer (highlight only); \"Yes\" opens the details popup. Turning a flag OFF\r\n // (raiseflag(..,false)) is unchanged and clears any auto task on that answer.\r\n onFlagClickOn(sectionIndex: number, questionIndex: number, ansIdx: number) {\r\n const question = ((((this.ChecklistForm.get('sections') as FormArray)?.at(sectionIndex) as FormGroup).get('questions') as FormArray).at(questionIndex) as FormGroup);\r\n const answers = (question.get('answers') as FormArray).value;\r\n // Respect the existing rule: the last unflagged answer cannot be flagged.\r\n // Let raiseflag surface its own error and stop before showing any dialog.\r\n if (answers.filter((x: any) => x.sopFlag === true).length === (answers.length - 1)) {\r\n this.raiseflag(sectionIndex, questionIndex, ansIdx, true);\r\n return;\r\n }\r\n // const flagSvg = `<span><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\"><rect width=\"48\" height=\"48\" rx=\"24\" fill=\"#EFF8FF\"/><path d=\"M17 30C17 30 18 29 21 29C24 29 26 31 29 31C32 31 33 30 33 30V18C33 18 32 19 29 19C26 19 24 17 21 17C18 17 17 18 17 18V30ZM17 30V36\" stroke=\"#00A3FF\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></span>`;\r\n // const dialogRef = this.dialog.open(TraxpopupComponent, { centered: true, size: 'md' });\r\n // dialogRef.componentInstance.data = {\r\n // imagesrc: flagSvg,\r\n // title: 'Create Auto Task?',\r\n // content: 'Do you want to create an auto task when this response is flagged?',\r\n // buttontype: 'yesno',\r\n // };\r\n // dialogRef.result.then((res: any) => {\r\n // if (res === 'confirm') {\r\n // this.openAutoTaskDetails(sectionIndex, questionIndex, ansIdx);\r\n // } else {\r\n // \"No\" -> highlight the flag only, no auto task.\r\n this.raiseflag(sectionIndex, questionIndex, ansIdx, true);\r\n // }\r\n // }, () => { /* dismissed (ESC/backdrop) -> leave the answer unflagged */ });\r\n }\r\n\r\n openAutoTaskDetails(sectionIndex: number, questionIndex: number, ansIdx: number) {\r\n const question = ((((this.ChecklistForm.get('sections') as FormArray)?.at(sectionIndex) as FormGroup).get('questions') as FormArray).at(questionIndex) as FormGroup);\r\n const answer = ((question.get('answers') as FormArray).at(ansIdx) as FormGroup);\r\n const existing = answer.get('autoTask')?.value || {};\r\n // Task name is derived (read-only): the question name for all types, plus the\r\n // answer-option text for multiplechoicemultiple and dropdown+allowMultiple\r\n // (those allow multiple flagged options => multiple distinct tasks per question).\r\n const answerType = question.get('answerType')?.value;\r\n const includeOption = answerType === 'multiplechoicemultiple' ||\r\n (answerType === 'dropdown' && !!question.get('allowMultiple')?.value);\r\n const qName = question.get('qname')?.value || '';\r\n const optionText = answer.get('answer')?.value || '';\r\n const computedTaskName = includeOption && optionText ? `${qName} (${optionText})` : qName;\r\n const isFirst = !this.autoTaskGlobalConfigured ||\r\n (this.firstAutoTaskRef?.i === sectionIndex && this.firstAutoTaskRef?.j === questionIndex && this.firstAutoTaskRef?.k === ansIdx);\r\n const ref = this.dialog.open(AutoTaskPopupComponent, { centered: true, size: 'lg', backdrop: 'static', scrollable: true });\r\n ref.componentInstance.data = {\r\n clientId: this.clientId,\r\n isFirstAutoTask: isFirst,\r\n taskName: computedTaskName,\r\n taskDescription: existing.taskDescription || '',\r\n referenceImage: existing.referenceImage || '',\r\n answerType: existing.answerType || 'image',\r\n answers: existing.answers || [],\r\n allowMultiple: existing.allowMultiple ?? false,\r\n descriptivetype: existing.descriptivetype ?? 'text',\r\n taskAssignee: this.globalTaskAssignee,\r\n taskValidity: this.globalTaskValidity,\r\n };\r\n ref.result.then((payload: any) => {\r\n if (!payload) return;\r\n // Assignee + validity are shared across every auto task in the checklist.\r\n // Editable from ANY task; whatever the user sets here reflects on ALL tasks.\r\n this.globalTaskAssignee = payload.taskAssignee;\r\n this.globalTaskValidity = payload.taskValidity;\r\n this.autoTaskGlobalConfigured = true;\r\n if (!this.firstAutoTaskRef) {\r\n this.firstAutoTaskRef = { i: sectionIndex, j: questionIndex, k: ansIdx };\r\n }\r\n // Persist the full task at the question-answer level. Assignee/validity\r\n // come from the locked globals so every answer's autoTask is self-contained.\r\n if (!answer.get('autoTask')) {\r\n answer.addControl('autoTask', this.fb.group({\r\n enabled: this.fb.control(true),\r\n taskName: this.fb.control(''),\r\n taskDescription: this.fb.control(''),\r\n referenceImage: this.fb.control(''),\r\n answerType: this.fb.control('image'),\r\n answers: this.fb.control([]),\r\n allowMultiple: this.fb.control(false),\r\n descriptivetype: this.fb.control('text'),\r\n taskAssignee: this.fb.control(this.globalTaskAssignee),\r\n taskValidity: this.fb.control(this.globalTaskValidity),\r\n }));\r\n }\r\n answer.get('autoTask')?.patchValue({\r\n enabled: true,\r\n taskName: payload.taskName,\r\n taskDescription: payload.taskDescription,\r\n referenceImage: payload.referenceImage,\r\n answerType: payload.answerType,\r\n answers: payload.answers,\r\n allowMultiple: payload.allowMultiple,\r\n descriptivetype: payload.descriptivetype,\r\n taskAssignee: this.globalTaskAssignee,\r\n taskValidity: this.globalTaskValidity,\r\n });\r\n // Reflect the shared assignee/validity on every flagged answer's auto task.\r\n this.propagateGlobalTaskSettings();\r\n // Maintain the single checklist-level key marking question-level task creation on.\r\n this.setChecklistAutoTaskFlag(true);\r\n // Only now set the flag, so a cancelled details form leaves it unflagged.\r\n // Skip when already flagged (e.g. editing an existing task) to avoid\r\n // re-triggering the \"every answer can't be a flag\" guard.\r\n if (answer.get('sopFlag')?.value !== true) {\r\n this.raiseflag(sectionIndex, questionIndex, ansIdx, true);\r\n }\r\n this.changedetector.detectChanges();\r\n }, () => { /* dismissed -> no task, answer stays unflagged */ });\r\n }\r\n\r\n // Assignee + validity are the same for every question, so when the first\r\n // task sets/changes them, copy them into every flagged answer's autoTask.\r\n propagateGlobalTaskSettings() {\r\n const sections = this.ChecklistForm.get('sections') as FormArray;\r\n for (let si = 0; si < sections.length; si++) {\r\n const questions = (sections.at(si) as FormGroup).get('questions') as FormArray;\r\n for (let qi = 0; qi < questions.length; qi++) {\r\n const answersCtrl = (questions.at(qi) as FormGroup).get('answers');\r\n if (!(answersCtrl instanceof FormArray)) continue;\r\n for (let ai = 0; ai < answersCtrl.length; ai++) {\r\n const at = (answersCtrl.at(ai) as FormGroup).get('autoTask');\r\n if (at?.value?.enabled) {\r\n at.patchValue({ taskAssignee: this.globalTaskAssignee, taskValidity: this.globalTaskValidity });\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // When the answer holding the \"first\" auto task is unflagged, hand the\r\n // assignee/validity source-of-truth to the next remaining auto task, or\r\n // reset the lock entirely if none are left.\r\n reassignFirstAutoTaskRef(i: number, j: number, k: number) {\r\n if (!this.firstAutoTaskRef) return;\r\n const wasFirst = this.firstAutoTaskRef.i === i && this.firstAutoTaskRef.j === j && this.firstAutoTaskRef.k === k;\r\n if (!wasFirst) return;\r\n const sections = this.ChecklistForm.get('sections') as FormArray;\r\n for (let si = 0; si < sections.length; si++) {\r\n const questions = (sections.at(si) as FormGroup).get('questions') as FormArray;\r\n for (let qi = 0; qi < questions.length; qi++) {\r\n const answersCtrl = (questions.at(qi) as FormGroup).get('answers');\r\n if (!(answersCtrl instanceof FormArray)) continue;\r\n for (let ai = 0; ai < answersCtrl.length; ai++) {\r\n if ((answersCtrl.at(ai) as FormGroup).get('autoTask')?.value?.enabled) {\r\n this.firstAutoTaskRef = { i: si, j: qi, k: ai };\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n this.firstAutoTaskRef = null;\r\n this.autoTaskGlobalConfigured = false;\r\n this.globalTaskAssignee = 'submitter';\r\n this.globalTaskValidity = 10;\r\n this.setChecklistAutoTaskFlag(false);\r\n }\r\n\r\n // Maintain a single checklist-level `autoCreateTask` key: true whenever any\r\n // flagged answer has a per-answer auto task, so the checklist config page and\r\n // the backend can detect question-level task creation from one flag.\r\n setChecklistAutoTaskFlag(enabled: boolean) {\r\n if (!this.ChecklistForm.get('autoCreateTask')) {\r\n this.ChecklistForm.addControl('autoCreateTask', this.fb.control(enabled));\r\n } else {\r\n this.ChecklistForm.get('autoCreateTask')?.setValue(enabled);\r\n }\r\n }\r\n\r\n // On edit-load, rebuild per-answer autoTask controls and the locked\r\n // assignee/validity from the saved checklist (this.getobject), so existing\r\n // tasks stay visible/editable and are not dropped on re-save. Safe no-op when\r\n // the backend does not (yet) return these fields.\r\n hydrateAutoTaskState() {\r\n const src = this.getobject;\r\n if (!src) return;\r\n const sectionsFA = this.ChecklistForm.get('sections') as FormArray;\r\n let firstFound = false;\r\n (src.sections || []).forEach((sec: any, si: number) => {\r\n (sec.questions || []).forEach((q: any, qi: number) => {\r\n const formQ = ((sectionsFA?.at(si) as FormGroup)?.get('questions') as FormArray)?.at(qi) as FormGroup;\r\n const formAnswers = formQ?.get('answers');\r\n if (!(formAnswers instanceof FormArray)) return;\r\n (q.answers || []).forEach((a: any, ai: number) => {\r\n const at = a?.autoTask;\r\n if (!at || !at.enabled) return;\r\n const formAns = formAnswers.at(ai) as FormGroup;\r\n if (!formAns) return;\r\n if (!formAns.get('autoTask')) {\r\n formAns.addControl('autoTask', this.fb.group({\r\n enabled: this.fb.control(true),\r\n taskName: this.fb.control(at.taskName || ''),\r\n taskDescription: this.fb.control(at.taskDescription || ''),\r\n referenceImage: this.fb.control(at.referenceImage || ''),\r\n answerType: this.fb.control(at.answerType || 'image'),\r\n answers: this.fb.control(at.answers || []),\r\n allowMultiple: this.fb.control(at.allowMultiple ?? false),\r\n descriptivetype: this.fb.control(at.descriptivetype ?? 'text'),\r\n taskAssignee: this.fb.control(at.taskAssignee || 'submitter'),\r\n taskValidity: this.fb.control(at.taskValidity ?? 10),\r\n }));\r\n }\r\n if (!firstFound) {\r\n this.autoTaskGlobalConfigured = true;\r\n this.firstAutoTaskRef = { i: si, j: qi, k: ai };\r\n this.globalTaskAssignee = at.taskAssignee || 'submitter';\r\n this.globalTaskValidity = at.taskValidity ?? 10;\r\n firstFound = true;\r\n }\r\n });\r\n });\r\n });\r\n if (this.autoTaskGlobalConfigured) {\r\n this.setChecklistAutoTaskFlag(true);\r\n }\r\n }\r\n\r\n addNestedQuestion(sectionIndex: number, questionIndex: number, ansIdx: number,value: boolean,linkedQuestionIndex:number=-1,linkedAnswer:number = -1) {\r\n let answer = (((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(sectionIndex) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(questionIndex) as FormGroup)\r\n .get('answers') as FormArray)\r\n .at(ansIdx) as FormGroup\r\n\r\n \r\n \r\n if(!answer?.get('linkQuestionAnswers')?.value.length) {\r\n answer.setControl('linkQuestionAnswers',\r\n this.fb.array([\r\n this.fb.group({\r\n \"qno\": this.fb.control(1),\r\n 'qname': this.fb.control('', [Validators.required,noWhitespaceValidator()]),\r\n 'qdescription': this.fb.control(''),\r\n 'answerType': this.fb.control('descriptive',\r\n this.allowedValuesValidator([\"descriptive\", \"yes/no\", \"multiplechoicesingle\", \"multiplechoicemultiple\",\"descriptiveImage\", \"image\", \"video\",'multipleImage','date','linearscale','time','image/video','dropdown'])),\r\n 'runAI': this.fb.control(false, [Validators.required]),\r\n 'runAIDescription': this.fb.control(''),\r\n 'allowUploadfromGallery': this.fb.control(false, [Validators.required]),\r\n \"multiQuestionReferenceImage\":this.fb.array([]),\r\n 'descriptivetype':this.fb.control('text'),\r\n 'questionReferenceImage':this.fb.control(''),\r\n 'runAIFeatures':this.fb.array([]), \r\n \"uniqueqno\": this.fb.control(0),\r\n \"uniqueqid\": this.fb.control(''),\r\n \"allowMultiple\":this.fb.control(false),\r\n \"compliance\":this.fb.control(false),\r\n })\r\n ])\r\n )\r\n }\r\n else {\r\n let nestedQuestion = answer.get('linkQuestionAnswers') as FormArray\r\n nestedQuestion.push(this.fb.group({\r\n \"qno\": this.fb.control(1),\r\n 'qname': this.fb.control('', [Validators.required,noWhitespaceValidator()]),\r\n 'qdescription': this.fb.control(''),\r\n 'answerType': this.fb.control('descriptive',\r\n this.allowedValuesValidator([\"descriptive\", \"yes/no\", \"multiplechoicesingle\", \"multiplechoicemultiple\",\"descriptiveImage\", \"image\", \"video\",'multipleImage','date','linearscale','time','image/video','dropdown'])),\r\n 'runAI': this.fb.control(false, [Validators.required]),\r\n 'runAIDescription': this.fb.control(''),\r\n 'allowUploadfromGallery': this.fb.control(false, [Validators.required]),\r\n \"multiQuestionReferenceImage\":this.fb.array([]),\r\n 'descriptivetype':this.fb.control('text'),\r\n 'questionReferenceImage':this.fb.control(''),\r\n 'runAIFeatures':this.fb.array([]), \r\n \"uniqueqno\": this.fb.control(0),\r\n \"uniqueqid\": this.fb.control(''),\r\n \"allowMultiple\":this.fb.control(false),\r\n \"compliance\":this.fb.control(false),\r\n }));\r\n }\r\n this.ChecklistForm.updateValueAndValidity();\r\n }\r\n \r\n accordian(index: any) {\r\n if (this.show == index) {\r\n this.show = -1;\r\n this.sectionIndex = -1;\r\n } else {\r\n this.show = index;\r\n this.sectionIndex = index;\r\n }\r\n }\r\n\r\n deleteSection(sectionIndex: any) {\r\n let section = ((this.ChecklistForm.get('sections') as FormArray).at(sectionIndex) as FormGroup);\r\n let sectionLength:any = \" \" + (section.get('questions') as FormArray).length;\r\n let sectionName:string = section.get('name')?.value;\r\n sectionName = sectionName.length > 20 ? (sectionName.slice(0, 20) + \"...\") : sectionName;\r\n let question_text = ''\r\n if (sectionLength == 1)\r\n question_text = 'Question'\r\n else\r\n question_text = 'Questions'\r\n const popupcontent = {\r\n displayprop: false,\r\n imagesrc: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\"><rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#FEE4E2\"/><path d=\"M28 24V28M28 32H28.01M38 28C38 33.5228 33.5228 38 28 38C22.4772 38 18 33.5228 18 28C18 22.4772 22.4772 18 28 18C33.5228 18 38 22.4772 38 28Z\" stroke=\"#D92D20\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#FEF3F2\" stroke-width=\"8\"/></svg>`,\r\n title: `Delete '${sectionName} Section'?`,\r\n content: `Are you sure you want to delete' <b>'${sectionName}'</b>? with <b>${sectionLength} ${question_text}</b> This action cannot be undone.`,\r\n buttontype: 'delete'\r\n }\r\n const dialogRef = this.dialog.open(TraxpopupComponent,{centered: true, size: 'md'});\r\n dialogRef.componentInstance.data = popupcontent\r\n dialogRef.result.then((res) => {\r\n if (res == 'delete') {\r\n (this.ChecklistForm.get('sections') as FormArray).removeAt(sectionIndex)\r\n this.changedetector.detectChanges();\r\n }\r\n });\r\n }\r\n\r\n AddMoreAns(sectionindex: any, questionIndex: any,type:string) {\r\n let ansoption =\r\n ((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(sectionindex) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(questionIndex)\r\n .get('answers') as FormArray);\r\n let ansoptionLength = ansoption.length;\r\n let validation = 'Capture Image';\r\n if(type == 'multiplechoicesingle') {\r\n validation = 'Capture Multiple Image with description';\r\n }\r\n if (ansoptionLength <= 99) {\r\n ansoption.push(\r\n this.fb.group({\r\n 'answer': this.fb.control(``, [Validators.required,noWhitespaceValidator()]),\r\n 'answeroptionNumber': this.fb.control(ansoptionLength + 1),\r\n 'sopFlag': this.fb.control(false, [Validators.required]),\r\n 'validation': this.fb.control(false, [Validators.required]),\r\n 'validationType': this.fb.control(validation, this.allowedValuesValidator([\"Capture Image\", \"Capture Multiple Image with description\", \"Descriptive Answer\",\"Capture Video\"])),\r\n \"multiReferenceImage\": this.fb.array([]),\r\n 'allowUploadfromGallery': this.fb.control(false),\r\n ...(type == 'multiplechoicesingle' ? {\"linkedQuestion\":this.fb.control(0, [Validators.required]),'showLinked':this.fb.control(false, [Validators.required])} : {}),\r\n 'runAI': this.fb.control(false),\r\n 'descriptivetype':this.fb.control(''),\r\n ...(type == 'multipleImage' ? {'descriptivetype':this.fb.control('text')}:{}),\r\n 'referenceImage':this.fb.control(''),\r\n 'runAIFeatures':this.fb.array([]),\r\n 'runAIDescription': this.fb.control(''),\r\n 'complianceScore':this.fb.control(0)\r\n })\r\n );\r\n }\r\n }\r\n\r\n deleteAnswer(sectionIndex: number, questionIndex: number, addmoreqnIndex: number,ansIndex:number = -1) {\r\n if(ansIndex != -1) {\r\n this.getFormArrayQuestionsAnswer(sectionIndex, questionIndex, 'answers',ansIndex).removeAt(addmoreqnIndex); \r\n }\r\n else {\r\n this.getFormArrayQuestionsAnswer(sectionIndex, questionIndex, 'answers',ansIndex).removeAt(addmoreqnIndex); \r\n }\r\n this.ChecklistForm.updateValueAndValidity();\r\n }\r\n\r\n cloneQuestion(sectionindex: any, questionindex: any) {\r\n let cloneQuestion = ((this.getSectionFormControl(sectionindex, 'questions') as FormArray).at(questionindex) as FormGroup).value;\r\n let questionLength = (this.getSectionFormControl(sectionindex, 'questions') as FormArray).value;\r\n let question: any;\r\n let answer: any;\r\n if (cloneQuestion.answers) {\r\n if (Array.isArray(cloneQuestion.answers) && cloneQuestion.answers.length) {\r\n answer = [];\r\n cloneQuestion.answers.forEach((k: any) => {\r\n answer.push(\r\n this.fb.group({\r\n ...(!['image', 'descriptiveImage','multipleImage'].includes(cloneQuestion?.answerType) && cloneQuestion?.answerType != 'video' ? { 'answer': this.fb.control(k?.answer, [Validators.required]) } : {}),\r\n ...(!['image', 'descriptiveImage','multipleImage'].includes(cloneQuestion?.answerType) && cloneQuestion?.answerType != 'video' ? { 'answeroptionNumber': this.fb.control(k?.answeroptionNumber + 1) } : {}),\r\n ...(!['image', 'descriptiveImage','multipleImage'].includes(cloneQuestion?.answerType) && cloneQuestion?.answerType != 'video' ? { 'sopFlag': this.fb.control(k?.sopFlag ? k?.sopFlag : false, [Validators.required]) } : {}),\r\n ...(!['image', 'descriptiveImage','multipleImage'].includes(cloneQuestion?.answerType) && cloneQuestion?.answerType != 'video' ? { 'validation': this.fb.control(k?.validation, [Validators.required]) } : {}),\r\n ...(!['image', 'descriptiveImage','multipleImage'].includes(cloneQuestion?.answerType) && cloneQuestion?.answerType != 'video' ? { 'validationType': this.fb.control(k?.validationType, this.allowedValuesValidator([\"Capture Image\", \"Capture Multiple Image with description\", \"Descriptive Answer\", \"Capture Video\"])) } : {}),\r\n ...(!['descriptive','image', 'descriptiveImage','multipleImage','date','image/video'].includes(cloneQuestion?.answerType) ? { \"multiReferenceImage\": this.fb.array(k?.multiReferenceImage) } : {}),\r\n ...((!['descriptive','image', 'descriptiveImage','multipleImage','date','image/video'].includes(cloneQuestion?.answerType)) ? { 'allowUploadfromGallery': this.fb.control(k?.allowUploadfromGallery == true ? true : false) } : {}),\r\n ...(!['descriptive','image', 'descriptiveImage','multipleImage','date','image/video'].includes(cloneQuestion?.answerType) ? { 'runAI': this.fb.control(k?.runAI ? k?.runAI : false) } : {}),\r\n ...(['multiplechoicesingle','yes/no'].includes(cloneQuestion?.answerType) ? { 'showLinked': false } : {}),\r\n ...(['multiplechoicesingle','yes/no'].includes(cloneQuestion?.answerType) ? { 'linkedQuestion': 0 } : {}),\r\n ...(['multiplechoicesingle','yes/no'].includes(cloneQuestion?.answerType) ? { 'linkedQuestion': 0 } : {}),\r\n descriptivetype:this.fb.control(k?.descriptivetype),\r\n 'referenceImage':this.fb.control(''),\r\n 'runAIFeatures':this.fb.array(k?.runAIFeatures || []),\r\n 'runAIDescription': this.fb.control(''),\r\n 'complianceScore':this.fb.control(0)\r\n }));\r\n });\r\n } else if(typeof cloneQuestion.answers === 'object' && cloneQuestion.answers !== null) {\r\n answer = this.fb.group({ \r\n ...(['image', 'descriptiveImage','multipleImage','image/video'].includes(cloneQuestion?.answerType) ? { \"multiReferenceImage\": this.fb.array(cloneQuestion?.answers?.multiReferenceImage) } : {}),\r\n ...((['image', 'descriptiveImage','multipleImage','image/video'].includes(cloneQuestion?.answerType) || cloneQuestion?.answerType == 'video') ? { 'allowUploadfromGallery': this.fb.control(cloneQuestion?.answers?.allowUploadfromGallery == true ? true : false) } : {}),\r\n ...(['image', 'descriptiveImage','multipleImage','image/video'].includes(cloneQuestion?.answerType) ? { 'runAI': this.fb.control(cloneQuestion?.answers?.runAI ? cloneQuestion?.answers?.runAI : false) } : {}),\r\n ...(['multipleImage'].includes(cloneQuestion?.answerType) ? { descriptivetype:this.fb.control(cloneQuestion?.answers?.descriptivetype) } : {}),\r\n ...(['linearscale'].includes(cloneQuestion?.answerType) ? { \r\n 'linearType':this.fb.control(cloneQuestion?.answers.linearType),'rangeStart':this.fb.control(cloneQuestion?.answers.rangeStart),'rangeEnd':this.fb.control(cloneQuestion?.answers.rangeEnd) } : {}),\r\n ...(['date'].includes(cloneQuestion?.answerType) ? { 'historicDate':this.fb.control(cloneQuestion?.answers.historicDate),startDate:this.fb.control(cloneQuestion?.answers?.startDate || this.dayjs().format('DD-MM-YYYY')),endDate:this.fb.control(cloneQuestion?.answers?.endDate || this.dayjs().format('DD-MM-YYYY'))} : {}),\r\n 'referenceImage':this.fb.control(''),\r\n 'runAIFeatures':this.fb.array(cloneQuestion?.answers?.runAIFeatures || []),\r\n 'runAIDescription': this.fb.control(cloneQuestion?.answers?.runAIDescription || cloneQuestion?.runAIDescription || ''),\r\n ...(['image/video'].includes(cloneQuestion?.answerType) && { 'limit':this.fb.control(cloneQuestion?.answers.limit),'imageLimit':this.fb.control(cloneQuestion?.answers.imageLimit),'videoLimit':this.fb.control(cloneQuestion?.answers.videoLimit)}),\r\n ...(['date','linearscale','image','image/video'].includes(cloneQuestion?.answerType) && {matchedCount:this.fb.control(0),notMatchedCount:this.fb.control(0)}),\r\n // Plain controls, as the range pickers bind them with formControlName: a FormGroup there throws\r\n // (control.registerOnChange is not a function) once Compliance Score shows the pickers.\r\n ...(cloneQuestion?.answerType == 'date' && {\r\n qnStartDate:this.fb.control(this.pickerDate(cloneQuestion?.answers?.startDate || this.dayjs().format('DD-MM-YYYY'))),\r\n qnEndDate:this.fb.control(this.pickerDate(cloneQuestion?.answers?.endDate || this.dayjs().format('DD-MM-YYYY')))\r\n })\r\n });\r\n }\r\n }\r\n // if(typeof cloneQuestion?.questionReferenceImage == 'string' && cloneQuestion?.questionReferenceImage != '') {\r\n // cloneQuestion.multiQuestionReferenceImage = [{imageURL:cloneQuestion?.questionReferenceImage,runAI:false}];\r\n // }\r\n question = this.fb.group({\r\n \"qno\": this.fb.control(questionLength.length + 1),\r\n 'qname': this.fb.control(cloneQuestion?.qname, [Validators.required,noWhitespaceValidator()]),\r\n 'qdescription': this.fb.control(cloneQuestion?.qdescription || ''),\r\n 'answerType': this.fb.control(cloneQuestion?.answerType, this.allowedValuesValidator([\"descriptive\", \"yes/no\", \"multiplechoicesingle\", \"multiplechoicemultiple\",\"descriptiveImage\", \"image\", \"video\",'multipleImage','date','linearscale','time','image/video','dropdown'])),\r\n ...(!['descriptive'].includes(cloneQuestion?.answerType) ? { 'answers': (['image','descriptiveImage', 'video','multipleImage','linearscale','time','image/video','date'].includes(cloneQuestion?.answerType)) ? answer : this.fb.array(answer,[uniqueStringValidator()]) } : {}),\r\n 'runAI': this.fb.control(cloneQuestion?.runAI, [Validators.required]),\r\n 'runAIDescription': this.fb.control(cloneQuestion?.runAIDescription || ''),\r\n 'allowUploadfromGallery': this.fb.control(cloneQuestion?.allowUploadfromGallery),\r\n 'linkType': this.fb.control(false),\r\n 'descriptivetype':this.fb.control(cloneQuestion?.descriptivetype),\r\n \"multiQuestionReferenceImage\":this.fb.array(cloneQuestion?.multiQuestionReferenceImage),\r\n 'questionReferenceImage':this.fb.control(''),\r\n 'runAIFeatures':this.fb.array(cloneQuestion?.runAIFeatures || []), \r\n \"uniqueqno\": this.fb.control(0),\r\n \"uniqueqid\": this.fb.control(''),\r\n \"allowMultiple\":this.fb.control(false),\r\n 'compliance':this.fb.control(false)\r\n });\r\n const sourceQuestionGroup = ((this.getSectionFormControl(sectionindex, 'questions') as FormArray).at(questionindex) as FormGroup);\r\n const sourceQuestionRunAI = sourceQuestionGroup.get('runAI')?.value === true;\r\n const sourceComplianceEnabled = sourceQuestionGroup.get('compliance')?.enabled === true;\r\n if (!(sourceQuestionRunAI || sourceComplianceEnabled)) {\r\n question.get('compliance')?.disable({ emitEvent: false });\r\n }\r\n const clonedAnswers = question.get('answers');\r\n if (clonedAnswers instanceof FormArray) {\r\n clonedAnswers.controls.forEach((ans) => this.applyNotApplicableLock(ans as FormGroup, cloneQuestion?.answerType));\r\n }\r\n // this.updateClonedlinkedQuestionNo(sectionindex, cloneQuestion?.qno);\r\n (this.getSectionFormControl(sectionindex, 'questions') as FormArray).insert(cloneQuestion?.qno,question);\r\n this.ChecklistForm.updateValueAndValidity();\r\n this.updateQuestionQnos(sectionindex);\r\n this.swalToast(`Question ${cloneQuestion?.qno} has been duplicated!`);\r\n this.changedetector.detectChanges();\r\n }\r\n\r\n updateClonedlinkedQuestionNo(secIdx:number,qidx:number) {\r\n let questions = (this.getSectionFormArray().at(secIdx).get('questions') as FormArray);\r\n for (let i = 0; i < questions.length; i++) {\r\n let answers = (questions.at(i) as FormGroup)?.get('answers') as FormArray;\r\n if(answers) {\r\n for(let j=0;j<answers.length;j++) {\r\n let linked = (answers.at(j) as FormGroup)?.get('showLinked')?.value;\r\n if(linked) {\r\n let questionNo = (answers.at(j) as FormGroup)?.get('linkedQuestion')?.value;\r\n if(questionNo > qidx) {\r\n (answers.at(j) as FormGroup)?.get('linkedQuestion')?.setValue(questionNo + 1);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n saveChecklistQuestions(type: string) {\r\n let checklist = this.ChecklistForm.value;\r\n // console.log(checklist,'checklist')\r\n if(!this.ChecklistForm.get('checklistName')?.valid) {\r\n let err: string = 'Please enter the audit name';\r\n this.swalToast(err,'error');\r\n return;\r\n } \r\n \r\n if (!this.ChecklistForm.valid) {\r\n this.markFormControlsAsTouched(this.ChecklistForm,0);\r\n this.scrollToErrors(this.ChecklistForm.get('sections') as FormArray);\r\n return;\r\n }\r\n let sections = checklist.sections;\r\n if(type == 'saveAsDraft') {\r\n checklist.submitType = 'save';\r\n } else {\r\n checklist.submitType = 'configure';\r\n }\r\n if(!sections.length) {\r\n let err: string = 'Please add atleast one section!';\r\n this.swalToast(err,'error');\r\n return;\r\n }\r\n for (let i = 0; i < sections.length; i++) {\r\n if(type == 'configure' && !sections[i].questions.length) {\r\n this.showEmptySection(i, sections[i].name);\r\n return;\r\n }\r\n let findExists = sections.filter((ele:any,index:any) => {\r\n if(index != i && sections[i].name.trim() == ele.name.trim())\r\n return ele;\r\n })\r\n if(findExists.length) {\r\n this.swalToast(`${sections[i].name} section name is Duplicated` ,'error');\r\n return;\r\n }\r\n for (let j = 0; j < sections[i].questions.length; j++) {\r\n let ansType = sections[i].questions[j].answerType;\r\n sections[i].questions[j].qname = sections[i].questions[j].qname.trim().replaceAll(/\\n/g, '')\r\n sections[i].questions[j].qdescription = (sections[i].questions[j].qdescription || '').trim();\r\n let findExists = sections[i].questions.filter((ele:any,index:any) => {\r\n if(index != j && sections[i].questions[j].qname.trim() == ele.qname.trim())\r\n return ele;\r\n })\r\n if(findExists.length) {\r\n this.swalToast(`${sections[i].questions[j].qname} question name is Duplicated` ,'error');\r\n return;\r\n }\r\n if(ansType == 'linearscale') {\r\n if(sections[i].questions[j].answers.rangeStart >= sections[i].questions[j].answers.rangeEnd){\r\n let err: string = 'Min value must be less than max value.';\r\n this.swalToast(err,'error');\r\n return;\r\n }\r\n // if(sections[i].questions[j].answers.linearType != '' ){\r\n // if(sections[i].questions[j].answers.minValue > sections[i].questions[j].answers.maxValue) {\r\n // let err: string = 'Min value is greater than Max Value.';\r\n // this.swalToast(err,'error');\r\n // return;\r\n // }\r\n // }\r\n // if(sections[i].questions[j].answers.linearType == 'degree' && (sections[i].questions[j].answers.rangeStart < -273.15 || sections[i].questions[j].answers.rangeEnd < -273.15)) {\r\n // let err: string = \"Min value shouldn't greater than -273.15\";\r\n // this.swalToast(err,'error');\r\n // return;\r\n // }\r\n }\r\n if(ansType == 'image/video') {\r\n if(sections[i].questions[j].answers.limit && (!sections[i].questions[j].answers.imageLimit || !sections[i].questions[j].answers.videoLimit)){\r\n let err: string = 'image & video limit is required';\r\n this.swalToast(err,'error');\r\n return;\r\n }\r\n }\r\n if(ansType != 'descriptive') {\r\n delete sections[i].questions[j].descriptivetype;\r\n }\r\n\r\n if(ansType == 'date') {\r\n if(sections[i].questions[j].compliance && this.dayjs(sections[i].questions[j].answers.startDate,'DD-MM-YYYY') > this.dayjs(sections[i].questions[j].answers.endDate,'DD-MM-YYYY')){\r\n let err: string = 'Start date is greater than end date';\r\n this.swalToast(err,'error');\r\n return;\r\n }\r\n }\r\n if ([\"multiplechoicemultiple\"].includes(ansType)) {\r\n for (let k = 0; k < sections[i].questions[j].answers.length; k++) {\r\n sections[i].questions[j].answers[k]['showLinked'] = false;\r\n sections[i].questions[j].answers[k]['answer'] = sections[i].questions[j].answers[k]['answer'].trim();\r\n sections[i].questions[j].answers[k]['linkedQuestion'] = 0;\r\n sections[i].questions[j].answers[k]['complianceScore'] = parseInt(sections[i].questions[j].answers[k]['complianceScore']);\r\n }\r\n sections[i].questions[j].allowUploadfromGallery = false;\r\n }\r\n if ([\"multiplechoicesingle\",\"yes/no\"].includes(ansType)) {\r\n for (let k = 0; k < sections[i].questions[j].answers.length; k++) {\r\n sections[i].questions[j].answers[k]['answer'] = sections[i].questions[j].answers[k]['answer'].trim();\r\n sections[i].questions[j].answers[k]['complianceScore'] = parseInt(sections[i].questions[j].answers[k]['complianceScore']);\r\n if (ansType === 'multiplechoicesingle' && this.isNotApplicableOption(sections[i].questions[j].answers[k]['answer'])) {\r\n sections[i].questions[j].answers[k]['complianceScore'] = 0;\r\n }\r\n }\r\n }\r\n if (typeof sections[i].questions[j].answers === 'object' &&\r\n sections[i].questions[j].answers !== null &&\r\n !Array.isArray(sections[i].questions[j].answers) || ['descriptive','date'].includes(ansType)) {\r\n let item = {\r\n \"answer\": '',\r\n \"answeroptionNumber\": 1,\r\n \"sopFlag\": false,\r\n \"validation\": false,\r\n \"validationType\": \"\",\r\n \"validationAnswer\": \"\",\r\n \"multiReferenceImage\": sections[i].questions[j].answers?.multiReferenceImage ? sections[i].questions[j].answers?.multiReferenceImage : [],\r\n \"showLinked\":false,\r\n \"linkedQuestion\":0,\r\n ...(ansType == 'multipleImage' ? {'descriptivetype':sections[i].questions[j].answers?.descriptivetype}:{}),\r\n ...(sections[i].questions[j].answerType == 'linearscale' ? {'rangeStart':sections[i].questions[j].answers?.rangeStart,'rangeEnd':sections[i].questions[j].answers?.rangeEnd,'linearType':sections[i].questions[j].answers?.linearType,'minValue':parseInt(sections[i].questions[j].answers?.minValue),'maxValue':parseInt(sections[i].questions[j].answers?.maxValue)}:{}),\r\n ...(sections[i].questions[j].answerType == 'date' ? {'historicDate':sections[i].questions[j].answers?.historicDate,'startDate':sections[i].questions[j].answers?.startDate,'endDate':sections[i].questions[j].answers?.endDate}:{}),\r\n runAI:sections[i]?.questions[j]?.answers?.runAI ?? false,\r\n runAIFeatures:sections[i].questions[j]?.answers?.runAIFeatures ?? [],\r\n runAIDescription: sections[i].questions[j]?.answers?.runAIDescription ? sections[i].questions[j]?.answers?.runAIDescription : \"\",\r\n ...(ansType == 'image/video' ? {'limit':sections[i].questions[j].answers?.limit,'videoLimit':sections[i].questions[j].answers?.videoLimit,'imageLimit':sections[i].questions[j].answers?.imageLimit}:{}),\r\n ...(['date','linearscale','image','image/video'].includes(sections[i].questions[j].answerType) && {'matchedCount':parseInt(sections[i].questions[j].answers?.matchedCount),'notMatchedCount':parseInt(sections[i].questions[j].answers?.notMatchedCount)})\r\n };\r\n sections[i].questions[j].allowUploadfromGallery = sections[i].questions[j].answers?.allowUploadfromGallery ? sections[i].questions[j].answers?.allowUploadfromGallery : false;\r\n if(ansType == 'multipleImage') {\r\n sections[i].questions[j].descriptivetype = sections[i].questions[j].answers?.descriptivetype ? sections[i].questions[j].answers?.descriptivetype : 'text';\r\n }\r\n if(['multipleImage','image/video'].includes(ansType)) {\r\n sections[i].questions[j].multiQuestionReferenceImage = sections[i].questions[j].answers?.multiReferenceImage ? sections[i].questions[j].answers?.multiReferenceImage : [];\r\n }\r\n sections[i].questions[j].answers = [item];\r\n // sections[i].questions[j].runAI = sections[i].questions[j].answers.runAI;\r\n // sections[i].questions[j].runAIFeatures = sections[i].questions[j].answers.runAIFeatures;\r\n }\r\n }\r\n }\r\n checklist.sections = sections;\r\n checklist.checklistName = checklist.checklistName.trim().charAt(0).toUpperCase() + checklist.checklistName.trim().slice(1);\r\n checklist.clientId = this.clientId;\r\n checklist.checklistName = checklist.checklistName.trim();\r\n checklist.checklistDescription = checklist?.checklistDescription ? checklist?.checklistDescription?.trim() : '';\r\n throwError(() => ({ error: { error: { message: 'Create the audit from Audit > Manage > Create Audit first' } } })).pipe(takeUntil(this.detach)).subscribe((res: any) => {\r\n if(res) {\r\n if (res?.code == 200) {\r\n if (this.fromAudit) {\r\n this.router.navigateByUrl(type == 'configure'\r\n ? `/manage/trax/audit-v2/manage/configure?checklistId=${res.data.checklistId}`\r\n : '/manage/trax/audit-v2/manage');\r\n } else if(type=='configure') {\r\n this.router.navigateByUrl(`/manage/trax/configure?checkListId=${res.data.checklistId}`);\r\n } else {\r\n this.router.navigateByUrl('/manage/trax/checklist');\r\n }\r\n } else {\r\n this.swalToast('Could not create the audit. Please try again.','error');\r\n }\r\n } else {\r\n this.swalToast('Could not create the audit. Please try again.','error');\r\n }\r\n },(error: any) => {\r\n let err = error?.error?.error?.message || 'Could not create the audit (server error). Please try again.';\r\n this.swalToast(err,'error');\r\n }\r\n )\r\n }\r\n\r\n saveAsDraftPop(type: string) {\r\n this.popupCount = this.popupCount + 1;\r\n const dialogRef = this.dialog.open(TraxpopupComponent,{centered: true, size: 'md'});\r\n dialogRef.componentInstance.data = {\r\n imagesrc: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\"><rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#FEF0C7\"/><path d=\"M27.9998 24.0012V28.0012M27.9998 32.0012H28.0098M26.2898 18.8612L17.8198 33.0012C17.6451 33.3036 17.5527 33.6465 17.5518 33.9957C17.5508 34.3449 17.6413 34.6883 17.8142 34.9917C17.9871 35.2951 18.2365 35.5479 18.5375 35.725C18.8385 35.9021 19.1806 35.9973 19.5298 36.0012H36.4698C36.819 35.9973 37.1611 35.9021 37.4621 35.725C37.7631 35.5479 38.0124 35.2951 38.1854 34.9917C38.3583 34.6883 38.4488 34.3449 38.4478 33.9957C38.4468 33.6465 38.3544 33.3036 38.1798 33.0012L29.7098 18.8612C29.5315 18.5673 29.2805 18.3243 28.981 18.1557C28.6814 17.987 28.3435 17.8984 27.9998 17.8984C27.656 17.8984 27.3181 17.987 27.0186 18.1557C26.7191 18.3243 26.468 18.5673 26.2898 18.8612Z\" stroke=\"#DC6803\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#FFFAEB\" stroke-width=\"8\"/></svg>`,\r\n title:`Unsaved changes`,\r\n content:`Do you want to save as draft?`,\r\n buttontype:'draft'\r\n }\r\n dialogRef.result.then((res)=>{\r\n if(!res) {\r\n this.popupCount = 0;\r\n }\r\n if(res) {\r\n if(type == 'create') {\r\n this.saveChecklistQuestions('saveAsDraft');\r\n } else {\r\n this.updateChecklistQuestions('saveAsDraft');\r\n }\r\n }\r\n });\r\n }\r\n\r\n updateChecklistQuestions(type: string) {\r\n let sectionsarray: any = [];\r\n let checklist: any;\r\n \r\n if(!this.ChecklistForm.get('checklistName')?.valid) {\r\n let err: string = 'Please enter the audit name';\r\n this.swalToast(err,'error');\r\n return;\r\n } \r\n \r\n // console.log(this.ChecklistForm);\r\n // return;\r\n checklist = this.ChecklistForm.getRawValue();\r\n // console.log(this.ChecklistForm,'form')\r\n if (!this.ChecklistForm.valid) {\r\n this.markFormControlsAsTouched(this.ChecklistForm,0);\r\n this.scrollToErrors(this.ChecklistForm.get('sections') as FormArray);\r\n return;\r\n }\r\n sectionsarray = checklist.sections;\r\n if(!this.ChecklistForm.get('checklistName')?.valid) {\r\n let err: string = 'Please enter the audit name';\r\n this.swalToast(err,'error');\r\n return;\r\n }\r\n if(type == 'saveAsDraft') {\r\n checklist.submitType = 'save';\r\n } else {\r\n checklist.submitType = 'configure';\r\n }\r\n if(!sectionsarray.length) {\r\n let err: string = 'Please add atleast one section!';\r\n this.swalToast(err,'error');\r\n return;\r\n }\r\n for (let i = 0; i < sectionsarray.length; i++) {\r\n let sectionName = sectionsarray[i].name;\r\n let findExists = sectionsarray.filter((ele:any,index:any) => {\r\n if(index != i && sectionName.trim() == ele.name.trim())\r\n return ele;\r\n })\r\n if(findExists.length) {\r\n this.swalToast(`${sectionName} section name is Duplicated` ,'error');\r\n return;\r\n }\r\n if(type == 'configure' && !sectionsarray[i].questions.length) {\r\n this.showEmptySection(i, sectionName);\r\n return;\r\n }\r\n for (let j = 0; j < sectionsarray[i].questions.length; j++) {\r\n sectionsarray[i].questions[j].qname = sectionsarray[i].questions[j].qname.trim().replaceAll(/\\n/g, '')\r\n sectionsarray[i].questions[j].qdescription = (sectionsarray[i].questions[j].qdescription || '').trim();\r\n let findExists = sectionsarray[i].questions.filter((ele:any,index:any) => {\r\n if(index != j && sectionsarray[i].questions[j].qname.trim() == ele.qname.trim())\r\n return ele;\r\n })\r\n if(findExists.length) {\r\n this.swalToast(`${sectionsarray[i].questions[j].qname} question name is Duplicated` ,'error');\r\n return;\r\n }\r\n if(sectionsarray[i].questions[j].answerType == 'linearscale') {\r\n if(sectionsarray[i].questions[j].answers.rangeStart >= sectionsarray[i].questions[j].answers.rangeEnd){\r\n let err: string = 'Min value must be less than max value.';\r\n this.swalToast(err,'error');\r\n return;\r\n }\r\n // if(sectionsarray[i].questions[j].answers.linearType != '' ){\r\n // if(sectionsarray[i].questions[j].answers.minValue > sectionsarray[i].questions[j].answers.maxvalue) {\r\n // let err: string = 'Min value is greater than Max Value.';\r\n // this.swalToast(err,'error');\r\n // return;\r\n // }\r\n // }\r\n // if(sectionsarray[i].questions[j].answers.linearType == 'degree' && (sectionsarray[i].questions[j].answers.rangeStart < -273.15 || sectionsarray[i].questions[j].answers.rangeEnd < -273.15)) {\r\n // let err: string = \"Min value shouldn't greater than -273.15\";\r\n // this.swalToast(err,'error');\r\n // return;\r\n // }\r\n }\r\n if(sectionsarray[i].questions[j].answerType == 'date') {\r\n if(sectionsarray[i].questions[j].compliance && this.dayjs(sectionsarray[i].questions[j].answers.startDate,'DD-MM-YYYY') > this.dayjs(sectionsarray[i].questions[j].answers.endDate,'DD-MM-YYYY')){\r\n let err: string = 'Start date is greater than end date';\r\n this.swalToast(err,'error');\r\n return;\r\n }\r\n }\r\n if(sectionsarray[i].questions[j].answerType == 'image/video') {\r\n if(sectionsarray[i].questions[j].answers.limit && (!sectionsarray[i].questions[j].answers.imageLimit || !sectionsarray[i].questions[j].answers.videoLimit)){\r\n let err: string = 'image & video limit is required';\r\n this.swalToast(err,'error');\r\n return;\r\n }\r\n }\r\n if(sectionsarray[i].questions[j].answerType != 'descriptive') {\r\n delete sectionsarray[i].questions[j].descriptivetype;\r\n }\r\n if ([\"multiplechoicemultiple\"].includes(sectionsarray[i].questions[j].answerType)) {\r\n for (let k = 0; k < sectionsarray[i].questions[j].answers.length; k++) {\r\n // sectionsarray[i].questions[j].answers[k]['answerInputStyle'] = sectionsarray[i].questions[j].answerType;\r\n // sectionsarray[i].questions[j].answers[k][\"multiReferenceImage\"] = \"\";\r\n // sectionsarray[i].questions[j].answers[k]['allowUploadfromGallery'] = false;\r\n // sectionsarray[i].questions[j].answers[k]['validationAnswer'] = \"\"; \r\n // sectionsarray[i].questions[j].answers[k]['runAI'] = false;\r\n sectionsarray[i].questions[j].answers[k]['answer'] = sectionsarray[i].questions[j].answers[k]['answer'].trim();\r\n sectionsarray[i].questions[j].answers[k]['showLinked'] = false;\r\n sectionsarray[i].questions[j].answers[k]['linkedQuestion'] = 0;\r\n sectionsarray[i].questions[j].answers[k]['complianceScore'] = parseInt(sectionsarray[i].questions[j].answers[k]['complianceScore']);\r\n }\r\n sectionsarray[i].questions[j].allowUploadfromGallery = false;\r\n }\r\n if ([\"multiplechoicesingle\",\"yes/no\"].includes(sectionsarray[i].questions[j].answerType)) {\r\n for (let k = 0; k < sectionsarray[i].questions[j].answers.length; k++) {\r\n sectionsarray[i].questions[j].answers[k]['answer'] = sectionsarray[i].questions[j].answers[k]['answer'].trim();\r\n sectionsarray[i].questions[j].answers[k]['complianceScore'] = parseInt(sectionsarray[i].questions[j].answers[k]['complianceScore']);\r\n if (sectionsarray[i].questions[j].answerType === 'multiplechoicesingle' && this.isNotApplicableOption(sectionsarray[i].questions[j].answers[k]['answer'])) {\r\n sectionsarray[i].questions[j].answers[k]['complianceScore'] = 0;\r\n }\r\n }\r\n }\r\n if (typeof sectionsarray[i].questions[j].answers === 'object' &&\r\n sectionsarray[i].questions[j].answers !== null &&\r\n !Array.isArray(sectionsarray[i].questions[j].answers) || ['descriptive','date'].includes(sectionsarray[i].questions[j].answerType)) {\r\n let item = {\r\n \"answer\": '',\r\n \"answeroptionNumber\": 1,\r\n \"sopFlag\": false,\r\n \"validation\": false,\r\n \"validationAnswer\": \"\",\r\n \"validationType\": \"\",\r\n \"multiReferenceImage\": sectionsarray[i].questions[j].answers?.multiReferenceImage ? sectionsarray[i].questions[j].answers?.multiReferenceImage : [],\r\n \"showLinked\":false,\r\n \"linkedQuestion\":0,\r\n referenceImage:'',\r\n ...(sectionsarray[i].questions[j].answerType == 'multipleImage' ? {'descriptivetype':sectionsarray[i].questions[j].answers?.descriptivetype}:{}),\r\n ...(sectionsarray[i].questions[j].answerType == 'linearscale' ? {'rangeStart':sectionsarray[i].questions[j].answers?.rangeStart,'rangeEnd':sectionsarray[i].questions[j].answers?.rangeEnd,'linearType':sectionsarray[i].questions[j].answers?.linearType,'minValue':parseInt(sectionsarray[i].questions[j].answers?.minValue),'maxValue':parseInt(sectionsarray[i].questions[j].answers?.maxValue)}:{}),\r\n ...(sectionsarray[i].questions[j].answerType == 'date' ? {'historicDate':sectionsarray[i].questions[j].answers?.historicDate,'startDate':sectionsarray[i].questions[j].answers?.startDate,'endDate':sectionsarray[i].questions[j].answers?.endDate}:{}),\r\n runAI:sectionsarray[i].questions[j]?.answers?.runAI ?? false,\r\n runAIFeatures:sectionsarray[i].questions[j]?.answers?.runAIFeatures ?? [],\r\n runAIDescription: sectionsarray[i].questions[j]?.answers?.runAIDescription ? sectionsarray[i].questions[j]?.answers?.runAIDescription : \"\",\r\n ...(sectionsarray[i].questions[j].answerType == 'image/video' ? {'limit':sectionsarray[i].questions[j].answers?.limit,'videoLimit':sectionsarray[i].questions[j].answers?.videoLimit,'imageLimit':sectionsarray[i].questions[j].answers?.imageLimit}:{}),\r\n ...(['date','linearscale','image','image/video'].includes(sectionsarray[i].questions[j].answerType) && {'matchedCount':parseInt(sectionsarray[i].questions[j].answers?.matchedCount),'notMatchedCount':parseInt(sectionsarray[i].questions[j].answers?.notMatchedCount)})\r\n\r\n // \"allowUploadfromGallery\": sectionsarray[i].questions[j].answers?.allowUploadfromGallery ? sectionsarray[i].questions[j].answers?.allowUploadfromGallery : false,\r\n // \"answerInputStyle\": sectionsarray[i].questions[j].answers?.answerInputStyle ? sectionsarray[i].questions[j].answers?.answerInputStyle : \"\",\r\n // \"runAI\": sectionsarray[i].questions[j].answers.runAI ? sectionsarray[i].questions[j].answers.runAI : false,\r\n };\r\n sectionsarray[i].questions[j].allowUploadfromGallery = sectionsarray[i].questions[j].answers?.allowUploadfromGallery ? sectionsarray[i].questions[j].answers?.allowUploadfromGallery : false;\r\n // sectionsarray[i].questions[j].runAI = sectionsarray[i].questions[j].answers.runAI;\r\n // sectionsarray[i].questions[j].runAIFeatures = sectionsarray[i].questions[j].answers.runAIFeatures;\r\n if(sectionsarray[i].questions[j].answerType == 'multipleImage') {\r\n sectionsarray[i].questions[j].descriptivetype = sectionsarray[i].questions[j].answers?.descriptivetype ? sectionsarray[i].questions[j].answers?.descriptivetype : 'text';\r\n }\r\n if(['multipleImage','image/video'].includes(sectionsarray[i].questions[j].answerType)) {\r\n sectionsarray[i].questions[j].multiQuestionReferenceImage = sectionsarray[i].questions[j].answers?.multiReferenceImage ? sectionsarray[i].questions[j].answers?.multiReferenceImage : [];\r\n }\r\n sectionsarray[i].questions[j].answers = [item];\r\n }\r\n }\r\n }\r\n checklist.sections = sectionsarray;\r\n checklist.checklistName = checklist.checklistName.trim().charAt(0).toUpperCase() + checklist.checklistName.trim().slice(1);\r\n checklist.checklistName = checklist.checklistName.trim();\r\n checklist.checklistDescription = checklist?.checklistDescription ? checklist?.checklistDescription?.trim() : '';\r\n checklist.clientId = this.clientId;\r\n this.sopService.auditChecklistUpdate(this.editvalue, checklist).pipe(takeUntil(this.detach)).subscribe((res: any) => {\r\n if(res) {\r\n if (res?.code == 200) {\r\n if (this.fromAudit) {\r\n this.router.navigateByUrl(type == 'configure'\r\n ? `/manage/trax/audit-v2/manage/configure?checklistId=${res.data.checklistId}`\r\n : '/manage/trax/audit-v2/manage');\r\n } else if(type=='configure') {\r\n this.router.navigateByUrl(`/manage/trax/configure?checkListId=${res.data.checklistId}&showEdit=true`);\r\n } else {\r\n this.router.navigateByUrl('/manage/trax/checklist');\r\n }\r\n } else {\r\n this.swalToast('Could not save the audit. Please try again.','error');\r\n }\r\n } else {\r\n this.swalToast('Could not save the audit. Please try again.','error');\r\n }\r\n }, (error) => {\r\n let err = error?.error?.error?.message || 'Could not save the audit (server error). Please try again.';\r\n this.swalToast(err,'error');\r\n });\r\n }\r\n\r\n /**\r\n * Configure needs every section to have a question (an audit visit with an empty section has nothing to\r\n * answer). Open the empty section, where \"Add Question\" is offered, and say which one it is.\r\n */\r\n showEmptySection(sectionIndex: number, sectionName: string) {\r\n this.show = sectionIndex;\r\n this.sectionIndex = sectionIndex;\r\n this.changedetector.detectChanges();\r\n this.swalToast(`Add at least one question to \"${(sectionName || '').trim() || 'Section ' + (sectionIndex + 1)}\" to continue, or delete the section.`, 'error');\r\n }\r\n\r\n markFormControlsAsTouched(control: FormGroup | FormArray,sectionIndex?: number) {\r\n control.markAsTouched();\r\n\r\n if (control instanceof FormGroup) {\r\n for (const controlName in control.controls) {\r\n this.markFormControlsAsTouched(control.get(controlName) as FormGroup);\r\n }\r\n } else if (control instanceof FormArray) {\r\n control.controls.forEach(formControl => {\r\n this.markFormControlsAsTouched(formControl as FormGroup);\r\n });\r\n }\r\n }\r\n\r\n scrollToErrors(sections: FormArray) {\r\n for(let i=0;i<sections.length;i++) {\r\n let section = sections.at(i) as FormGroup;\r\n if (section.invalid) {\r\n let questions = section.get('questions') as FormArray;\r\n for(let j=0;j<questions.length;j++) {\r\n let question = questions.at(j) as FormGroup;\r\n // console.log(question,'question');\r\n \r\n if (question.invalid) {\r\n this.show = i;\r\n this.scrollToQuestion(i, j);\r\n this.swalToast('Please fill out all the fields!','error');\r\n return;\r\n }\r\n }\r\n return;\r\n }\r\n }\r\n }\r\n\r\n swalToast(err: string,type?:string,icon?: string) {\r\n if(type == 'error') {\r\n this.toast.getErrorToast(err);\r\n }\r\n else {\r\n this.toast.getSuccessToast(err);\r\n }\r\n // Swal.fire({\r\n // toast: true,\r\n // ...( icon ? { iconHtml: icon } : {}),\r\n // // titleText: `Checklist Form Error`,\r\n // html: `<div class=\"row \">\r\n // <div class=\"col-12 mt-2\">\r\n // <div class=\"toasttitile\">${err}</div>\r\n // </div>\r\n \r\n // </div>`,\r\n // position: 'bottom',\r\n // showConfirmButton: false,\r\n // showCloseButton: true,\r\n // timer: 6000,\r\n // timerProgressBar: true,\r\n // didOpen: (toast) => {\r\n // toast.addEventListener('mouseenter', Swal.stopTimer)\r\n // toast.addEventListener('mouseleave', Swal.resumeTimer)\r\n // $(\"#kt_create_account_form_account_type_personal\")?.val('');\r\n // this.changedetector.detectChanges();\r\n // }\r\n // });\r\n }\r\n\r\n RunAI(sIdx:number,qIdx: number,ansIdx:number=-1) {\r\n let dialogRef: any;\r\n let question: any = this.getQuestionFormControl(sIdx,qIdx,'qname')?.value;\r\n if(this.getAnswerFormGroup_FormControl(sIdx,qIdx,'runAI',ansIdx)?.value == false) {\r\n if(!question || !this.ChecklistForm.get('checklistName')?.value) {\r\n let err: string = !question ? 'Please enter question to continue!' : 'Please enter Checklist Name to continue!';\r\n this.swalToast(err,'error'); \r\n this.runAIOff(sIdx, qIdx,false,ansIdx);\r\n return;\r\n } else {\r\n const dialogRef = this.dialog.open(TraxpopupComponent,{centered: true, size: 'md'});\r\n dialogRef.componentInstance.data = {\r\n imagesrc: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\"><rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#D1FADF\"/><path d=\"M23.3564 19.3525C24.1748 18.7327 25.1738 18.3985 26.2004 18.4009C26.5549 18.393 26.9057 18.4746 27.2204 18.6382C27.535 18.8018 27.8033 19.0421 28.0004 19.3369C28.1975 19.0421 28.4658 18.8018 28.7804 18.6382C29.095 18.4746 29.4459 18.393 29.8004 18.4009C30.827 18.3985 31.826 18.7327 32.6444 19.3525C33.2744 19.8421 33.7604 20.5201 33.932 21.3397C34.3256 21.3697 34.6856 21.5329 34.988 21.7789C35.4464 22.1509 35.78 22.7089 35.99 23.2993C36.3188 24.2173 36.4076 25.3873 36.0668 26.3833C36.1532 26.4241 36.2384 26.4721 36.3212 26.5273C36.6512 26.7469 36.902 27.0613 37.0868 27.4321C37.4504 28.1581 37.6004 29.1709 37.6004 30.4009C37.6004 31.7701 37.0784 32.6893 36.416 33.2569C36.0497 33.571 35.6174 33.7986 35.1512 33.9229C35.0312 34.5925 34.6952 35.3677 34.1684 36.0253C33.4844 36.8833 32.4236 37.6009 31.0004 37.6009C29.8724 37.6009 28.9748 36.9769 28.3916 36.3649C28.2522 36.2188 28.1215 36.0645 28.0004 35.9029C27.8793 36.0645 27.7486 36.2188 27.6092 36.3649C27.026 36.9769 26.1296 37.6009 25.0004 37.6009C23.5772 37.6009 22.5176 36.8833 21.8324 36.0253C21.3401 35.414 21.0029 34.6927 20.8496 33.9229C20.3834 33.7986 19.9511 33.571 19.5848 33.2569C18.9224 32.6893 18.4004 31.7689 18.4004 30.4009C18.4004 29.1709 18.5516 28.1569 18.914 27.4321C19.0857 27.0685 19.3497 26.7561 19.6796 26.5261C19.7606 26.4725 19.8457 26.4251 19.934 26.3845C19.5932 25.3861 19.682 24.2173 20.0108 23.2993C20.2208 22.7089 20.5544 22.1509 21.0128 21.7789C21.3152 21.5329 21.6752 21.3709 22.0688 21.3397C22.2416 20.5201 22.7264 19.8421 23.3564 19.3525ZM27.4004 21.4009V21.3889L27.398 21.3289C27.3803 21.0161 27.3181 20.7074 27.2132 20.4121C27.1385 20.1892 27.0113 19.9876 26.8424 19.8241C26.6651 19.6698 26.4352 19.5898 26.2004 19.6009C25.4407 19.5983 24.7009 19.8435 24.0932 20.2993C23.5364 20.7325 23.2004 21.3193 23.2004 22.0009C23.2003 22.0959 23.1777 22.1896 23.1343 22.2741C23.091 22.3587 23.0282 22.4318 22.9511 22.4873C22.874 22.5428 22.7848 22.5793 22.6909 22.5936C22.5969 22.6079 22.5009 22.5997 22.4108 22.5697C22.1852 22.4953 21.9836 22.5373 21.7688 22.7101C21.5336 22.9021 21.3044 23.2429 21.14 23.7025C20.8052 24.6409 20.84 25.7773 21.2996 26.4685C21.3652 26.567 21.4003 26.6826 21.4004 26.8009H22.3004C23.0165 26.8009 23.7032 27.0854 24.2096 27.5917C24.7159 28.0981 25.0004 28.7848 25.0004 29.5009V29.9029C25.4007 30.0445 25.7381 30.323 25.953 30.6892C26.1678 31.0555 26.2463 31.4859 26.1745 31.9044C26.1027 32.3229 25.8852 32.7025 25.5606 32.9762C25.2359 33.2499 24.825 33.4 24.4004 33.4C23.9758 33.4 23.5648 33.2499 23.2402 32.9762C22.9156 32.7025 22.6981 32.3229 22.6263 31.9044C22.5545 31.4859 22.633 31.0555 22.8478 30.6892C23.0627 30.323 23.4001 30.0445 23.8004 29.9029V29.5009C23.8004 28.6729 23.1284 28.0009 22.3004 28.0009H20.2004C20.1287 28.0008 20.0575 27.9878 19.9904 27.9625L19.9868 27.9697C19.7492 28.4437 19.6004 29.2309 19.6004 30.4009C19.6004 31.4317 19.9784 32.0125 20.366 32.3449C20.7824 32.7025 21.2444 32.8009 21.4004 32.8009C21.5595 32.8009 21.7121 32.8641 21.8247 32.9767C21.9372 33.0892 22.0004 33.2418 22.0004 33.4009C22.0004 33.8425 22.2404 34.6141 22.7684 35.2765C23.2832 35.9185 24.0236 36.4009 25.0004 36.4009C25.6724 36.4009 26.2748 36.0253 26.7404 35.5369C26.9696 35.2969 27.1484 35.0485 27.2648 34.8445C27.3178 34.7541 27.3631 34.6593 27.4004 34.5613V25.0009H26.0984C25.9569 25.4012 25.6783 25.7387 25.3121 25.9535C24.9459 26.1683 24.5154 26.2468 24.097 26.175C23.6785 26.1032 23.2988 25.8858 23.0251 25.5611C22.7514 25.2365 22.6013 24.8255 22.6013 24.4009C22.6013 23.9763 22.7514 23.5654 23.0251 23.2407C23.2988 22.9161 23.6785 22.6986 24.097 22.6268C24.5154 22.555 24.9459 22.6335 25.3121 22.8483C25.6783 23.0632 25.9569 23.4006 26.0984 23.8009H27.4004V21.4009ZM28.6004 33.3997V34.5601C28.6377 34.6581 28.683 34.7528 28.736 34.8433C28.8536 35.0473 29.0312 35.2957 29.2592 35.5357C29.726 36.0241 30.3296 36.3997 31.0004 36.3997C31.9772 36.3997 32.7176 35.9173 33.2324 35.2753C33.7604 34.6129 34.0004 33.8413 34.0004 33.3997C34.0004 33.2406 34.0636 33.088 34.1761 32.9755C34.2886 32.8629 34.4413 32.7997 34.6004 32.7997C34.7564 32.7997 35.2184 32.7013 35.6348 32.3437C36.0224 32.0113 36.4004 31.4305 36.4004 30.3997C36.4004 29.2297 36.2504 28.4437 36.014 27.9685C35.9349 27.7916 35.8108 27.6385 35.654 27.5245C35.5189 27.4381 35.3606 27.395 35.2004 27.4009C35.0919 27.4009 34.9854 27.3714 34.8923 27.3156C34.7992 27.2598 34.723 27.1798 34.6717 27.0841C34.6205 26.9884 34.5962 26.8807 34.6014 26.7723C34.6066 26.6638 34.6411 26.5589 34.7012 26.4685C35.162 25.7773 35.1956 24.6409 34.8608 23.7025C34.6964 23.2429 34.4672 22.9009 34.232 22.7101C34.0172 22.5373 33.8156 22.4941 33.59 22.5697C33.4998 22.5997 33.4038 22.6079 33.3099 22.5936C33.216 22.5793 33.1268 22.5428 33.0497 22.4873C32.9726 22.4318 32.9098 22.3587 32.8664 22.2741C32.8231 22.1896 32.8005 22.0959 32.8004 22.0009C32.8004 21.3193 32.4644 20.7325 31.9064 20.2993C31.299 19.8438 30.5596 19.5986 29.8004 19.6009C29.5656 19.5898 29.3356 19.6698 29.1584 19.8241C28.9889 19.9874 28.8613 20.1891 28.7864 20.4121C28.6721 20.7256 28.6093 21.0554 28.6004 21.3889V32.2009H29.5004C30.3284 32.2009 31.0004 31.5289 31.0004 30.7009V28.4989C30.6001 28.3574 30.2627 28.0789 30.0478 27.7126C29.833 27.3464 29.7545 26.916 29.8263 26.4975C29.8981 26.079 30.1156 25.6993 30.4402 25.4257C30.7648 25.152 31.1758 25.0019 31.6004 25.0019C32.025 25.0019 32.4359 25.152 32.7606 25.4257C33.0852 25.6993 33.3027 26.079 33.3745 26.4975C33.4463 26.916 33.3678 27.3464 33.153 27.7126C32.9381 28.0789 32.6007 28.3574 32.2004 28.4989V30.7009C32.2004 31.417 31.9159 32.1038 31.4096 32.6101C30.9032 33.1165 30.2165 33.4009 29.5004 33.4009H28.6004V33.3997ZM23.8004 24.4009C23.8004 24.5601 23.8636 24.7127 23.9761 24.8252C24.0886 24.9377 24.2413 25.0009 24.4004 25.0009C24.5595 25.0009 24.7121 24.9377 24.8247 24.8252C24.9372 24.7127 25.0004 24.5601 25.0004 24.4009C25.0004 24.2418 24.9372 24.0892 24.8247 23.9767C24.7121 23.8641 24.5595 23.8009 24.4004 23.8009C24.2413 23.8009 24.0886 23.8641 23.9761 23.9767C23.8636 24.0892 23.8004 24.2418 23.8004 24.4009ZM31.6004 27.4009C31.7595 27.4009 31.9121 27.3377 32.0247 27.2252C32.1372 27.1127 32.2004 26.9601 32.2004 26.8009C32.2004 26.6418 32.1372 26.4892 32.0247 26.3767C31.9121 26.2641 31.7595 26.2009 31.6004 26.2009C31.4413 26.2009 31.2886 26.2641 31.1761 26.3767C31.0636 26.4892 31.0004 26.6418 31.0004 26.8009C31.0004 26.9601 31.0636 27.1127 31.1761 27.2252C31.2886 27.3377 31.4413 27.4009 31.6004 27.4009ZM24.4004 31.0009C24.2413 31.0009 24.0886 31.0641 23.9761 31.1767C23.8636 31.2892 23.8004 31.4418 23.8004 31.6009C23.8004 31.7601 23.8636 31.9127 23.9761 32.0252C24.0886 32.1377 24.2413 32.2009 24.4004 32.2009C24.5595 32.2009 24.7121 32.1377 24.8247 32.0252C24.9372 31.9127 25.0004 31.7601 25.0004 31.6009C25.0004 31.4418 24.9372 31.2892 24.8247 31.1767C24.7121 31.0641 24.5595 31.0009 24.4004 31.0009Z\" fill=\"#039855\"/><rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#ECFDF3\" stroke-width=\"8\"/></svg>`,\r\n title: `Run AI on image uploaded`,\r\n content: `Use the power of AI to compare and detect anomalies between uploaded and reference image.`,\r\n inputlabel1: 'Question',\r\n inputtype1: 'text',\r\n input1: 'true',\r\n inputlabel2: 'Specify your request',\r\n inputtype2: 'text',\r\n resType: 'custom',\r\n input2: 'true',\r\n placeholder1: question,\r\n placeholder2: 'Please compare the uploaded images a..',\r\n buttontype: 'Request'\r\n }\r\n dialogRef.result.then((res: any) => {\r\n if (res && res.status == 'confirm') {\r\n let req: any = {\r\n checklistName: this.ChecklistForm.get('checklistName')?.value,\r\n questionName: question,\r\n runAIDescription: res.data.requestText,\r\n answerType: \"image\",\r\n referenceImage: this.getAnswerFormGroup_FormControl(sIdx, qIdx, \"multiReferenceImage\",ansIdx)?.value || '',\r\n clientId:this.clientId\r\n }\r\n this.sopService.runAIInsert(req).pipe(takeUntil(this.detach)).subscribe((apires: any) => {\r\n if (apires) {\r\n if (apires.code == 200) {\r\n if (!this.hasValidationEnabled(sIdx, qIdx)) {\r\n ((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(sIdx) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(qIdx) as FormGroup).get('compliance')?.enable({ onlySelf: true })\r\n }\r\n console.log(((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(sIdx) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(qIdx) as FormGroup).get('compliance'))\r\n this.getAnswerFormGroup_FormControl(sIdx, qIdx, 'runAI',ansIdx)?.patchValue(true);\r\n this.getQuestionFormControl(sIdx, qIdx, 'runAI',ansIdx)?.patchValue(true);\r\n this.getQuestionFormControl(sIdx, qIdx, 'runAIDescription',ansIdx)?.patchValue(res.data.requestText);\r\n this.swalToast(\r\n `<span style=\"padding-right: 36px;\">${apires.data.message}</span>`,\r\n `<img src=\"../../../../assets/Icons/sop-runai-tosticon.svg\" />`\r\n );\r\n // <a \r\n // href=\"/support/view-tickets\" \r\n // target=\"_blank\" \r\n // style=\"color: var(--primary-700, #009BF3);font-family: Roboto;font-size: 15px;font-weight: 700;text-decoration: underline;cursor: pointer;\">\r\n // View Ticket\r\n // </a>\r\n } else {\r\n this.runAIOff(sIdx, qIdx,true,ansIdx);\r\n }\r\n } else {\r\n this.runAIOff(sIdx, qIdx,true,ansIdx);\r\n }\r\n }, (error) => {\r\n this.runAIOff(sIdx, qIdx,true,ansIdx);\r\n });\r\n } else {\r\n this.runAIOff(sIdx, qIdx,false,ansIdx);\r\n }\r\n });\r\n }\r\n } else {\r\n const dialogRef = this.dialog.open(TraxpopupComponent,{centered: true, size: 'md'});\r\n dialogRef.componentInstance.data = {\r\n imagesrc: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\"><rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#D1FADF\"/><path d=\"M23.3564 19.3525C24.1748 18.7327 25.1738 18.3985 26.2004 18.4009C26.5549 18.393 26.9057 18.4746 27.2204 18.6382C27.535 18.8018 27.8033 19.0421 28.0004 19.3369C28.1975 19.0421 28.4658 18.8018 28.7804 18.6382C29.095 18.4746 29.4459 18.393 29.8004 18.4009C30.827 18.3985 31.826 18.7327 32.6444 19.3525C33.2744 19.8421 33.7604 20.5201 33.932 21.3397C34.3256 21.3697 34.6856 21.5329 34.988 21.7789C35.4464 22.1509 35.78 22.7089 35.99 23.2993C36.3188 24.2173 36.4076 25.3873 36.0668 26.3833C36.1532 26.4241 36.2384 26.4721 36.3212 26.5273C36.6512 26.7469 36.902 27.0613 37.0868 27.4321C37.4504 28.1581 37.6004 29.1709 37.6004 30.4009C37.6004 31.7701 37.0784 32.6893 36.416 33.2569C36.0497 33.571 35.6174 33.7986 35.1512 33.9229C35.0312 34.5925 34.6952 35.3677 34.1684 36.0253C33.4844 36.8833 32.4236 37.6009 31.0004 37.6009C29.8724 37.6009 28.9748 36.9769 28.3916 36.3649C28.2522 36.2188 28.1215 36.0645 28.0004 35.9029C27.8793 36.0645 27.7486 36.2188 27.6092 36.3649C27.026 36.9769 26.1296 37.6009 25.0004 37.6009C23.5772 37.6009 22.5176 36.8833 21.8324 36.0253C21.3401 35.414 21.0029 34.6927 20.8496 33.9229C20.3834 33.7986 19.9511 33.571 19.5848 33.2569C18.9224 32.6893 18.4004 31.7689 18.4004 30.4009C18.4004 29.1709 18.5516 28.1569 18.914 27.4321C19.0857 27.0685 19.3497 26.7561 19.6796 26.5261C19.7606 26.4725 19.8457 26.4251 19.934 26.3845C19.5932 25.3861 19.682 24.2173 20.0108 23.2993C20.2208 22.7089 20.5544 22.1509 21.0128 21.7789C21.3152 21.5329 21.6752 21.3709 22.0688 21.3397C22.2416 20.5201 22.7264 19.8421 23.3564 19.3525ZM27.4004 21.4009V21.3889L27.398 21.3289C27.3803 21.0161 27.3181 20.7074 27.2132 20.4121C27.1385 20.1892 27.0113 19.9876 26.8424 19.8241C26.6651 19.6698 26.4352 19.5898 26.2004 19.6009C25.4407 19.5983 24.7009 19.8435 24.0932 20.2993C23.5364 20.7325 23.2004 21.3193 23.2004 22.0009C23.2003 22.0959 23.1777 22.1896 23.1343 22.2741C23.091 22.3587 23.0282 22.4318 22.9511 22.4873C22.874 22.5428 22.7848 22.5793 22.6909 22.5936C22.5969 22.6079 22.5009 22.5997 22.4108 22.5697C22.1852 22.4953 21.9836 22.5373 21.7688 22.7101C21.5336 22.9021 21.3044 23.2429 21.14 23.7025C20.8052 24.6409 20.84 25.7773 21.2996 26.4685C21.3652 26.567 21.4003 26.6826 21.4004 26.8009H22.3004C23.0165 26.8009 23.7032 27.0854 24.2096 27.5917C24.7159 28.0981 25.0004 28.7848 25.0004 29.5009V29.9029C25.4007 30.0445 25.7381 30.323 25.953 30.6892C26.1678 31.0555 26.2463 31.4859 26.1745 31.9044C26.1027 32.3229 25.8852 32.7025 25.5606 32.9762C25.2359 33.2499 24.825 33.4 24.4004 33.4C23.9758 33.4 23.5648 33.2499 23.2402 32.9762C22.9156 32.7025 22.6981 32.3229 22.6263 31.9044C22.5545 31.4859 22.633 31.0555 22.8478 30.6892C23.0627 30.323 23.4001 30.0445 23.8004 29.9029V29.5009C23.8004 28.6729 23.1284 28.0009 22.3004 28.0009H20.2004C20.1287 28.0008 20.0575 27.9878 19.9904 27.9625L19.9868 27.9697C19.7492 28.4437 19.6004 29.2309 19.6004 30.4009C19.6004 31.4317 19.9784 32.0125 20.366 32.3449C20.7824 32.7025 21.2444 32.8009 21.4004 32.8009C21.5595 32.8009 21.7121 32.8641 21.8247 32.9767C21.9372 33.0892 22.0004 33.2418 22.0004 33.4009C22.0004 33.8425 22.2404 34.6141 22.7684 35.2765C23.2832 35.9185 24.0236 36.4009 25.0004 36.4009C25.6724 36.4009 26.2748 36.0253 26.7404 35.5369C26.9696 35.2969 27.1484 35.0485 27.2648 34.8445C27.3178 34.7541 27.3631 34.6593 27.4004 34.5613V25.0009H26.0984C25.9569 25.4012 25.6783 25.7387 25.3121 25.9535C24.9459 26.1683 24.5154 26.2468 24.097 26.175C23.6785 26.1032 23.2988 25.8858 23.0251 25.5611C22.7514 25.2365 22.6013 24.8255 22.6013 24.4009C22.6013 23.9763 22.7514 23.5654 23.0251 23.2407C23.2988 22.9161 23.6785 22.6986 24.097 22.6268C24.5154 22.555 24.9459 22.6335 25.3121 22.8483C25.6783 23.0632 25.9569 23.4006 26.0984 23.8009H27.4004V21.4009ZM28.6004 33.3997V34.5601C28.6377 34.6581 28.683 34.7528 28.736 34.8433C28.8536 35.0473 29.0312 35.2957 29.2592 35.5357C29.726 36.0241 30.3296 36.3997 31.0004 36.3997C31.9772 36.3997 32.7176 35.9173 33.2324 35.2753C33.7604 34.6129 34.0004 33.8413 34.0004 33.3997C34.0004 33.2406 34.0636 33.088 34.1761 32.9755C34.2886 32.8629 34.4413 32.7997 34.6004 32.7997C34.7564 32.7997 35.2184 32.7013 35.6348 32.3437C36.0224 32.0113 36.4004 31.4305 36.4004 30.3997C36.4004 29.2297 36.2504 28.4437 36.014 27.9685C35.9349 27.7916 35.8108 27.6385 35.654 27.5245C35.5189 27.4381 35.3606 27.395 35.2004 27.4009C35.0919 27.4009 34.9854 27.3714 34.8923 27.3156C34.7992 27.2598 34.723 27.1798 34.6717 27.0841C34.6205 26.9884 34.5962 26.8807 34.6014 26.7723C34.6066 26.6638 34.6411 26.5589 34.7012 26.4685C35.162 25.7773 35.1956 24.6409 34.8608 23.7025C34.6964 23.2429 34.4672 22.9009 34.232 22.7101C34.0172 22.5373 33.8156 22.4941 33.59 22.5697C33.4998 22.5997 33.4038 22.6079 33.3099 22.5936C33.216 22.5793 33.1268 22.5428 33.0497 22.4873C32.9726 22.4318 32.9098 22.3587 32.8664 22.2741C32.8231 22.1896 32.8005 22.0959 32.8004 22.0009C32.8004 21.3193 32.4644 20.7325 31.9064 20.2993C31.299 19.8438 30.5596 19.5986 29.8004 19.6009C29.5656 19.5898 29.3356 19.6698 29.1584 19.8241C28.9889 19.9874 28.8613 20.1891 28.7864 20.4121C28.6721 20.7256 28.6093 21.0554 28.6004 21.3889V32.2009H29.5004C30.3284 32.2009 31.0004 31.5289 31.0004 30.7009V28.4989C30.6001 28.3574 30.2627 28.0789 30.0478 27.7126C29.833 27.3464 29.7545 26.916 29.8263 26.4975C29.8981 26.079 30.1156 25.6993 30.4402 25.4257C30.7648 25.152 31.1758 25.0019 31.6004 25.0019C32.025 25.0019 32.4359 25.152 32.7606 25.4257C33.0852 25.6993 33.3027 26.079 33.3745 26.4975C33.4463 26.916 33.3678 27.3464 33.153 27.7126C32.9381 28.0789 32.6007 28.3574 32.2004 28.4989V30.7009C32.2004 31.417 31.9159 32.1038 31.4096 32.6101C30.9032 33.1165 30.2165 33.4009 29.5004 33.4009H28.6004V33.3997ZM23.8004 24.4009C23.8004 24.5601 23.8636 24.7127 23.9761 24.8252C24.0886 24.9377 24.2413 25.0009 24.4004 25.0009C24.5595 25.0009 24.7121 24.9377 24.8247 24.8252C24.9372 24.7127 25.0004 24.5601 25.0004 24.4009C25.0004 24.2418 24.9372 24.0892 24.8247 23.9767C24.7121 23.8641 24.5595 23.8009 24.4004 23.8009C24.2413 23.8009 24.0886 23.8641 23.9761 23.9767C23.8636 24.0892 23.8004 24.2418 23.8004 24.4009ZM31.6004 27.4009C31.7595 27.4009 31.9121 27.3377 32.0247 27.2252C32.1372 27.1127 32.2004 26.9601 32.2004 26.8009C32.2004 26.6418 32.1372 26.4892 32.0247 26.3767C31.9121 26.2641 31.7595 26.2009 31.6004 26.2009C31.4413 26.2009 31.2886 26.2641 31.1761 26.3767C31.0636 26.4892 31.0004 26.6418 31.0004 26.8009C31.0004 26.9601 31.0636 27.1127 31.1761 27.2252C31.2886 27.3377 31.4413 27.4009 31.6004 27.4009ZM24.4004 31.0009C24.2413 31.0009 24.0886 31.0641 23.9761 31.1767C23.8636 31.2892 23.8004 31.4418 23.8004 31.6009C23.8004 31.7601 23.8636 31.9127 23.9761 32.0252C24.0886 32.1377 24.2413 32.2009 24.4004 32.2009C24.5595 32.2009 24.7121 32.1377 24.8247 32.0252C24.9372 31.9127 25.0004 31.7601 25.0004 31.6009C25.0004 31.4418 24.9372 31.2892 24.8247 31.1767C24.7121 31.0641 24.5595 31.0009 24.4004 31.0009Z\" fill=\"#039855\"/><rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#ECFDF3\" stroke-width=\"8\"/></svg>`,\r\n title: `Don't run AI on image uploaded`,\r\n content: `Do you wish to not run AI in the image?`,\r\n buttontype: 'confirm'\r\n }\r\n dialogRef.result.then((res: any) => {\r\n if (res) {\r\n this.runAIOff(sIdx,qIdx,false,ansIdx);\r\n } else {\r\n this.getAnswerFormGroup_FormControl(sIdx, qIdx, 'runAI')?.patchValue(true);\r\n this.getQuestionFormControl(sIdx, qIdx, 'runAI')?.patchValue(true);\r\n }\r\n });\r\n }\r\n }\r\n\r\n runAIOff(sIdx: number, qIdx: number, showError?: boolean,ansIdx:number=-1) {\r\n const answerFormGroup = this.getAnswerFormGroup_FormControl(sIdx, qIdx, 'runAI',ansIdx);\r\n const sectionQuestion = ((((this.ChecklistForm.get('sections') as FormArray).at(sIdx) as FormGroup).get('questions') as FormArray).at(qIdx) as FormGroup);\r\n if (answerFormGroup) {\r\n answerFormGroup.patchValue(false);\r\n }\r\n\r\n const answersControl = sectionQuestion.get('answers');\r\n let answers: FormGroup | null = null;\r\n if (ansIdx !== -1 && answersControl instanceof FormArray) {\r\n answers = answersControl.at(ansIdx) as FormGroup;\r\n } else if (answersControl instanceof FormGroup) {\r\n answers = answersControl;\r\n }\r\n (answers?.get('runAIFeatures') as FormArray)?.clear();\r\n\r\n const questionControl = this.getQuestionFormControl(sIdx, qIdx, 'runAI',ansIdx);\r\n if (questionControl) {\r\n questionControl.patchValue(false);\r\n }\r\n\r\n (answers?.get('runAIDescription') as FormControl)?.setValue('');\r\n\r\n this.unlockQuestionAfterRunAIOff(sIdx, qIdx, ansIdx);\r\n\r\n if (showError) {\r\n this.swalToast('Unable to process runAI request! Try again after some time!','error');\r\n }\r\n }\r\n\r\n unlockQuestionAfterRunAIOff(sIdx: number, qIdx: number, ansIdx: number = -1) {\r\n const question = ((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(sIdx) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(qIdx) as FormGroup);\r\n\r\n const answers = question.get('answers');\r\n\r\n if (answers instanceof FormArray) {\r\n const stillLocked = answers.controls.some((a, idx) =>\r\n idx !== ansIdx && (a as FormGroup).get('runAI')?.value === true);\r\n if (stillLocked) return;\r\n }\r\n\r\n question.get('disableRunAI')?.setValue(false, { emitEvent: false });\r\n\r\n ['qname', 'answerType', 'runAI', 'allowUploadfromGallery', 'descriptivetype']\r\n .forEach(name => question.get(name)?.enable({ emitEvent: false }));\r\n\r\n if (answers instanceof FormArray) {\r\n answers.controls.forEach(ans => {\r\n if (ans instanceof FormGroup) {\r\n ['answer', 'validation', 'validationType', 'allowUploadfromGallery', 'runAI']\r\n .forEach(name => ans.get(name)?.enable({ emitEvent: false }));\r\n }\r\n });\r\n } else if (answers instanceof FormGroup) {\r\n ['allowUploadfromGallery', 'runAI']\r\n .forEach(name => answers.get(name)?.enable({ emitEvent: false }));\r\n }\r\n\r\n this.changedetector.detectChanges();\r\n }\r\n\r\n\r\n getSectionFormArray() {\r\n return (this.ChecklistForm.get('sections') as FormArray);\r\n }\r\n\r\n getFormControl(formControl: string) {\r\n return (this.ChecklistForm.get(formControl) as FormControl);\r\n }\r\n\r\n getSectionFormControl(sectionIndex: number, formControlName: string) {\r\n return (\r\n (this.ChecklistForm.get('sections') as FormArray)\r\n .at(sectionIndex) as FormGroup)\r\n .get(formControlName);\r\n }\r\n\r\n getQuestionFormControl(sectionIndex: number, questionIndex: number, formControlName: string,ansIdx:number = -1) {\r\n const sections = this.ChecklistForm.get('sections') as FormArray | null;\r\n if (!sections) return null;\r\n \r\n const section = sections.at(sectionIndex) as FormGroup | null;\r\n if (!section) return null;\r\n \r\n const questions = section.get('questions') as FormArray | null;\r\n if (!questions) return null;\r\n \r\n let question = questions.at(questionIndex) as FormGroup | null;\r\n if (!question) return null;\r\n\r\n if(ansIdx != -1) {\r\n let answerList = question.get('answers') as FormArray | null;\r\n if(!answerList) return null;\r\n question = answerList.at(ansIdx) as FormGroup | null;\r\n if(!question) return null;\r\n }\r\n \r\n const control = question.get(formControlName) as FormControl | null;\r\n return control;\r\n }\r\n \r\n\r\n getFormArrayQuestions(sectionIndex: number) {\r\n return ((this.ChecklistForm.get('sections') as FormArray).at(sectionIndex).get('questions') as FormArray);\r\n }\r\n\r\n // individual question\r\n getQuestionsFormGroup(sectionIndex: number, questionIndex: number) {\r\n return (((this.ChecklistForm.get('sections') as FormArray).at(sectionIndex).get('questions') as FormArray).at(questionIndex) as FormGroup);\r\n }\r\n\r\n // Until qdescription became an editable field, saving a question-level auto task copied the task\r\n // description into it. Treat that copy as \"no description\" so it isn't shown to store users.\r\n savedQuestionDescription(question: any): string {\r\n const qdescription = question?.qdescription || '';\r\n const isTaskCopy = (question?.answers || []).some((ans: any) => ans?.autoTask?.enabled && ans.autoTask.taskDescription === qdescription);\r\n return isTaskCopy ? '' : qdescription;\r\n }\r\n\r\n isQdescriptionOpen(question: AbstractControl): boolean {\r\n return this.openedQdescriptions.has(question) || !!question.get('qdescription')?.value;\r\n }\r\n\r\n openQdescription(question: AbstractControl, sectionIndex: number, questionIndex: number) {\r\n if (!question.get('qdescription')) {\r\n (question as FormGroup).addControl('qdescription', this.fb.control(''));\r\n }\r\n this.openedQdescriptions.add(question);\r\n setTimeout(() => document.getElementById(`qdesc-${sectionIndex}-${questionIndex}`)?.focus());\r\n }\r\n\r\n removeQdescription(question: AbstractControl) {\r\n this.openedQdescriptions.delete(question);\r\n question.get('qdescription')?.setValue('');\r\n }\r\n\r\n getFormArrayQuestionsAnswer(sectionIndex: number, questionIndex: number, formArrayName: string,ansIndex:number = -1,linkquestionIndex:number = -1) {\r\n let section = ((this.ChecklistForm.get('sections') as FormArray)?.at(sectionIndex) as FormGroup);\r\n let questions = ((section.get('questions') as FormArray)?.at(questionIndex) as FormGroup);\r\n if(ansIndex == -1) {\r\n return (questions.get(formArrayName) as FormArray);\r\n }\r\n else {\r\n let answers = ((questions.get('answers') as FormArray)?.at(ansIndex) as FormGroup);\r\n let linkedIndex = ((answers.get('linkQuestionAnswers') as FormArray).at(linkquestionIndex) as FormGroup);\r\n return (linkedIndex.get('answers') as FormArray)\r\n }\r\n }\r\n\r\n getFormArrayLinkedQuestions(sectionIndex: number, questionIndex: number,answerIndex:number) {\r\n let section = ((this.ChecklistForm.get('sections') as FormArray)?.at(sectionIndex) as FormGroup);\r\n let questions = ((section.get('questions') as FormArray)?.at(questionIndex) as FormGroup);\r\n let answer = (questions.get('answers') as FormArray)?.at(answerIndex) as FormGroup;\r\n return (answer.get('linkQuestionAnswers') as FormArray)\r\n }\r\n\r\n getQuestionsFormArrayValues(sectionIndex: number): any[] {\r\n return ((this.ChecklistForm.get('sections') as FormArray).at(sectionIndex).get('questions') as FormArray).getRawValue() || [];\r\n }\r\n\r\n getAnswerFormGroup_FormControl(sectionIndex: number, questionIndex: number, formControlName: string,ansIdx:number= -1) {\r\n const sections = this.ChecklistForm.get('sections') as FormArray | null;\r\n if (!sections) return null;\r\n \r\n const section = sections.at(sectionIndex) as FormGroup | null;\r\n if (!section) return null;\r\n \r\n const questions = section.get('questions') as FormArray | null;\r\n if (!questions) return null;\r\n \r\n const question = questions.at(questionIndex) as FormGroup | null;\r\n if (!question) return null;\r\n\r\n if(formControlName == \"multiQuestionReferenceImage\") {\r\n const control = question.get(formControlName) as FormArray | null;\r\n return control;\r\n }\r\n else {\r\n let answers = question.get('answers') as FormGroup | null;\r\n if (!answers) return null;\r\n \r\n if(ansIdx != -1) {\r\n \r\n let answerList = question.get('answers') as FormArray | null;\r\n if(!answerList) return null;\r\n answers = answerList.at(ansIdx) as FormGroup | null;\r\n if (!answers) return null;\r\n }\r\n const control = answers.get(formControlName) as FormControl | null;\r\n return control;\r\n }\r\n \r\n }\r\n\r\n removedNestedQuestion(sectionindex: number,qno:any) {\r\n let questions = (this.getSectionFormArray().at(sectionindex).get('questions') as FormArray);\r\n for (let i = 0; i < questions.length; i++) {\r\n let answers = (questions.at(i) as FormGroup)?.get('answers') as FormArray;\r\n if(answers) {\r\n for(let j=0;j<answers.length;j++) {\r\n let linked = (answers.at(j) as FormGroup)?.get('showLinked')?.value;\r\n if(linked) {\r\n let questionNo = (answers.at(j) as FormGroup)?.get('linkedQuestion')?.value;\r\n if(questionNo == qno) {\r\n (answers.at(j) as FormGroup)?.get('linkedQuestion')?.setValue(0);\r\n (answers.at(j) as FormGroup)?.get('showLinked')?.setValue(false);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n updateQuestionQnos(sectionindex: number) {\r\n let questions = (this.getSectionFormArray().at(sectionindex).get('questions') as FormArray);\r\n let updatedList:any = [];\r\n for (let i = 0; i < questions.length; i++) {\r\n let qno = (questions.at(i) as FormGroup)?.get('qno')?.value;\r\n if(!this.deletedList.includes(qno)) {\r\n let questionArray = questions?.value;\r\n for(let qn = 0; qn < questionArray.length ;qn++) {\r\n if(!updatedList.includes(qn)) {\r\n let item = questionArray[qn];\r\n if (!['descriptive', 'image', 'descriptiveImage', 'multipleImage', 'video','linearscale','time','date'].includes(item.answerType)) {\r\n for(let ans = 0; ans < item.answers.length ; ans++) {\r\n if (item.answers[ans].linkedQuestion == qno) {\r\n updatedList.push(qn);\r\n (((questions.at(qn) as FormGroup)?.get('answers') as FormArray).at(ans) as FormGroup).get('linkedQuestion')?.setValue(i+1);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n (questions.at(i) as FormGroup)?.get('qno')?.setValue(i+1);\r\n }\r\n this.ChecklistForm.updateValueAndValidity();\r\n }\r\n\r\n // updateQuestionQnos(sectionindex: number) {\r\n // let questions = (this.getSectionFormArray().at(sectionindex).get('questions') as FormArray);\r\n // let questionArray = questions?.value;\r\n // for (let i = 0; i < questions.length; i++) {\r\n // let qno = (questions.at(i) as FormGroup)?.get('qno')?.value;\r\n // if(!this.deletedList.includes(qno)) {\r\n // for(let qn = 0; qn < questionArray.length ;qn++) {\r\n // let item = questionArray[qn];\r\n // if (!['descriptive', 'image', 'descriptiveImage', 'multipleImage', 'video','linearscale','time','date'].includes(item.answerType)) {\r\n // let findIndex = item.answers.map((item:any, index:any) => (item.linkedQuestion == qno ? index : -1)).filter((index:any) => index !== -1);\r\n // if(findIndex.length) {\r\n // findIndex.forEach((idx:number) => {\r\n // item.answers[idx].checked = true;\r\n // (((questions.at(qn) as FormGroup)?.get('answers') as FormArray).at(idx) as FormGroup).get('linkedQuestion')?.setValue(i+1);\r\n // })\r\n // }\r\n // // let findAnsIdx = item.answers.findIndex((ele:any) => ele.linkedQuestion == qno && !item.checked);\r\n // // if(findAnsIdx != -1) {\r\n // // }\r\n // }\r\n // }\r\n // }\r\n // (questions.at(i) as FormGroup)?.get('qno')?.setValue(i+1);\r\n // }\r\n // this.ChecklistForm.updateValueAndValidity();\r\n // }\r\n\r\n getQuestionsAnswerFormGroup(sectionIndex: number, questionIndex: number,ansIndex:number) {\r\n return (((((this.ChecklistForm.get('sections') as FormArray).at(sectionIndex).get('questions') as FormArray).at(questionIndex) as FormGroup).get('answers') as FormArray).at(ansIndex) as FormGroup);\r\n }\r\n\r\n setActiveQuestion(secIdx: number, questionIndex: number, activestatus: number,answerIndex:number = -1) {\r\n if(activestatus == 1) {\r\n if(answerIndex != -1) {\r\n this.getQuestionsAnswerFormGroup(secIdx,questionIndex,answerIndex).addControl('active',this.fb.control(true));\r\n }\r\n this.getQuestionsFormGroup(secIdx,questionIndex).addControl('active',this.fb.control(true));\r\n } else {\r\n if(answerIndex != -1) {\r\n this.getQuestionsAnswerFormGroup(secIdx,questionIndex,answerIndex).removeControl('active');\r\n }\r\n this.getQuestionsFormGroup(secIdx,questionIndex).removeControl('active');\r\n }\r\n }\r\n\r\n allowAddAnswer(answers: any[]) {\r\n return answers.length < 100;\r\n }\r\n\r\n getQuestionList(secIdx:number,qntIdx:number,ansIdx:number) {\r\n const questionDetails = ((this.ChecklistForm.get('sections') as FormArray).at(secIdx).get('questions') as FormArray).getRawValue() || [];\r\n if (!questionDetails.length) return [];\r\n\r\n const currentQno = qntIdx + 1;\r\n const singleAnswerTypes = ['video','image','descriptiveImage','multipleImage','linearscale','time','date','image/video'];\r\n\r\n // Build forward link map: source qno -> Set of target qnos.\r\n // Also remember the current cell's selection so it stays visible in its own dropdown.\r\n const linkMap = new Map<number, Set<number>>();\r\n let currentSelection: number | null = null;\r\n for (const q of questionDetails) {\r\n if (!q?.answers) continue;\r\n const answersArray = singleAnswerTypes.includes(q.answerType) ? [q.answers] : q.answers;\r\n answersArray.forEach((a: any, idx: number) => {\r\n const linked = a?.linkedQuestion ? parseInt(a.linkedQuestion) : 0;\r\n if (!linked) return;\r\n if (!linkMap.has(q.qno)) linkMap.set(q.qno, new Set());\r\n linkMap.get(q.qno)!.add(linked);\r\n if (q.qno === currentQno && idx === ansIdx) currentSelection = linked;\r\n });\r\n }\r\n\r\n // Already-linked targets — union of every recorded link's target.\r\n const alreadyLinked = new Set<number>();\r\n linkMap.forEach(targets => targets.forEach(t => alreadyLinked.add(t)));\r\n\r\n // Upstream — every qno whose chain transitively reaches currentQno (would cycle).\r\n const upstream = new Set<number>();\r\n const collectUpstream = (target: number) => {\r\n linkMap.forEach((targets, src) => {\r\n if (targets.has(target) && !upstream.has(src)) {\r\n upstream.add(src);\r\n collectUpstream(src);\r\n }\r\n });\r\n };\r\n collectUpstream(currentQno);\r\n\r\n const questionList: number[] = [];\r\n for (const q of questionDetails) {\r\n const qno = q?.qno;\r\n if (!qno || qno === currentQno) continue;\r\n if (qno === currentSelection) {\r\n if (!questionList.includes(qno)) questionList.push(qno);\r\n continue;\r\n }\r\n if (alreadyLinked.has(qno)) continue;\r\n if (upstream.has(qno)) continue;\r\n if (!questionList.includes(qno)) questionList.push(qno);\r\n }\r\n return questionList;\r\n }\r\n\r\n updateLinked(secIdx:number,qnIdx:number,ansIdx:number) {\r\n let linkValue = ((((((this.ChecklistForm.get('sections') as FormArray).at(secIdx) as FormGroup).get('questions') as FormArray).at(qnIdx) as FormGroup).get('answers') as FormArray).at(ansIdx) as FormGroup).get('showLinked')?.value;\r\n if(linkValue) {\r\n let linkedQuestion = (((((this.ChecklistForm.get('sections') as FormArray).at(secIdx).get('questions') as FormArray).at(qnIdx) as FormGroup).get('answers') as FormArray).at(ansIdx) as FormGroup).get('linkedQuestion')?.value;\r\n if(linkedQuestion) {\r\n (((this.ChecklistForm.get('sections') as FormArray).at(secIdx).get('questions') as FormArray).at(linkedQuestion - 1) as FormGroup).get('linkType')?.setValue(false);\r\n }\r\n ((((((this.ChecklistForm.get('sections') as FormArray).at(secIdx) as FormGroup).get('questions') as FormArray).at(qnIdx) as FormGroup).get('answers') as FormArray).at(ansIdx) as FormGroup).get('linkedQuestion')?.setValue(0);\r\n }\r\n\r\n if(!linkValue) {\r\n ((((((this.ChecklistForm.get('sections') as FormArray).at(secIdx) as FormGroup).get('questions') as FormArray).at(qnIdx) as FormGroup).get('answers') as FormArray).at(ansIdx) as FormGroup).get('validation')?.setValue(false);\r\n }\r\n const answerGroup = ((((((this.ChecklistForm.get('sections') as FormArray).at(secIdx) as FormGroup).get('questions') as FormArray).at(qnIdx) as FormGroup).get('answers') as FormArray).at(ansIdx) as FormGroup);\r\n (answerGroup.get('multiReferenceImage') as FormArray)?.clear();\r\n answerGroup.get('referenceImage')?.setValue('');\r\n answerGroup.get('runAI')?.setValue(false);\r\n (answerGroup.get('runAIFeatures') as FormArray)?.clear();\r\n answerGroup.get('runAIDescription')?.setValue('');\r\n\r\n ((((((this.ChecklistForm.get('sections') as FormArray).at(secIdx) as FormGroup).get('questions') as FormArray).at(qnIdx) as FormGroup).get('answers') as FormArray).at(ansIdx) as FormGroup).get('showLinked')?.setValue(!linkValue)\r\n }\r\n\r\n updateQuestionType(secIdx:number,qnIdx:number,ansIdx:number,event:any) {\r\n let linkedQuestion = (((((this.ChecklistForm.get('sections') as FormArray).at(secIdx).get('questions') as FormArray).at(qnIdx) as FormGroup).get('answers') as FormArray).at(ansIdx) as FormGroup).get('linkedQuestion')?.value;\r\n if(linkedQuestion) {\r\n (((this.ChecklistForm.get('sections') as FormArray).at(secIdx).get('questions') as FormArray).at(linkedQuestion - 1) as FormGroup).get('linkType')?.setValue(false);\r\n }\r\n if(event.target.value) {\r\n let index = parseInt(event.target.value) - 1;\r\n (((this.ChecklistForm.get('sections') as FormArray).at(secIdx).get('questions') as FormArray).at(index) as FormGroup).get('linkType')?.setValue(true);\r\n (((((this.ChecklistForm.get('sections') as FormArray).at(secIdx).get('questions') as FormArray).at(qnIdx) as FormGroup).get('answers') as FormArray).at(ansIdx) as FormGroup).get('linkedQuestion')?.setValue(event.target.value);\r\n }\r\n else {\r\n (((((this.ChecklistForm.get('sections') as FormArray).at(secIdx).get('questions') as FormArray).at(qnIdx) as FormGroup).get('answers') as FormArray).at(ansIdx) as FormGroup).get('linkedQuestion')?.setValue(0);\r\n (((((this.ChecklistForm.get('sections') as FormArray).at(secIdx).get('questions') as FormArray).at(qnIdx) as FormGroup).get('answers') as FormArray).at(ansIdx) as FormGroup).get('showLinked')?.setValue(false);\r\n }\r\n }\r\n\r\n selectOption(qno:any,ansLinked:any) {\r\n return qno == ansLinked ? true : false;\r\n }\r\n\r\n getQuestionName(secIdx:number,qIdx:number) {\r\n return ((this.getSectionFormArray().at(secIdx).get('questions') as FormArray).at(qIdx-1) as FormGroup).get('qname')?.value;\r\n }\r\n\r\nRunAINew(sIdx:number,qIdx: number,ansIdx:number=-1,event: any) {\r\n console.log(\"event =>\", event.target.checked)\r\n // if(event.target.checked){\r\n let qName: any = this.getQuestionFormControl(sIdx,qIdx,'qname')?.value; \r\n let runAIFeatures: any = [];\r\n let runAIDescription: any = '';\r\n let sectionQuestion = ((((this.ChecklistForm.get('sections') as FormArray).at(sIdx) as FormGroup).get('questions') as FormArray).at(qIdx) as FormGroup);\r\n if(ansIdx != -1) {\r\n runAIFeatures= this.getAnswerFormGroup_FormControl(sIdx,qIdx,'runAIFeatures',ansIdx)?.value; \r\n runAIDescription= this.getAnswerFormGroup_FormControl(sIdx,qIdx,'runAIDescription',ansIdx)?.value;\r\n } \r\n else {\r\n runAIFeatures= ((sectionQuestion.get(\"answers\") as FormGroup).get(\"runAIFeatures\") as FormArray)?.value; \r\n runAIDescription= ((sectionQuestion.get(\"answers\") as FormGroup).get(\"runAIDescription\") as FormArray)?.value;\r\n }\r\n let questionImages;\r\n if(ansIdx != -1) {\r\n let answers = ((sectionQuestion.get('answers') as FormArray).at(ansIdx) as FormGroup);\r\n questionImages = (answers.get('multiReferenceImage') as FormArray)?.value;\r\n } else {\r\n if(['image','multipleImage','descriptiveImage','image/video'].includes(this.getQuestionFormControl(sIdx,qIdx,'answerType')?.value)) {\r\n questionImages = (sectionQuestion.get('answers') as FormGroup).get('multiReferenceImage')?.value;\r\n }\r\n else {\r\n questionImages = (sectionQuestion.get('answers') as FormGroup).get('multiQuestionReferenceImage')?.value;\r\n }\r\n }\r\n \r\n if(event.target.checked){ \r\n if (this.getAnswerFormGroup_FormControl(sIdx, qIdx, \"runAI\", ansIdx)?.value == false) {\r\n if (!qName || !this.ChecklistForm.get(\"checklistName\")?.value) {\r\n let err: string = !qName\r\n ? \"Please enter question to continue!\"\r\n : \"Please enter Checklist Name to continue!\";\r\n this.swalToast(err, \"error\");\r\n this.runAIOff(sIdx, qIdx, false, ansIdx);\r\n return;\r\n }\r\n const dialogRef = this.dialog.open(TraxRunAIPopupComponent, {\r\n centered: true,\r\n size: \"md\",\r\n backdrop: \"static\"\r\n });\r\n dialogRef.componentInstance.data = {\r\n imagesrc: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\"><rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#D1FADF\"/><path d=\"M23.3564 19.3525C24.1748 18.7327 25.1738 18.3985 26.2004 18.4009C26.5549 18.393 26.9057 18.4746 27.2204 18.6382C27.535 18.8018 27.8033 19.0421 28.0004 19.3369C28.1975 19.0421 28.4658 18.8018 28.7804 18.6382C29.095 18.4746 29.4459 18.393 29.8004 18.4009C30.827 18.3985 31.826 18.7327 32.6444 19.3525C33.2744 19.8421 33.7604 20.5201 33.932 21.3397C34.3256 21.3697 34.6856 21.5329 34.988 21.7789C35.4464 22.1509 35.78 22.7089 35.99 23.2993C36.3188 24.2173 36.4076 25.3873 36.0668 26.3833C36.1532 26.4241 36.2384 26.4721 36.3212 26.5273C36.6512 26.7469 36.902 27.0613 37.0868 27.4321C37.4504 28.1581 37.6004 29.1709 37.6004 30.4009C37.6004 31.7701 37.0784 32.6893 36.416 33.2569C36.0497 33.571 35.6174 33.7986 35.1512 33.9229C35.0312 34.5925 34.6952 35.3677 34.1684 36.0253C33.4844 36.8833 32.4236 37.6009 31.0004 37.6009C29.8724 37.6009 28.9748 36.9769 28.3916 36.3649C28.2522 36.2188 28.1215 36.0645 28.0004 35.9029C27.8793 36.0645 27.7486 36.2188 27.6092 36.3649C27.026 36.9769 26.1296 37.6009 25.0004 37.6009C23.5772 37.6009 22.5176 36.8833 21.8324 36.0253C21.3401 35.414 21.0029 34.6927 20.8496 33.9229C20.3834 33.7986 19.9511 33.571 19.5848 33.2569C18.9224 32.6893 18.4004 31.7689 18.4004 30.4009C18.4004 29.1709 18.5516 28.1569 18.914 27.4321C19.0857 27.0685 19.3497 26.7561 19.6796 26.5261C19.7606 26.4725 19.8457 26.4251 19.934 26.3845C19.5932 25.3861 19.682 24.2173 20.0108 23.2993C20.2208 22.7089 20.5544 22.1509 21.0128 21.7789C21.3152 21.5329 21.6752 21.3709 22.0688 21.3397C22.2416 20.5201 22.7264 19.8421 23.3564 19.3525ZM27.4004 21.4009V21.3889L27.398 21.3289C27.3803 21.0161 27.3181 20.7074 27.2132 20.4121C27.1385 20.1892 27.0113 19.9876 26.8424 19.8241C26.6651 19.6698 26.4352 19.5898 26.2004 19.6009C25.4407 19.5983 24.7009 19.8435 24.0932 20.2993C23.5364 20.7325 23.2004 21.3193 23.2004 22.0009C23.2003 22.0959 23.1777 22.1896 23.1343 22.2741C23.091 22.3587 23.0282 22.4318 22.9511 22.4873C22.874 22.5428 22.7848 22.5793 22.6909 22.5936C22.5969 22.6079 22.5009 22.5997 22.4108 22.5697C22.1852 22.4953 21.9836 22.5373 21.7688 22.7101C21.5336 22.9021 21.3044 23.2429 21.14 23.7025C20.8052 24.6409 20.84 25.7773 21.2996 26.4685C21.3652 26.567 21.4003 26.6826 21.4004 26.8009H22.3004C23.0165 26.8009 23.7032 27.0854 24.2096 27.5917C24.7159 28.0981 25.0004 28.7848 25.0004 29.5009V29.9029C25.4007 30.0445 25.7381 30.323 25.953 30.6892C26.1678 31.0555 26.2463 31.4859 26.1745 31.9044C26.1027 32.3229 25.8852 32.7025 25.5606 32.9762C25.2359 33.2499 24.825 33.4 24.4004 33.4C23.9758 33.4 23.5648 33.2499 23.2402 32.9762C22.9156 32.7025 22.6981 32.3229 22.6263 31.9044C22.5545 31.4859 22.633 31.0555 22.8478 30.6892C23.0627 30.323 23.4001 30.0445 23.8004 29.9029V29.5009C23.8004 28.6729 23.1284 28.0009 22.3004 28.0009H20.2004C20.1287 28.0008 20.0575 27.9878 19.9904 27.9625L19.9868 27.9697C19.7492 28.4437 19.6004 29.2309 19.6004 30.4009C19.6004 31.4317 19.9784 32.0125 20.366 32.3449C20.7824 32.7025 21.2444 32.8009 21.4004 32.8009C21.5595 32.8009 21.7121 32.8641 21.8247 32.9767C21.9372 33.0892 22.0004 33.2418 22.0004 33.4009C22.0004 33.8425 22.2404 34.6141 22.7684 35.2765C23.2832 35.9185 24.0236 36.4009 25.0004 36.4009C25.6724 36.4009 26.2748 36.0253 26.7404 35.5369C26.9696 35.2969 27.1484 35.0485 27.2648 34.8445C27.3178 34.7541 27.3631 34.6593 27.4004 34.5613V25.0009H26.0984C25.9569 25.4012 25.6783 25.7387 25.3121 25.9535C24.9459 26.1683 24.5154 26.2468 24.097 26.175C23.6785 26.1032 23.2988 25.8858 23.0251 25.5611C22.7514 25.2365 22.6013 24.8255 22.6013 24.4009C22.6013 23.9763 22.7514 23.5654 23.0251 23.2407C23.2988 22.9161 23.6785 22.6986 24.097 22.6268C24.5154 22.555 24.9459 22.6335 25.3121 22.8483C25.6783 23.0632 25.9569 23.4006 26.0984 23.8009H27.4004V21.4009ZM28.6004 33.3997V34.5601C28.6377 34.6581 28.683 34.7528 28.736 34.8433C28.8536 35.0473 29.0312 35.2957 29.2592 35.5357C29.726 36.0241 30.3296 36.3997 31.0004 36.3997C31.9772 36.3997 32.7176 35.9173 33.2324 35.2753C33.7604 34.6129 34.0004 33.8413 34.0004 33.3997C34.0004 33.2406 34.0636 33.088 34.1761 32.9755C34.2886 32.8629 34.4413 32.7997 34.6004 32.7997C34.7564 32.7997 35.2184 32.7013 35.6348 32.3437C36.0224 32.0113 36.4004 31.4305 36.4004 30.3997C36.4004 29.2297 36.2504 28.4437 36.014 27.9685C35.9349 27.7916 35.8108 27.6385 35.654 27.5245C35.5189 27.4381 35.3606 27.395 35.2004 27.4009C35.0919 27.4009 34.9854 27.3714 34.8923 27.3156C34.7992 27.2598 34.723 27.1798 34.6717 27.0841C34.6205 26.9884 34.5962 26.8807 34.6014 26.7723C34.6066 26.6638 34.6411 26.5589 34.7012 26.4685C35.162 25.7773 35.1956 24.6409 34.8608 23.7025C34.6964 23.2429 34.4672 22.9009 34.232 22.7101C34.0172 22.5373 33.8156 22.4941 33.59 22.5697C33.4998 22.5997 33.4038 22.6079 33.3099 22.5936C33.216 22.5793 33.1268 22.5428 33.0497 22.4873C32.9726 22.4318 32.9098 22.3587 32.8664 22.2741C32.8231 22.1896 32.8005 22.0959 32.8004 22.0009C32.8004 21.3193 32.4644 20.7325 31.9064 20.2993C31.299 19.8438 30.5596 19.5986 29.8004 19.6009C29.5656 19.5898 29.3356 19.6698 29.1584 19.8241C28.9889 19.9874 28.8613 20.1891 28.7864 20.4121C28.6721 20.7256 28.6093 21.0554 28.6004 21.3889V32.2009H29.5004C30.3284 32.2009 31.0004 31.5289 31.0004 30.7009V28.4989C30.6001 28.3574 30.2627 28.0789 30.0478 27.7126C29.833 27.3464 29.7545 26.916 29.8263 26.4975C29.8981 26.079 30.1156 25.6993 30.4402 25.4257C30.7648 25.152 31.1758 25.0019 31.6004 25.0019C32.025 25.0019 32.4359 25.152 32.7606 25.4257C33.0852 25.6993 33.3027 26.079 33.3745 26.4975C33.4463 26.916 33.3678 27.3464 33.153 27.7126C32.9381 28.0789 32.6007 28.3574 32.2004 28.4989V30.7009C32.2004 31.417 31.9159 32.1038 31.4096 32.6101C30.9032 33.1165 30.2165 33.4009 29.5004 33.4009H28.6004V33.3997ZM23.8004 24.4009C23.8004 24.5601 23.8636 24.7127 23.9761 24.8252C24.0886 24.9377 24.2413 25.0009 24.4004 25.0009C24.5595 25.0009 24.7121 24.9377 24.8247 24.8252C24.9372 24.7127 25.0004 24.5601 25.0004 24.4009C25.0004 24.2418 24.9372 24.0892 24.8247 23.9767C24.7121 23.8641 24.5595 23.8009 24.4004 23.8009C24.2413 23.8009 24.0886 23.8641 23.9761 23.9767C23.8636 24.0892 23.8004 24.2418 23.8004 24.4009ZM31.6004 27.4009C31.7595 27.4009 31.9121 27.3377 32.0247 27.2252C32.1372 27.1127 32.2004 26.9601 32.2004 26.8009C32.2004 26.6418 32.1372 26.4892 32.0247 26.3767C31.9121 26.2641 31.7595 26.2009 31.6004 26.2009C31.4413 26.2009 31.2886 26.2641 31.1761 26.3767C31.0636 26.4892 31.0004 26.6418 31.0004 26.8009C31.0004 26.9601 31.0636 27.1127 31.1761 27.2252C31.2886 27.3377 31.4413 27.4009 31.6004 27.4009ZM24.4004 31.0009C24.2413 31.0009 24.0886 31.0641 23.9761 31.1767C23.8636 31.2892 23.8004 31.4418 23.8004 31.6009C23.8004 31.7601 23.8636 31.9127 23.9761 32.0252C24.0886 32.1377 24.2413 32.2009 24.4004 32.2009C24.5595 32.2009 24.7121 32.1377 24.8247 32.0252C24.9372 31.9127 25.0004 31.7601 25.0004 31.6009C25.0004 31.4418 24.9372 31.2892 24.8247 31.1767C24.7121 31.0641 24.5595 31.0009 24.4004 31.0009Z\" fill=\"#039855\"/><rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#ECFDF3\" stroke-width=\"8\"/></svg>`,\r\n title: `Run AI on image uploaded`,\r\n content: `Use the power of AI to compare and detect anomalies between uploaded and reference image.`,\r\n questionName: qName,\r\n images: questionImages,\r\n environment: this.environment.TraxAnswerCDN,\r\n runAIFeatures: runAIFeatures,\r\n runAIDescription: runAIDescription,\r\n clientId:this.clientId\r\n };\r\n dialogRef.result.then((res: any) => {\r\n if (res != \"cancel\") {\r\n let images: any;\r\n let features: any;\r\n if (ansIdx != -1) {\r\n images = (\r\n (sectionQuestion.get(\"answers\") as FormArray).at(\r\n ansIdx\r\n ) as FormGroup\r\n )?.get(\"multiReferenceImage\") as FormArray;\r\n features = (\r\n (sectionQuestion.get(\"answers\") as FormArray).at(\r\n ansIdx\r\n ) as FormGroup\r\n )?.get(\"runAIFeatures\") as FormArray;\r\n ((sectionQuestion.get(\"answers\") as FormArray).at(ansIdx) as FormGroup).get(\"runAIDescription\")?.setValue(res.runAIDescription);\r\n } else {\r\n images = (sectionQuestion.get(\"answers\") as FormGroup).get(\r\n \"multiReferenceImage\"\r\n );\r\n features = (sectionQuestion.get(\"answers\") as FormGroup).get(\"runAIFeatures\") as FormArray;\r\n (sectionQuestion.get(\"answers\") as FormGroup).get(\"runAIDescription\")?.setValue(res.runAIDescription);\r\n }\r\n images.clear();\r\n res.images.forEach((img: any) => {\r\n images.push(\r\n this.fb.group({\r\n imageURL: img.imageURL,\r\n runAI: img.runAI,\r\n })\r\n );\r\n });\r\n features.clear();\r\n res.runAIFeatures.forEach((ele: any) => {\r\n features.push(\r\n this.fb.group({\r\n featureName: this.fb.control(ele.featureName),\r\n lableName: this.fb.control(ele.lableName),\r\n })\r\n );\r\n });\r\n this.insertFeatures(res.runAIFeatures);\r\n if (!this.hasValidationEnabled(sIdx, qIdx)) {\r\n ((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(sIdx) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(qIdx) as FormGroup).get('compliance')?.enable()\r\n }\r\n const runAICtrl = this.getAnswerFormGroup_FormControl(sIdx, qIdx, 'runAI', ansIdx);\r\n if (runAICtrl && runAICtrl.value !== true) {\r\n runAICtrl.setValue(true, { emitEvent: false });\r\n }\r\n this.changedetector.detectChanges();\r\n this.toast.getSuccessToast('RunAI enabled successfully');\r\n }\r\n else {\r\n this.runAIOff(sIdx, qIdx, false, ansIdx);\r\n }\r\n }, () => {\r\n this.runAIOff(sIdx, qIdx, false, ansIdx);\r\n });\r\n }\r\n else {\r\n this.runAIOff(sIdx, qIdx, false, ansIdx);\r\n this.toast.getSuccessToast('RunAI disabled successfully');\r\n return;\r\n }\r\n }else{\r\n const dialogRef = this.dialog.open(TraxpopupComponent,{centered: true, size: 'md', backdrop: \"static\"});\r\n dialogRef.componentInstance.data = {\r\n imagesrc: `<span><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"56\" height=\"56\" viewBox=\"0 0 56 56\" fill=\"none\"><rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" fill=\"#FEE4E2\"/><path d=\"M28 24V28M28 32H28.01M38 28C38 33.5228 33.5228 38 28 38C22.4772 38 18 33.5228 18 28C18 22.4772 22.4772 18 28 18C33.5228 18 38 22.4772 38 28Z\" stroke=\"#D92D20\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/><rect x=\"4\" y=\"4\" width=\"48\" height=\"48\" rx=\"24\" stroke=\"#FEF3F2\" stroke-width=\"8\"/></svg></span>`,\r\n title: `Run AI Remove`,\r\n content: `Are you sure you want to Remove Run AI?`,\r\n buttontype: 'remove'\r\n }\r\n const restoreRunAI = () => {\r\n const control = this.getAnswerFormGroup_FormControl(sIdx, qIdx, \"runAI\", ansIdx);\r\n if (control) {\r\n control.setValue(true, { emitEvent: true }); // reset to ON\r\n }\r\n };\r\n dialogRef.result.then((res) => {\r\n // console.log(\"res =>\", res)\r\n if (res == 'delete') {\r\n if(['image','image/video'].includes(this.getQuestionFormControl(sIdx,qIdx,'answerType')?.value)){\r\n let question = ((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(sIdx) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(qIdx) as FormGroup)\r\n question.get('compliance')?.disable({emitEvent:false})\r\n question.get('compliance')?.patchValue(false);}\r\n this.runAIOff(sIdx, qIdx, false, ansIdx);\r\n this.toast.getSuccessToast('RunAI disabled successfully');\r\n }else{\r\n restoreRunAI();\r\n }\r\n }, () => {\r\n // Dismissed (ESC / programmatic dismiss) — restore the toggle so it doesn't drift to false with stale features.\r\n restoreRunAI();\r\n });\r\n return;\r\n }\r\n }\r\n\r\n insertFeatures(data:any) {\r\n let params = {\r\n clientId: this.clientId,\r\n runAIFeatures: data,\r\n };\r\n\r\n this.sopService.updateRunAIFeatures(params).pipe(takeUntil(this.detach)).subscribe((res:any) => {\r\n if(res && res.code == 200){}\r\n })\r\n }\r\n\r\n \r\n onPopup(image:string){\r\n let imageRef = this.dialog.open(TraxpopupComponent, { centered: true, size: \"md\" });\r\n imageRef.componentInstance.data = {type:'image',image:this.environment.TraxAnswerCDN+image};\r\n imageRef.result.then(() => {});\r\n }\r\n \r\n /** Value of a Date question's range picker (qnStartDate / qnEndDate) for a DD-MM-YYYY date, as built on load. */\r\n pickerDate(date: string): { startDate: dayjs.Dayjs; endDate: dayjs.Dayjs } {\r\n return { startDate: this.dayjs(date, 'DD-MM-YYYY'), endDate: this.dayjs(date, 'DD-MM-YYYY') };\r\n }\r\n\r\n dateRange(event:any,type:string,secIdx:number,qnIdx:number) {\r\n if(event.startDate ) {\r\n if(type == 'start') {\r\n (((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(secIdx) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(qnIdx) as FormGroup).get('answers') as FormGroup).get('startDate')?.setValue(event.startDate.format('DD-MM-YYYY'));\r\n }\r\n else {\r\n (((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(secIdx) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(qnIdx) as FormGroup).get('answers') as FormGroup).get('endDate')?.setValue(event.startDate.format('DD-MM-YYYY'));\r\n }\r\n }\r\n }\r\n\r\n /** Returns true when Configure Compliance Score should be disabled.\r\n * Disabled when validate response is enabled, EXCEPT when:\r\n * - validationType is \"Capture Image\" and Run AI is enabled, OR\r\n * - validationType is \"Capture Multiple Image with description\" and Run AI is enabled and at least one reference image is added. */\r\n hasValidationEnabled(sectionIndex: number, questionIndex: number): boolean {\r\n const answers = this.getFormArrayQuestionsAnswer(sectionIndex, questionIndex, 'answers')?.value;\r\n if (!Array.isArray(answers)) return false;\r\n return false;\r\n // return answers.some((a: any) => {\r\n // if (!a.validation) return false;\r\n // if (a.validationType === 'Capture Image' && a.runAI) return false;\r\n // if (\r\n // a.validationType === 'Capture Multiple Image with description' &&\r\n // a.runAI &&\r\n // Array.isArray(a.multiReferenceImage) &&\r\n // a.multiReferenceImage.length > 0\r\n // ) return false;\r\n // return true;\r\n // });\r\n }\r\n\r\n /** \"Not Applicable\" option — its compliance score is always 0 and is excluded from scoring.\r\n * Match is case-insensitive against \"n/a\" or \"na\" (after trimming). */\r\n isNotApplicableOption(value: any): boolean {\r\n if (typeof value !== 'string') return false;\r\n const normalized = value.trim().toLowerCase();\r\n return normalized === 'n/a' || normalized === 'na';\r\n }\r\n\r\n /** Lock or unlock a single answer's compliance score based on whether it's an \"N/A\"\r\n * multiplechoicesingle option. N/A options are forced to 0 and disabled so they can't be scored. */\r\n applyNotApplicableLock(answer: FormGroup, answerType: string) {\r\n const scoreCtrl = answer.get('complianceScore');\r\n if (!scoreCtrl) return;\r\n if (answerType === 'multiplechoicesingle' && this.isNotApplicableOption(answer.get('answer')?.value)) {\r\n scoreCtrl.setValue(0, { emitEvent: false });\r\n scoreCtrl.disable({ emitEvent: false });\r\n } else if (scoreCtrl.disabled) {\r\n scoreCtrl.enable({ emitEvent: false });\r\n }\r\n }\r\n\r\n /** Re-evaluate the N/A lock whenever a multiplechoicesingle option's text is edited. */\r\n onAnswerValueChange(secIdx: number, qnIdx: number, ansIdx: number) {\r\n const question = ((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(secIdx) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(qnIdx) as FormGroup);\r\n const answerType = question.get('answerType')?.value;\r\n const answers = question.get('answers');\r\n if (!(answers instanceof FormArray)) return;\r\n const answer = answers.at(ansIdx) as FormGroup;\r\n if (!answer) return;\r\n this.applyNotApplicableLock(answer, answerType);\r\n }\r\n\r\n /** Normalize on load: lock the compliance score of any \"N/A\" multiplechoicesingle option to 0. */\r\n lockNotApplicableComplianceScores() {\r\n const sections = this.ChecklistForm.get('sections') as FormArray;\r\n sections?.controls.forEach((section) => {\r\n const questions = (section as FormGroup).get('questions') as FormArray;\r\n questions?.controls.forEach((question) => {\r\n const q = question as FormGroup;\r\n const answerType = q.get('answerType')?.value;\r\n const answers = q.get('answers');\r\n if (!(answers instanceof FormArray)) return;\r\n answers.controls.forEach((ans) => this.applyNotApplicableLock(ans as FormGroup, answerType));\r\n });\r\n });\r\n }\r\n\r\n getComplianceToast(secIdx:number,qnIdx:number,event:any) {\r\n if(event.target.checked) {\r\n const questionGroup = ((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(secIdx) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(qnIdx) as FormGroup);\r\n let question = questionGroup.get('answerType')?.value;\r\n\r\n let answers = questionGroup.get('answers')?.value;\r\n\r\n // Options already typed (e.g. \"N/A\") before compliance was switched on must stay locked to 0.\r\n const answersArray = questionGroup.get('answers');\r\n if (answersArray instanceof FormArray) {\r\n answersArray.controls.forEach((ans) => this.applyNotApplicableLock(ans as FormGroup, question));\r\n }\r\n\r\n if(['multiplechoicemultiple','multiplechoicesingle','yes/no'].includes(question) && answers.some((ele:any) => ele.runAI)) {\r\n this.toast.getWarningToast('Compliance score has been enabled for Run AI');\r\n }\r\n }\r\n }\r\n\r\n bulkUploadQuestion() {\r\n if (!this.access.canEdit) { return; }\r\n const dialogRef = this.dialog.open(AuditV2BulkUploadComponent, {\r\n centered: true,\r\n size: \"lg\",\r\n });\r\n dialogRef.componentInstance.checklistData = {\r\n checkListName: this.ChecklistForm.value.checklistName,\r\n checkListDescription: this.ChecklistForm.value.checklistDescription,\r\n clientId: this.clientId,\r\n checklistId: this.editvalue,\r\n };\r\n dialogRef.result.then((res) => {\r\n if (res == \"reload\") {\r\n this.checklistLoading = true;\r\n this.sopService\r\n .auditGetConfig({ checkListId: this.editvalue, clientId: this.clientId })\r\n .pipe(takeUntil(this.detach))\r\n .subscribe(\r\n (res: any) => {\r\n if (res) {\r\n if (res.code == 200) {\r\n this.getobject = res.data.checkListDetails;\r\n this.formChecklistQuestions();\r\n } else {\r\n this.checklistLoading = false;\r\n }\r\n } else {\r\n this.checklistLoading = false;\r\n }\r\n },\r\n (error) => {\r\n this.checklistLoading = false;\r\n },\r\n );\r\n }\r\n });\r\n }\r\n\r\n updateNumber(event: any, secIdx: number, qnIdx: number) {\r\n const linearType = event?.target?.value as 'percentage' | 'number' | 'degree';\r\n const answers = ((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(secIdx) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(qnIdx) as FormGroup).get('answers') as FormGroup;\r\n\r\n const defaults: Record<string, { rangeStart: number; rangeEnd: number }> = {\r\n percentage: { rangeStart: 0, rangeEnd: 100 },\r\n number: { rangeStart: 0, rangeEnd: 100 },\r\n degree: { rangeStart: 0, rangeEnd: 100 }, // default 0; user can enter down to -273.15\r\n };\r\n const { rangeStart, rangeEnd } = defaults[linearType] ?? defaults.number;\r\n\r\n answers.get('rangeStart')?.setValue(rangeStart);\r\n answers.get('rangeEnd')?.setValue(rangeEnd);\r\n\r\n const minValue = answers.get('minValue')?.value;\r\n const maxValue = answers.get('maxValue')?.value;\r\n if (minValue != null && minValue !== '' && Number(minValue) < rangeStart) {\r\n answers.get('minValue')?.setValue(rangeStart);\r\n } else if (minValue != null && minValue !== '' && Number(minValue) > rangeEnd) {\r\n answers.get('minValue')?.setValue(rangeEnd);\r\n }\r\n if (maxValue != null && maxValue !== '' && Number(maxValue) < rangeStart) {\r\n answers.get('maxValue')?.setValue(rangeStart);\r\n } else if (maxValue != null && maxValue !== '' && Number(maxValue) > rangeEnd) {\r\n answers.get('maxValue')?.setValue(rangeEnd);\r\n }\r\n }\r\n\r\n onRangeValueInput(event: Event, secIdx: number, qnIdx: number, controlName: 'minValue' | 'maxValue') {\r\n const linearType = this.getAnswerFormGroup_FormControl(secIdx, qnIdx, 'linearType')?.value;\r\n if (linearType !== 'degree') return;\r\n\r\n const input = event.target as HTMLInputElement;\r\n const filtered = input.value.replace(/[^\\d.-]/g, '').replace(/(?!^)-/g, '').replace(/(\\..*)\\./g, '$1');\r\n if (filtered !== input.value) {\r\n input.value = filtered;\r\n const answers = ((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(secIdx) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(qnIdx) as FormGroup).get('answers') as FormGroup;\r\n const val = filtered === '' || filtered === '-' ? filtered : Number(filtered);\r\n answers.get(controlName)?.setValue(val, { emitEvent: false });\r\n }\r\n }\r\n\r\n clampRangeInput(secIdx: number, qnIdx: number, controlName: 'minValue' | 'maxValue') {\r\n const answers = ((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(secIdx) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(qnIdx) as FormGroup).get('answers') as FormGroup;\r\n\r\n const rangeStart = answers.get('rangeStart')?.value;\r\n const rangeEnd = answers.get('rangeEnd')?.value;\r\n\r\n if (rangeStart == null || rangeEnd == null) return;\r\n\r\n const control = answers.get(controlName);\r\n const value = control?.value;\r\n\r\n if (value === '' || value === '-' || (typeof value === 'number' && Number.isNaN(value))) {\r\n control?.setValue(rangeStart);\r\n } else if (value != null) {\r\n const numValue = Number(value);\r\n if (!Number.isNaN(numValue)) {\r\n if (numValue < rangeStart) {\r\n control?.setValue(rangeStart);\r\n } else if (numValue > rangeEnd) {\r\n control?.setValue(rangeEnd);\r\n }\r\n } else {\r\n control?.setValue(rangeStart);\r\n }\r\n }\r\n }\r\n\r\n updateLimit(event:any,secIdx:number,qnIdx:number) {\r\n (((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(secIdx) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(qnIdx) as FormGroup).get('answers') as FormGroup).get('imageLimit')?.setValue(0);\r\n (((((this.ChecklistForm.get('sections') as FormArray)\r\n .at(secIdx) as FormGroup)\r\n .get('questions') as FormArray)\r\n .at(qnIdx) as FormGroup).get('answers') as FormGroup).get('videoLimit')?.setValue(0);\r\n }\r\n}\r\n","<div class=\"card\" *ngIf=\"checklistLoading\">\r\n <div class=\"row loader d-flex justify-content-center align-items-center\">\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n <div class=\"shimmer\">\r\n <div class=\"wrapper\">\r\n <div class=\"stroke animate title\"></div>\r\n <div class=\"stroke animate link\"></div>\r\n <div class=\"stroke animate description\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n<div *ngIf=\"!checklistLoading && ChecklistForm\" id=\"checklistCreate\">\r\n <div class=\"card\">\r\n <ng-container [formGroup]=\"ChecklistForm\">\r\n <div class=\"card-header border-0 pt-3 pb-3\">\r\n <div class=\"row w-100\">\r\n <div class=\"col-md-9\">\r\n <h3 class=\"card-title align-items-center mt-3 mb-0\">\r\n <div routerLink=\"/manage/trax/audit-v2/manage\" class=\"btn btn-sm btn-outline me-5 ps-2 px-3\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M15.8332 10.0003H4.1665M4.1665 10.0003L9.99984 15.8337M4.1665 10.0003L9.99984 4.16699\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg></div>\r\n <div class=\"flex-column w-800px\">\r\n <div class=\"editablecontent mb-4 w-100\"><input type=\"text\" class=\"checklist plain-input\" #checklistName placeholder=\"Enter Checklist Name\" formControlName=\"checklistName\"></div>\r\n <div class=\"editablecontent w-100\"><input type=\"text\" class=\"checklistDescription plain-input\" #checklistDescription placeholder=\"Enter Checklist Description\" formControlName=\"checklistDescription\"></div>\r\n </div>\r\n </h3>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <div class=\"d-flex my-6 justify-content-end\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <button type=\"button\" class=\"btn btn-primary mx-2 btn-outline btn-outline-default rounded-3 text-nowrap border-val\"\r\n *ngIf=\"showvalue === 'add'\" (click)=\"saveChecklistQuestions('configure')\"><span class=\"ms-2\">Configure</span>\r\n </button>\r\n \r\n <button type=\"button\" class=\"btn btn-default mx-2 btn-outline btn-outline-default rounded-3 text-nowrap border-val\"\r\n *ngIf=\"showvalue === 'add'\" (click)=\"saveAsDraftPop('create')\"><span class=\"ms-2\">Save as Draft</span> </button>\r\n \r\n <!-- Saving needs the Checklist edit permission (access.canEdit). -->\r\n <button type=\"button\" class=\"btn btn-primary mx-2 btn-outline btn-outline-default rounded-3 text-nowrap border-val\"\r\n *ngIf=\"showvalue === 'edit'\" [disabled]=\"!access.canEdit\" (click)=\"updateChecklistQuestions('configure')\"><span class=\"ms-2\">Configure</span>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-default mx-2 btn-outline btn-outline-default rounded-3 text-nowrap border-val\"\r\n *ngIf=\"showvalue === 'edit'\" [disabled]=\"!access.canEdit\" (click)=\"saveAsDraftPop('update')\"><span class=\"ms-2\">Save as Draft</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n \r\n <div class=\"row\">\r\n <div class=\"col-lg-3 mt-2\">\r\n <ng-container [formGroup]=\"ChecklistForm\">\r\n <div class=\"section-left card px-7 py-7\">\r\n <div class=\"fs-18px fw-600 text-left mb-3 concise-checklistname\">\r\n {{getFormControl('checklistName').value ? getFormControl('checklistName').value : 'ChecklistName'}}\r\n </div>\r\n <div class=\"left-panel-container\" formArrayName=\"sections\">\r\n <div *ngFor=\"let section of getSectionFormArray().controls;let i=index;\">\r\n <ng-container [formGroupName]=\"i\">\r\n <div class=\"d-flex section align-items-center justify-content-between\">\r\n <div class=\"fs-18px fw-bold editablecontent-left\">{{\r\n getSectionFormControl(i,'name')?.value === '' ? \"Section \" : ''}}{{\r\n getSectionFormControl(i,'name')?.value ? getSectionFormControl(i,'name')?.value\r\n : getSectionFormControl(i,'sectionNumber')?.value}}</div>\r\n <hr class=\"mx-2\">\r\n <svg (click)=\"deleteSection(i)\" xmlns=\"http://www.w3.org/2000/svg\" width=\"35\"\r\n height=\"35\" viewBox=\"0 0 18 18\" matTooltip=\"Delete section\"\r\n matTooltipPosition=\"above\" matTooltipClass=\"custom-test\" fill=\"none\">\r\n <path\r\n d=\"M2.25 4.5H3.75M3.75 4.5H15.75M3.75 4.5V15C3.75 15.3978 3.90804 15.7794 4.18934 16.0607C4.47064 16.342 4.85218 16.5 5.25 16.5H12.75C13.1478 16.5 13.5294 16.342 13.8107 16.0607C14.092 15.7794 14.25 15.3978 14.25 15V4.5H3.75ZM6 4.5V3C6 2.60218 6.15804 2.22064 6.43934 1.93934C6.72064 1.65804 7.10218 1.5 7.5 1.5H10.5C10.8978 1.5 11.2794 1.65804 11.5607 1.93934C11.842 2.22064 12 2.60218 12 3V4.5M7.5 8.25V12.75M10.5 8.25V12.75\"\r\n stroke=\"#667085\" stroke-width=\"1.4\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg (click)=\"accordian(i)\" [ngClass]=\"{'rotate' : show !== i}\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"35\" height=\"35\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <ng-container *ngIf=\"show===i\">\r\n <div cdkDropList (cdkDropListDropped)=\"dragDrop(i,$event)\"\r\n [cdkDropListData]=\"getFormArrayQuestions(i).controls\" class=\"question-left\">\r\n <ng-container formArrayName=\"questions\">\r\n <div *ngFor=\"let question of getFormArrayQuestions(i).controls;let j=index;\"\r\n class=\"my-2 cursor-pointer\"\r\n [ngClass]=\"question.get('active')?.value === true ? 'active-question' : 'q-btn'\"\r\n cdkDrag (mouseenter)=\"setActiveQuestion(i,j,1)\"\r\n (click)=\"scrollToQuestion(i,j);\"\r\n (mouseleave)=\"setActiveQuestion(i,j,-1)\">\r\n <ng-container [formGroupName]=\"j\">\r\n <div class=\"concise-question\">\r\n {{getQuestionFormControl(i,j,'qname')?.value ? '' : \"Question\"}}{{ getQuestionFormControl(i,j,'qname')?.value ?\r\n getQuestionFormControl(i,j,'qname')?.value :\r\n getQuestionFormControl(i,j,'qno')?.value }}\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n \r\n <div class=\"col-lg-9 mt-2\">\r\n <form [formGroup]=\"ChecklistForm\" #formRef>\r\n <div class=\"card px-7\">\r\n <!-- <div class=\"checklist-card py-5\">\r\n <input type=\"text\" class=\"mt-2\" style=\"text-transform: capitalize;\"\r\n placeholder=\"Enter checklist name here\" formControlName=\"checklistName\">\r\n <input type=\"text\" class=\"mt-4\" placeholder=\"Enter checklist description here\"\r\n formControlName=\"checklistDescription\">\r\n </div> -->\r\n <ng-container formArrayName=\"sections\" >\r\n <div class=\"sectionArea mt-5\" *ngFor=\"let section of getSectionFormArray().controls;let i=index;\">\r\n <ng-container [formGroupName]=\"i\">\r\n <div class=\"section d-flex align-items-center justify-content-between\">\r\n \r\n <div class=\"fs-18px fw-bold editablecontent\"><input type=\"text\" class=\"plain-input\"\r\n #sectionName (change)=\"updateInputValue(i,sectionName.value)\"\r\n formControlName=\"name\"></div>\r\n <hr>\r\n <svg class=\"ml-5\" (click)=\"deleteSection(i)\" xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\" height=\"20\" matTooltip=\"Delete section\" matTooltipPosition=\"above\"\r\n matTooltipClass=\"custom-test\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M2.25 4.5H3.75M3.75 4.5H15.75M3.75 4.5V15C3.75 15.3978 3.90804 15.7794 4.18934 16.0607C4.47064 16.342 4.85218 16.5 5.25 16.5H12.75C13.1478 16.5 13.5294 16.342 13.8107 16.0607C14.092 15.7794 14.25 15.3978 14.25 15V4.5H3.75ZM6 4.5V3C6 2.60218 6.15804 2.22064 6.43934 1.93934C6.72064 1.65804 7.10218 1.5 7.5 1.5H10.5C10.8978 1.5 11.2794 1.65804 11.5607 1.93934C11.842 2.22064 12 2.60218 12 3V4.5M7.5 8.25V12.75M10.5 8.25V12.75\"\r\n stroke=\"#667085\" stroke-width=\"1.4\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n <svg (click)=\"accordian(i)\" [ngClass]=\"{'rotate' : show !== i}\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"#667085\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <div class=\"questionsArea\" *ngIf=\"show === i\">\r\n <ng-container formArrayName=\"questions\">\r\n <div class=\"Question-sec mt-10\"\r\n *ngFor=\"let question of getFormArrayQuestions(i).controls;let j = index;\"\r\n (mouseenter)=\"setActiveQuestion(i,j,1)\"\r\n (mouseleave)=\"setActiveQuestion(i,j,-1)\">\r\n <ng-container [formGroupName]=\"j\">\r\n <span class=\"fs-18px px-3 editablecontent questiontitle\"\r\n style=\"cursor: default;\"> Question {{j+1}}</span>\r\n \r\n <div class=\"checklist-card pb-5\">\r\n <textarea class=\"form-control form-control-solid\" rows=\"1\"\r\n type=\"text\" class=\"mt-0\" [id]=\"'q-' + i + '-' + j\"\r\n placeholder=\"Enter question here\"\r\n formControlName=\"qname\"></textarea>\r\n <ng-container\r\n *ngIf=\"question.get('qname')?.invalid && question.get('qname')?.touched\">\r\n <p style=\"color: red;\"\r\n *ngIf=\"question.get('qname')?.hasError('required')\">*\r\n Question is required.</p>\r\n </ng-container>\r\n </div>\r\n \r\n <div class=\"row\"\r\n *ngIf=\"!['descriptiveImage','image','multipleImage','image/video'].includes(question.get('answerType')?.value)\">\r\n <div class=\"col-md-4 w-90 text-center\" *ngFor=\"let image of question.get('multiQuestionReferenceImage')?.value; let m = index\" style=\"position: relative;\">\r\n <div *ngIf=\"image?.imageURL\"\r\n class=\"image-container ref_img_cont mb-4 mt-5\">\r\n <img src=\"{{environment.TraxAnswerCDN}}{{image.imageURL}}\"\r\n width=\"90%\" height=\"300px\" class=\"auto-adjust\"\r\n alt=\"Tango Eye\" />\r\n <div class=\"overlay-icons\">\r\n <span class=\"cursor-pointer\" (click)=\"question.get('disableRunAI')?.value ? '' : onPopup(image.imageURL)\" ngbTooltip=\"Expand\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_14557_62513)\">\r\n <rect x=\"2\" y=\"1\" width=\"36\" height=\"36\" rx=\"8\" fill=\"white\"/>\r\n <rect x=\"2.5\" y=\"1.5\" width=\"35\" height=\"35\" rx=\"7.5\" stroke=\"#D0D5DD\"/>\r\n <path d=\"M22.5 11.5H27.5M27.5 11.5V16.5M27.5 11.5L21.6667 17.3333M17.5 26.5H12.5M12.5 26.5V21.5M12.5 26.5L18.3333 20.6667\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_14557_62513\" x=\"0\" y=\"0\" width=\"40\" height=\"40\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\r\n <feOffset dy=\"1\"/>\r\n <feGaussianBlur stdDeviation=\"1\"/>\r\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\"/>\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_14557_62513\"/>\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_14557_62513\" result=\"shape\"/>\r\n </filter>\r\n </defs>\r\n </svg>\r\n </span>\r\n <input class=\"d-none\" [id]=\"'fileuploadref_1'+i+j+m\" type=\"file\"\r\n name=\"answerFile\" accept=\"image/png, image/jpeg\"\r\n (click)=\"question.get('disableRunAI')?.value ? $event.preventDefault() : null\"\r\n (change)=\"question.get('disableRunAI')?.value ? '' : loadImageFromDevice(i,refImgQIdx,$event,-1,'multiQuestionReferenceImage',m)\">\r\n <label class=\"cursor-pointer\" (click)=\"refImgQIdx=j;\" [for]=\"'fileuploadref_1'+i+j+m\" ngbTooltip=\"Reupload\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_14557_62522)\">\r\n <rect x=\"2\" y=\"1\" width=\"36\" height=\"36\" rx=\"8\" fill=\"white\"/>\r\n <rect x=\"2.5\" y=\"1.5\" width=\"35\" height=\"35\" rx=\"7.5\" stroke=\"#D0D5DD\"/>\r\n <path d=\"M27.5 21.5V24.8333C27.5 25.2754 27.3244 25.6993 27.0118 26.0118C26.6993 26.3244 26.2754 26.5 25.8333 26.5H14.1667C13.7246 26.5 13.3007 26.3244 12.9882 26.0118C12.6756 25.6993 12.5 25.2754 12.5 24.8333V21.5M24.1667 15.6667L20 11.5M20 11.5L15.8333 15.6667M20 11.5V21.5\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_14557_62522\" x=\"0\" y=\"0\" width=\"40\" height=\"40\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\r\n <feOffset dy=\"1\"/>\r\n <feGaussianBlur stdDeviation=\"1\"/>\r\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\"/>\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_14557_62522\"/>\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_14557_62522\" result=\"shape\"/>\r\n </filter>\r\n </defs>\r\n </svg>\r\n </label>\r\n <span class=\"cursor-pointer\" (click)=\"question.get('disableRunAI')?.value ? '' : clearReferenceImage(i,j,-1,m,'multiQuestionReferenceImage');\" ngbTooltip=\"Delete\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_14557_62514)\">\r\n <rect x=\"2\" y=\"1\" width=\"36\" height=\"36\" rx=\"8\" fill=\"white\"/>\r\n <rect x=\"2.5\" y=\"1.5\" width=\"35\" height=\"35\" rx=\"7.5\" stroke=\"#D0D5DD\"/>\r\n <path d=\"M12.5 13.9974H14.1667M14.1667 13.9974H27.5M14.1667 13.9974V25.6641C14.1667 26.1061 14.3423 26.53 14.6548 26.8426C14.9674 27.1551 15.3913 27.3307 15.8333 27.3307H24.1667C24.6087 27.3307 25.0326 27.1551 25.3452 26.8426C25.6577 26.53 25.8333 26.1061 25.8333 25.6641V13.9974H14.1667ZM16.6667 13.9974V12.3307C16.6667 11.8887 16.8423 11.4648 17.1548 11.1522C17.4674 10.8397 17.8913 10.6641 18.3333 10.6641H21.6667C22.1087 10.6641 22.5326 10.8397 22.8452 11.1522C23.1577 11.4648 23.3333 11.8887 23.3333 12.3307V13.9974M18.3333 18.1641V23.1641M21.6667 18.1641V23.1641\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_14557_62514\" x=\"0\" y=\"0\" width=\"40\" height=\"40\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\r\n <feOffset dy=\"1\"/>\r\n <feGaussianBlur stdDeviation=\"1\"/>\r\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\"/>\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_14557_62514\"/>\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_14557_62514\" result=\"shape\"/>\r\n </filter>\r\n </defs>\r\n </svg>\r\n </span>\r\n </div>\r\n <!-- <div class=\"ref_del_icon\" (click)=\"clearReferenceImage(i,j);\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2.5 5.0013H4.16667M4.16667 5.0013H17.5M4.16667 5.0013V16.668C4.16667 17.11 4.34226 17.5339 4.65482 17.8465C4.96738 18.159 5.39131 18.3346 5.83333 18.3346H14.1667C14.6087 18.3346 15.0326 18.159 15.3452 17.8465C15.6577 17.5339 15.8333 17.11 15.8333 16.668V5.0013H4.16667ZM6.66667 5.0013V3.33464C6.66667 2.89261 6.84226 2.46868 7.15482 2.15612C7.46738 1.84356 7.89131 1.66797 8.33333 1.66797H11.6667C12.1087 1.66797 12.5326 1.84356 12.8452 2.15612C13.1577 2.46868 13.3333 2.89261 13.3333 3.33464V5.0013M8.33333 9.16797V14.168M11.6667 9.16797V14.168\"\r\n stroke=\"#B42318\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div> -->\r\n </div>\r\n \r\n </div>\r\n <div class=\"d-flex mb-3\">\r\n <!-- <div *ngIf=\"getAnswerFormGroup_FormControl(i,j,'multiQuestionReferenceImage')?.value\"\r\n class=\"col-lg-3 btn btn-light-primary mt-2\">\r\n <input class=\"d-none\" [id]=\"'fileupload_'+i+j\" type=\"file\"\r\n name=\"answerFile\" accept=\"image/png, image/jpeg\"\r\n (change)=\"loadImageFromDevice(i,refImgQIdx,$event,-1,'multiQuestionReferenceImage')\">\r\n <label [for]=\"'fileupload_'+i+j\" (click)=\"refImgQIdx=j;\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"mx-2\"\r\n width=\"21\" height=\"20\" viewBox=\"0 0 21 20\"\r\n fill=\"none\">\r\n <g clip-path=\"url(#clip0_4082_3122)\">\r\n <path\r\n d=\"M19.6667 3.33527V8.33527M19.6667 8.33527H14.6667M19.6667 8.33527L15.8 4.70193C14.9044 3.80586 13.7964 3.15127 12.5793 2.79925C11.3623 2.44722 10.0759 2.40923 8.84025 2.68882C7.60456 2.96841 6.45984 3.55646 5.5129 4.39812C4.56595 5.23977 3.84765 6.30759 3.42501 7.50193M1.33334 16.6686V11.6686M1.33334 11.6686H6.33334M1.33334 11.6686L5.20001 15.3019C6.09563 16.198 7.20365 16.8526 8.42068 17.2046C9.63771 17.5567 10.9241 17.5946 12.1598 17.3151C13.3955 17.0355 14.5402 16.4474 15.4871 15.6058C16.4341 14.7641 17.1524 13.6963 17.575 12.5019\"\r\n stroke=\"#009BF3\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4082_3122\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\"\r\n transform=\"translate(0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>Reupload Image\r\n </label>\r\n </div> -->\r\n <ng-container *ngTemplateOutlet=\"qdescriptionButton; context: {$implicit: question, i: i, j: j}\"></ng-container>\r\n <div *ngIf=\"question.get('multiQuestionReferenceImage')?.value.length <5 && !question.get('disableRunAI')?.value\"\r\n class=\"col-lg-3 btn add-ref-btn btn-light-primary my-2\">\r\n <input class=\"d-none\" [id]=\"'fileuploadQnRef1_2'+i+j\" type=\"file\"\r\n name=\"file\" accept=\"image/png, image/jpeg\"\r\n (change)=\"loadImageFromDevice(i,refImgQIdx,$event,-1,'multiQuestionReferenceImage')\">\r\n <label class=\"pointer\" [for]=\"'fileuploadQnRef1_2'+i+j\"\r\n (click)=\"refImgQIdx=j;\"> \r\n <svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M10 4.16797V15.8346M4.16669 10.0013H15.8334\"\r\n stroke=\"#009BF3\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>Add Reference Image \r\n </label>\r\n </div>\r\n <div *ngIf=\"question.get('multiQuestionReferenceImage')?.value.length >= 5 || question.get('disableRunAI')?.value\"\r\n class=\"col-lg-3 btn-light-disbaled btn add-ref-btn my-2 borderCard\">\r\n <label class=\"pointer\"> \r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0013 4.16406V15.8307M4.16797 9.9974H15.8346\" stroke=\"#6BCAFF\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> <span>Add Reference Image</span> \r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Question description (qdescription): optional, shown under the question in the mobile app and Gallery. Hidden while showQdescription is off -->\r\n <div class=\"d-flex mb-3\" *ngIf=\"showQdescription && ['descriptiveImage','image','multipleImage','image/video'].includes(question.get('answerType')?.value)\">\r\n <ng-container *ngTemplateOutlet=\"qdescriptionButton; context: {$implicit: question, i: i, j: j}\"></ng-container>\r\n </div>\r\n <div class=\"qdescription-field mb-3\" *ngIf=\"showQdescription && isQdescriptionOpen(question)\">\r\n <div class=\"d-flex align-items-center\">\r\n <input type=\"text\" [id]=\"'qdesc-' + i + '-' + j\" formControlName=\"qdescription\"\r\n placeholder=\"Enter question description\">\r\n <svg class=\"ms-4 flex-shrink-0 cursor-pointer\" (click)=\"removeQdescription(question)\"\r\n matTooltip=\"Remove description\" matTooltipPosition=\"above\" matTooltipClass=\"custom-test\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 18 18\" fill=\"none\">\r\n <path\r\n d=\"M2.25 4.5H3.75M3.75 4.5H15.75M3.75 4.5V15C3.75 15.3978 3.90804 15.7794 4.18934 16.0607C4.47064 16.342 4.85218 16.5 5.25 16.5H12.75C13.1478 16.5 13.5294 16.342 13.8107 16.0607C14.092 15.7794 14.25 15.3978 14.25 15V4.5H3.75ZM6 4.5V3C6 2.60218 6.15804 2.22064 6.43934 1.93934C6.72064 1.65804 7.10218 1.5 7.5 1.5H10.5C10.8978 1.5 11.2794 1.65804 11.5607 1.93934C11.842 2.22064 12 2.60218 12 3V4.5M7.5 8.25V12.75M10.5 8.25V12.75\"\r\n stroke=\"#667085\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <div class=\"qdescription-hint mt-2\">Shown below the question in Trax and Gallery.</div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"checklist-card pb-5\" [ngClass]=\"['image','image/video','multiplechoicesingle','yes/no','date','linearscale'].includes(question.get('answerType')?.value) ? 'col-md-8' :'col-md-12'\">\r\n <lib-audit-v2-select class=\"mt-5\" formControlName=\"answerType\" [options]=\"answerTypeOptions\" [searchable]=\"false\" ariaLabel=\"Answer type\" (changed)=\"answerTypeSelection(i,j,$event)\"></lib-audit-v2-select>\r\n \r\n </div>\r\n <div class=\"col-md-4\" *ngIf=\"['image','image/video','multiplechoicesingle','yes/no','date','linearscale'].includes(question.get('answerType')?.value)\">\r\n <div class=\"form-check form-switch text-left align-items-center btn-sec mt-10\" >\r\n <input class=\"form-check-input mx-0 pointer\" type=\"checkbox\" name=\"toc\" value=\"1\" ngDefaultControl formControlName=\"compliance\" (change)=\"getComplianceToast(i,j,$event)\" [attr.disabled]=\"hasValidationEnabled(i,j) ? true : null\">\r\n <label class=\"form-check-label pointer fs-16px\" for=\"flexSwitchCheckDefault\">Configure Compliance Score</label>\r\n\r\n </div>\r\n <!-- Image answers are scored by Run AI (matched / not matched), so the switch waits for it (as the Checklist editor). -->\r\n <div class=\"qdescription-hint mt-1\" *ngIf=\"['image','image/video'].includes(question.get('answerType')?.value) && question.get('compliance')?.disabled\">\r\n Turn on Run AI to score image answers.\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-3 mx-4 d-flex mt-3\" *ngIf=\"['descriptive'].includes(question.get('answerType')?.value)\">\r\n <div class=\"form-check\" >\r\n <input formControlName=\"descriptivetype\" class=\"form-check-input cursor-pointer\" type=\"radio\" value=\"text\" [name]=\"'descriptivetype'\" [id]=\"'inlineRadio0'+ i + j\" [attr.disabled]=\"question.get('disableRunAI')?.value ? true : null\">\r\n <label class=\"cursor-pointer dscriptiveType\" [for]=\"'inlineRadio0'+ i + j\">Text</label>\r\n </div>\r\n <div class=\"form-check ms-5\">\r\n <input formControlName=\"descriptivetype\" class=\"form-check-input cursor-pointer\" type=\"radio\" value=\"number\" [name]=\"'descriptivetype'\" [id]=\"'inlineRadio1'+ i + j\" [attr.disabled]=\"question.get('disableRunAI')?.value ? true : null\">\r\n <label class=\"cursor-pointer dscriptiveType\" [for]=\"'inlineRadio1'+i + j\">Number</label>\r\n </div>\r\n </div>\r\n <ng-container\r\n *ngIf=\"['yes/no','multiplechoicesingle','multiplechoicemultiple','dropdown'].includes(question.get('answerType')?.value)\">\r\n <div class=\"d-flex justify-content-between\">\r\n <div class=\"fs-18px fw-bolder\" style=\"cursor: default;\">Answer Options</div>\r\n <div class=\"form-check form-switch text-left align-items-center btn-sec mt-2\" *ngIf=\"question.get('answerType')?.value == 'dropdown'\">\r\n <input class=\"form-check-input mx-0 pointer\" type=\"checkbox\" name=\"toc\" value=\"1\" ngDefaultControl formControlName=\"allowMultiple\">\r\n <label class=\"form-check-label pointer fs-16px\" for=\"flexSwitchCheckDefault\">Allow Multiple Response</label>\r\n \r\n </div>\r\n </div>\r\n <ng-container formArrayName=\"answers\">\r\n <ng-container\r\n *ngFor=\"let answer of getFormArrayQuestionsAnswer(i,j,'answers')?.controls;let k = index;\">\r\n <div class=\"row\" [formGroupName]=\"k\">\r\n <ng-container *ngIf=\"!answer.get('isdeleted')?.value\">\r\n <div class=\"Answer1\" [ngClass]=\"question.get('compliance')?.value ? 'col-lg-4' : 'col-lg-6'\">\r\n <div class=\"checklist-card pb-0 mt-5\">\r\n <input type=\"text\" class=\"mt-0\"\r\n placeholder=\"Enter answer here\"\r\n formControlName=\"answer\"\r\n (input)=\"onAnswerValueChange(i,j,k)\">\r\n <span class=\"vl\"></span>\r\n <ng-container\r\n *ngIf=\"question.get('answerType')?.value === 'yes/no' || question.get('answerType')?.value === 'multiplechoicesingle'\"\r\n ngDefaultControl>\r\n <span class=\"vl2\"></span>\r\n <svg class=\"imgAdd\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\"\r\n (click)=\"question.get('disableRunAI')?.value ?'' :updateLinked(i,j,k)\">\r\n <path\r\n d=\"M9.99999 4.16602V15.8327M4.16666 9.99935H15.8333\"\r\n stroke=\"#344054\"\r\n stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </ng-container>\r\n <ng-container\r\n *ngIf=\"answer.get('answer')?.invalid && answer.get('answer')?.touched\">\r\n <p style=\"color: red;\"\r\n *ngIf=\"answer.get('answer')?.hasError('required')\">\r\n * Answer is required.</p>\r\n </ng-container>\r\n <p style=\"color: red;\"\r\n *ngIf=\"answer.get('showSOPFlagError')?.value === true\">\r\n Every answer can’t be a flag.</p>\r\n \r\n <ng-container formControlName=\"sopFlag\"\r\n ngDefaultControl>\r\n \r\n <svg (click)=\"question.get('disableRunAI')?.value ?'' : onFlagClickOn(i,j,k)\"\r\n matTooltip=\"Raise a flag if this answer is selected\"\r\n matTooltipPosition=\"above\"\r\n matTooltipClass=\"custom-test\"\r\n *ngIf=\"answer.get('sopFlag')?.value === false\"\r\n class=\"kiwi\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\">\r\n <path\r\n d=\"M2.66669 10.0007C2.66669 10.0007 3.33335 9.33398 5.33335 9.33398C7.33335 9.33398 8.66669 10.6673 10.6667 10.6673C12.6667 10.6673 13.3334 10.0007 13.3334 10.0007V2.00065C13.3334 2.00065 12.6667 2.66732 10.6667 2.66732C8.66669 2.66732 7.33335 1.33398 5.33335 1.33398C3.33335 1.33398 2.66669 2.00065 2.66669 2.00065V10.0007ZM2.66669 10.0007V14.6673\"\r\n stroke=\"#D0D5DD\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n \r\n <svg (click)=\"question.get('disableRunAI')?.value ?'' : raiseflag(i,j,k,false)\"\r\n matTooltip=\"Raise a flag if this answer is selected\"\r\n matTooltipPosition=\"above\"\r\n matTooltipClass=\"custom-test\"\r\n *ngIf=\"answer.get('sopFlag')?.value === true\"\r\n class=\"active-flag\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"16\" height=\"16\"\r\n viewBox=\"0 0 16 16\">\r\n <path\r\n d=\"M2.66669 10.0007C2.66669 10.0007 3.33335 9.33398 5.33335 9.33398C7.33335 9.33398 8.66669 10.6673 10.6667 10.6673C12.6667 10.6673 13.3334 10.0007 13.3334 10.0007V2.00065C13.3334 2.00065 12.6667 2.66732 10.6667 2.66732C8.66669 2.66732 7.33335 1.33398 5.33335 1.33398C3.33335 1.33398 2.66669 2.00065 2.66669 2.00065V10.0007ZM2.66669 10.0007V14.6673\"\r\n stroke=\"#D0D5DD\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </ng-container>\r\n <p class=\"mt-2\" *ngIf=\"answer.get('autoTask')?.value?.enabled\">\r\n Auto Task has been created for the flagged option\r\n <span class=\"text-primary fw-semibold cursor-pointer ms-2 mt-2\" style=\"font-size:11px;\"\r\n *ngIf=\"answer.get('autoTask')?.value?.enabled\"\r\n (click)=\"question.get('disableRunAI')?.value ? '' : openAutoTaskDetails(i,j,k)\"\r\n matTooltip=\"Edit auto task\" matTooltipPosition=\"above\">View task</span>\r\n </p>\r\n </div>\r\n </div>\r\n <div [ngClass]=\"question.get('compliance')?.value ? 'col-lg-5' : 'col-lg-6'\"\r\n *ngIf=\"!answer.get('showLinked')?.value\">\r\n <div class=\"d-flex justify-content-between\">\r\n <div class=\"d-flex answervalidation\">\r\n <input class=\"mt-7\" type=\"checkbox\"\r\n style=\"width:16px;height:16px;cursor: pointer;\"\r\n value=\"1\"\r\n (change)=\"getvalidation(i,j,k,$event)\"\r\n formControlName=\"validation\">\r\n <div class=\"chackbox pt-4 mt-2 mx-2\"\r\n style=\"cursor: default;\">\r\n <h3>Validate response</h3>\r\n <p class=\"mb-0\">Trigger an action\r\n for each response to validate it\r\n </p>\r\n </div>\r\n </div>\r\n <svg *ngIf=\"question.get('answerType')?.value !== 'yes/no' && getFormArrayQuestionsAnswer(i,j,'answers').value.length > 2 && !question.get('compliance')?.value\"\r\n (click)=\"question.get('disableRunAI')?.value ?'' :deleteAnswer(i,j,k)\"\r\n class=\"mt-8\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n matTooltip=\"Delete answer\"\r\n matTooltipPosition=\"above\"\r\n matTooltipClass=\"custom-test\" width=\"20\"\r\n height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <path d=\"M15 5L5 15M5 5L15 15\"\r\n stroke=\"#667085\"\r\n stroke-width=\"1.66667\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n \r\n </div>\r\n <div class=\"col-md-3\" *ngIf=\"question.get('compliance')?.value\">\r\n <lib-audit-v2-select class=\"w-150px mt-7\" formControlName=\"complianceScore\" [options]=\"scoreOptions\" [searchable]=\"false\" ariaLabel=\"Compliance score\"></lib-audit-v2-select>\r\n <svg class=\"ms-3\" *ngIf=\"question.get('answerType')?.value !== 'yes/no' && getFormArrayQuestionsAnswer(i,j,'answers').value.length > 2\"\r\n (click)=\"question.get('disableRunAI')?.value ?'' :deleteAnswer(i,j,k)\"\r\n class=\"\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n matTooltip=\"Delete answer\"\r\n matTooltipPosition=\"above\"\r\n matTooltipClass=\"custom-test\" width=\"20\"\r\n height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <path d=\"M15 5L5 15M5 5L15 15\"\r\n stroke=\"#667085\"\r\n stroke-width=\"1.66667\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n <!-- *ngIf=\"moreqn.validation\" -->\r\n <div *ngIf=\"answer.get('validation')?.value\"\r\n class=\"row\">\r\n <div class=\"col-lg-3 pt-7 fs-4 fw-400 mt-1\">\r\n If the response is this, then\r\n </div>\r\n <div [ngClass]=\"answer.get('validationType')?.value === 'Capture Multiple Image with description' ? 'col-md-6' : 'col-lg-3'\">\r\n <lib-audit-v2-select class=\"mt-5 mx-1\" formControlName=\"validationType\" [options]=\"validationOptions(question.get('answerType')?.value)\" ariaLabel=\"Validation type\" (changed)=\"updateValidationType($event,i,j,k)\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"col-lg-3 mx-4 d-flex pt-8\" *ngIf=\"answer.get('validationType')?.value === 'Descriptive Answer'\">\r\n <div class=\"form-check\">\r\n <input formControlName=\"descriptivetype\" class=\"form-check-input cursor-pointer\" type=\"radio\" [id]=\"'inlineRadio2' + i + j + k\"\r\n value=\"text\" [name]=\"'descriptivetype'\" [attr.disabled]=\"question.get('disableRunAI')?.value ? true : null\">\r\n <label class=\"cursor-pointer dscriptiveType\" [for]=\"'inlineRadio2' + i + j + k\">Text</label>\r\n </div>\r\n <div class=\"form-check ms-5\">\r\n <input formControlName=\"descriptivetype\" class=\"form-check-input cursor-pointer\" type=\"radio\" [id]=\"'inlineRadio3'+ i + j + k\"\r\n value=\"number\" [name]=\"'descriptivetype'\" [attr.disabled]=\"question.get('disableRunAI')?.value ? true : null\">\r\n <label class=\"cursor-pointer dscriptiveType\" [for]=\"'inlineRadio3' + i + j + k\">Number</label>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\"\r\n *ngIf=\"answer.get('showLinked')?.value\">\r\n <div class=\"col-lg-3 pt-7 fs-4 fw-400 mt-1\">\r\n Linked Question\r\n </div>\r\n <div class=\"col-lg-9\">\r\n <lib-audit-v2-select class=\"mt-5\" [value]=\"answer.get('linkedQuestion')?.value || ''\" [options]=\"linkedOptions(i,j,k)\" [searchable]=\"false\" placeholder=\"Select Question\" ariaLabel=\"Linked question\" [disabled]=\"question.get('disableRunAI')?.value\" (changed)=\"updateQuestionType(i,j,k,$event)\"></lib-audit-v2-select>\r\n </div>\r\n </div>\r\n <div class=\"row\"\r\n *ngIf=\"answer.get('validation')?.value && (answer.get('validationType')?.value === 'Capture Image' || answer.get('validationType')?.value === 'Capture Multiple Image with description')\">\r\n <div *ngFor=\"let image of getAnswerFormGroup_FormControl(i,j,'multiReferenceImage',k)?.value;let n=index\"\r\n class=\"col-md-4 image-container ref_img_cont mb-4 mt-5\">\r\n <img src=\"{{environment.TraxAnswerCDN}}{{image.imageURL}}\"\r\n width=\"90%\" height=\"300px\"\r\n class=\"auto-adju st\" alt=\"Tango Eye\" />\r\n <div class=\"overlay-icons\">\r\n <span class=\"cursor-pointer\" (click)=\"question.get('disableRunAI')?.value ?'' :onPopup(image.imageURL)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_14557_62513)\">\r\n <rect x=\"2\" y=\"1\" width=\"36\" height=\"36\" rx=\"8\" fill=\"white\"/>\r\n <rect x=\"2.5\" y=\"1.5\" width=\"35\" height=\"35\" rx=\"7.5\" stroke=\"#D0D5DD\"/>\r\n <path d=\"M22.5 11.5H27.5M27.5 11.5V16.5M27.5 11.5L21.6667 17.3333M17.5 26.5H12.5M12.5 26.5V21.5M12.5 26.5L18.3333 20.6667\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_14557_62513\" x=\"0\" y=\"0\" width=\"40\" height=\"40\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\r\n <feOffset dy=\"1\"/>\r\n <feGaussianBlur stdDeviation=\"1\"/>\r\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\"/>\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_14557_62513\"/>\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_14557_62513\" result=\"shape\"/>\r\n </filter>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span class=\"cursor-pointer\">\r\n <input class=\"d-none\"\r\n [id]=\"'fileupload_validref'+i+j+k+n\"\r\n type=\"file\" name=\"answerFile\"\r\n accept=\"image/png, image/jpeg\"\r\n (click)=\"question.get('disableRunAI')?.value ? $event.preventDefault() : null\"\r\n (change)=\"question.get('disableRunAI')?.value ? '' : loadImageFromDevice(i,refImgQIdx,$event,k,'multiReferenceImage',n)\">\r\n <label [for]=\"'fileupload_validref'+i+j+k+n\"\r\n (click)=\"refImgQIdx=j;\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_14557_62522)\">\r\n <rect x=\"2\" y=\"1\" width=\"36\" height=\"36\" rx=\"8\" fill=\"white\"/>\r\n <rect x=\"2.5\" y=\"1.5\" width=\"35\" height=\"35\" rx=\"7.5\" stroke=\"#D0D5DD\"/>\r\n <path d=\"M27.5 21.5V24.8333C27.5 25.2754 27.3244 25.6993 27.0118 26.0118C26.6993 26.3244 26.2754 26.5 25.8333 26.5H14.1667C13.7246 26.5 13.3007 26.3244 12.9882 26.0118C12.6756 25.6993 12.5 25.2754 12.5 24.8333V21.5M24.1667 15.6667L20 11.5M20 11.5L15.8333 15.6667M20 11.5V21.5\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_14557_62522\" x=\"0\" y=\"0\" width=\"40\" height=\"40\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\r\n <feOffset dy=\"1\"/>\r\n <feGaussianBlur stdDeviation=\"1\"/>\r\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\"/>\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_14557_62522\"/>\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_14557_62522\" result=\"shape\"/>\r\n </filter>\r\n </defs>\r\n </svg>\r\n </label>\r\n </span>\r\n <span class=\"cursor-pointer\" (click)=\"question.get('disableRunAI')?.value ?'' :clearReferenceImage(i,j,k,n,'multiReferenceImage');\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_14557_62514)\">\r\n <rect x=\"2\" y=\"1\" width=\"36\" height=\"36\" rx=\"8\" fill=\"white\"/>\r\n <rect x=\"2.5\" y=\"1.5\" width=\"35\" height=\"35\" rx=\"7.5\" stroke=\"#D0D5DD\"/>\r\n <path d=\"M12.5 13.9974H14.1667M14.1667 13.9974H27.5M14.1667 13.9974V25.6641C14.1667 26.1061 14.3423 26.53 14.6548 26.8426C14.9674 27.1551 15.3913 27.3307 15.8333 27.3307H24.1667C24.6087 27.3307 25.0326 27.1551 25.3452 26.8426C25.6577 26.53 25.8333 26.1061 25.8333 25.6641V13.9974H14.1667ZM16.6667 13.9974V12.3307C16.6667 11.8887 16.8423 11.4648 17.1548 11.1522C17.4674 10.8397 17.8913 10.6641 18.3333 10.6641H21.6667C22.1087 10.6641 22.5326 10.8397 22.8452 11.1522C23.1577 11.4648 23.3333 11.8887 23.3333 12.3307V13.9974M18.3333 18.1641V23.1641M21.6667 18.1641V23.1641\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_14557_62514\" x=\"0\" y=\"0\" width=\"40\" height=\"40\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\r\n <feOffset dy=\"1\"/>\r\n <feGaussianBlur stdDeviation=\"1\"/>\r\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\"/>\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_14557_62514\"/>\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_14557_62514\" result=\"shape\"/>\r\n </filter>\r\n </defs>\r\n </svg>\r\n </span>\r\n </div>\r\n <!-- <div class=\"ref_del_icon\"\r\n (click)=\"clearReferenceImage(i,j,k);\">\r\n <svg width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M2.5 5.0013H4.16667M4.16667 5.0013H17.5M4.16667 5.0013V16.668C4.16667 17.11 4.34226 17.5339 4.65482 17.8465C4.96738 18.159 5.39131 18.3346 5.83333 18.3346H14.1667C14.6087 18.3346 15.0326 18.159 15.3452 17.8465C15.6577 17.5339 15.8333 17.11 15.8333 16.668V5.0013H4.16667ZM6.66667 5.0013V3.33464C6.66667 2.89261 6.84226 2.46868 7.15482 2.15612C7.46738 1.84356 7.89131 1.66797 8.33333 1.66797H11.6667C12.1087 1.66797 12.5326 1.84356 12.8452 2.15612C13.1577 2.46868 13.3333 2.89261 13.3333 3.33464V5.0013M8.33333 9.16797V14.168M11.6667 9.16797V14.168\"\r\n stroke=\"#B42318\"\r\n stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div> -->\r\n </div>\r\n <div class=\"d-flex mb-3\">\r\n <!-- <div *ngIf=\"getAnswerFormGroup_FormControl(i,j,'multiReferenceImage',k)?.value\"\r\n class=\"col-lg-3 btn btn-light-primary mt-2\">\r\n <input class=\"d-none\"\r\n [id]=\"'fileupload_'+i+j+k\"\r\n type=\"file\" name=\"answerFile\"\r\n accept=\"image/png, image/jpeg\"\r\n (change)=\"loadImageFromDevice(i,refImgQIdx,$event,k)\">\r\n <label [for]=\"'fileupload_'+i+j+k\"\r\n (click)=\"refImgQIdx=j;\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\"\r\n class=\"mx-2\" width=\"21\"\r\n height=\"20\" viewBox=\"0 0 21 20\"\r\n fill=\"none\">\r\n <g\r\n clip-path=\"url(#clip0_4082_3122)\">\r\n <path\r\n d=\"M19.6667 3.33527V8.33527M19.6667 8.33527H14.6667M19.6667 8.33527L15.8 4.70193C14.9044 3.80586 13.7964 3.15127 12.5793 2.79925C11.3623 2.44722 10.0759 2.40923 8.84025 2.68882C7.60456 2.96841 6.45984 3.55646 5.5129 4.39812C4.56595 5.23977 3.84765 6.30759 3.42501 7.50193M1.33334 16.6686V11.6686M1.33334 11.6686H6.33334M1.33334 11.6686L5.20001 15.3019C6.09563 16.198 7.20365 16.8526 8.42068 17.2046C9.63771 17.5567 10.9241 17.5946 12.1598 17.3151C13.3955 17.0355 14.5402 16.4474 15.4871 15.6058C16.4341 14.7641 17.1524 13.6963 17.575 12.5019\"\r\n stroke=\"#009BF3\"\r\n stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath\r\n id=\"clip0_4082_3122\">\r\n <rect width=\"20\"\r\n height=\"20\"\r\n fill=\"white\"\r\n transform=\"translate(0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>Reupload Image</label>\r\n </div> -->\r\n <div *ngIf=\"getAnswerFormGroup_FormControl(i,j,'multiReferenceImage',k)?.value.length >= 5 || question.get('disableRunAI')?.value\"\r\n class=\"col-lg-3 btn-light-disbaled btn add-ref-btn my-2 borderCard\">\r\n <label class=\"pointer\"> \r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0013 4.16406V15.8307M4.16797 9.9974H15.8346\" stroke=\"#6BCAFF\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> <span>Add Reference Image</span> \r\n </label>\r\n </div>\r\n <div *ngIf=\"!question.get('disableRunAI')?.value && getAnswerFormGroup_FormControl(i,j,'multiReferenceImage',k)?.value.length < 5\"\r\n class=\"col-lg-3 btn add-ref-btn btn-light-primary my-2\">\r\n <input class=\"d-none\"\r\n [id]=\"'fileupload_validImage1'+i+j+k\"\r\n type=\"file\" name=\"file\"\r\n accept=\"image/png, image/jpeg\"\r\n (change)=\"loadImageFromDevice(i,refImgQIdx,$event,k,'multiReferenceImage')\">\r\n <label class=\"pointer\"\r\n [for]=\"'fileupload_validImage1'+i+j+k\"\r\n (click)=\"refImgQIdx=j;\"> <svg\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M10 4.16797V15.8346M4.16669 10.0013H15.8334\"\r\n stroke=\"#009BF3\"\r\n stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>Add Reference Image </label>\r\n </div>\r\n <div\r\n class=\"col-lg-4 form-check form-switch mx-2 btn-sec mt-6 text-left align-items-center\">\r\n <input\r\n class=\"form-check-input mx-0 pointer\"\r\n type=\"checkbox\" name=\"toc\" value=\"1\"\r\n ngDefaultControl\r\n formControlName=\"allowUploadfromGallery\">\r\n <label class=\"form-check-label pointer\"\r\n for=\"flexSwitchCheckDefault\"></label>\r\n Allow upload from gallery\r\n </div>\r\n <div class=\"col-lg-2\"></div>\r\n <div class=\"col-lg-3 d-flex justify-content-center align-items-center mt-2\" *ngIf=\"userType && userType === 'tango'\">\r\n <h3 class=\"fs16-600 px-12\"> Run AI ✨</h3>\r\n <div class=\"form-check form-switch align-items-center btn-sec ml-5\">\r\n <!-- (click)=\"RunAINew(i,j,k)\" -->\r\n <input class=\"form-check-input pointer\" type=\"checkbox\"\r\n formControlName=\"runAI\" name=\"toc\" value=\"1\" (click)=\"RunAINew(i,j,k,$event)\">\r\n <label class=\"form-check-label\"\r\n for=\"flexSwitchCheckDefault\"></label>\r\n </div>\r\n <svg [ngClass]=\"question.get('answerType')?.value === 'multipleImage' ? 'mt-1' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\"\r\n height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n matTooltip=\"Enable AI where you want tango to identify, track and alert instances.\"\r\n matTooltipPosition=\"above\"\r\n matTooltipClass=\"custom-test\">\r\n <g clip-path=\"url(#clip0_2301_100038)\">\r\n <path\r\n d=\"M7.99967 10.6654V7.9987M7.99967 5.33203H8.00634M14.6663 7.9987C14.6663 11.6806 11.6816 14.6654 7.99967 14.6654C4.31778 14.6654 1.33301 11.6806 1.33301 7.9987C1.33301 4.3168 4.31778 1.33203 7.99967 1.33203C11.6816 1.33203 14.6663 4.3168 14.6663 7.9987Z\"\r\n stroke=\"#98A2B3\" stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_2301_100038\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"question.get('answers')?.hasError('duplicateString')\" class=\"text-danger mt-2\">* Same answer cannot be\r\n repeated</div>\r\n <ng-container class=\"row\"\r\n *ngIf=\"['multiplechoicemultiple','multiplechoicesingle','dropdown'].includes(question.get('answerType')?.value) && allowAddAnswer(question.get('answers')?.value) && !question.get('disableRunAI')?.value\">\r\n <div (click)=\"AddMoreAns(i,j,question.get('answerType')?.value)\"\r\n class=\"btn col-lg-12 btn-light-primary my-3\">\r\n Add More Answer</div>\r\n </ng-container>\r\n \r\n </ng-container>\r\n </ng-container>\r\n \r\n <!-- Image -->\r\n <ng-container\r\n *ngIf=\"['image','descriptiveImage','multipleImage'].includes(question.get('answerType')?.value)\"\r\n class=\"row\">\r\n <ng-container formGroupName=\"answers\">\r\n <div *ngFor=\"let image of getAnswerFormGroup_FormControl(i,j,'multiReferenceImage')?.value;let n=index\"\r\n class=\"col-md-4 image-container ref_img_cont ref_img_cont mb-4\">\r\n <img src=\"{{environment.TraxAnswerCDN}}{{image.imageURL}}\"\r\n width=\"90%\" height=\"300px\" class=\"auto-adjust\"\r\n alt=\"Tango Eye\" />\r\n <div class=\"overlay-icons\">\r\n <span class=\"cursor-pointer\" (click)=\"onPopup(image.imageURL)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_14557_62513)\">\r\n <rect x=\"2\" y=\"1\" width=\"36\" height=\"36\" rx=\"8\" fill=\"white\"/>\r\n <rect x=\"2.5\" y=\"1.5\" width=\"35\" height=\"35\" rx=\"7.5\" stroke=\"#D0D5DD\"/>\r\n <path d=\"M22.5 11.5H27.5M27.5 11.5V16.5M27.5 11.5L21.6667 17.3333M17.5 26.5H12.5M12.5 26.5V21.5M12.5 26.5L18.3333 20.6667\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_14557_62513\" x=\"0\" y=\"0\" width=\"40\" height=\"40\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\r\n <feOffset dy=\"1\"/>\r\n <feGaussianBlur stdDeviation=\"1\"/>\r\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\"/>\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_14557_62513\"/>\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_14557_62513\" result=\"shape\"/>\r\n </filter>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span class=\"cursor-pointer\">\r\n <input class=\"d-none\" [id]=\"'fileuploadImage_45_'+i+'_'+j+'_'+n\" type=\"file\"\r\n name=\"file\" accept=\"image/png, image/jpeg\"\r\n (click)=\"question.get('disableRunAI')?.value ? $event.preventDefault() : null\"\r\n (change)=\"question.get('disableRunAI')?.value ? '' : loadImageFromDevice(i,refImgQIdx,$event,-1,'multiReferenceImage',n)\">\r\n <label [for]=\"'fileuploadImage_45_'+i+'_'+j+'_'+n\" (click)=\"refImgQIdx=j;\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_14557_62522)\">\r\n <rect x=\"2\" y=\"1\" width=\"36\" height=\"36\" rx=\"8\" fill=\"white\"/>\r\n <rect x=\"2.5\" y=\"1.5\" width=\"35\" height=\"35\" rx=\"7.5\" stroke=\"#D0D5DD\"/>\r\n <path d=\"M27.5 21.5V24.8333C27.5 25.2754 27.3244 25.6993 27.0118 26.0118C26.6993 26.3244 26.2754 26.5 25.8333 26.5H14.1667C13.7246 26.5 13.3007 26.3244 12.9882 26.0118C12.6756 25.6993 12.5 25.2754 12.5 24.8333V21.5M24.1667 15.6667L20 11.5M20 11.5L15.8333 15.6667M20 11.5V21.5\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_14557_62522\" x=\"0\" y=\"0\" width=\"40\" height=\"40\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\r\n <feOffset dy=\"1\"/>\r\n <feGaussianBlur stdDeviation=\"1\"/>\r\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\"/>\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_14557_62522\"/>\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_14557_62522\" result=\"shape\"/>\r\n </filter>\r\n </defs>\r\n </svg>\r\n </label>\r\n </span>\r\n <span class=\"cursor-pointer\" (click)=\"question.get('disableRunAI')?.value ? '': clearReferenceImage(i,j,-1,n,'multiReferenceImage');\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_14557_62514)\">\r\n <rect x=\"2\" y=\"1\" width=\"36\" height=\"36\" rx=\"8\" fill=\"white\"/>\r\n <rect x=\"2.5\" y=\"1.5\" width=\"35\" height=\"35\" rx=\"7.5\" stroke=\"#D0D5DD\"/>\r\n <path d=\"M12.5 13.9974H14.1667M14.1667 13.9974H27.5M14.1667 13.9974V25.6641C14.1667 26.1061 14.3423 26.53 14.6548 26.8426C14.9674 27.1551 15.3913 27.3307 15.8333 27.3307H24.1667C24.6087 27.3307 25.0326 27.1551 25.3452 26.8426C25.6577 26.53 25.8333 26.1061 25.8333 25.6641V13.9974H14.1667ZM16.6667 13.9974V12.3307C16.6667 11.8887 16.8423 11.4648 17.1548 11.1522C17.4674 10.8397 17.8913 10.6641 18.3333 10.6641H21.6667C22.1087 10.6641 22.5326 10.8397 22.8452 11.1522C23.1577 11.4648 23.3333 11.8887 23.3333 12.3307V13.9974M18.3333 18.1641V23.1641M21.6667 18.1641V23.1641\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_14557_62514\" x=\"0\" y=\"0\" width=\"40\" height=\"40\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\r\n <feOffset dy=\"1\"/>\r\n <feGaussianBlur stdDeviation=\"1\"/>\r\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\"/>\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_14557_62514\"/>\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_14557_62514\" result=\"shape\"/>\r\n </filter>\r\n </defs>\r\n </svg>\r\n </span>\r\n </div>\r\n <!-- <div class=\"ref_del_icon\"\r\n (click)=\"(question.get('answerType')?.value === 'image' && question.get('runAIDefault')?.value) ? '': clearReferenceImage(i,j);\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" [style]=\"(question.get('answerType')?.value === 'image' && question.get('runAIDefault')?.value) ? 'cursor:default':''\">\r\n <path\r\n d=\"M2.5 5.0013H4.16667M4.16667 5.0013H17.5M4.16667 5.0013V16.668C4.16667 17.11 4.34226 17.5339 4.65482 17.8465C4.96738 18.159 5.39131 18.3346 5.83333 18.3346H14.1667C14.6087 18.3346 15.0326 18.159 15.3452 17.8465C15.6577 17.5339 15.8333 17.11 15.8333 16.668V5.0013H4.16667ZM6.66667 5.0013V3.33464C6.66667 2.89261 6.84226 2.46868 7.15482 2.15612C7.46738 1.84356 7.89131 1.66797 8.33333 1.66797H11.6667C12.1087 1.66797 12.5326 1.84356 12.8452 2.15612C13.1577 2.46868 13.3333 2.89261 13.3333 3.33464V5.0013M8.33333 9.16797V14.168M11.6667 9.16797V14.168\"\r\n stroke=\"#B42318\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>\r\n </div> -->\r\n </div>\r\n <div class=\"d-flex mb-3\">\r\n <!-- <div *ngIf=\"getAnswerFormGroup_FormControl(i,j,'multiReferenceImage')?.value\"\r\n class=\"col-lg-3 btn btn-light-primary mt-2\">\r\n <input class=\"d-none\" id=\"fileupload\" type=\"file\"\r\n name=\"file\" accept=\"image/png, image/jpeg\"\r\n (change)=\"loadImageFromDevice(i,refImgQIdx,$event)\" *ngIf=\"(question.get('answerType')?.value !== 'image' || (question.get('answerType')?.value === 'image' && !question.get('runAIDefault')?.value))\">\r\n <label for=\"fileupload\" (click)=\"refImgQIdx=j;\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"mx-2\"\r\n width=\"21\" height=\"20\" viewBox=\"0 0 21 20\"\r\n fill=\"none\">\r\n <g clip-path=\"url(#clip0_4082_3122)\">\r\n <path\r\n d=\"M19.6667 3.33527V8.33527M19.6667 8.33527H14.6667M19.6667 8.33527L15.8 4.70193C14.9044 3.80586 13.7964 3.15127 12.5793 2.79925C11.3623 2.44722 10.0759 2.40923 8.84025 2.68882C7.60456 2.96841 6.45984 3.55646 5.5129 4.39812C4.56595 5.23977 3.84765 6.30759 3.42501 7.50193M1.33334 16.6686V11.6686M1.33334 11.6686H6.33334M1.33334 11.6686L5.20001 15.3019C6.09563 16.198 7.20365 16.8526 8.42068 17.2046C9.63771 17.5567 10.9241 17.5946 12.1598 17.3151C13.3955 17.0355 14.5402 16.4474 15.4871 15.6058C16.4341 14.7641 17.1524 13.6963 17.575 12.5019\"\r\n stroke=\"#009BF3\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_4082_3122\">\r\n <rect width=\"20\" height=\"20\"\r\n fill=\"white\"\r\n transform=\"translate(0.5)\" />\r\n </clipPath>\r\n </defs>\r\n </svg>Reupload Image</label>\r\n </div> -->\r\n <div *ngIf=\"!question.get('disableRunAI')?.value && getAnswerFormGroup_FormControl(i,j,'multiReferenceImage')?.value.length < 5 && !question.get('disableRunAI')?.value\"\r\n class=\"col-lg-3 btn add-ref-btn btn-light-primary my-2\">\r\n <input class=\"d-none\" [id]=\"'fileuploadrefImage1_'+i+'_'+j\" type=\"file\"\r\n name=\"file\" accept=\"image/png, image/jpeg\"\r\n (change)=\"loadImageFromDevice(i,refImgQIdx,$event,-1,'multiReferenceImage')\" *ngIf=\"(question.get('answerType')?.value !== 'image' || (question.get('answerType')?.value === 'image' && !question.get('runAIDefault')?.value))\">\r\n <label class=\"pointer\" [for]=\"'fileuploadrefImage1_'+i+'_'+j\"\r\n (click)=\"refImgQIdx=j;\"> <svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M10 4.16797V15.8346M4.16669 10.0013H15.8334\"\r\n stroke=\"#009BF3\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg>Add Reference Image </label>\r\n </div>\r\n <div *ngIf=\"getAnswerFormGroup_FormControl(i,j,'multiReferenceImage')?.value.length >= 5 || question.get('disableRunAI')?.value\"\r\n class=\"col-lg-3 btn-light-disbaled btn add-ref-btn my-2 borderCard\">\r\n <label class=\"pointer\"> \r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0013 4.16406V15.8307M4.16797 9.9974H15.8346\" stroke=\"#6BCAFF\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> <span>Add Reference Image</span> \r\n </label>\r\n </div>\r\n <div\r\n class=\"col-lg-4 form-check form-switch mx-2 btn-sec mt-6 text-left align-items-center\">\r\n <input class=\"form-check-input mx-0 pointer\"\r\n type=\"checkbox\" name=\"toc\" value=\"1\"\r\n ngDefaultControl\r\n formControlName=\"allowUploadfromGallery\">\r\n <label class=\"form-check-label pointer\"\r\n for=\"flexSwitchCheckDefault\"></label>\r\n Allow upload from gallery\r\n </div>\r\n <div\r\n [ngClass]=\"(['multipleImage'].includes(question.get('answerType')?.value) && getAnswerFormGroup_FormControl(i,j,'multiReferenceImage')?.value === '') ? 'col-lg-4 mt-6' : ['image','descriptiveImage'].includes(question.get('answerType')?.value) ? 'col-lg-2' : ''\">\r\n <div class=\"d-flex\" *ngIf=\"(['multipleImage'].includes(question.get('answerType')?.value) && getAnswerFormGroup_FormControl(i,j,'multiReferenceImage')?.value === '')\">\r\n <div class=\"form-check\">\r\n <input formControlName=\"descriptivetype\" class=\"form-check-input cursor-pointer\" type=\"radio\" [id]=\"'inlineRadio4' + i + j\"\r\n value=\"text\" [name]=\"'descriptivetype'\" [attr.disabled]=\"question.get('disableRunAI')?.value ? true : null\">\r\n <label class=\"cursor-pointer dscriptiveType\" [for]=\"'inlineRadio4' + i + j\">Text</label>\r\n </div>\r\n <div class=\"form-check ms-5\">\r\n <input formControlName=\"descriptivetype\" class=\"form-check-input cursor-pointer\" type=\"radio\" [id]=\"'inlineRadio5' + i + j\"\r\n value=\"number\" [name]=\"'descriptivetype'\" [attr.disabled]=\"question.get('disableRunAI')?.value ? true : null\">\r\n <label class=\"cursor-pointer dscriptiveType\" [for]=\"'inlineRadio5' + i + j\">Number</label>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"getAnswerFormGroup_FormControl(i,j,'multiReferenceImage')?.value && ['image','multipleImage','descriptiveImage'].includes(question.get('answerType')?.value)\"\r\n [ngClass]=\"question.get('answerType')?.value === 'multipleImage' ? 'col-lg-5 d-flex mt-6' : 'col-lg-3 d-flex justify-content-center align-items-center mt-2'\">\r\n <div class=\"d-flex\" *ngIf=\"question.get('answerType')?.value === 'multipleImage'\">\r\n <div class=\"form-check\">\r\n <input formControlName=\"descriptivetype\" class=\"form-check-input cursor-pointer\" type=\"radio\" [id]=\"'inlineRadio6' + i + j\"\r\n value=\"text\" [name]=\"'descriptivetype'\" [attr.disabled]=\"question.get('disableRunAI')?.value ? true : null\">\r\n <label class=\"cursor-pointer dscriptiveType\" [for]=\"'inlineRadio6' + i + j\">Text</label>\r\n </div>\r\n <div class=\"form-check ms-5\">\r\n <input formControlName=\"descriptivetype\" class=\"form-check-input cursor-pointer\" type=\"radio\" [id]=\"'inlineRadio6' + i + j\"\r\n value=\"number\" [name]=\"'descriptivetype'\" [attr.disabled]=\"question.get('disableRunAI')?.value ? true : null\">\r\n <label class=\"cursor-pointer dscriptiveType\" [for]=\"'inlineRadio6' + i + j\">Number</label>\r\n </div>\r\n </div>\r\n <div class=\"d-flex\" *ngIf=\"userType && userType === 'tango'\">\r\n <h3 class=\"fs16-600 px-12\"> Run AI ✨</h3>\r\n <div class=\"form-check form-switch align-items-center btn-sec ml-5\">\r\n <!-- (click)=\"RunAINew(i,j)\" -->\r\n <input class=\"form-check-input pointer\" type=\"checkbox\"\r\n formControlName=\"runAI\" name=\"toc\" value=\"1\" (click)=\"RunAINew(i,j,-1,$event)\">\r\n <label class=\"form-check-label\"\r\n for=\"flexSwitchCheckDefault\"></label>\r\n </div>\r\n <svg [ngClass]=\"question.get('answerType')?.value === 'multipleImage' ? 'mt-1' : ''\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"16\"\r\n height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n matTooltip=\"Enable AI where you want tango to identify, track and alert instances.\"\r\n matTooltipPosition=\"above\"\r\n matTooltipClass=\"custom-test\">\r\n <g clip-path=\"url(#clip0_2301_100038)\">\r\n <path\r\n d=\"M7.99967 10.6654V7.9987M7.99967 5.33203H8.00634M14.6663 7.9987C14.6663 11.6806 11.6816 14.6654 7.99967 14.6654C4.31778 14.6654 1.33301 11.6806 1.33301 7.9987C1.33301 4.3168 4.31778 1.33203 7.99967 1.33203C11.6816 1.33203 14.6663 4.3168 14.6663 7.9987Z\"\r\n stroke=\"#98A2B3\" stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_2301_100038\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"['image'].includes(question.get('answerType')?.value) && question.get('compliance')?.value\">\r\n <div formGroupName=\"answers\">\r\n <div class=\"row mt-3 dropText\" >\r\n <div class=\"mt-3 col-md-6\">\r\n If the response image is matched, then the score will be\r\n </div>\r\n <div class=\"col-md-3\">\r\n <lib-audit-v2-select class=\"w-150px ms-10\" formControlName=\"matchedCount\" [options]=\"scoreOptions\" [searchable]=\"false\" ariaLabel=\"Matched count\"></lib-audit-v2-select>\r\n </div>\r\n </div>\r\n <div class=\"row mt-3 dropText\" >\r\n <div class=\"mt-3 col-md-6\">\r\n If the response image is not matched, then the score will be\r\n </div>\r\n <div class=\"col-md-3\">\r\n <lib-audit-v2-select class=\"w-150px ms-10\" formControlName=\"notMatchedCount\" [options]=\"scoreOptions\" [searchable]=\"false\" ariaLabel=\"Not matched count\"></lib-audit-v2-select>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n \r\n <!-- Video -->\r\n <ng-container *ngIf=\"question.get('answerType')?.value === 'video'\"\r\n class=\"row\">\r\n <ng-container formGroupName=\"answers\">\r\n <div\r\n class=\" col-lg-4 form-check form-switch text-left align-items-center btn-sec mt-2\">\r\n <input class=\"form-check-input mx-0 pointer\" type=\"checkbox\"\r\n name=\"toc\" value=\"1\" ngDefaultControl\r\n formControlName=\"allowUploadfromGallery\">\r\n <label class=\"form-check-label pointer\"\r\n for=\"flexSwitchCheckDefault\">Allow upload from gallery</label>\r\n \r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- <ng-container *ngIf=\"question.get('answerType')?.value === 'time'\" class=\"row\">\r\n <ng-container formGroupName=\"answers\">\r\n <div class=\" col-lg-4 btn-sec mt-2\">\r\n <input class=\"form-control form-control-solid flatpickr-input w-200px\" type=\"time\" name=\"time\" ngDefaultControl formControlName=\"answer\">\r\n </div>\r\n </ng-container>\r\n </ng-container> -->\r\n\r\n <ng-container *ngIf=\"question.get('answerType')?.value === 'linearscale'\">\r\n <ng-container formGroupName=\"answers\">\r\n <div class=\"row\">\r\n <div class=\"col-md-4\">\r\n <div class=\"dropText\">\r\n Select Type\r\n </div>\r\n <div class=\"mt-2\">\r\n <lib-audit-v2-select class=\"\" formControlName=\"linearType\" [options]=\"linearTypeOptions\" ariaLabel=\"Linear scale type\" (changed)=\"updateNumber($event,i,j)\"></lib-audit-v2-select>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <div class=\"dropText\">\r\n Min Value\r\n </div>\r\n <div class=\"mt-2\">\r\n <lib-audit-v2-counter style=\"width: 40%\" formControlName=\"rangeStart\" [step]=\"1\" placeholder=\"0\" [type]=\"getAnswerFormGroup_FormControl(i,j,'linearType')?.value\"></lib-audit-v2-counter>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4\">\r\n <div class=\"dropText\">\r\n Max Value\r\n </div>\r\n <div class=\"mt-2\">\r\n <lib-audit-v2-counter style=\"width: 40%\" formControlName=\"rangeEnd\" [step]=\"1\" placeholder=\"0\" [type]=\"getAnswerFormGroup_FormControl(i,j,'linearType')?.value\"></lib-audit-v2-counter>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"question.get('answers')?.invalid && question.get('answers')?.touched\">\r\n <div *ngIf=\"question.get('answers')?.hasError('invalidRange')\" class=\"text-danger mt-2\">* Min value must be less than max value.</div>\r\n </ng-container>\r\n <div *ngIf=\"question.get('compliance')?.value\">\r\n <div class=\"row mt-5\" >\r\n <div class=\"col-md-8\">\r\n <div class=\"d-flex align-items-center flex-nowrap\">\r\n <span class=\"dropText me-2\">If the response is between</span>\r\n <div class=\"btn-sec me-2\">\r\n <input class=\"form-control form-control-solid flatpickr-input w-100px\" [attr.type]=\"getAnswerFormGroup_FormControl(i,j,'linearType')?.value === 'degree' ? 'text' : 'number'\" [attr.inputmode]=\"getAnswerFormGroup_FormControl(i,j,'linearType')?.value === 'degree' ? 'text' : 'numeric'\" name=\"start\" ngDefaultControl formControlName=\"minValue\" [min]=\"question.get('answers')?.get('rangeStart')?.value\" [max]=\"question.get('answers')?.get('rangeEnd')?.value\" (input)=\"onRangeValueInput($event, i, j, 'minValue')\" (blur)=\"clampRangeInput(i, j, 'minValue')\" /> \r\n </div>\r\n <span class=\"btn-sec me-2 align-self-center\">to</span>\r\n <div class=\"btn-sec me-2\">\r\n <input class=\"form-control form-control-solid flatpickr-input w-100px\" [attr.type]=\"getAnswerFormGroup_FormControl(i,j,'linearType')?.value === 'degree' ? 'text' : 'number'\" [attr.inputmode]=\"getAnswerFormGroup_FormControl(i,j,'linearType')?.value === 'degree' ? 'text' : 'numeric'\" name=\"start\" ngDefaultControl formControlName=\"maxValue\" [min]=\"question.get('answers')?.get('rangeStart')?.value\" [max]=\"question.get('answers')?.get('rangeEnd')?.value\" (input)=\"onRangeValueInput($event, i, j, 'maxValue')\" (blur)=\"clampRangeInput(i, j, 'maxValue')\">\r\n </div>\r\n <span class=\"dropText ms-1\">, then the score will be</span>\r\n </div>\r\n </div>\r\n <div class=\"col-md-4 text-end\">\r\n <lib-audit-v2-select class=\"w-150px ms-14\" formControlName=\"matchedCount\" [options]=\"scoreOptions\" [searchable]=\"false\" ariaLabel=\"Matched count\"></lib-audit-v2-select>\r\n </div>\r\n </div>\r\n <div class=\"row mt-3\">\r\n <div class=\"dropText mt-5 col-md-8\">\r\n If the response is other than the selected range, then the score will be \r\n </div>\r\n <div class=\"col-md-4 text-end\">\r\n <lib-audit-v2-select class=\"w-150px ms-14\" formControlName=\"notMatchedCount\" [options]=\"scoreOptions\" [searchable]=\"false\" ariaLabel=\"Not matched count\"></lib-audit-v2-select>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"question.get('answerType')?.value === 'date'\">\r\n <ng-container formGroupName=\"answers\">\r\n <div class=\"d-flex answervalidation\">\r\n <input class=\"\" type=\"checkbox\"\r\n style=\"width:16px;height:16px;cursor: pointer;\"\r\n value=\"1\"\r\n formControlName=\"historicDate\">\r\n <div class=\"checkbox mt-1 mx-2\"\r\n style=\"cursor: default;\">\r\n <h3>Allow Historic Dates on Date Picker</h3>\r\n </div>\r\n </div>\r\n <div *ngIf=\"question.get('compliance')?.value\">\r\n <div class=\"d-flex mt-5\">\r\n <div class=\"rangeText\">Select Range from</div>\r\n <div class=\"col-md-3 px-4 pe-3\" id=\"dateclass\"\r\n data-kt-daterangepicker=\"true\" data-kt-daterangepicker-opens=\"left\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <input class=\"fx-date-range form-control ps-14\" type=\"text\"\r\n matInput ngxDaterangepickerMd [singleDatePicker]=\"true\"\r\n [drops]=\"'down'\" [opens]=\"'right'\"\r\n [alwaysShowCalendars]=\"false\"\r\n [keepCalendarOpeningWithRange]=\"true\" [showCancel]=\"true\"\r\n autocomplete=\"off\"\r\n [autoApply]=\"true\"\r\n [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\r\n (datesUpdated)=\"dateRange($event,'start',i,j)\" name=\"daterange\"\r\n [readonly]=\"true\" formControlName=\"qnStartDate\" [showDropdowns]=\"true\"/> \r\n </div>\r\n </div>\r\n <div class=\"rangeText\">To</div>\r\n <div class=\"col-md-3 px-4 pe-3\" id=\"dateclass\"\r\n data-kt-daterangepicker=\"true\" data-kt-daterangepicker-opens=\"left\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon svg-icon-1 position-absolute ms-3\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path\r\n d=\"M13.3333 1.66663V4.99996M6.66667 1.66663V4.99996M2.5 8.33329H17.5M4.16667 3.33329H15.8333C16.7538 3.33329 17.5 4.07948 17.5 4.99996V16.6666C17.5 17.5871 16.7538 18.3333 15.8333 18.3333H4.16667C3.24619 18.3333 2.5 17.5871 2.5 16.6666V4.99996C2.5 4.07948 3.24619 3.33329 4.16667 3.33329Z\"\r\n stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n <input class=\"fx-date-range form-control ps-14\" type=\"text\"\r\n matInput ngxDaterangepickerMd [singleDatePicker]=\"true\"\r\n [drops]=\"'down'\" [opens]=\"'right'\"\r\n [alwaysShowCalendars]=\"false\"\r\n [keepCalendarOpeningWithRange]=\"true\" [showCancel]=\"true\"\r\n autocomplete=\"off\" \r\n [autoApply]=\"true\"\r\n [locale]=\"{ format: 'DD-MM-YYYY', firstDay: 1, monthNames: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] }\"\r\n (datesUpdated)=\"dateRange($event,'end',i,j)\" name=\"daterange\"\r\n [readonly]=\"true\" formControlName=\"qnEndDate\" [showDropdowns]=\"true\"/>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex mt-5 dropText\" >\r\n <div class=\"mt-3\">\r\n If the response date is between the selected range, then the score will be\r\n </div>\r\n <div>\r\n <lib-audit-v2-select class=\"w-150px ms-14\" formControlName=\"matchedCount\" [options]=\"scoreOptions\" [searchable]=\"false\" ariaLabel=\"Matched count\"></lib-audit-v2-select>\r\n </div>\r\n </div>\r\n <div class=\"d-flex mt-3 dropText\" >\r\n <div class=\"mt-3\">\r\n If the response date is other than the selected range, then the score will be\r\n </div>\r\n <div>\r\n <lib-audit-v2-select class=\"w-150px ms-10\" formControlName=\"notMatchedCount\" [options]=\"scoreOptions\" [searchable]=\"false\" ariaLabel=\"Not matched count\"></lib-audit-v2-select>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"question.get('answerType')?.value === 'image/video'\"\r\n class=\"row\">\r\n <ng-container formGroupName=\"answers\">\r\n <div *ngFor=\"let image of getAnswerFormGroup_FormControl(i,j,'multiReferenceImage')?.value;let n=index\"\r\n class=\"col-md-4 image-container ref_img_cont ref_img_cont mb-4\">\r\n <img src=\"{{environment.TraxAnswerCDN}}{{image.imageURL}}\"\r\n width=\"90%\" height=\"300px\" class=\"auto-adjust\"\r\n alt=\"Tango Eye\" />\r\n <div class=\"overlay-icons\">\r\n <span class=\"cursor-pointer\" (click)=\"onPopup(image.imageURL)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_iv_zoom)\">\r\n <rect x=\"2\" y=\"1\" width=\"36\" height=\"36\" rx=\"8\" fill=\"white\"/>\r\n <rect x=\"2.5\" y=\"1.5\" width=\"35\" height=\"35\" rx=\"7.5\" stroke=\"#D0D5DD\"/>\r\n <path d=\"M22.5 11.5H27.5M27.5 11.5V16.5M27.5 11.5L21.6667 17.3333M17.5 26.5H12.5M12.5 26.5V21.5M12.5 26.5L18.3333 20.6667\" stroke=\"#344054\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_iv_zoom\" x=\"0\" y=\"0\" width=\"40\" height=\"40\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\r\n <feOffset dy=\"1\"/>\r\n <feGaussianBlur stdDeviation=\"1\"/>\r\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\"/>\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_iv_zoom\"/>\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_iv_zoom\" result=\"shape\"/>\r\n </filter>\r\n </defs>\r\n </svg>\r\n </span>\r\n <span class=\"cursor-pointer\">\r\n <input class=\"d-none\" [id]=\"'fileuploadIV_'+i+j+n\" type=\"file\"\r\n name=\"file\" accept=\"image/png, image/jpeg\"\r\n (click)=\"question.get('disableRunAI')?.value ? $event.preventDefault() : null\"\r\n (change)=\"question.get('disableRunAI')?.value ? '' : loadImageFromDevice(i,refImgQIdx,$event,-1,'multiReferenceImage',n)\">\r\n <label [for]=\"'fileuploadIV_'+i+j+n\" (click)=\"refImgQIdx=j;\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_iv_upload)\">\r\n <rect x=\"2\" y=\"1\" width=\"36\" height=\"36\" rx=\"8\" fill=\"white\"/>\r\n <rect x=\"2.5\" y=\"1.5\" width=\"35\" height=\"35\" rx=\"7.5\" stroke=\"#D0D5DD\"/>\r\n <path d=\"M27.5 21.5V24.8333C27.5 25.2754 27.3244 25.6993 27.0118 26.0118C26.6993 26.3244 26.2754 26.5 25.8333 26.5H14.1667C13.7246 26.5 13.3007 26.3244 12.9882 26.0118C12.6756 25.6993 12.5 25.2754 12.5 24.8333V21.5M24.1667 15.6667L20 11.5M20 11.5L15.8333 15.6667M20 11.5V21.5\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_iv_upload\" x=\"0\" y=\"0\" width=\"40\" height=\"40\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\r\n <feOffset dy=\"1\"/>\r\n <feGaussianBlur stdDeviation=\"1\"/>\r\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\"/>\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_iv_upload\"/>\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_iv_upload\" result=\"shape\"/>\r\n </filter>\r\n </defs>\r\n </svg>\r\n </label>\r\n </span>\r\n <span class=\"cursor-pointer\" (click)=\"question.get('disableRunAI')?.value ? '' : clearReferenceImage(i,j,-1,n,'multiReferenceImage');\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" fill=\"none\">\r\n <g filter=\"url(#filter0_d_iv_del)\">\r\n <rect x=\"2\" y=\"1\" width=\"36\" height=\"36\" rx=\"8\" fill=\"white\"/>\r\n <rect x=\"2.5\" y=\"1.5\" width=\"35\" height=\"35\" rx=\"7.5\" stroke=\"#D0D5DD\"/>\r\n <path d=\"M12.5 13.9974H14.1667M14.1667 13.9974H27.5M14.1667 13.9974V25.6641C14.1667 26.1061 14.3423 26.53 14.6548 26.8426C14.9674 27.1551 15.3913 27.3307 15.8333 27.3307H24.1667C24.6087 27.3307 25.0326 27.1551 25.3452 26.8426C25.6577 26.53 25.8333 26.1061 25.8333 25.6641V13.9974H14.1667ZM16.6667 13.9974V12.3307C16.6667 11.8887 16.8423 11.4648 17.1548 11.1522C17.4674 10.8397 17.8913 10.6641 18.3333 10.6641H21.6667C22.1087 10.6641 22.5326 10.8397 22.8452 11.1522C23.1577 11.4648 23.3333 11.8887 23.3333 12.3307V13.9974M18.3333 18.1641V23.1641M21.6667 18.1641V23.1641\" stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </g>\r\n <defs>\r\n <filter id=\"filter0_d_iv_del\" x=\"0\" y=\"0\" width=\"40\" height=\"40\" filterUnits=\"userSpaceOnUse\" color-interpolation-filters=\"sRGB\">\r\n <feFlood flood-opacity=\"0\" result=\"BackgroundImageFix\"/>\r\n <feColorMatrix in=\"SourceAlpha\" type=\"matrix\" values=\"0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0\" result=\"hardAlpha\"/>\r\n <feOffset dy=\"1\"/>\r\n <feGaussianBlur stdDeviation=\"1\"/>\r\n <feColorMatrix type=\"matrix\" values=\"0 0 0 0 0.0627451 0 0 0 0 0.0941176 0 0 0 0 0.156863 0 0 0 0.05 0\"/>\r\n <feBlend mode=\"normal\" in2=\"BackgroundImageFix\" result=\"effect1_dropShadow_iv_del\"/>\r\n <feBlend mode=\"normal\" in=\"SourceGraphic\" in2=\"effect1_dropShadow_iv_del\" result=\"shape\"/>\r\n </filter>\r\n </defs>\r\n </svg>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"d-flex mb-3\">\r\n <div *ngIf=\"!question.get('disableRunAI')?.value && getAnswerFormGroup_FormControl(i,j,'multiReferenceImage')?.value.length < 5 && !question.get('disableRunAI')?.value\"\r\n class=\"col-lg-3 btn add-ref-btn btn-light-primary my-2\">\r\n <input class=\"d-none\" [id]=\"'fileuploadrefImageIV'+i+j\" type=\"file\"\r\n name=\"file\" accept=\"image/png, image/jpeg\"\r\n (change)=\"loadImageFromDevice(i,refImgQIdx,$event,-1,'multiReferenceImage')\">\r\n <label class=\"pointer\" [for]=\"'fileuploadrefImageIV'+i+j\" (click)=\"refImgQIdx=j;\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10 4.16797V15.8346M4.16669 10.0013H15.8334\" stroke=\"#009BF3\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>Add Reference Image </label>\r\n </div>\r\n <div *ngIf=\"getAnswerFormGroup_FormControl(i,j,'multiReferenceImage')?.value.length >= 5 || question.get('disableRunAI')?.value\"\r\n class=\"col-lg-3 btn-light-disbaled btn add-ref-btn my-2 borderCard\">\r\n <label class=\"pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10.0013 4.16406V15.8307M4.16797 9.9974H15.8346\" stroke=\"#6BCAFF\" stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg> <span>Add Reference Image</span>\r\n </label>\r\n </div>\r\n <div class=\"col-lg-4 form-check form-switch mx-2 btn-sec mt-6 text-left align-items-center\">\r\n <input class=\"form-check-input mx-0 pointer\" type=\"checkbox\" name=\"toc\" value=\"1\"\r\n ngDefaultControl formControlName=\"allowUploadfromGallery\">\r\n <label class=\"form-check-label pointer\" for=\"flexSwitchCheckDefault\"></label>\r\n Allow upload from gallery\r\n </div>\r\n <div class=\"col-lg-2\"></div>\r\n <div *ngIf=\"getAnswerFormGroup_FormControl(i,j,'multiReferenceImage')?.value && question.get('answerType')?.value === 'image/video'\"\r\n [ngClass]=\"'col-lg-3 d-flex justify-content-center align-items-center mt-2'\">\r\n <div class=\"d-flex\" *ngIf=\"userType && userType === 'tango'\">\r\n <h3 class=\"fs16-600 px-12\"> Run AI ✨</h3>\r\n <div class=\"form-check form-switch align-items-center btn-sec ml-5\">\r\n <!-- (click)=\"RunAINew(i,j)\" -->\r\n <input class=\"form-check-input pointer\" type=\"checkbox\"\r\n formControlName=\"runAI\" name=\"toc\" value=\"1\" (click)=\"RunAINew(i,j,-1,$event)\">\r\n <label class=\"form-check-label\"\r\n for=\"flexSwitchCheckDefault\"></label>\r\n </div>\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\"\r\n height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\"\r\n matTooltip=\"Enable AI where you want tango to identify, track and alert instances.\"\r\n matTooltipPosition=\"above\"\r\n matTooltipClass=\"custom-test\">\r\n <g clip-path=\"url(#clip0_iv_runai_info)\">\r\n <path\r\n d=\"M7.99967 10.6654V7.9987M7.99967 5.33203H8.00634M14.6663 7.9987C14.6663 11.6806 11.6816 14.6654 7.99967 14.6654C4.31778 14.6654 1.33301 11.6806 1.33301 7.9987C1.33301 4.3168 4.31778 1.33203 7.99967 1.33203C11.6816 1.33203 14.6663 4.3168 14.6663 7.9987Z\"\r\n stroke=\"#98A2B3\" stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_iv_runai_info\">\r\n <rect width=\"16\" height=\"16\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n </div>\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"question.get('compliance')?.value\">\r\n <span class=\"limitComplianceText\">Compliance score is applicable only for image outputs, not for video.</span>\r\n <div class=\"row mt-3 dropText\">\r\n <div class=\"mt-3 col-md-6\">\r\n If the response image is matched, then the score will be\r\n </div>\r\n <div class=\"col-md-3\">\r\n <lib-audit-v2-select class=\"w-150px ms-10\" formControlName=\"matchedCount\" [options]=\"scoreOptions\" [searchable]=\"false\" ariaLabel=\"Matched count\"></lib-audit-v2-select>\r\n </div>\r\n </div>\r\n <div class=\"row mt-3 dropText\">\r\n <div class=\"mt-3 col-md-6\">\r\n If the response image is not matched, then the score will be\r\n </div>\r\n <div class=\"col-md-3\">\r\n <lib-audit-v2-select class=\"w-150px ms-10\" formControlName=\"notMatchedCount\" [options]=\"scoreOptions\" [searchable]=\"false\" ariaLabel=\"Not matched count\"></lib-audit-v2-select>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div\r\n class=\" col-lg-4 form-check form-switch text-left align-items-center btn-sec mt-5\" *ngIf=\"userType && userType === 'tango'\">\r\n <input class=\"form-check-input mx-0 pointer\" type=\"checkbox\"\r\n name=\"toc\" value=\"1\" ngDefaultControl\r\n formControlName=\"limit\" (change)=\"updateLimit($event,i,j)\">\r\n <label class=\"form-check-label pointer\"\r\n for=\"flexSwitchCheckDefault\">Set Limits </label>\r\n <svg ngbTooltip=\"Uploads are allowed as per the configured image/video limits\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" matTooltip=\"Enable AI where you want tango to identify, track and alert instances.\" matTooltipPosition=\"above\" matTooltipClass=\"custom-test\" ng-reflect-ng-class=\"\"><g clip-path=\"url(#clip0_2301_100038)\"><path d=\"M7.99967 10.6654V7.9987M7.99967 5.33203H8.00634M14.6663 7.9987C14.6663 11.6806 11.6816 14.6654 7.99967 14.6654C4.31778 14.6654 1.33301 11.6806 1.33301 7.9987C1.33301 4.3168 4.31778 1.33203 7.99967 1.33203C11.6816 1.33203 14.6663 4.3168 14.6663 7.9987Z\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path></g><defs><clipPath id=\"clip0_2301_100038\"><rect width=\"16\" height=\"16\" fill=\"white\"></rect></clipPath></defs></svg>\r\n \r\n </div>\r\n <div\r\n class=\" col-lg-12 form-check form-switch text-left align-items-center btn-sec mt-5\" *ngIf=\"getAnswerFormGroup_FormControl(i,j,'limit')?.value\">\r\n <div class=\"d-flex\">\r\n <div class=\"me-3 mt-3\">Attach</div>\r\n <div class=\"w-70px me-3\">\r\n <lib-audit-v2-select class=\"\" formControlName=\"imageLimit\" [options]=\"limitOptions\" placeholder=\"-\" ariaLabel=\"Image limit\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"me-3 mt-3\">images and</div>\r\n <div class=\"w-70px me-3\">\r\n <lib-audit-v2-select class=\"\" formControlName=\"videoLimit\" [options]=\"limitOptions\" placeholder=\"-\" ariaLabel=\"Video limit\"></lib-audit-v2-select>\r\n </div>\r\n <div class=\"me-3 mt-3\">\r\n Videos.\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"limitTooltipText mt-3\" *ngIf=\"getAnswerFormGroup_FormControl(i,j,'limit')?.value && (getAnswerFormGroup_FormControl(i,j,'imageLimit')?.value || getAnswerFormGroup_FormControl(i,j,'videoLimit')?.value)\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" matTooltip=\"Enable AI where you want tango to identify, track and alert instances.\" matTooltipPosition=\"above\" matTooltipClass=\"custom-test\" ng-reflect-ng-class=\"\"><g clip-path=\"url(#clip0_2301_100038)\"><path d=\"M7.99967 10.6654V7.9987M7.99967 5.33203H8.00634M14.6663 7.9987C14.6663 11.6806 11.6816 14.6654 7.99967 14.6654C4.31778 14.6654 1.33301 11.6806 1.33301 7.9987C1.33301 4.3168 4.31778 1.33203 7.99967 1.33203C11.6816 1.33203 14.6663 4.3168 14.6663 7.9987Z\" stroke=\"#98A2B3\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path></g><defs><clipPath id=\"clip0_2301_100038\"><rect width=\"16\" height=\"16\" fill=\"white\"></rect></clipPath></defs></svg>\r\n Checklist fillers must capture/upload {{ getAnswerFormGroup_FormControl(i,j,'imageLimit')?.value ? getAnswerFormGroup_FormControl(i,j,'imageLimit')?.value + ' image' + (getAnswerFormGroup_FormControl(i,j,'imageLimit')?.value > 1 ? 's' : '') : '' }} {{ getAnswerFormGroup_FormControl(i,j,'videoLimit')?.value ? ' and ' + getAnswerFormGroup_FormControl(i,j,'videoLimit')?.value + ' video' + (getAnswerFormGroup_FormControl(i,j,'videoLimit')?.value > 1 ? 's' : '') : '' }}\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n \r\n <div class=\"d-flex justify-content-end py-2\">\r\n <div class=\"pt-1\" >\r\n <svg (click)=\"question.get('disableRunAI')?.value ? '' : cloneQuestion(i,j)\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n matTooltip=\"Duplicate\" matTooltipPosition=\"above\"\r\n matTooltipClass=\"custom-test\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <g clip-path=\"url(#clip0_3385_10578)\">\r\n <path\r\n d=\"M4.16663 12.4993H3.33329C2.89127 12.4993 2.46734 12.3238 2.15478 12.0112C1.84222 11.6986 1.66663 11.2747 1.66663 10.8327V3.33268C1.66663 2.89065 1.84222 2.46673 2.15478 2.15417C2.46734 1.84161 2.89127 1.66602 3.33329 1.66602H10.8333C11.2753 1.66602 11.6992 1.84161 12.0118 2.15417C12.3244 2.46673 12.5 2.89065 12.5 3.33268V4.16602M9.16663 7.49935H16.6666C17.5871 7.49935 18.3333 8.24554 18.3333 9.16602V16.666C18.3333 17.5865 17.5871 18.3327 16.6666 18.3327H9.16663C8.24615 18.3327 7.49996 17.5865 7.49996 16.666V9.16602C7.49996 8.24554 8.24615 7.49935 9.16663 7.49935Z\"\r\n [attr.stroke]=\"question.get('disableRunAI')?.value ? '#D0D5DD' : '#667085'\" stroke-width=\"1.66667\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </g>\r\n <defs>\r\n <clipPath id=\"clip0_3385_10578\">\r\n <rect width=\"20\" height=\"20\" fill=\"white\" />\r\n </clipPath>\r\n </defs>\r\n </svg>\r\n <svg (click)=\"question.get('disableRunAI')?.value ? '' : deleteQuestion(i,j)\"\r\n style=\"margin-left: 24px !important;\"\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n matTooltip=\"Delete question\" matTooltipPosition=\"above\"\r\n matTooltipClass=\"custom-test\" viewBox=\"0 0 20 20\"\r\n fill=\"none\" [ngbTooltip]=\"question.get('disableRunAI')?.value ? 'The delete option is disabled as the runAI is enabled' : ''\">\r\n <path\r\n d=\"M2.5 4.99935H4.16667M4.16667 4.99935H17.5M4.16667 4.99935V16.666C4.16667 17.108 4.34226 17.532 4.65482 17.8445C4.96738 18.1571 5.39131 18.3327 5.83333 18.3327H14.1667C14.6087 18.3327 15.0326 18.1571 15.3452 17.8445C15.6577 17.532 15.8333 17.108 15.8333 16.666V4.99935H4.16667ZM6.66667 4.99935V3.33268C6.66667 2.89065 6.84226 2.46673 7.15482 2.15417C7.46738 1.84161 7.89131 1.66602 8.33333 1.66602H11.6667C12.1087 1.66602 12.5326 1.84161 12.8452 2.15417C13.1577 2.46673 13.3333 2.89065 13.3333 3.33268V4.99935M8.33333 9.16602V14.166M11.6667 9.16602V14.166\"\r\n [attr.stroke]=\"question.get('disableRunAI')?.value ? '#D0D5DD' : '#667085'\" stroke-width=\"1.66667\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n <div>\r\n <div class=\"row mx-0\">\r\n <!-- Audit bulk upload (AuditV2BulkUploadComponent saves to the audit APIs) -->\r\n <div class=\"col-lg-4 px-0\" *ngIf=\"showvalue === 'edit' && access.canEdit && ChecklistForm.get('sections')\">\r\n <div class=\"checklist-card py-7 text-center\">\r\n <div (click)=\"bulkUploadQuestion()\" class=\"mt-2 btn-sec pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M9.99999 4.16602V15.8327M4.16666 9.99935H15.8333\" stroke=\"#344054\"\r\n stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>Bulk Upload Questions</div>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-4 pl-5\" *ngIf=\"ChecklistForm.get('sections')\">\r\n <div class=\"checklist-card py-7 text-center\">\r\n <div (click)=\"addNewQuestion(sectionIndex)\" class=\"mt-2 btn-sec pointer\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M9.99999 4.16602V15.8327M4.16666 9.99935H15.8333\" stroke=\"#344054\"\r\n stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg> Add New Question</div>\r\n </div>\r\n </div>\r\n <div class=\"col-lg-4 pl-5\">\r\n <div class=\"checklist-card py-7 text-center\">\r\n <div (click)=\"addNewSection()\" class=\"mt-2 px-0 btn-sec pointer\"> <svg\r\n xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\"\r\n viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M9.99999 4.16602V15.8327M4.16666 9.99935H15.8333\" stroke=\"#344054\"\r\n stroke-width=\"1.67\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg> Add New Section</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- \"+ Question description\" button (qdescription); hidden once the description input is open -->\r\n<ng-template #qdescriptionButton let-question let-i=\"i\" let-j=\"j\">\r\n <div *ngIf=\"showQdescription && !isQdescriptionOpen(question)\" class=\"btn add-ref-btn btn-light-primary qdescription-btn my-2\"\r\n (click)=\"openQdescription(question, i, j)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M10 4.16797V15.8346M4.16669 10.0013H15.8334\" stroke=\"#009BF3\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>Question description\r\n </div>\r\n</ng-template>","import { ChangeDetectorRef, Component, HostListener, OnDestroy, OnInit } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { Subject, debounceTime, takeUntil } from 'rxjs';\r\nimport { GlobalStateService } from 'tango-app-ui-global';\r\nimport { ToastService } from 'tango-app-ui-shared';\r\nimport dayjs from 'dayjs';\r\nimport { TraxService } from '../../../services/trax.service';\r\nimport { AuditAccess, auditAccess } from '../audit-v2-access';\r\n\r\n/**\r\n * Dashboard detail pages for one audit (?checklistId=), store (?store=<storeId>) or auditor (?email=):\r\n * the prototype's \"Dashboard — audit / store / user detail\" screens. One component, the mode comes from the\r\n * route's data.by. Everything is read from POST /trax/audit/dashboard/detail in the header's date range.\r\n */\r\nexport type DetailBy = 'audit' | 'store' | 'user';\r\nexport type VisitStatus = 'submit' | 'inprogress' | 'open';\r\n\r\nexport interface DetailRow {\r\n id: string;\r\n date: string;\r\n checklistId: string;\r\n checkListName: string;\r\n checkListType: string;\r\n storeId: string;\r\n storeName: string;\r\n userName: string;\r\n userEmail: string;\r\n status: VisitStatus;\r\n redo: boolean;\r\n submittedOn: string | null;\r\n submissionCount: number;\r\n flags: number;\r\n approvedBy: string;\r\n approvedOn: string | null;\r\n}\r\n\r\nexport interface DetailCards {\r\n visits: number;\r\n submitted: number;\r\n open: number;\r\n inprogress: number;\r\n notSubmitted: number;\r\n activeAudits: number;\r\n flags: number;\r\n completion: number | null;\r\n compliance: number | null;\r\n}\r\n\r\n/** One KPI: value text and its change vs the previous period (higherIsBad flips the colour, e.g. flags). */\r\nexport interface DetailKpi {\r\n label: string;\r\n value: string;\r\n delta: number | null;\r\n points: boolean;\r\n higherIsBad: boolean;\r\n}\r\n\r\nexport interface CalendarDay {\r\n date: string;\r\n day: number;\r\n visits: number;\r\n submitted: number;\r\n score: number | null;\r\n status: 'track' | 'risk' | 'missed' | 'none';\r\n}\r\n\r\nconst EMPTY_CARDS: DetailCards = {\r\n visits: 0, submitted: 0, open: 0, inprogress: 0, notSubmitted: 0, activeAudits: 0, flags: 0, completion: null, compliance: null\r\n};\r\n\r\n@Component({\r\n selector: 'lib-audit-v2-detail',\r\n templateUrl: './audit-v2-detail.component.html',\r\n styleUrl: './audit-v2-detail.component.scss'\r\n})\r\nexport class AuditV2DetailComponent implements OnInit, OnDestroy {\r\n by: DetailBy = 'store';\r\n /** checklistId, storeId or auditor email, from the query string. */\r\n subjectId = '';\r\n info: any = null;\r\n\r\n loading = true;\r\n rowsLoading = true;\r\n exporting = false;\r\n period = '';\r\n vsLabel = 'vs last day';\r\n /** Shown instead of a change when the previous period had nothing to compare with (the API sends null). */\r\n noPrevLabel = 'No data for the previous day';\r\n\r\n cards: DetailCards = { ...EMPTY_CARDS };\r\n deltas: Record<string, number | null> = {};\r\n\r\n rows: DetailRow[] = [];\r\n totalCount = 0;\r\n page = 1;\r\n pageSize = 10;\r\n readonly paginationSizes = [10, 20, 30];\r\n\r\n /** 'redo' = visits sent back for a redo (any status); the others filter by the visit's status (no Disputed filter, QA 10 Oct). */\r\n status: 'all' | 'redo' | VisitStatus = 'all';\r\n readonly statusOptions: Array<{ value: 'all' | 'redo' | VisitStatus; label: string }> = [\r\n { value: 'all', label: 'All' },\r\n { value: 'submit', label: 'Submitted' },\r\n { value: 'inprogress', label: 'In Progress' },\r\n { value: 'open', label: 'Open' },\r\n { value: 'redo', label: 'Redo' }\r\n ];\r\n search = '';\r\n\r\n /** Month shown in the Monthly Performance calendar (YYYY-MM); empty = the month of the period end. */\r\n month = '';\r\n calendarDays: CalendarDay[] = [];\r\n calendarLead: number[] = [];\r\n readonly weekdays = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];\r\n\r\n /** Audit page: the client's audits for the name switcher (prototype: name chip with a chevron). */\r\n auditOptions: Array<{ id: string; name: string; publish: boolean }> = [];\r\n /** Custom switcher menu: open state and its search text. */\r\n switchOpen = false;\r\n switchQuery = '';\r\n /** Send Alert needs the Checklist edit permission (POST /trax/audit/alert checks it too). */\r\n access: AuditAccess = { canAdd: false, canEdit: false };\r\n /** Visits ticked for Send Alert (only not-submitted ones can be ticked). */\r\n alertIds = new Set<string>();\r\n alerting = false;\r\n\r\n private headerData: any;\r\n /** Period passed by the Dashboard link (from / to): the days of the row clicked; empty = the header range. */\r\n private linkFrom = '';\r\n private linkTo = '';\r\n private readonly userEmailes: string[] = JSON.parse(localStorage.getItem('usersEmail-info') || '[]');\r\n private readonly search$ = new Subject<void>();\r\n private readonly destroy$ = new Subject<void>();\r\n\r\n constructor(\r\n private route: ActivatedRoute,\r\n private router: Router,\r\n private traxService: TraxService,\r\n private gs: GlobalStateService,\r\n private toast: ToastService,\r\n private cd: ChangeDetectorRef\r\n ) { }\r\n\r\n ngOnInit(): void {\r\n auditAccess(this.gs).pipe(takeUntil(this.destroy$)).subscribe(access => { this.access = access; this.cd.detectChanges(); });\r\n this.by = (this.route.snapshot.data['by'] as DetailBy) || 'store';\r\n const q = this.route.snapshot.queryParamMap;\r\n this.subjectId = (this.by === 'audit' ? q.get('checklistId') : (this.by === 'store' ? q.get('store') : q.get('email'))) || '';\r\n if (q.get('from') && q.get('to')) {\r\n this.linkFrom = String(q.get('from'));\r\n this.linkTo = String(q.get('to'));\r\n }\r\n // Dashboard Submitted count opens the table on that status (?status=submit).\r\n const linked = this.statusOptions.find(o => o.value === q.get('status'));\r\n if (linked) { this.status = linked.value; }\r\n\r\n this.search$.pipe(debounceTime(400), takeUntil(this.destroy$)).subscribe(() => {\r\n this.page = 1;\r\n this.load();\r\n });\r\n // The page opens on the period of the link (the Dashboard's), then follows the portal header's date picker\r\n // as soon as it changes there (QA 10 Oct: the header picker did nothing on this page).\r\n let firstHeader = true;\r\n this.gs.dataRangeValue\r\n .pipe(takeUntil(this.destroy$), debounceTime(300))\r\n .subscribe((data: any) => {\r\n if (!data?.client) { return; }\r\n const clientChanged = this.headerData?.client !== data.client;\r\n if (!firstHeader) { this.linkFrom = ''; this.linkTo = ''; }\r\n firstHeader = false;\r\n this.headerData = data;\r\n this.period = 'Based on ' + this.fmtDay(this.fromDate) + ' - ' + this.fmtDay(this.toDate);\r\n this.month = '';\r\n this.page = 1;\r\n this.loading = true;\r\n if (clientChanged && this.by === 'audit') { this.loadAuditOptions(); }\r\n this.load();\r\n });\r\n }\r\n\r\n /** The audits of the client (POST /trax/audit/list), for the name switcher. */\r\n private loadAuditOptions(): void {\r\n this.traxService.auditList({\r\n clientId: this.headerData?.client, fromDate: this.fromDate, toDate: this.toDate,\r\n limit: 500, offset: 1, search: ''\r\n }).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (res: any) => {\r\n this.auditOptions = (res?.code === 200 ? res.data?.result || [] : [])\r\n .map((a: any) => ({ id: String(a._id), name: a.checkListName || '—', publish: !!a.publish }))\r\n .sort((a: { name: string }, b: { name: string }) => a.name.localeCompare(b.name));\r\n this.cd.detectChanges();\r\n },\r\n error: () => { this.auditOptions = []; }\r\n });\r\n }\r\n\r\n // ---- Send Alert ----\r\n\r\n /** Rows of this page that can be alerted (not submitted yet). */\r\n get alertableRows(): DetailRow[] {\r\n return this.rows.filter(r => r.status !== 'submit');\r\n }\r\n\r\n get allAlertable(): boolean {\r\n const rows = this.alertableRows;\r\n return rows.length > 0 && rows.every(r => this.alertIds.has(r.id));\r\n }\r\n\r\n get someAlertable(): boolean {\r\n return this.alertIds.size > 0 && !this.allAlertable;\r\n }\r\n\r\n toggleAlert(row: DetailRow): void {\r\n if (row.status === 'submit') { return; }\r\n const next = new Set(this.alertIds);\r\n next.has(row.id) ? next.delete(row.id) : next.add(row.id);\r\n this.alertIds = next;\r\n }\r\n\r\n toggleAllAlert(): void {\r\n this.alertIds = this.allAlertable ? new Set<string>() : new Set(this.alertableRows.map(r => r.id));\r\n }\r\n\r\n /** Reminder email to the auditors of the ticked visits (POST /trax/audit/alert); one email per auditor. */\r\n sendAlert(): void {\r\n if (!this.alertIds.size || this.alerting || this.by !== 'audit' || !this.access.canEdit) { return; }\r\n this.alerting = true;\r\n this.traxService.auditAlert({ clientId: this.headerData?.client, checklistId: this.subjectId, visitIds: [...this.alertIds] })\r\n .pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (res: any) => {\r\n this.alerting = false;\r\n if (res?.code === 200) {\r\n const n = Number(res.data?.emails) || 0;\r\n const v = Number(res.data?.visits) || 0;\r\n this.toast.getSuccessToast('Reminder sent to ' + n + (n === 1 ? ' auditor' : ' auditors') + ' for ' + v + (v === 1 ? ' visit' : ' visits'));\r\n this.alertIds = new Set<string>();\r\n } else {\r\n this.toast.getErrorToast('Could not send the alert');\r\n }\r\n this.cd.detectChanges();\r\n },\r\n error: (e: any) => {\r\n this.alerting = false;\r\n this.toast.getErrorToast(e?.error?.error?.message || e?.error?.message || 'Could not send the alert');\r\n this.cd.detectChanges();\r\n }\r\n });\r\n }\r\n\r\n get switchFiltered(): Array<{ id: string; name: string; publish: boolean }> {\r\n const q = this.switchQuery.trim().toLowerCase();\r\n return q ? this.auditOptions.filter(a => a.name.toLowerCase().includes(q)) : this.auditOptions;\r\n }\r\n\r\n toggleSwitch(): void {\r\n this.switchOpen = !this.switchOpen;\r\n this.switchQuery = '';\r\n }\r\n\r\n @HostListener('document:keydown.escape')\r\n closeSwitch(): void {\r\n this.switchOpen = false;\r\n }\r\n\r\n /** Switch to another audit: same page and period, the URL follows so a refresh keeps it. */\r\n switchAudit(id: string): void {\r\n this.switchOpen = false;\r\n if (!id || id === this.subjectId) { return; }\r\n this.subjectId = id;\r\n this.router.navigate([], { relativeTo: this.route, queryParams: { checklistId: id }, queryParamsHandling: 'merge', replaceUrl: true });\r\n this.month = '';\r\n this.page = 1;\r\n this.loading = true;\r\n this.load();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n /** ---- Data ---- */\r\n\r\n /** The period shown: the Dashboard link's from / to when it passed them, else the header range. */\r\n get fromDate(): string {\r\n return this.linkFrom || this.headerData?.date?.startDate || '';\r\n }\r\n\r\n get toDate(): string {\r\n return this.linkTo || this.headerData?.date?.endDate || '';\r\n }\r\n\r\n /** Store / user links in the table keep this page's period. */\r\n detailParams(subject: Record<string, any>): Record<string, any> {\r\n return { ...subject, from: this.fromDate, to: this.toDate };\r\n }\r\n\r\n private payload(extra: Record<string, any> = {}): Record<string, any> {\r\n const subject = this.by === 'audit' ? { checklistId: this.subjectId }\r\n : (this.by === 'store' ? { store: this.subjectId } : { userEmail: this.subjectId });\r\n return {\r\n clientId: this.headerData?.client,\r\n fromDate: this.fromDate,\r\n toDate: this.toDate,\r\n storeId: (this.headerData?.stores || []).filter((s: any) => s.checked).map((s: any) => s.storeId),\r\n userEmailes: this.userEmailes,\r\n by: this.by,\r\n ...subject,\r\n ...(this.month ? { month: this.month } : {}),\r\n status: this.status,\r\n searchValue: this.search.trim(),\r\n limit: this.pageSize,\r\n offset: this.page,\r\n // Sent only once a column is picked, so an API without sorting still serves newest first.\r\n ...(this.sortColumn ? { sortColumn: this.sortColumn, sortBy: this.sortBy } : {}),\r\n ...extra\r\n };\r\n }\r\n\r\n private load(): void {\r\n if (!this.headerData) { return; }\r\n if (!this.subjectId) {\r\n this.loading = false;\r\n this.rowsLoading = false;\r\n return;\r\n }\r\n this.rowsLoading = true;\r\n this.traxService.auditDashboardDetail(this.payload()).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (res: any) => this.apply(res?.code === 200 ? res.data : null),\r\n error: (e: any) => {\r\n this.apply(null);\r\n this.toast.getErrorToast(e?.error?.error?.message || e?.error?.error || 'Unable to load the details');\r\n }\r\n });\r\n }\r\n\r\n private apply(d: any): void {\r\n this.info = d?.info || this.info;\r\n this.cards = { ...EMPTY_CARDS, ...(d?.cards || {}) };\r\n this.deltas = d?.deltas || {};\r\n const days = Number(d?.period?.previous?.days) || 1;\r\n this.vsLabel = days === 1 ? 'vs last day' : `vs previous ${days} days`;\r\n this.noPrevLabel = days === 1 ? 'No data for the previous day' : `No data in the previous ${days} days`;\r\n this.rows = d?.rows || [];\r\n this.alertIds = new Set<string>();\r\n this.totalCount = Number(d?.totalCount) || 0;\r\n if (d?.calendar) {\r\n this.month = d.calendar.month;\r\n this.calendarLead = Array.from({ length: Number(d.calendar.firstWeekday) || 0 }, (_, i) => i);\r\n this.calendarDays = d.calendar.days || [];\r\n }\r\n this.loading = false;\r\n this.rowsLoading = false;\r\n this.cd.detectChanges();\r\n }\r\n\r\n /** ---- Header ---- */\r\n\r\n get title(): string {\r\n if (this.by === 'audit') { return this.info?.name || 'Audit'; }\r\n if (this.by === 'store') { return this.info?.name ? `${this.info.name} (${this.subjectId})` : this.subjectId; }\r\n return this.info?.name || this.subjectId;\r\n }\r\n\r\n get initials(): string {\r\n return (this.info?.name || this.subjectId || '').replace(/[^A-Za-z]/g, '').slice(0, 2).toUpperCase();\r\n }\r\n\r\n /** ---- Cards ---- */\r\n\r\n private pct(v: number | null): string {\r\n return v === null || v === undefined ? '—' : v + '%';\r\n }\r\n\r\n /** Audit / user pages: the three count cards above the calendar. */\r\n get countKpis(): DetailKpi[] {\r\n return [\r\n { label: 'Total Audits', value: String(this.cards.visits), delta: this.deltas['visits'] ?? null, points: false, higherIsBad: false },\r\n { label: 'Completed Audits', value: String(this.cards.submitted), delta: this.deltas['submitted'] ?? null, points: false, higherIsBad: false },\r\n { label: 'Flags', value: String(this.cards.flags), delta: this.deltas['flags'] ?? null, points: false, higherIsBad: true }\r\n ];\r\n }\r\n\r\n /** Audit / user pages: the score cards beside the calendar. */\r\n get scoreKpis(): DetailKpi[] {\r\n return [\r\n { label: 'Completion Score', value: this.pct(this.cards.completion), delta: this.deltas['completion'] ?? null, points: true, higherIsBad: false },\r\n { label: 'Compliance Rate', value: this.pct(this.cards.compliance), delta: this.deltas['compliance'] ?? null, points: true, higherIsBad: false }\r\n ];\r\n }\r\n\r\n /** Store page: the three figures in the Submitted card. */\r\n get storeKpis(): DetailKpi[] {\r\n return [\r\n { label: 'Completion Score', value: this.pct(this.cards.completion), delta: this.deltas['completion'] ?? null, points: true, higherIsBad: false },\r\n { label: 'Compliance Score', value: this.pct(this.cards.compliance), delta: this.deltas['compliance'] ?? null, points: true, higherIsBad: false },\r\n { label: 'Total Flags', value: String(this.cards.flags), delta: this.deltas['flags'] ?? null, points: false, higherIsBad: true }\r\n ];\r\n }\r\n\r\n deltaText(k: DetailKpi): string {\r\n return k.delta === null ? '—' : Math.abs(k.delta) + '%';\r\n }\r\n\r\n deltaDir(k: DetailKpi): 'up' | 'down' | 'flat' {\r\n if (k.delta === null || k.delta === 0) { return 'flat'; }\r\n return k.delta > 0 ? 'up' : 'down';\r\n }\r\n\r\n /** Green when the change is good, red when bad, grey when unchanged or unknown. */\r\n deltaTone(k: DetailKpi): 'good' | 'bad' | 'flat' {\r\n const dir = this.deltaDir(k);\r\n if (dir === 'flat') { return 'flat'; }\r\n return (dir === 'up') !== k.higherIsBad ? 'good' : 'bad';\r\n }\r\n\r\n /** ---- Calendar ---- */\r\n\r\n get monthLabel(): string {\r\n return this.month ? dayjs(this.month + '-01').format('MMMM YYYY') : '';\r\n }\r\n\r\n shiftMonth(step: number): void {\r\n if (!this.month) { return; }\r\n this.month = dayjs(this.month + '-01').add(step, 'month').format('YYYY-MM');\r\n this.load();\r\n }\r\n\r\n dayTitle(d: CalendarDay): string {\r\n if (!d.visits) { return 'No visits'; }\r\n const score = d.score === null ? '' : ` · score ${d.score}%`;\r\n return `${d.visits} visit${d.visits === 1 ? '' : 's'} · ${d.submitted} submitted${score}`;\r\n }\r\n\r\n /** ---- Table ---- */\r\n\r\n onSearch(): void {\r\n this.search$.next();\r\n }\r\n\r\n onStatus(): void {\r\n this.page = 1;\r\n this.load();\r\n }\r\n\r\n onPageChange(page: number): void {\r\n this.page = page;\r\n this.load();\r\n }\r\n\r\n /** Column sort, done by the API (the table is paged there); '' = newest visit first. */\r\n sortColumn = '';\r\n sortBy: 1 | -1 = 1;\r\n\r\n sortTable(column: string): void {\r\n this.sortBy = this.sortColumn === column && this.sortBy === 1 ? -1 : 1;\r\n this.sortColumn = column;\r\n this.page = 1;\r\n this.load();\r\n }\r\n\r\n onPageSizeChange(size: any): void {\r\n this.pageSize = Number(size) || 10;\r\n this.page = 1;\r\n this.load();\r\n }\r\n\r\n statusLabel(row: DetailRow): string {\r\n return row.status === 'submit' ? 'Submitted' : (row.status === 'inprogress' ? 'In Progress' : 'Open');\r\n }\r\n\r\n statusBg(row: DetailRow): string {\r\n return row.status === 'submit' ? '#ECFDF3' : (row.status === 'inprogress' ? '#FFFAEB' : '#EFF8FF');\r\n }\r\n\r\n statusFg(row: DetailRow): string {\r\n return row.status === 'submit' ? '#027A48' : (row.status === 'inprogress' ? '#B54708' : '#175CD3');\r\n }\r\n\r\n rowInitials(name: string): string {\r\n return (name || '').replace(/[^A-Za-z]/g, '').slice(0, 2) || '--';\r\n }\r\n\r\n fmtDay(v: any): string {\r\n return v ? dayjs(v).format('MMM DD, YYYY') : '—';\r\n }\r\n\r\n fmtDate(v: string): string {\r\n return v ? dayjs(v).format('DD MMM YYYY') : '--';\r\n }\r\n\r\n fmtTime(v: string | null): string {\r\n return v ? dayjs(v).format('hh:mm A, DD MMM YYYY') : '--';\r\n }\r\n\r\n galleryParams(row: DetailRow): Record<string, string> {\r\n return { audit: row.checklistId, store: row.storeId, date: row.date };\r\n }\r\n\r\n /** Same PDF download as the Checklist dashboard: queued, then listed under Notifications > Downloads. */\r\n download(row: DetailRow): void {\r\n const user = JSON.parse(localStorage.getItem('user-info') || '{}');\r\n this.traxService.reportTableExport({\r\n fromDate: this.fromDate,\r\n toDate: this.toDate,\r\n checklistId: [row.id],\r\n sourceCheckList_id: '',\r\n checklistName: row.checkListName,\r\n fileType: 'pdf',\r\n storeIds: [row.storeId],\r\n userId: user?._id,\r\n clientId: this.headerData?.client,\r\n downloadInsertFrom: 'dashboard',\r\n insertType: 'checklist',\r\n checkListType: row.checkListType || 'custom'\r\n }).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (res: any) => {\r\n if (res?.code === 200) {\r\n this.toast.getSuccessToast('Downloading your report. Find it under Notifications > Downloads.');\r\n } else {\r\n this.toast.getErrorToast(this.downloadError(res, 'Could not start the download'));\r\n }\r\n },\r\n // The API's own reason (e.g. the download could not be queued) instead of a bare \"Something went wrong!\".\r\n error: (err: any) => this.toast.getErrorToast(this.downloadError(err?.error, 'Could not start the download'))\r\n });\r\n }\r\n\r\n private downloadError(body: any, fallback: string): string {\r\n const e = body?.error ?? body?.message;\r\n const text = typeof e === 'string' ? e : (e?.message || e?.details?.message);\r\n return text && text !== '{}' ? text : fallback;\r\n }\r\n\r\n /** Every visit that matches the current filters, as an xlsx. */\r\n exportRows(): void {\r\n if (this.exporting || !this.totalCount) { return; }\r\n this.exporting = true;\r\n this.traxService.auditDashboardDetail(this.payload({ limit: 5000, offset: 1 })).pipe(takeUntil(this.destroy$)).subscribe({\r\n next: (res: any) => {\r\n this.exporting = false;\r\n const rows: DetailRow[] = res?.code === 200 ? (res.data?.rows || []) : [];\r\n const sheet = rows.map(r => ({\r\n 'Date': this.fmtDate(r.date),\r\n 'Audit Name': r.checkListName,\r\n 'Store ID': r.storeId,\r\n 'Store Name': r.storeName,\r\n 'User Name': r.userName,\r\n 'Submitted By': r.userEmail,\r\n 'Status': this.statusLabel(r) + (r.redo ? ' (Redo)' : ''),\r\n 'Submitted On': this.fmtTime(r.submittedOn),\r\n 'Submission Count': r.submissionCount,\r\n 'Flags': r.flags,\r\n 'Approved By': r.approvedBy || '--',\r\n 'Approved On': this.fmtTime(r.approvedOn)\r\n }));\r\n this.traxService.exportWorkbook([{ name: 'Audit Info', rows: sheet }], `${this.title} - audit info`);\r\n this.cd.detectChanges();\r\n },\r\n error: () => {\r\n this.exporting = false;\r\n this.toast.getErrorToast('Unable to export');\r\n this.cd.detectChanges();\r\n }\r\n });\r\n }\r\n\r\n trackByRow(_: number, row: DetailRow): string {\r\n return row.id;\r\n }\r\n\r\n trackByDay(_: number, d: CalendarDay): string {\r\n return d.date;\r\n }\r\n}\r\n","<div class=\"av2-page audit-detail\">\r\n <!-- Back + title (audit: owner / stores / schedule chips; user: avatar + tag) -->\r\n <div class=\"sd-head\">\r\n <a class=\"sd-back\" routerLink=\"/manage/trax/audit-v2/dashboard\" title=\"Back to dashboard\">\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <line x1=\"19\" y1=\"12\" x2=\"5\" y2=\"12\"></line>\r\n <polyline points=\"12 19 5 12 12 5\"></polyline>\r\n </svg>\r\n </a>\r\n <span *ngIf=\"by === 'user'\" class=\"sd-avatar sd-avatar--lg\">{{ initials || '--' }}</span>\r\n <div class=\"sd-head-text\">\r\n <div class=\"sd-title-row\">\r\n <span *ngIf=\"loading && !info\" class=\"av2-sk av2-sk--title\"></span>\r\n <!-- Audit page: the name is a switcher (prototype: name chip with a chevron) + published dot -->\r\n <div *ngIf=\"by === 'audit' && auditOptions.length > 1 && (!loading || info)\" class=\"sd-switch\" [class.is-open]=\"switchOpen\">\r\n <button type=\"button\" class=\"sd-switch-btn\" (click)=\"toggleSwitch()\" [attr.aria-expanded]=\"switchOpen\"\r\n aria-haspopup=\"listbox\" title=\"Switch audit\">\r\n <span class=\"sd-switch-name\">{{ title }}</span>\r\n <svg class=\"sd-switch-chev\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n </button>\r\n <div class=\"sd-switch-menu\" *ngIf=\"switchOpen\" role=\"listbox\">\r\n <label class=\"sd-switch-search\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7\"></circle><line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line></svg>\r\n <input type=\"text\" [(ngModel)]=\"switchQuery\" placeholder=\"Search audits\" autocomplete=\"off\">\r\n </label>\r\n <div class=\"sd-switch-list\">\r\n <button type=\"button\" class=\"sd-switch-item\" *ngFor=\"let a of switchFiltered\" role=\"option\"\r\n [class.is-active]=\"a.id === subjectId\" [attr.aria-selected]=\"a.id === subjectId\" (click)=\"switchAudit(a.id)\">\r\n <span class=\"sd-pubdot\" [class.is-on]=\"a.publish\" [title]=\"a.publish ? 'Published' : 'Draft'\"></span>\r\n <span class=\"sd-switch-label\" [title]=\"a.name\">{{ a.name }}</span>\r\n <svg *ngIf=\"a.id === subjectId\" class=\"sd-switch-check\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\"\r\n stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n </button>\r\n <div class=\"sd-switch-empty\" *ngIf=\"!switchFiltered.length\">No audit matches \"{{ switchQuery }}\"</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"sd-switch-backdrop\" *ngIf=\"switchOpen\" (click)=\"closeSwitch()\"></div>\r\n <span *ngIf=\"(by !== 'audit' || auditOptions.length <= 1) && (!loading || info)\" class=\"sd-title\">{{ title }}</span>\r\n <!-- Live state of the audit: Published (green) or Draft (grey) -->\r\n <span *ngIf=\"by === 'audit' && info\" class=\"sd-pubstate\" [class.is-on]=\"info.publish\"\r\n [title]=\"info.publish ? 'This audit is published' : 'This audit is a draft (not published)'\">\r\n <span class=\"sd-pubdot\" [class.is-on]=\"info.publish\"></span>{{ info.publish ? 'Published' : 'Draft' }}\r\n </span>\r\n <span *ngIf=\"by === 'user'\" class=\"sd-tag\">user</span>\r\n </div>\r\n <div class=\"sd-sub\" *ngIf=\"by !== 'audit'\">\r\n <ng-container *ngIf=\"by === 'user' && subjectId\">{{ subjectId }} · </ng-container>{{ period }}\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"by === 'audit' && info\">\r\n <span class=\"sd-divider\"></span>\r\n <div class=\"sd-chips\">\r\n <span class=\"sd-chip\" *ngIf=\"info.owner\" title=\"Audit owner\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"></path><circle cx=\"12\" cy=\"7\" r=\"4\"></circle></svg>\r\n {{ info.owner }}\r\n </span>\r\n <span class=\"sd-chip\" title=\"Assigned stores\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M3 9l1-5h16l1 5\"></path><path d=\"M4 9v11h16V9\"></path><path d=\"M9 20v-6h6v6\"></path></svg>\r\n {{ info.stores }} {{ info.stores === 1 ? 'Store' : 'Stores' }}\r\n </span>\r\n <!-- No schedule-type (\"One time\") or audit-level visit-window chip (QA 10 Oct): audits are scheduled by\r\n Schedules, whose rows carry the visit windows. -->\r\n </div>\r\n </ng-container>\r\n <div class=\"av2-grow\"></div>\r\n <span *ngIf=\"by === 'audit'\" class=\"sd-sub\">{{ period }}</span>\r\n </div>\r\n\r\n <!-- Store page: the prototype's three stat blocks -->\r\n <div class=\"sd-stats\" *ngIf=\"by === 'store'\">\r\n <div class=\"sd-stat\">\r\n <div class=\"sd-stat-head\">\r\n <div class=\"sd-stat-big\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.activeAudits }}</ng-container></div>\r\n <div class=\"sd-stat-label\">Active Audits</div>\r\n </div>\r\n <div class=\"sd-stat-body\">\r\n <div>\r\n <div class=\"sd-stat-mid\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.visits }}</ng-container></div>\r\n <div class=\"sd-stat-sub\">Audit Instances</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"sd-stat\">\r\n <div class=\"sd-stat-head\">\r\n <div class=\"sd-stat-big\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.notSubmitted }}</ng-container></div>\r\n <div class=\"sd-stat-label\">Not Submitted Audits</div>\r\n </div>\r\n <div class=\"sd-stat-body sd-stat-body--2\">\r\n <div>\r\n <div class=\"sd-stat-mid\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.open }}</ng-container></div>\r\n <div class=\"sd-stat-sub\">Open Audits</div>\r\n </div>\r\n <div>\r\n <div class=\"sd-stat-mid\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.inprogress }}</ng-container></div>\r\n <div class=\"sd-stat-sub\">In Progress Audits</div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"sd-stat\">\r\n <div class=\"sd-stat-head\">\r\n <div class=\"sd-stat-big\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ cards.submitted }}</ng-container></div>\r\n <div class=\"sd-stat-label\">Submitted Audits</div>\r\n </div>\r\n <div class=\"sd-stat-body sd-stat-body--3\">\r\n <div class=\"sd-stat-cell\" *ngFor=\"let k of storeKpis\">\r\n <div class=\"sd-stat-mid\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ k.value }}</ng-container></div>\r\n <div class=\"sd-stat-sub\">{{ k.label }}</div>\r\n <ng-container *ngTemplateOutlet=\"deltaTpl; context: { $implicit: k }\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Audit / user pages: count + score cards beside the month calendar -->\r\n <div class=\"sd-overview\" *ngIf=\"by !== 'store'\">\r\n <!-- Cards in their own grid, stretched to the calendar height: the score row takes what the count row leaves. -->\r\n <div class=\"sd-overview-main\">\r\n <div class=\"sd-kpi\" *ngFor=\"let k of countKpis\">\r\n <div class=\"sd-kpi-title\">{{ k.label }}</div>\r\n <div class=\"sd-kpi-value\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ k.value }}</ng-container></div>\r\n <ng-container *ngTemplateOutlet=\"deltaTpl; context: { $implicit: k, center: true }\"></ng-container>\r\n </div>\r\n\r\n <!-- Same look as the count cards (prototype): gradient title, centred value and change -->\r\n <div class=\"sd-kpi sd-kpi--score\" *ngFor=\"let k of scoreKpis\">\r\n <div class=\"sd-kpi-title\">{{ k.label }}</div>\r\n <div class=\"sd-kpi-value\"><span *ngIf=\"loading\" class=\"av2-sk av2-sk--value\"></span><ng-container *ngIf=\"!loading\">{{ k.value }}</ng-container></div>\r\n <ng-container *ngTemplateOutlet=\"deltaTpl; context: { $implicit: k, center: true }\"></ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"sd-cal\">\r\n <div class=\"sd-cal-title\">\r\n Monthly Performance\r\n <span class=\"sd-cal-info\" title=\"Colour shows each day's visits: all submitted and passing, partly done or below the pass mark, or none submitted\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"></circle><path d=\"M12 8h.01M11 12h1v4h1\"></path></svg>\r\n </span>\r\n </div>\r\n <div class=\"sd-cal-nav\">\r\n <button type=\"button\" class=\"sd-cal-step\" title=\"Previous month\" (click)=\"shiftMonth(-1)\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 18 9 12 15 6\"></polyline></svg>\r\n </button>\r\n <span class=\"sd-cal-month\">{{ monthLabel }}</span>\r\n <button type=\"button\" class=\"sd-cal-step\" title=\"Next month\" (click)=\"shiftMonth(1)\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"9 18 15 12 9 6\"></polyline></svg>\r\n </button>\r\n </div>\r\n <div class=\"sd-cal-week\">\r\n <span *ngFor=\"let w of weekdays\">{{ w }}</span>\r\n </div>\r\n <div class=\"sd-cal-days\">\r\n <span *ngFor=\"let i of calendarLead\" class=\"sd-day sd-day--blank\"></span>\r\n <span *ngFor=\"let d of calendarDays; trackBy: trackByDay\" class=\"sd-day\" [ngClass]=\"'sd-day--' + d.status\"\r\n [title]=\"dayTitle(d)\">{{ d.day }}</span>\r\n </div>\r\n <div class=\"sd-cal-legend\">\r\n <span><i class=\"sd-dot sd-dot--track\"></i>On track</span>\r\n <span><i class=\"sd-dot sd-dot--risk\"></i>At risk</span>\r\n <span><i class=\"sd-dot sd-dot--missed\"></i>Missed</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Visits table -->\r\n <section class=\"sd-card\">\r\n <div class=\"sd-card-head\">\r\n <div class=\"sd-card-text\">\r\n <div class=\"sd-card-title\">\r\n Audit Info\r\n <span class=\"sd-count\">{{ totalCount }} Total</span>\r\n </div>\r\n <div class=\"sd-sub\">{{ period }}</div>\r\n </div>\r\n <div class=\"av2-grow\"></div>\r\n <lib-audit-v2-select class=\"sd-status\" [(ngModel)]=\"status\" (ngModelChange)=\"onStatus()\" [options]=\"statusOptions\"\r\n ariaLabel=\"Visit status\"></lib-audit-v2-select>\r\n <label class=\"av2-search sd-search\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"\r\n stroke-linecap=\"round\">\r\n <circle cx=\"11\" cy=\"11\" r=\"7\"></circle>\r\n <line x1=\"16.5\" y1=\"16.5\" x2=\"21\" y2=\"21\"></line>\r\n </svg>\r\n <input type=\"text\" [placeholder]=\"by === 'store' ? 'Search by audit or auditor' : 'Search by store or user'\"\r\n [(ngModel)]=\"search\" (ngModelChange)=\"onSearch()\">\r\n </label>\r\n <!-- Send Alert: reminder email to the auditors of the ticked visits that are not submitted -->\r\n <button type=\"button\" class=\"av2-btn sd-alert\" *ngIf=\"by === 'audit' && access.canEdit\"\r\n [disabled]=\"!alertIds.size || alerting\" (click)=\"sendAlert()\"\r\n [title]=\"alertIds.size ? 'Email a reminder to the auditors of the ticked visits' : 'Tick visits that are not submitted yet'\">\r\n {{ alerting ? 'Sending…' : (alertIds.size ? 'Send Alert (' + alertIds.size + ')' : 'Send Alert') }}\r\n </button>\r\n <button type=\"button\" class=\"av2-btn av2-btn--ghost\" [disabled]=\"exporting || !totalCount\" (click)=\"exportRows()\">\r\n <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\r\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"></path>\r\n <polyline points=\"7 10 12 15 17 10\"></polyline>\r\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\"></line>\r\n </svg>\r\n {{ exporting ? 'Exporting…' : 'Export' }}\r\n </button>\r\n </div>\r\n\r\n <lib-audit-v2-shimmer *ngIf=\"rowsLoading\" [rows]=\"6\"></lib-audit-v2-shimmer>\r\n\r\n <div class=\"av2-table-wrap\" *ngIf=\"!rowsLoading && rows.length\">\r\n <table class=\"sd-table\" [ngClass]=\"'sd-table--' + by\">\r\n <thead>\r\n <tr>\r\n <th *ngIf=\"by === 'audit'\" class=\"sd-check\">\r\n <input type=\"checkbox\" class=\"sd-cb\" aria-label=\"Select all visits that are not submitted\"\r\n [checked]=\"allAlertable\" [indeterminate]=\"someAlertable\" [disabled]=\"!alertableRows.length\" (change)=\"toggleAllAlert()\">\r\n </th>\r\n <th *ngIf=\"by !== 'store'\" class=\"av2-sortable\" (click)=\"sortTable('date')\">Date <lib-audit-v2-sort-icon [active]=\"sortColumn === 'date'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th *ngIf=\"by !== 'audit'\" class=\"av2-sortable\" (click)=\"sortTable('checkListName')\">Audit Name <lib-audit-v2-sort-icon [active]=\"sortColumn === 'checkListName'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th *ngIf=\"by !== 'store'\" class=\"av2-sortable\" (click)=\"sortTable('storeName')\">Store Name <lib-audit-v2-sort-icon [active]=\"sortColumn === 'storeName'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th *ngIf=\"by !== 'store'\" class=\"av2-sortable\" (click)=\"sortTable('userName')\">User Name <lib-audit-v2-sort-icon [active]=\"sortColumn === 'userName'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('status')\">Status <lib-audit-v2-sort-icon [active]=\"sortColumn === 'status'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th *ngIf=\"by !== 'user'\" class=\"av2-sortable\" (click)=\"sortTable('submittedBy')\">Submitted By <lib-audit-v2-sort-icon [active]=\"sortColumn === 'submittedBy'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('submittedOn')\">Submitted On <lib-audit-v2-sort-icon [active]=\"sortColumn === 'submittedOn'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('submissionCount')\">Submission Count <lib-audit-v2-sort-icon [active]=\"sortColumn === 'submissionCount'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('flags')\">Flags <lib-audit-v2-sort-icon [active]=\"sortColumn === 'flags'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('approvedBy')\">Approved By <lib-audit-v2-sort-icon [active]=\"sortColumn === 'approvedBy'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th class=\"av2-sortable\" (click)=\"sortTable('approvedOn')\">Approved On <lib-audit-v2-sort-icon [active]=\"sortColumn === 'approvedOn'\" [dir]=\"sortBy === 1 ? 'asc' : 'desc'\"></lib-audit-v2-sort-icon></th>\r\n <th>Action</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of rows; trackBy: trackByRow\">\r\n <td *ngIf=\"by === 'audit'\" class=\"sd-check\">\r\n <input type=\"checkbox\" class=\"sd-cb\" [checked]=\"alertIds.has(row.id)\" [disabled]=\"row.status === 'submit'\"\r\n [title]=\"row.status === 'submit' ? 'Already submitted' : 'Select for Send Alert'\" (change)=\"toggleAlert(row)\">\r\n </td>\r\n <td *ngIf=\"by !== 'store'\" class=\"sd-nowrap\">{{ fmtDate(row.date) }}</td>\r\n <td *ngIf=\"by !== 'audit'\">\r\n <div class=\"sd-name\">\r\n <span class=\"sd-avatar\">{{ rowInitials(row.checkListName) }}</span>\r\n <span class=\"av2-ellipsis\" [av2Tip]=\"row.checkListName\">{{ row.checkListName }}</span>\r\n </div>\r\n </td>\r\n <td *ngIf=\"by !== 'store'\" class=\"av2-ellipsis\">\r\n <a class=\"sd-link sd-link--plain\" routerLink=\"/manage/trax/audit-v2/dashboard/store\"\r\n [queryParams]=\"detailParams({ store: row.storeId })\" [title]=\"row.storeName || ''\">{{ row.storeName || '—' }}</a>\r\n </td>\r\n <td *ngIf=\"by !== 'store'\" class=\"av2-ellipsis\">\r\n <a *ngIf=\"by !== 'user'\" class=\"sd-link sd-link--plain\" routerLink=\"/manage/trax/audit-v2/dashboard/user\"\r\n [queryParams]=\"detailParams({ email: row.userEmail })\" [title]=\"row.userEmail\">{{ row.userName || row.userEmail }}</a>\r\n <span *ngIf=\"by === 'user'\" [title]=\"row.userEmail\">{{ row.userName || row.userEmail }}</span>\r\n </td>\r\n <td>\r\n <span class=\"sd-pill\" [style.background]=\"statusBg(row)\" [style.color]=\"statusFg(row)\">\r\n <svg *ngIf=\"row.redo\" class=\"sd-redo\" width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><title>Redo</title><polyline points=\"1 4 1 10 7 10\"></polyline><path d=\"M3.5 15a9 9 0 1 0 2.1-9.4L1 10\"></path></svg>\r\n {{ statusLabel(row) }}\r\n </span>\r\n </td>\r\n <td *ngIf=\"by !== 'user'\" class=\"av2-ellipsis av2-dim\" [av2Tip]=\"row.userEmail\">{{ row.userEmail || '--' }}</td>\r\n <td class=\"av2-dim sd-nowrap\">{{ fmtTime(row.submittedOn) }}</td>\r\n <td>{{ row.submissionCount }}</td>\r\n <td>{{ row.flags }}</td>\r\n <td class=\"av2-ellipsis\" [class.av2-faint]=\"!row.approvedBy\">{{ row.approvedBy || '--' }}</td>\r\n <td class=\"sd-nowrap\" [class.av2-faint]=\"!row.approvedOn\">{{ fmtTime(row.approvedOn) }}</td>\r\n <td>\r\n <span class=\"sd-actions\" *ngIf=\"row.status === 'submit'\">\r\n <a class=\"sd-link\" routerLink=\"/manage/trax/audit-v2/gallery\" [queryParams]=\"galleryParams(row)\">View</a>\r\n <a class=\"sd-link\" (click)=\"download(row)\">Download</a>\r\n </span>\r\n <span *ngIf=\"row.status !== 'submit'\" class=\"av2-faint\">--</span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"!rowsLoading && !rows.length\" class=\"av2-empty\">\r\n <img class=\"av2-empty-img\" src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"\">\r\n <div class=\"av2-empty-text\">\r\n <div class=\"av2-empty-title\">No data found</div>\r\n <div class=\"av2-empty-sub\">{{ subjectId ? 'There are no audit visits for this filter in the selected period' : 'Open this page from the Dashboard' }}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"sd-pagination\" *ngIf=\"!rowsLoading && totalCount > pageSize\">\r\n <lib-pagination [itemsPerPage]=\"pageSize\" [pageSize]=\"pageSize\" [paginationSizes]=\"paginationSizes\"\r\n [currentPage]=\"page\" [totalItems]=\"totalCount\" (pageChange)=\"onPageChange($event)\"\r\n (pageSizeChange)=\"onPageSizeChange($event)\"></lib-pagination>\r\n </div>\r\n </section>\r\n</div>\r\n\r\n<!-- Change vs the previous period: arrow + % (points for scores) + \"vs last day / previous N days\" -->\r\n<ng-template #deltaTpl let-k let-center=\"center\">\r\n <div class=\"sd-delta\" [class.sd-delta--center]=\"center\" [ngClass]=\"'sd-delta--' + deltaTone(k)\">\r\n <svg *ngIf=\"deltaDir(k) === 'up'\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 16 10 10 14 14 20 8\"></polyline><polyline points=\"15 8 20 8 20 13\"></polyline></svg>\r\n <svg *ngIf=\"deltaDir(k) === 'down'\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"4 8 10 14 14 10 20 16\"></polyline><polyline points=\"15 16 20 16 20 11\"></polyline></svg>\r\n <ng-container *ngIf=\"k.delta !== null; else noPrev\">\r\n <span class=\"sd-delta-val\">{{ deltaText(k) }}</span>\r\n <span class=\"sd-delta-vs\">{{ vsLabel }}</span>\r\n </ng-container>\r\n <ng-template #noPrev><span class=\"sd-delta-vs\" [attr.title]=\"'Nothing was recorded in that period, so there is no change to show'\">{{ noPrevLabel }}</span></ng-template>\r\n </div>\r\n</ng-template>\r\n","import { NgModule } from '@angular/core';\r\nimport { RouterModule, Routes } from '@angular/router';\r\nimport { AuditV2LayoutComponent } from './audit-v2-layout/audit-v2-layout.component';\r\nimport { AuditV2DashboardComponent } from './dashboard/audit-v2-dashboard.component';\r\nimport { AuditV2ActionCentreComponent } from './action-centre/audit-v2-action-centre.component';\r\nimport { AuditV2FlagsComponent } from './flags/audit-v2-flags.component';\r\nimport { AuditV2FlagDetailComponent } from './flags/flag-detail/audit-v2-flag-detail.component';\r\nimport { AuditV2GalleryComponent } from './gallery/audit-v2-gallery.component';\r\nimport { AuditV2ManageComponent } from './manage/audit-v2-manage.component';\r\nimport { AuditV2ReportsComponent } from './reports/audit-v2-reports.component';\r\nimport { AuditV2PredefinedComponent } from './predefined/audit-v2-predefined.component';\r\nimport { AuditV2ConfigureComponent } from './configure/audit-v2-configure.component';\r\nimport { AuditV2QuestionEditorComponent } from './question-editor/audit-v2-question-editor.component';\r\nimport { AuditV2DetailComponent } from './detail/audit-v2-detail.component';\r\nimport { CreateTaskComponent } from '../create-task/create-task.component';\r\nimport { TaskConfigureComponent } from '../task-configure/task-configure.component';\r\n\r\nconst routes: Routes = [\r\n {\r\n path: '',\r\n component: AuditV2LayoutComponent,\r\n children: [\r\n {\r\n path: '',\r\n redirectTo: 'actioncenter',\r\n pathMatch: 'full'\r\n },\r\n {\r\n path: 'dashboard',\r\n component: AuditV2DashboardComponent\r\n },\r\n {\r\n path: 'actioncenter',\r\n component: AuditV2ActionCentreComponent\r\n },\r\n {\r\n path: 'flags',\r\n component: AuditV2FlagsComponent\r\n },\r\n {\r\n // Flags -> View: one audit's flag details (v1 Flags -> Flags Info)\r\n path: 'flags/detail',\r\n component: AuditV2FlagDetailComponent\r\n },\r\n {\r\n path: 'gallery',\r\n component: AuditV2GalleryComponent\r\n },\r\n {\r\n path: 'manage',\r\n component: AuditV2ManageComponent\r\n },\r\n {\r\n path: 'reports',\r\n component: AuditV2ReportsComponent\r\n },\r\n {\r\n path: 'manage/predefined',\r\n component: AuditV2PredefinedComponent\r\n },\r\n {\r\n path: 'manage/configure',\r\n component: AuditV2ConfigureComponent\r\n },\r\n {\r\n // Audit question editor (audit copy of the checklist editor)\r\n path: 'manage/editor',\r\n component: AuditV2QuestionEditorComponent\r\n },\r\n // Manage -> Task: the task builder and task setup inside the Audit shell (same pages as\r\n // Checklist > Task; opened with from=audit they tag the task and return to Manage -> Task).\r\n {\r\n path: 'manage/task',\r\n component: CreateTaskComponent\r\n },\r\n {\r\n path: 'manage/task-configure',\r\n component: TaskConfigureComponent\r\n },\r\n // Dashboard detail pages; one component, the mode comes from data.by\r\n {\r\n path: 'dashboard/audit',\r\n component: AuditV2DetailComponent,\r\n data: { by: 'audit' }\r\n },\r\n {\r\n path: 'dashboard/store',\r\n component: AuditV2DetailComponent,\r\n data: { by: 'store' }\r\n },\r\n {\r\n path: 'dashboard/user',\r\n component: AuditV2DetailComponent,\r\n data: { by: 'user' }\r\n }\r\n ]\r\n }\r\n];\r\n\r\n@NgModule({\r\n imports: [RouterModule.forChild(routes)],\r\n exports: [RouterModule]\r\n})\r\nexport class AuditV2RoutingModule { }\r\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { CommonSharedModule } from 'tango-app-ui-shared';\nimport { NgbAccordionModule, NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap';\nimport { DragDropModule } from '@angular/cdk/drag-drop';\nimport { NgxDaterangepickerMd } from 'ngx-daterangepicker-material';\n\nimport { AuditV2RoutingModule } from './audit-v2-routing.module';\nimport { AuditV2LayoutComponent } from './audit-v2-layout/audit-v2-layout.component';\nimport { AuditV2DashboardComponent } from './dashboard/audit-v2-dashboard.component';\nimport { AuditV2ActionCentreComponent } from './action-centre/audit-v2-action-centre.component';\nimport { AuditV2FlagsComponent } from './flags/audit-v2-flags.component';\nimport { AuditV2FlagDetailComponent } from './flags/flag-detail/audit-v2-flag-detail.component';\nimport { AuditV2GalleryComponent } from './gallery/audit-v2-gallery.component';\nimport { AuditV2ManageComponent } from './manage/audit-v2-manage.component';\nimport { AuditV2ReportsComponent } from './reports/audit-v2-reports.component';\nimport { AuditV2TipDirective } from './tip/audit-v2-tip.directive';\nimport { AuditV2PredefinedComponent } from './predefined/audit-v2-predefined.component';\nimport { AuditV2ConfigureComponent } from './configure/audit-v2-configure.component';\nimport { AuditV2DetailComponent } from './detail/audit-v2-detail.component';\nimport { AuditV2ScheduleEditorComponent } from './schedule/audit-v2-schedule-editor.component';\nimport { AuditV2ScheduleDetailComponent } from './schedule/audit-v2-schedule-detail.component';\nimport { AuditV2ShimmerComponent } from './shimmer/audit-v2-shimmer.component';\nimport { AuditV2QuestionEditorComponent } from './question-editor/audit-v2-question-editor.component';\nimport { AuditV2CounterComponent } from './question-editor/counter/audit-v2-counter.component';\nimport { AuditV2BulkUploadComponent } from './question-editor/bulk-upload/audit-v2-bulk-upload.component';\nimport { AuditV2SelectComponent } from './select/audit-v2-select.component';\nimport { AuditV2SortIconComponent } from './sort-icon/audit-v2-sort-icon.component';\nimport { DateRangePickerComponent } from '../activity-log-v2/log-view-popup/date-range-picker/date-range-picker.component';\n\n@NgModule({\n declarations: [\n AuditV2LayoutComponent,\n AuditV2DashboardComponent,\n AuditV2ActionCentreComponent,\n AuditV2FlagsComponent,\n AuditV2FlagDetailComponent,\n AuditV2GalleryComponent,\n AuditV2ManageComponent,\n AuditV2ReportsComponent,\n AuditV2TipDirective,\n AuditV2PredefinedComponent,\n AuditV2ConfigureComponent,\n AuditV2DetailComponent,\n AuditV2ScheduleEditorComponent,\n AuditV2ScheduleDetailComponent,\n AuditV2ShimmerComponent,\n AuditV2QuestionEditorComponent,\n AuditV2CounterComponent,\n AuditV2BulkUploadComponent,\n // Custom dropdown used instead of native <select> across the Audit menu\n AuditV2SelectComponent,\n // The Checklist tables' sort arrow, on every sortable audit table header\n AuditV2SortIconComponent\n ],\n imports: [\n CommonModule,\n AuditV2RoutingModule,\n CommonSharedModule,\n FormsModule,\n ReactiveFormsModule,\n NgbTooltipModule,\n NgbAccordionModule,\n DateRangePickerComponent,\n DragDropModule,\n // ngxDaterangepickerMd: question-editor date questions, Dashboard period range, Manage visit day\n NgxDaterangepickerMd\n ]\n})\nexport class AuditV2Module { }\n"],"names":["i1","i2","PASS_MARK","takeUntil","i1.TraxService","i4","i5","i6","i7","i8.AuditV2TipDirective","i9.AuditV2ShimmerComponent","i10.AuditV2SelectComponent","i11.AuditV2SortIconComponent","i3","i7.DateRangePickerComponent","i10.AuditV2SortIconComponent","i7.AuditV2TipDirective","i8.AuditV2ShimmerComponent","i9.AuditV2SortIconComponent","EXPORT_PAGE","map","i6.AuditV2ShimmerComponent","STATUS","i5.AuditV2TipDirective","i7.AuditV2SortIconComponent","i8.AuditV2ScheduleEditorComponent","i9.AuditV2ScheduleDetailComponent","i10.AuditV2ShimmerComponent","i9.AuditV2SelectComponent","i7.AuditV2ShimmerComponent","i8.AuditV2SelectComponent","i3.TraxService","utc","i6.TraxService","i8","i9","i10.AuditV2CounterComponent","i11.AuditV2SelectComponent","i2.TraxService"],"mappings":"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"}
|