tango-app-ui-analyse-trax 3.0.0-dev → 3.3.1-alpha-task.63
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/action-centre/action-centre.component.mjs +303 -0
- package/esm2022/lib/components/activity-log/activity-log.component.mjs +94 -0
- package/esm2022/lib/components/add-checklist/add-checklist.component.mjs +1439 -0
- package/esm2022/lib/components/add-task/add-task.component.mjs +85 -0
- package/esm2022/lib/components/checklist/checklist.component.mjs +252 -0
- package/esm2022/lib/components/checklist-configure/checklist-configure.component.mjs +1954 -0
- package/esm2022/lib/components/checklistlayout/checklistlayout.component.mjs +12 -0
- package/esm2022/lib/components/chip-dropdown/chip-dropdown.component.mjs +84 -0
- package/esm2022/lib/components/create-task/create-task.component.mjs +367 -0
- package/esm2022/lib/components/create-task/create-task.data.mjs +306 -0
- package/esm2022/lib/components/create-task/create-task.interface.mjs +2 -0
- package/esm2022/lib/components/custom-select/custom-select.component.mjs +236 -0
- package/esm2022/lib/components/dashboard/dashboard.component.mjs +600 -0
- package/esm2022/lib/components/dashboard-info/dashboard-info.component.mjs +635 -0
- package/esm2022/lib/components/dashboard-info/monthlyperformance-datepicker/monthlyperformance-datepicker.component.mjs +172 -0
- package/esm2022/lib/components/dashboard-layout/dashboard-layout.component.mjs +12 -0
- package/esm2022/lib/components/export-gallery/export-gallery.component.mjs +119 -0
- package/esm2022/lib/components/flag-layout/flag-layout.component.mjs +12 -0
- package/esm2022/lib/components/flags/flags.component.mjs +257 -0
- package/esm2022/lib/components/flags/flags.interface.mjs +2 -0
- package/esm2022/lib/components/flags-info/flags-info.component.mjs +388 -0
- package/esm2022/lib/components/flags-info/flags-info.interface.mjs +2 -0
- package/esm2022/lib/components/flags-info/unattended-pie-chart/unattended-pie-chart.component.mjs +71 -0
- package/esm2022/lib/components/gallery/gallery.component.mjs +1202 -0
- package/esm2022/lib/components/group-select/group-select.component.mjs +155 -0
- package/esm2022/lib/components/managechecklist/managechecklist.component.mjs +172 -0
- package/esm2022/lib/components/multi-date-datepicker/multi-date-datepicker.component.mjs +117 -0
- package/esm2022/lib/components/orders/orders.component.mjs +171 -0
- package/esm2022/lib/components/pagination/pagination.component.mjs +62 -0
- package/esm2022/lib/components/reactive-select/reactive-select.component.mjs +105 -0
- package/esm2022/lib/components/reports/date-picker/date-picker.component.mjs +60 -0
- package/esm2022/lib/components/reports/reports.component.mjs +299 -0
- package/esm2022/lib/components/reports/reports.interface.mjs +2 -0
- package/esm2022/lib/components/tango-analyse-trax/tango-analyse-trax.component.mjs +27 -6
- package/esm2022/lib/components/task/task.component.mjs +271 -0
- package/esm2022/lib/components/task-configure/task-configure.component.mjs +504 -0
- package/esm2022/lib/components/task-configure/task-configure.interface.mjs +2 -0
- package/esm2022/lib/components/task-info/task-info.component.mjs +300 -0
- package/esm2022/lib/components/task-info/taskinfo-edit/taskinfo-edit.component.mjs +203 -0
- package/esm2022/lib/components/task-layout/task-layout.component.mjs +12 -0
- package/esm2022/lib/components/trax-store/trax-store.component.mjs +153 -0
- package/esm2022/lib/components/traxpopup/traxpopup.component.mjs +67 -0
- package/esm2022/lib/services/trax.service.mjs +334 -0
- package/esm2022/lib/tango-analyse-trax-routing.module.mjs +124 -6
- package/esm2022/lib/tango-analyse-trax.module.mjs +147 -9
- package/fesm2022/tango-app-ui-analyse-trax.mjs +11512 -21
- package/fesm2022/tango-app-ui-analyse-trax.mjs.map +1 -1
- package/lib/components/action-centre/action-centre.component.d.ts +56 -0
- package/lib/components/activity-log/activity-log.component.d.ts +30 -0
- package/lib/components/add-checklist/add-checklist.component.d.ts +99 -0
- package/lib/components/add-task/add-task.component.d.ts +38 -0
- package/lib/components/checklist/checklist.component.d.ts +39 -0
- package/lib/components/checklist-configure/checklist-configure.component.d.ts +160 -0
- package/lib/components/checklistlayout/checklistlayout.component.d.ts +5 -0
- package/lib/components/chip-dropdown/chip-dropdown.component.d.ts +24 -0
- package/lib/components/create-task/create-task.component.d.ts +58 -0
- package/lib/components/create-task/create-task.data.d.ts +244 -0
- package/lib/components/create-task/create-task.interface.d.ts +147 -0
- package/lib/components/custom-select/custom-select.component.d.ts +35 -0
- package/lib/components/dashboard/dashboard.component.d.ts +77 -0
- package/lib/components/dashboard-info/dashboard-info.component.d.ts +102 -0
- package/lib/components/dashboard-info/monthlyperformance-datepicker/monthlyperformance-datepicker.component.d.ts +40 -0
- package/lib/components/dashboard-layout/dashboard-layout.component.d.ts +5 -0
- package/lib/components/export-gallery/export-gallery.component.d.ts +33 -0
- package/lib/components/flag-layout/flag-layout.component.d.ts +5 -0
- package/lib/components/flags/flags.component.d.ts +51 -0
- package/lib/components/flags/flags.interface.d.ts +64 -0
- package/lib/components/flags-info/flags-info.component.d.ts +62 -0
- package/lib/components/flags-info/flags-info.interface.d.ts +212 -0
- package/lib/components/flags-info/unattended-pie-chart/unattended-pie-chart.component.d.ts +13 -0
- package/lib/components/gallery/gallery.component.d.ts +126 -0
- package/lib/components/group-select/group-select.component.d.ts +33 -0
- package/lib/components/managechecklist/managechecklist.component.d.ts +32 -0
- package/lib/components/multi-date-datepicker/multi-date-datepicker.component.d.ts +27 -0
- package/lib/components/orders/orders.component.d.ts +38 -0
- package/lib/components/pagination/pagination.component.d.ts +16 -0
- package/lib/components/reactive-select/reactive-select.component.d.ts +32 -0
- package/lib/components/reports/date-picker/date-picker.component.d.ts +23 -0
- package/lib/components/reports/reports.component.d.ts +55 -0
- package/lib/components/reports/reports.interface.d.ts +46 -0
- package/lib/components/tango-analyse-trax/tango-analyse-trax.component.d.ts +10 -1
- package/lib/components/task/task.component.d.ts +59 -0
- package/lib/components/task-configure/task-configure.component.d.ts +69 -0
- package/lib/components/task-configure/task-configure.interface.d.ts +124 -0
- package/lib/components/task-info/task-info.component.d.ts +68 -0
- package/lib/components/task-info/taskinfo-edit/taskinfo-edit.component.d.ts +60 -0
- package/lib/components/task-layout/task-layout.component.d.ts +5 -0
- package/lib/components/trax-store/trax-store.component.d.ts +44 -0
- package/lib/components/traxpopup/traxpopup.component.d.ts +23 -0
- package/lib/services/trax.service.d.ts +107 -0
- package/lib/tango-analyse-trax.module.d.ts +43 -3
- package/package.json +1 -1
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import dayjs from 'dayjs';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
export class MultiDateDatepickerComponent {
|
|
6
|
+
dayjs = dayjs;
|
|
7
|
+
startDate;
|
|
8
|
+
endDate;
|
|
9
|
+
predefinedDates = [];
|
|
10
|
+
selectedDates = new EventEmitter();
|
|
11
|
+
currentYear = new Date().getFullYear();
|
|
12
|
+
currentMonth = new Date().getMonth();
|
|
13
|
+
dayNames = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'];
|
|
14
|
+
monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
|
|
15
|
+
ngOnInit() {
|
|
16
|
+
this.predefinedDates = JSON.parse(JSON.stringify(this.predefinedDates));
|
|
17
|
+
}
|
|
18
|
+
getDaysInMonth() {
|
|
19
|
+
const daysInMonth = new Date(this.currentYear, this.currentMonth + 1, 0).getDate();
|
|
20
|
+
return Array.from({ length: daysInMonth }, (_, i) => i + 1);
|
|
21
|
+
}
|
|
22
|
+
getEmptyDays() {
|
|
23
|
+
const firstDayOfMonth = new Date(this.currentYear, this.currentMonth, 1).getDay();
|
|
24
|
+
return Array(firstDayOfMonth === 0 ? 6 : firstDayOfMonth - 1).fill(0);
|
|
25
|
+
}
|
|
26
|
+
isPredefined(day) {
|
|
27
|
+
day = day < 10 ? `0${day}` : day;
|
|
28
|
+
let date = day + '-' + (this.currentMonth + 1) + '-' + this.currentYear;
|
|
29
|
+
return this.predefinedDates.includes(date);
|
|
30
|
+
}
|
|
31
|
+
previousMonth() {
|
|
32
|
+
if (this.currentMonth === 0) {
|
|
33
|
+
this.currentMonth = 11;
|
|
34
|
+
this.currentYear--;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
this.currentMonth--;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
nextMonth() {
|
|
41
|
+
if (this.currentMonth === 11) {
|
|
42
|
+
this.currentMonth = 0;
|
|
43
|
+
this.currentYear++;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
this.currentMonth++;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
addPredefinedDays(day) {
|
|
50
|
+
day = day < 10 ? `0${day}` : day;
|
|
51
|
+
let date = day + '-' + (this.currentMonth + 1) + '-' + this.currentYear;
|
|
52
|
+
let findDayIdx = this.predefinedDates.findIndex((item) => item == date);
|
|
53
|
+
if (findDayIdx != -1) {
|
|
54
|
+
this.predefinedDates.splice(findDayIdx, 1);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
this.predefinedDates.push(date);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
validateDates(day) {
|
|
61
|
+
day = day < 10 ? `0${day}` : day;
|
|
62
|
+
let date = this.currentYear + '-' + (this.currentMonth + 1) + '-' + day;
|
|
63
|
+
let sDate = this.dayjs(this.startDate, 'YYYY-MM-DD');
|
|
64
|
+
let eDate = this.dayjs(this.endDate, 'YYYY-MM-DD');
|
|
65
|
+
date = this.dayjs(date, 'YYYY-MM-DD');
|
|
66
|
+
if (date.diff(sDate, 'd') >= 0 && eDate.diff(date, 'd') >= 0) {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
showPrev() {
|
|
72
|
+
let date = this.currentYear + '-' + (this.currentMonth + 1) + '-01';
|
|
73
|
+
date = this.dayjs(date, 'YYYY-MM-DD').subtract(1, 'month');
|
|
74
|
+
let sDate = this.dayjs(this.startDate, 'YYYY-MM-DD');
|
|
75
|
+
if (date.diff(sDate, 'm') >= 0) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
else if (date.month() == sDate.month()) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
showNext() {
|
|
86
|
+
let date = this.currentYear + '-' + (this.currentMonth + 1) + '-01';
|
|
87
|
+
date = this.dayjs(date, 'YYYY-MM-DD').add(1, 'month');
|
|
88
|
+
let eDate = this.dayjs(this.endDate, 'YYYY-MM-DD');
|
|
89
|
+
if (eDate.diff(date, 'm') >= 0) {
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
else if (date.month() == eDate.month()) {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
applyDate() {
|
|
100
|
+
this.selectedDates.emit(this.predefinedDates);
|
|
101
|
+
}
|
|
102
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiDateDatepickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
103
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: MultiDateDatepickerComponent, selector: "lib-multi-date-datepicker", inputs: { startDate: "startDate", endDate: "endDate", predefinedDates: "predefinedDates" }, outputs: { selectedDates: "selectedDates" }, ngImport: i0, template: "<div class=\"calendar-container\">\r\n <div class=\"calendar\">\r\n <div class=\"calendar-header my-3 mx-5\">\r\n <span class=\"cursor-pointer\" (click)=\"previousMonth()\" [style]=\"!showPrev() ? {visibility: 'hidden'}:{}\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M12.5 15L7.5 10L12.5 5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></span>\r\n <span>{{ monthNames[currentMonth] }} {{ currentYear }}</span>\r\n <span class=\"cursor-pointer\" (click)=\"nextMonth()\" [style]=\"!showNext() ? {visibility: 'hidden'} : {}\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M7.5 15L12.5 10L7.5 5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></span>\r\n </div>\r\n <div class=\"calendar-body my-4\">\r\n <div class=\"day-names\">\r\n <div *ngFor=\"let day of dayNames\">{{ day }}</div>\r\n </div>\r\n <div class=\"calendar-days\">\r\n <div *ngFor=\"let _ of getEmptyDays()\" class=\"empty-day\"></div>\r\n <div *ngFor=\"let day of getDaysInMonth()\" [class] =\"validateDates(day) === true ? 'cursor-pointer' : 'disabled-day'\"\r\n [ngClass]=\"{ 'selected-day': isPredefined(day) }\" (click)=\"validateDates(day) === true ? addPredefinedDays(day) : ''\">\r\n {{ day }}\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"calendar-footer align-self-end\">\r\n <div class=\"button ms-2\" (click)=\"applyDate();\">\r\n <button class=\"btn btn-primary btn-block w-100 right\">\r\n Apply\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".calendar-container{display:flex;padding:16px 20px;flex-direction:column;align-items:flex-start;gap:12px;background:#fff;border-radius:5px;box-shadow:0 0 10px #0000001a}.calendar{display:flex;flex-direction:column;align-items:center}.calendar-header{display:flex;justify-content:space-between;width:100%;color:var(--Gray-700, #344054);text-align:center;font-size:16px;font-style:normal;font-weight:500;line-height:24px}.calendar-body{display:flex;flex-direction:column;width:100%}.day-names{display:grid;grid-template-columns:repeat(7,1fr);font-weight:700;margin-bottom:10px;text-align:center}.calendar-days{display:grid;grid-template-columns:repeat(7,1fr);gap:5px}.empty-day{visibility:hidden}.calendar-days div{padding:10px;text-align:center;border-radius:50%;cursor:not-allowed}.selected-day{background-color:#00a3ff;color:#fff}.disabled-day{color:gray;text-decoration:line-through;cursor:not-allowed}button{background-color:transparent;border:none;cursor:pointer;font-size:16px}.performanceheading{color:var(--Gray-900, #101828);font-size:18px;font-style:normal;font-weight:600;line-height:28px}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
104
|
+
}
|
|
105
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MultiDateDatepickerComponent, decorators: [{
|
|
106
|
+
type: Component,
|
|
107
|
+
args: [{ selector: 'lib-multi-date-datepicker', template: "<div class=\"calendar-container\">\r\n <div class=\"calendar\">\r\n <div class=\"calendar-header my-3 mx-5\">\r\n <span class=\"cursor-pointer\" (click)=\"previousMonth()\" [style]=\"!showPrev() ? {visibility: 'hidden'}:{}\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M12.5 15L7.5 10L12.5 5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></span>\r\n <span>{{ monthNames[currentMonth] }} {{ currentYear }}</span>\r\n <span class=\"cursor-pointer\" (click)=\"nextMonth()\" [style]=\"!showNext() ? {visibility: 'hidden'} : {}\"><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\"\r\n height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\r\n <path d=\"M7.5 15L12.5 10L7.5 5\" stroke=\"#667085\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\" />\r\n </svg></span>\r\n </div>\r\n <div class=\"calendar-body my-4\">\r\n <div class=\"day-names\">\r\n <div *ngFor=\"let day of dayNames\">{{ day }}</div>\r\n </div>\r\n <div class=\"calendar-days\">\r\n <div *ngFor=\"let _ of getEmptyDays()\" class=\"empty-day\"></div>\r\n <div *ngFor=\"let day of getDaysInMonth()\" [class] =\"validateDates(day) === true ? 'cursor-pointer' : 'disabled-day'\"\r\n [ngClass]=\"{ 'selected-day': isPredefined(day) }\" (click)=\"validateDates(day) === true ? addPredefinedDays(day) : ''\">\r\n {{ day }}\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"calendar-footer align-self-end\">\r\n <div class=\"button ms-2\" (click)=\"applyDate();\">\r\n <button class=\"btn btn-primary btn-block w-100 right\">\r\n Apply\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [".calendar-container{display:flex;padding:16px 20px;flex-direction:column;align-items:flex-start;gap:12px;background:#fff;border-radius:5px;box-shadow:0 0 10px #0000001a}.calendar{display:flex;flex-direction:column;align-items:center}.calendar-header{display:flex;justify-content:space-between;width:100%;color:var(--Gray-700, #344054);text-align:center;font-size:16px;font-style:normal;font-weight:500;line-height:24px}.calendar-body{display:flex;flex-direction:column;width:100%}.day-names{display:grid;grid-template-columns:repeat(7,1fr);font-weight:700;margin-bottom:10px;text-align:center}.calendar-days{display:grid;grid-template-columns:repeat(7,1fr);gap:5px}.empty-day{visibility:hidden}.calendar-days div{padding:10px;text-align:center;border-radius:50%;cursor:not-allowed}.selected-day{background-color:#00a3ff;color:#fff}.disabled-day{color:gray;text-decoration:line-through;cursor:not-allowed}button{background-color:transparent;border:none;cursor:pointer;font-size:16px}.performanceheading{color:var(--Gray-900, #101828);font-size:18px;font-style:normal;font-weight:600;line-height:28px}\n"] }]
|
|
108
|
+
}], propDecorators: { startDate: [{
|
|
109
|
+
type: Input
|
|
110
|
+
}], endDate: [{
|
|
111
|
+
type: Input
|
|
112
|
+
}], predefinedDates: [{
|
|
113
|
+
type: Input
|
|
114
|
+
}], selectedDates: [{
|
|
115
|
+
type: Output
|
|
116
|
+
}] } });
|
|
117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktZGF0ZS1kYXRlcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJheC9zcmMvbGliL2NvbXBvbmVudHMvbXVsdGktZGF0ZS1kYXRlcGlja2VyL211bHRpLWRhdGUtZGF0ZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL211bHRpLWRhdGUtZGF0ZXBpY2tlci9tdWx0aS1kYXRlLWRhdGVwaWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7OztBQU8xQixNQUFNLE9BQU8sNEJBQTRCO0lBQ3ZDLEtBQUssR0FBQyxLQUFLLENBQUM7SUFDSCxTQUFTLENBQUs7SUFDZCxPQUFPLENBQUs7SUFDWixlQUFlLEdBQU8sRUFBRSxDQUFDO0lBQ3hCLGFBQWEsR0FBMkIsSUFBSSxZQUFZLEVBQVksQ0FBQztJQUMvRSxXQUFXLEdBQVcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMvQyxZQUFZLEdBQVcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3QyxRQUFRLEdBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRSxVQUFVLEdBQWEsQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFF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QkFBZixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0ksYUFBYTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLW11bHRpLWRhdGUtZGF0ZXBpY2tlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL211bHRpLWRhdGUtZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL211bHRpLWRhdGUtZGF0ZXBpY2tlci5jb21wb25lbnQuc2NzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIE11bHRpRGF0ZURhdGVwaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXR7XHJcbiAgZGF5anM9ZGF5anM7XHJcbiAgQElucHV0KCkgc3RhcnREYXRlOmFueTtcclxuICBASW5wdXQoKSBlbmREYXRlOmFueTtcclxuICBASW5wdXQoKSBwcmVkZWZpbmVkRGF0ZXM6YW55ID0gW107XHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkRGF0ZXMgOkV2ZW50RW1pdHRlcjxzdHJpbmdbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZ1tdPigpO1xyXG4gIGN1cnJlbnRZZWFyOiBudW1iZXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7XHJcbiAgY3VycmVudE1vbnRoOiBudW1iZXIgPSBuZXcgRGF0ZSgpLmdldE1vbnRoKCk7XHJcbiAgZGF5TmFtZXM6IHN0cmluZ1tdID0gWydNbycsICdUdScsICdXZScsICdUaCcsICdGcicsICdTYScsICdTdSddO1xyXG4gIG1vbnRoTmFtZXM6IHN0cmluZ1tdID0gWydKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ107XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5wcmVkZWZpbmVkRGF0ZXMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMucHJlZGVmaW5lZERhdGVzKSlcclxuICB9XHJcblxyXG4gIGdldERheXNJbk1vbnRoKCk6IG51bWJlcltdIHtcclxuICAgIGNvbnN0IGRheXNJbk1vbnRoID0gbmV3IERhdGUodGhpcy5jdXJyZW50WWVhciwgdGhpcy5jdXJyZW50TW9udGggKyAxLCAwKS5nZXREYXRlKCk7XHJcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogZGF5c0luTW9udGggfSwgKF8sIGkpID0+IGkgKyAxKTtcclxuICB9XHJcblxyXG4gIGdldEVtcHR5RGF5cygpOiBudW1iZXJbXSB7XHJcbiAgICBjb25zdCBmaXJzdERheU9mTW9udGggPSBuZXcgRGF0ZSh0aGlzLmN1cnJlbnRZZWFyLCB0aGlzLmN1cnJlbnRNb250aCwgMSkuZ2V0RGF5KCk7XHJcbiAgICByZXR1cm4gQXJyYXkoZmlyc3REYXlPZk1vbnRoID09PSAwID8gNiA6IGZpcnN0RGF5T2ZNb250aCAtIDEpLmZpbGwoMCk7XHJcbiAgfVxyXG5cclxuICBpc1ByZWRlZmluZWQoZGF5OiBhbnkpOiBib29sZWFuIHtcclxuICAgIGRheSA9IGRheSA8IDEwID8gYDAke2RheX1gIDogZGF5O1xyXG4gICAgbGV0IGRhdGU6YW55ID0gZGF5KyctJysodGhpcy5jdXJyZW50TW9udGggKyAxKSsnLScrdGhpcy5jdXJyZW50WWVhcjtcclxuICAgIHJldHVybiB0aGlzLnByZWRlZmluZWREYXRlcy5pbmNsdWRlcyhkYXRlKTtcclxuICB9XHJcblxyXG4gIHByZXZpb3VzTW9udGgoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jdXJyZW50TW9udGggPT09IDApIHtcclxuICAgICAgdGhpcy5jdXJyZW50TW9udGggPSAxMTtcclxuICAgICAgdGhpcy5jdXJyZW50WWVhci0tO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jdXJyZW50TW9udGgtLTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5leHRNb250aCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmN1cnJlbnRNb250aCA9PT0gMTEpIHtcclxuICAgICAgdGhpcy5jdXJyZW50TW9udGggPSAwO1xyXG4gICAgICB0aGlzLmN1cnJlbnRZZWFyKys7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmN1cnJlbnRNb250aCsrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkUHJlZGVmaW5lZERheXMoZGF5OmFueSkge1xyXG4gICAgZGF5ID0gZGF5IDwgMTAgPyBgMCR7ZGF5fWAgOiBkYXk7XHJcbiAgICBsZXQgZGF0ZTphbnkgPSBkYXkrJy0nKyh0aGlzLmN1cnJlbnRNb250aCArIDEpKyctJyt0aGlzLmN1cnJlbnRZZWFyO1xyXG4gICAgbGV0IGZpbmREYXlJZHggPSB0aGlzLnByZWRlZmluZWREYXRlcy5maW5kSW5kZXgoKGl0ZW06YW55KSA9PiBpdGVtID09IGRhdGUpO1xyXG4gICAgaWYoZmluZERheUlkeCAhPSAtMSkge1xyXG4gICAgICB0aGlzLnByZWRlZmluZWREYXRlcy5zcGxpY2UoZmluZERheUlkeCwxKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLnByZWRlZmluZWREYXRlcy5wdXNoIChkYXRlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZhbGlkYXRlRGF0ZXMoZGF5OmFueSkge1xyXG4gICAgZGF5ID0gZGF5IDwgMTAgPyBgMCR7ZGF5fWAgOiBkYXk7XHJcbiAgICBsZXQgZGF0ZTphbnkgPSB0aGlzLmN1cnJlbnRZZWFyICsgJy0nICsgKHRoaXMuY3VycmVudE1vbnRoICsgMSkgKyAnLScgKyBkYXk7XHJcbiAgICBsZXQgc0RhdGUgPSB0aGlzLmRheWpzKHRoaXMuc3RhcnREYXRlLCAnWVlZWS1NTS1ERCcpO1xyXG4gICAgbGV0IGVEYXRlID0gdGhpcy5kYXlqcyh0aGlzLmVuZERhdGUsICdZWVlZLU1NLUREJyk7XHJcbiAgICBkYXRlID0gdGhpcy5kYXlqcyhkYXRlLCAnWVlZWS1NTS1ERCcpO1xyXG4gICAgaWYoZGF0ZS5kaWZmKHNEYXRlLCdkJykgPj0gMCAmJiBlRGF0ZS5kaWZmKGRhdGUsJ2QnKSA+PSAwKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBcclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHNob3dQcmV2KCkge1xyXG4gICAgbGV0IGRhdGU6YW55ID0gdGhpcy5jdXJyZW50WWVhcisnLScgKyAodGhpcy5jdXJyZW50TW9udGggKyAxKSsgJy0wMSc7XHJcbiAgICBkYXRlID0gdGhpcy5kYXlqcyhkYXRlLCdZWVlZLU1NLUREJykuc3VidHJhY3QoMSwnbW9udGgnKTtcclxuICAgIGxldCBzRGF0ZSA9IHRoaXMuZGF5anModGhpcy5zdGFydERhdGUsJ1lZWVktTU0tREQnKTtcclxuICAgIGlmKGRhdGUuZGlmZihzRGF0ZSwnbScpID49IDApIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGVsc2UgaWYoZGF0ZS5tb250aCgpID09IHNEYXRlLm1vbnRoKCkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93TmV4dCgpIHtcclxuICAgIGxldCBkYXRlOmFueSA9IHRoaXMuY3VycmVudFllYXIrJy0nICsgKHRoaXMuY3VycmVudE1vbnRoICsgMSkrICctMDEnO1xyXG4gICAgZGF0ZSA9IHRoaXMuZGF5anMoZGF0ZSwnWVlZWS1NTS1ERCcpLmFkZCgxLCdtb250aCcpO1xyXG4gICAgbGV0IGVEYXRlID0gdGhpcy5kYXlqcyh0aGlzLmVuZERhdGUsJ1lZWVktTU0tREQnKTtcclxuICAgIGlmKGVEYXRlLmRpZmYoZGF0ZSwnbScpID49IDApIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGVsc2UgaWYoZGF0ZS5tb250aCgpID09IGVEYXRlLm1vbnRoKCkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhcHBseURhdGUoKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZXMuZW1pdCh0aGlzLnByZWRlZmluZWREYXRlcyk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJjYWxlbmRhci1jb250YWluZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1oZWFkZXIgbXktMyBteC01XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwicHJldmlvdXNNb250aCgpXCIgW3N0eWxlXT1cIiFzaG93UHJldigpID8ge3Zpc2liaWxpdHk6ICdoaWRkZW4nfTp7fVwiPjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIlxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMi41IDE1TDcuNSAxMEwxMi41IDVcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS42N1wiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7IG1vbnRoTmFtZXNbY3VycmVudE1vbnRoXSB9fSB7eyBjdXJyZW50WWVhciB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJuZXh0TW9udGgoKVwiIFtzdHlsZV09XCIhc2hvd05leHQoKSA/IHt2aXNpYmlsaXR5OiAnaGlkZGVuJ30gOiB7fVwiPjxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMjBcIlxyXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03LjUgMTVMMTIuNSAxMEw3LjUgNVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItYm9keSBteS00XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXktbmFtZXNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGRheSBvZiBkYXlOYW1lc1wiPnt7IGRheSB9fTwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWRheXNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IF8gb2YgZ2V0RW1wdHlEYXlzKClcIiBjbGFzcz1cImVtcHR5LWRheVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZGF5IG9mIGdldERheXNJbk1vbnRoKClcIiBbY2xhc3NdID1cInZhbGlkYXRlRGF0ZXMoZGF5KSA9PT0gdHJ1ZSA/ICdjdXJzb3ItcG9pbnRlcicgOiAnZGlzYWJsZWQtZGF5J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VsZWN0ZWQtZGF5JzogaXNQcmVkZWZpbmVkKGRheSkgfVwiIChjbGljayk9XCJ2YWxpZGF0ZURhdGVzKGRheSkgPT09IHRydWUgPyBhZGRQcmVkZWZpbmVkRGF5cyhkYXkpIDogJydcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBkYXkgfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItZm9vdGVyIGFsaWduLXNlbGYtZW5kXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b24gbXMtMlwiIChjbGljayk9XCJhcHBseURhdGUoKTtcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLWJsb2NrIHctMTAwIHJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgQXBwbHlcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj4iXX0=
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { BehaviorSubject } from "rxjs";
|
|
3
|
+
import dayjs from "dayjs";
|
|
4
|
+
import utc from 'dayjs/plugin/utc';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../../services/trax.service";
|
|
7
|
+
import * as i2 from "tango-app-ui-shared";
|
|
8
|
+
import * as i3 from "tango-app-ui-global";
|
|
9
|
+
import * as i4 from "@angular/common";
|
|
10
|
+
import * as i5 from "@angular/forms";
|
|
11
|
+
import * as i6 from "ngx-daterangepicker-material";
|
|
12
|
+
dayjs.extend(utc);
|
|
13
|
+
export class OrdersComponent {
|
|
14
|
+
sopService;
|
|
15
|
+
toastService;
|
|
16
|
+
pageInfo;
|
|
17
|
+
dayjs = dayjs;
|
|
18
|
+
displayedColumns = [];
|
|
19
|
+
date = this.dayjs().add(1, 'day').format();
|
|
20
|
+
dataSource = [];
|
|
21
|
+
storeCodes = '';
|
|
22
|
+
isAuthorized = 'UNAUTHORIZED';
|
|
23
|
+
isCustomDate = (m) => {
|
|
24
|
+
const isValidDate = m > this.dayjs().add(3, 'day') || m < this.dayjs();
|
|
25
|
+
return isValidDate ? 'invalid-date' : false;
|
|
26
|
+
};
|
|
27
|
+
selectedDateRange = { startDate: this.dayjs().add(1, 'day'), endDate: this.dayjs().add(1, 'day') };
|
|
28
|
+
tableApiState = new BehaviorSubject('initial');
|
|
29
|
+
constructor(sopService, toastService, pageInfo) {
|
|
30
|
+
this.sopService = sopService;
|
|
31
|
+
this.toastService = toastService;
|
|
32
|
+
this.pageInfo = pageInfo;
|
|
33
|
+
}
|
|
34
|
+
ngOnInit() {
|
|
35
|
+
this.sopService.isLocusAuthorized().subscribe((res) => {
|
|
36
|
+
this.isAuthorized = res.message || 'UNAUTHORIZED';
|
|
37
|
+
if (this.isAuthorized === 'AUTHORIZED') {
|
|
38
|
+
this.setPageData();
|
|
39
|
+
this.getOrdersByDate();
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
setPageData() {
|
|
44
|
+
this.pageInfo.setTitle("Create Order");
|
|
45
|
+
this.pageInfo.setDescription("Create order ID list to map with Locus");
|
|
46
|
+
this.pageInfo.setBreadcrumbs([
|
|
47
|
+
{ title: "Analyze", path: "/manage/trax/dashboard", isActive: false, isSeparator: false },
|
|
48
|
+
{ title: "Analyze", path: "/manage/trax/dashboard", isActive: false, isSeparator: true },
|
|
49
|
+
{ title: "Tango Trax", path: "/manage/trax/dashboard", isActive: false, isSeparator: false },
|
|
50
|
+
{ title: "Tango Trax", path: "/manage/trax/dashboard", isActive: false, isSeparator: true },
|
|
51
|
+
]);
|
|
52
|
+
}
|
|
53
|
+
getOrdersByDate() {
|
|
54
|
+
this.tableApiState.next('loading');
|
|
55
|
+
const reqBody = {
|
|
56
|
+
date: this.date
|
|
57
|
+
};
|
|
58
|
+
this.sopService.getOrdersByDate(reqBody).subscribe({
|
|
59
|
+
next: (res) => {
|
|
60
|
+
this.tableApiState.next('loaded');
|
|
61
|
+
if (res?.data?.length) {
|
|
62
|
+
this.dataSource = res?.data;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
this.dataSource = [];
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
error: () => {
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
onDateChange(event) {
|
|
73
|
+
if (!event?.startDate) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
this.date = this.dayjs(event.startDate).format();
|
|
77
|
+
this.storeCodes = '';
|
|
78
|
+
this.getOrdersByDate();
|
|
79
|
+
}
|
|
80
|
+
updateOrder() {
|
|
81
|
+
const reqBody = {
|
|
82
|
+
storeCodes: this.storeCodes,
|
|
83
|
+
date: this.date
|
|
84
|
+
};
|
|
85
|
+
this.sopService.orderUpdate(reqBody).subscribe({
|
|
86
|
+
next: (res) => {
|
|
87
|
+
if (res?.code === 200) {
|
|
88
|
+
this.storeCodes = '';
|
|
89
|
+
if (res.message === 'Updated successfully') {
|
|
90
|
+
this.toastService.getSuccessToast(res.message);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
this.toastService.getErrorToast(res.message);
|
|
94
|
+
}
|
|
95
|
+
this.getOrdersByDate();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
deleteOrder(id) {
|
|
101
|
+
const reqBody = {
|
|
102
|
+
_id: id
|
|
103
|
+
};
|
|
104
|
+
this.sopService.orderDelete(reqBody).subscribe({
|
|
105
|
+
next: (res) => {
|
|
106
|
+
if (res?.code === 200) {
|
|
107
|
+
this.toastService.getSuccessToast(res.message);
|
|
108
|
+
this.getOrdersByDate();
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
sortTableData(event) {
|
|
114
|
+
if (event?.direction === 'asc' || 'desc') {
|
|
115
|
+
this.dataSource = this.sortObjectArray([...this.dataSource], event);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
sortObjectArray(dataArray, sortConfig) {
|
|
119
|
+
const { active, direction } = sortConfig;
|
|
120
|
+
const sortOrder = direction.toLowerCase() === 'asc' ? 1 : -1;
|
|
121
|
+
return dataArray.sort((a, b) => {
|
|
122
|
+
const valueA = (a[active] || '').toString().toLowerCase();
|
|
123
|
+
const valueB = (b[active] || '').toString().toLowerCase();
|
|
124
|
+
if (valueA < valueB) {
|
|
125
|
+
return -1 * sortOrder;
|
|
126
|
+
}
|
|
127
|
+
else if (valueA > valueB) {
|
|
128
|
+
return 1 * sortOrder;
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
return 0;
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
exportAsExcel() {
|
|
136
|
+
const excludeKeys = ['createdAt', 'updatedAt', '_id', 'date', 'type'];
|
|
137
|
+
const excludedData = this.removeExcludedKeys(this.dataSource, excludeKeys);
|
|
138
|
+
const exportData = this.replaceUnderscoreInKeys(excludedData);
|
|
139
|
+
this.sopService.exportAsCSVFile(exportData, `${this.dayjs(this.date).format('DD_MM_YYYY')}_List`);
|
|
140
|
+
}
|
|
141
|
+
removeExcludedKeys(dataArray, excludeKeys) {
|
|
142
|
+
return dataArray.map(item => {
|
|
143
|
+
const newItem = {};
|
|
144
|
+
for (const key in item) {
|
|
145
|
+
if (item.hasOwnProperty(key) && !excludeKeys.includes(key)) {
|
|
146
|
+
newItem[key] = item[key];
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return newItem;
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
replaceUnderscoreInKeys(dataArray) {
|
|
153
|
+
return dataArray.map(item => {
|
|
154
|
+
const newItem = {};
|
|
155
|
+
for (const key in item) {
|
|
156
|
+
if (item.hasOwnProperty(key)) {
|
|
157
|
+
const newKey = key.replace(/_/g, ' ');
|
|
158
|
+
newItem[newKey] = item[key];
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return newItem;
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OrdersComponent, deps: [{ token: i1.TraxService }, { token: i2.ToastService }, { token: i3.PageInfoService }], target: i0.ɵɵFactoryTarget.Component });
|
|
165
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: OrdersComponent, selector: "lib-orders", ngImport: i0, template: "<ng-container *ngIf=\"isAuthorized === 'AUTHORIZED'\" >\r\n <div class=\"row\">\r\n <div class=\"col-md-12 my-2\">\r\n <div class=\" card\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12\">\r\n <div class=\"card-header border-0 pt-4 px-4\">\r\n <h3 class=\"card-title align-items-start flex-column\">\r\n <span class=\"card-label mb-2\">Task Configuration</span>\r\n </h3>\r\n <div class=\"card-toolbar\">\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon footfallsearch svg-icon-1 position-absolute ms-4\">\r\n <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\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\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\">\r\n </path>\r\n </svg>\r\n </span>\r\n\r\n <input class=\"fx-date-range form-control ps-14\"\r\n style=\"min-width: 100px !important;\" type=\"text\" matInput\r\n ngxDaterangepickerMd [singleDatePicker]=\"true\" [drops]=\"'down'\"\r\n [opens]=\"'right'\" [alwaysShowCalendars]=\"false\"\r\n [keepCalendarOpeningWithRange]=\"true\" [showCancel]=\"false\"\r\n autocomplete=\"off\" [(ngModel)]=\"selectedDateRange\"\r\n [ngModelOptions]=\"{standalone: true}\"\r\n (startDateChanged)=\"onDateChange($event)\" [isCustomDate]=\"isCustomDate\"\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 name=\"daterange\" [readonly]=\"true\" />\r\n\r\n <button [disabled]=\"!dataSource.length\" (click)=\"exportAsExcel()\" type=\"button\"\r\n class=\"btn-outline btn align-items-end text-nowrap invheader ms-4\">\r\n <!-- Export Icon -->\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\r\n 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\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"></path>\r\n </svg>\r\n <span class=\"ms-2\"></span> Export\r\n </button>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-body p-0\">\r\n <ng-container>\r\n <ng-container\r\n *ngIf=\"(tableApiState | async) === 'loaded' \">\r\n <div class=\"table-responsive px-4\">\r\n <table class=\"table text-nowrap bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>Action</th>\r\n <th>Task ID</th>\r\n <th>Service Type</th>\r\n <th>Customer Name</th>\r\n <th>Customer Contact</th>\r\n <th>Customer Address</th>\r\n <th>City</th>\r\n <th>State</th>\r\n <th>Country</th>\r\n <th>Customer Zipcode</th>\r\n <th>Latitude</th>\r\n <th>Longitude</th>\r\n <th>Task Date</th>\r\n <th>Task Start Time</th>\r\n <th>Task End Time</th>\r\n <th>TAT</th>\r\n <th>Payment Method</th>\r\n <th>Amount</th>\r\n <th>Note</th>\r\n <th>user ID</th>\r\n </tr>\r\n <tr>\r\n <th style=\"background-color: unset !important; border-bottom: unset !important;\" ></th>\r\n <th style=\"background-color: unset !important; border-bottom: unset !important;\" ></th>\r\n <th style=\"background-color: unset !important; border-bottom: unset !important;\" ></th>\r\n <th style=\"background-color: unset !important; border-bottom: unset !important; padding-left: unset !important;\" >\r\n <input (keydown.enter)=\"updateOrder()\" [(ngModel)]=\"storeCodes\" style=\"min-width: 250px;\" class=\"form-control\" type=\"text\">\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let element of dataSource\">\r\n <td>\r\n <div class=\"d-flex align-items-center justify-content-center\">\r\n <svg (click)=\"deleteOrder(element?._id)\" class=\"cursor-pointer\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <path d=\"M15 5L5 15M5 5L15 15\" stroke=\"#667085\" stroke-width=\"1.66667\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"data\">{{element?.Task_ID}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\" >{{element?.Service_Type}}</div>\r\n </td>\r\n \r\n <td>\r\n <div class=\"data\">{{element?.Customer_Name}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\">{{element?.Customer_Contact}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\">{{element?.Customer_Address}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\" >{{element?.City}}</div>\r\n </td>\r\n \r\n <td>\r\n <div class=\"data\">{{element?.State}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\">{{element?.Country}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\">{{element?.Customer_Zipcode}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\" >{{element?.Latitude}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\" >{{element?.Longitude}}</div>\r\n </td>\r\n \r\n <td>\r\n <div class=\"data\">{{element?.Task_Date}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\">{{element?.Task_Start_Time}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\">{{element?.Task_End_Time}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\" >{{element?.TAT}}</div>\r\n </td>\r\n \r\n <td>\r\n <div class=\"data\">{{element?.Payment_Method}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\">{{element?.Amount}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\">{{element?.Note}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\">{{element?.user_ID}}</div>\r\n </td>\r\n \r\n \r\n \r\n </tr>\r\n </tbody>\r\n </table>\r\n \r\n </div>\r\n \r\n </ng-container>\r\n </ng-container>\r\n <ng-container\r\n *ngIf=\"(tableApiState | async) === 'loading' || (tableApiState | async) === 'initial'\">\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 </ng-container>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n </div>\r\n</ng-container>\r\n", styles: [".data{color:var(--Gray-500, #667085);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:20px}.data-dark{color:var(--Gray-900, #101828);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:20px}.view{color:var(--Primary-700, #009BF3);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-decoration-line:underline;text-transform:capitalize}.rotate{rotate:180deg;transition:1s}:host::ng-deep .md-drppicker .btn{line-height:10px!important}:host::ng-deep .daterangepicker-input+.ngx-daterangepicker-material .applyBtn{display:none}:host::ng-deep .md-drppicker.drops-down-right.ltr.show-ranges.shown{top:65px!important}:host::ng-deep .md-drppicker.drops-down-right.ltr.double.show-ranges.shown{top:65px!important;right:-475px!important;left:unset!important;height:400px!important}:host::ng-deep .md-drppicker .btn{border-radius:8px!important;border:1px solid var(--Primary-600, #00A3FF)!important;background:var(--Primary-600, #00A3FF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--White, #FFF)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize}:host::ng-deep .md-drppicker .ranges ul li button{padding:12px 16px;width:160px;color:var(--Gray-700, #344054);font-size:14px;font-weight:400;line-height:20px;background:none;border:none;text-align:left;cursor:pointer}:host::ng-deep .md-drppicker td.active,:host::ng-deep .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px!important;color:var(--White, #FFF)!important;text-align:center!important;font-size:14px!important;font-weight:500!important;line-height:20px}:host::ng-deep .md-drppicker.ltr .ranges{float:left;margin-top:10px!important}:host::ng-deep .md-drppicker td.in-range{background:var(--Primary-50, #EAF8FF)}:host::ng-deep .md-drppicker .ranges ul li button.active{background:var(--Primary-50, #EAF8FF)!important;border-radius:8px!important;color:var(--Primary-700, #009BF3);font-size:14px!important;font-weight:500!important;line-height:20px!important}:host::ng-deep .md-drppicker table th,:host::ng-deep table td{width:40px!important;height:40px!important;padding:10px 8px!important}:host::ng-deep .md-drppicker td.available.prev,:host::ng-deep .md-drppicker th.available.prev{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .md-drppicker td.available.next,:host::ng-deep .md-drppicker th.available.next{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .md-drppicker table th{border-bottom:0px solid var(--Gray-200, #EAECF0)!important;background:transparent!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:16px!important;font-weight:500!important;line-height:24px}:host::ng-deep .md-drppicker .btn.btn-default{border-radius:8px!important;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize;margin-right:10px!important}:host::ng-deep .md-drppicker td.available.invalid-date{text-decoration:line-through;pointer-events:none;color:#a9a9a9}:host::ng-deep .md-drppicker td.available.today:not(.invalid-date){text-decoration:unset;pointer-events:unset;color:unset}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.DaterangepickerDirective, selector: "input[ngxDaterangepickerMd]", inputs: ["minDate", "maxDate", "autoApply", "alwaysShowCalendars", "showCustomRangeLabel", "linkedCalendars", "dateLimit", "singleDatePicker", "showWeekNumbers", "showISOWeekNumbers", "showDropdowns", "isInvalidDate", "isCustomDate", "isTooltipDate", "showClearButton", "customRangeDirection", "ranges", "opens", "drops", "firstMonthDayClass", "lastMonthDayClass", "emptyWeekRowClass", "emptyWeekColumnClass", "firstDayOfNextMonthClass", "lastDayOfPreviousMonthClass", "keepCalendarOpeningWithRange", "showRangeLabelOnInput", "showCancel", "lockStartDate", "timePicker", "timePicker24Hour", "timePickerIncrement", "timePickerSeconds", "closeOnAutoApply", "endKeyHolder", "startKey", "locale", "endKey"], outputs: ["change", "rangeClicked", "datesUpdated", "startDateChanged", "endDateChanged", "clearClicked"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] });
|
|
166
|
+
}
|
|
167
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OrdersComponent, decorators: [{
|
|
168
|
+
type: Component,
|
|
169
|
+
args: [{ selector: 'lib-orders', template: "<ng-container *ngIf=\"isAuthorized === 'AUTHORIZED'\" >\r\n <div class=\"row\">\r\n <div class=\"col-md-12 my-2\">\r\n <div class=\" card\">\r\n <div class=\"row\">\r\n <div class=\"col-lg-12\">\r\n <div class=\"card-header border-0 pt-4 px-4\">\r\n <h3 class=\"card-title align-items-start flex-column\">\r\n <span class=\"card-label mb-2\">Task Configuration</span>\r\n </h3>\r\n <div class=\"card-toolbar\">\r\n <div class=\"d-flex\">\r\n <div class=\"d-flex align-items-center position-relative my-1\">\r\n <span class=\"svg-icon footfallsearch svg-icon-1 position-absolute ms-4\">\r\n <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\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\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\">\r\n </path>\r\n </svg>\r\n </span>\r\n\r\n <input class=\"fx-date-range form-control ps-14\"\r\n style=\"min-width: 100px !important;\" type=\"text\" matInput\r\n ngxDaterangepickerMd [singleDatePicker]=\"true\" [drops]=\"'down'\"\r\n [opens]=\"'right'\" [alwaysShowCalendars]=\"false\"\r\n [keepCalendarOpeningWithRange]=\"true\" [showCancel]=\"false\"\r\n autocomplete=\"off\" [(ngModel)]=\"selectedDateRange\"\r\n [ngModelOptions]=\"{standalone: true}\"\r\n (startDateChanged)=\"onDateChange($event)\" [isCustomDate]=\"isCustomDate\"\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 name=\"daterange\" [readonly]=\"true\" />\r\n\r\n <button [disabled]=\"!dataSource.length\" (click)=\"exportAsExcel()\" type=\"button\"\r\n class=\"btn-outline btn align-items-end text-nowrap invheader ms-4\">\r\n <!-- Export Icon -->\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\r\n 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\"\r\n stroke=\"#344054\" stroke-width=\"1.67\" stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"></path>\r\n </svg>\r\n <span class=\"ms-2\"></span> Export\r\n </button>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"card-body p-0\">\r\n <ng-container>\r\n <ng-container\r\n *ngIf=\"(tableApiState | async) === 'loaded' \">\r\n <div class=\"table-responsive px-4\">\r\n <table class=\"table text-nowrap bottom-border\">\r\n <thead>\r\n <tr>\r\n <th>Action</th>\r\n <th>Task ID</th>\r\n <th>Service Type</th>\r\n <th>Customer Name</th>\r\n <th>Customer Contact</th>\r\n <th>Customer Address</th>\r\n <th>City</th>\r\n <th>State</th>\r\n <th>Country</th>\r\n <th>Customer Zipcode</th>\r\n <th>Latitude</th>\r\n <th>Longitude</th>\r\n <th>Task Date</th>\r\n <th>Task Start Time</th>\r\n <th>Task End Time</th>\r\n <th>TAT</th>\r\n <th>Payment Method</th>\r\n <th>Amount</th>\r\n <th>Note</th>\r\n <th>user ID</th>\r\n </tr>\r\n <tr>\r\n <th style=\"background-color: unset !important; border-bottom: unset !important;\" ></th>\r\n <th style=\"background-color: unset !important; border-bottom: unset !important;\" ></th>\r\n <th style=\"background-color: unset !important; border-bottom: unset !important;\" ></th>\r\n <th style=\"background-color: unset !important; border-bottom: unset !important; padding-left: unset !important;\" >\r\n <input (keydown.enter)=\"updateOrder()\" [(ngModel)]=\"storeCodes\" style=\"min-width: 250px;\" class=\"form-control\" type=\"text\">\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let element of dataSource\">\r\n <td>\r\n <div class=\"d-flex align-items-center justify-content-center\">\r\n <svg (click)=\"deleteOrder(element?._id)\" class=\"cursor-pointer\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\"\r\n fill=\"none\">\r\n <path d=\"M15 5L5 15M5 5L15 15\" stroke=\"#667085\" stroke-width=\"1.66667\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n </td>\r\n <td>\r\n <div class=\"data\">{{element?.Task_ID}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\" >{{element?.Service_Type}}</div>\r\n </td>\r\n \r\n <td>\r\n <div class=\"data\">{{element?.Customer_Name}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\">{{element?.Customer_Contact}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\">{{element?.Customer_Address}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\" >{{element?.City}}</div>\r\n </td>\r\n \r\n <td>\r\n <div class=\"data\">{{element?.State}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\">{{element?.Country}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\">{{element?.Customer_Zipcode}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\" >{{element?.Latitude}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\" >{{element?.Longitude}}</div>\r\n </td>\r\n \r\n <td>\r\n <div class=\"data\">{{element?.Task_Date}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\">{{element?.Task_Start_Time}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\">{{element?.Task_End_Time}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\" >{{element?.TAT}}</div>\r\n </td>\r\n \r\n <td>\r\n <div class=\"data\">{{element?.Payment_Method}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\">{{element?.Amount}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\">{{element?.Note}}</div>\r\n </td>\r\n <td>\r\n <div class=\"data\">{{element?.user_ID}}</div>\r\n </td>\r\n \r\n \r\n \r\n </tr>\r\n </tbody>\r\n </table>\r\n \r\n </div>\r\n \r\n </ng-container>\r\n </ng-container>\r\n <ng-container\r\n *ngIf=\"(tableApiState | async) === 'loading' || (tableApiState | async) === 'initial'\">\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 </ng-container>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n </div>\r\n</ng-container>\r\n", styles: [".data{color:var(--Gray-500, #667085);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:20px}.data-dark{color:var(--Gray-900, #101828);font-family:Inter;font-size:14px;font-style:normal;font-weight:500;line-height:20px}.view{color:var(--Primary-700, #009BF3);font-family:Inter;font-size:14px;font-style:normal;font-weight:600;line-height:20px;text-decoration-line:underline;text-transform:capitalize}.rotate{rotate:180deg;transition:1s}:host::ng-deep .md-drppicker .btn{line-height:10px!important}:host::ng-deep .daterangepicker-input+.ngx-daterangepicker-material .applyBtn{display:none}:host::ng-deep .md-drppicker.drops-down-right.ltr.show-ranges.shown{top:65px!important}:host::ng-deep .md-drppicker.drops-down-right.ltr.double.show-ranges.shown{top:65px!important;right:-475px!important;left:unset!important;height:400px!important}:host::ng-deep .md-drppicker .btn{border-radius:8px!important;border:1px solid var(--Primary-600, #00A3FF)!important;background:var(--Primary-600, #00A3FF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--White, #FFF)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize}:host::ng-deep .md-drppicker .ranges ul li button{padding:12px 16px;width:160px;color:var(--Gray-700, #344054);font-size:14px;font-weight:400;line-height:20px;background:none;border:none;text-align:left;cursor:pointer}:host::ng-deep .md-drppicker td.active,:host::ng-deep .md-drppicker td.active:hover{background-color:#029cf4!important;border-radius:20px!important;color:var(--White, #FFF)!important;text-align:center!important;font-size:14px!important;font-weight:500!important;line-height:20px}:host::ng-deep .md-drppicker.ltr .ranges{float:left;margin-top:10px!important}:host::ng-deep .md-drppicker td.in-range{background:var(--Primary-50, #EAF8FF)}:host::ng-deep .md-drppicker .ranges ul li button.active{background:var(--Primary-50, #EAF8FF)!important;border-radius:8px!important;color:var(--Primary-700, #009BF3);font-size:14px!important;font-weight:500!important;line-height:20px!important}:host::ng-deep .md-drppicker table th,:host::ng-deep table td{width:40px!important;height:40px!important;padding:10px 8px!important}:host::ng-deep .md-drppicker td.available.prev,:host::ng-deep .md-drppicker th.available.prev{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .md-drppicker td.available.next,:host::ng-deep .md-drppicker th.available.next{background-image:url(data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMy43IDYiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDMuNyA2IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGQ9Ik0zLjcsMC43TDEuNCwzbDIuMywyLjNMMyw2TDAsM2wzLTNMMy43LDAuN3oiLz4NCjwvZz4NCjwvc3ZnPg0K)!important;background-repeat:no-repeat!important;background-size:.5em!important;background-position:center!important}:host::ng-deep .md-drppicker table th{border-bottom:0px solid var(--Gray-200, #EAECF0)!important;background:transparent!important;color:var(--Gray-700, #344054)!important;text-align:center;font-size:16px!important;font-weight:500!important;line-height:24px}:host::ng-deep .md-drppicker .btn.btn-default{border-radius:8px!important;border:1px solid var(--Gray-300, #D0D5DD)!important;background:var(--White, #FFF)!important;box-shadow:0 1px 2px #1018280d!important;color:var(--Gray-700, #344054)!important;font-size:14px!important;font-weight:600!important;line-height:20px;text-transform:capitalize;margin-right:10px!important}:host::ng-deep .md-drppicker td.available.invalid-date{text-decoration:line-through;pointer-events:none;color:#a9a9a9}:host::ng-deep .md-drppicker td.available.today:not(.invalid-date){text-decoration:unset;pointer-events:unset;color:unset}\n"] }]
|
|
170
|
+
}], ctorParameters: () => [{ type: i1.TraxService }, { type: i2.ToastService }, { type: i3.PageInfoService }] });
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFuYWx5c2UtdHJheC9zcmMvbGliL2NvbXBvbmVudHMvb3JkZXJzL29yZGVycy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL29yZGVycy9vcmRlcnMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUVsRCxPQUFPLEVBQUUsZUFBZSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7Ozs7QUFHbkMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQU9sQixNQUFNLE9BQU8sZUFBZTtJQWlCTjtJQUFpQztJQUFtQztJQWZ4RixLQUFLLEdBQUcsS0FBSyxDQUFBO0lBQ2IsZ0JBQWdCLEdBQWEsRUFBRSxDQUFDO0lBQ2hDLElBQUksR0FBVyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUNsRCxVQUFVLEdBQVUsRUFBRSxDQUFDO0lBQ3ZCLFVBQVUsR0FBVyxFQUFFLENBQUE7SUFDdkIsWUFBWSxHQUFrQyxjQUFjLENBQUE7SUFDNUQsWUFBWSxHQUFHLENBQUMsQ0FBYyxFQUFFLEVBQUU7UUFDaEMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7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QixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtnQkFDdEIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUM1QixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDdEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDN0I7YUFDRjtZQUNELE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0FyTFUsZUFBZTs0RkFBZixlQUFlLGtEQ2Q1QixzaGVBMk1BOzs0RkQ3TGEsZUFBZTtrQkFMM0IsU0FBUzsrQkFDRSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVHJheFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90cmF4LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3R9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCBkYXlqcyBmcm9tIFwiZGF5anNcIjtcclxuaW1wb3J0IHV0YyBmcm9tICdkYXlqcy9wbHVnaW4vdXRjJztcclxuaW1wb3J0IHsgVG9hc3RTZXJ2aWNlIH0gZnJvbSAndGFuZ28tYXBwLXVpLXNoYXJlZCc7XHJcbmltcG9ydCB7IFBhZ2VJbmZvU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xyXG5kYXlqcy5leHRlbmQodXRjKTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLW9yZGVycycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL29yZGVycy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vb3JkZXJzLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIE9yZGVyc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gIGRheWpzID0gZGF5anNcclxuICBkaXNwbGF5ZWRDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGRhdGU6IHN0cmluZyA9IHRoaXMuZGF5anMoKS5hZGQoMSwgJ2RheScpLmZvcm1hdCgpXHJcbiAgZGF0YVNvdXJjZTogYW55W10gPSBbXTtcclxuICBzdG9yZUNvZGVzOiBzdHJpbmcgPSAnJ1xyXG4gIGlzQXV0aG9yaXplZDogJ0FVVEhPUklaRUQnIHwgJ1VOQVVUSE9SSVpFRCcgPSAnVU5BVVRIT1JJWkVEJ1xyXG4gIGlzQ3VzdG9tRGF0ZSA9IChtOiBkYXlqcy5EYXlqcykgPT4ge1xyXG4gICAgY29uc3QgaXNWYWxpZERhdGUgPSBtID4gdGhpcy5kYXlqcygpLmFkZCgzLCAnZGF5JykgfHwgbSA8IHRoaXMuZGF5anMoKTtcclxuICAgIHJldHVybiBpc1ZhbGlkRGF0ZSA/ICdpbnZhbGlkLWRhdGUnIDogZmFsc2U7XHJcbiAgfVxyXG4gIHNlbGVjdGVkRGF0ZVJhbmdlOmFueSA9IHtzdGFydERhdGU6dGhpcy5kYXlqcygpLmFkZCgxLCAnZGF5JyksIGVuZERhdGU6dGhpcy5kYXlqcygpLmFkZCgxLCAnZGF5Jyl9IFxyXG4gIHRhYmxlQXBpU3RhdGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PCdpbml0aWFsJyB8ICdsb2FkaW5nJyB8ICdsb2FkZWQnPignaW5pdGlhbCcpXHJcblxyXG5cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzb3BTZXJ2aWNlOiBUcmF4U2VydmljZSwgcHJpdmF0ZSB0b2FzdFNlcnZpY2U6VG9hc3RTZXJ2aWNlLCBwcml2YXRlIHBhZ2VJbmZvOlBhZ2VJbmZvU2VydmljZSkgeyB9XHJcblxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc29wU2VydmljZS5pc0xvY3VzQXV0aG9yaXplZCgpLnN1YnNjcmliZSgocmVzOmFueSk9PntcclxuICAgICAgdGhpcy5pc0F1dGhvcml6ZWQgPSByZXMubWVzc2FnZSB8fCAnVU5BVVRIT1JJWkVEJ1xyXG4gICAgICBpZih0aGlzLmlzQXV0aG9yaXplZCA9PT0gJ0FVVEhPUklaRUQnKXtcclxuICAgICAgICB0aGlzLnNldFBhZ2VEYXRhKClcclxuICAgICAgICB0aGlzLmdldE9yZGVyc0J5RGF0ZSgpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gIH1cclxuXHJcbiAgc2V0UGFnZURhdGEoKSB7XHJcbiAgICB0aGlzLnBhZ2VJbmZvLnNldFRpdGxlKFwiQ3JlYXRlIE9yZGVyXCIpO1xyXG4gICAgdGhpcy5wYWdlSW5mby5zZXREZXNjcmlwdGlvbihcIkNyZWF0ZSBvcmRlciBJRCBsaXN0IHRvIG1hcCB3aXRoIExvY3VzXCIpO1xyXG4gICAgdGhpcy5wYWdlSW5mby5zZXRCcmVhZGNydW1icyhbXHJcbiAgICAgIHsgdGl0bGU6IFwiQW5hbHl6ZVwiLCBwYXRoOiBcIi9tYW5hZ2UvdHJheC9kYXNoYm9hcmRcIiwgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogZmFsc2UgfSxcclxuICAgICAgeyB0aXRsZTogXCJBbmFseXplXCIsIHBhdGg6IFwiL21hbmFnZS90cmF4L2Rhc2hib2FyZFwiLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiB0cnVlIH0sXHJcbiAgICAgIHsgdGl0bGU6IFwiVGFuZ28gVHJheFwiLCBwYXRoOiBcIi9tYW5hZ2UvdHJheC9kYXNoYm9hcmRcIiwgaXNBY3RpdmU6IGZhbHNlLCBpc1NlcGFyYXRvcjogZmFsc2UgfSxcclxuICAgICAgeyB0aXRsZTogXCJUYW5nbyBUcmF4XCIsIHBhdGg6IFwiL21hbmFnZS90cmF4L2Rhc2hib2FyZFwiLCBpc0FjdGl2ZTogZmFsc2UsIGlzU2VwYXJhdG9yOiB0cnVlIH0sXHJcbiAgICBdKTtcclxuXHJcbiAgfVxyXG5cclxuICBnZXRPcmRlcnNCeURhdGUoKSB7XHJcbiAgICB0aGlzLnRhYmxlQXBpU3RhdGUubmV4dCgnbG9hZGluZycpXHJcbiAgICBjb25zdCByZXFCb2R5ID0ge1xyXG4gICAgICBkYXRlOiB0aGlzLmRhdGVcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNvcFNlcnZpY2UuZ2V0T3JkZXJzQnlEYXRlKHJlcUJvZHkpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXM6YW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy50YWJsZUFwaVN0YXRlLm5leHQoJ2xvYWRlZCcpXHJcbiAgICAgICAgaWYgKHJlcz8uZGF0YT8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSByZXM/LmRhdGEgICAgICAgICAgXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IFtdXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG5cclxuICAgICAgZXJyb3I6KCk9PntcclxuICAgICAgICBcclxuICAgICAgfVxyXG5cclxuICAgIH0sXHJcbiAgKVxyXG4gIH1cclxuXHJcbiAgb25EYXRlQ2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICghZXZlbnQ/LnN0YXJ0RGF0ZSkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRhdGUgPSB0aGlzLmRheWpzKGV2ZW50LnN0YXJ0RGF0ZSkuZm9ybWF0KClcclxuICAgIHRoaXMuc3RvcmVDb2RlcyA9ICcnXHJcbiAgICB0aGlzLmdldE9yZGVyc0J5RGF0ZSgpXHJcbiAgfVxyXG5cclxuICB1cGRhdGVPcmRlcigpIHtcclxuXHJcbiAgICBjb25zdCByZXFCb2R5ID0ge1xyXG4gICAgICBzdG9yZUNvZGVzOiB0aGlzLnN0b3JlQ29kZXMsXHJcbiAgICAgIGRhdGU6IHRoaXMuZGF0ZVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc29wU2VydmljZS5vcmRlclVwZGF0ZShyZXFCb2R5KS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzOmFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXM/LmNvZGUgPT09IDIwMCkge1xyXG4gICAgICAgICAgdGhpcy5zdG9yZUNvZGVzID0gJydcclxuICAgICAgICAgIGlmIChyZXMubWVzc2FnZSA9PT0gJ1VwZGF0ZWQgc3VjY2Vzc2Z1bGx5Jykge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRTdWNjZXNzVG9hc3QocmVzLm1lc3NhZ2UpXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KHJlcy5tZXNzYWdlKVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuZ2V0T3JkZXJzQnlEYXRlKClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gIH1cclxuXHJcbiAgZGVsZXRlT3JkZXIoaWQ6IHN0cmluZykge1xyXG5cclxuICAgIGNvbnN0IHJlcUJvZHkgPSB7XHJcbiAgICAgIF9pZDogaWRcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNvcFNlcnZpY2Uub3JkZXJEZWxldGUocmVxQm9keSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKHJlczphbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzPy5jb2RlID09PSAyMDApIHtcclxuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldFN1Y2Nlc3NUb2FzdChyZXMubWVzc2FnZSlcclxuICAgICAgICAgIHRoaXMuZ2V0T3JkZXJzQnlEYXRlKClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gIH1cclxuXHJcbiAgc29ydFRhYmxlRGF0YShldmVudDogYW55KSB7XHJcbiAgICBpZiAoZXZlbnQ/LmRpcmVjdGlvbiA9PT0gJ2FzYycgfHwgJ2Rlc2MnKSB7XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IHRoaXMuc29ydE9iamVjdEFycmF5KFsuLi50aGlzLmRhdGFTb3VyY2VdLCBldmVudCk7XHJcbiAgICB9XHJcblxyXG5cclxuICB9XHJcblxyXG4gIHNvcnRPYmplY3RBcnJheShkYXRhQXJyYXk6IGFueVtdLCBzb3J0Q29uZmlnOiB7IGFjdGl2ZTogc3RyaW5nLCBkaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnIHwgJycgfSkge1xyXG4gICAgY29uc3QgeyBhY3RpdmUsIGRpcmVjdGlvbiB9ID0gc29ydENvbmZpZztcclxuICAgIGNvbnN0IHNvcnRPcmRlciA9IGRpcmVjdGlvbi50b0xvd2VyQ2FzZSgpID09PSAnYXNjJyA/IDEgOiAtMTtcclxuXHJcbiAgICByZXR1cm4gZGF0YUFycmF5LnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgY29uc3QgdmFsdWVBID0gKGFbYWN0aXZlXSB8fCAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICBjb25zdCB2YWx1ZUIgPSAoYlthY3RpdmVdIHx8ICcnKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgICBpZiAodmFsdWVBIDwgdmFsdWVCKSB7XHJcbiAgICAgICAgcmV0dXJuIC0xICogc29ydE9yZGVyO1xyXG4gICAgICB9IGVsc2UgaWYgKHZhbHVlQSA+IHZhbHVlQikge1xyXG4gICAgICAgIHJldHVybiAxICogc29ydE9yZGVyO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGV4cG9ydEFzRXhjZWwoKSB7XHJcbiAgICBjb25zdCBleGNsdWRlS2V5cyA9IFsnY3JlYXRlZEF0JywgJ3VwZGF0ZWRBdCcsICdfaWQnLCAnZGF0ZScsICd0eXBlJ107XHJcbiAgICBjb25zdCBleGNsdWRlZERhdGEgPSB0aGlzLnJlbW92ZUV4Y2x1ZGVkS2V5cyh0aGlzLmRhdGFTb3VyY2UsIGV4Y2x1ZGVLZXlzKVxyXG4gICAgY29uc3QgZXhwb3J0RGF0YSA9IHRoaXMucmVwbGFjZVVuZGVyc2NvcmVJbktleXMoZXhjbHVkZWREYXRhKVxyXG5cclxuICAgIHRoaXMuc29wU2VydmljZS5leHBvcnRBc0NTVkZpbGUoXHJcbiAgICAgIGV4cG9ydERhdGEsXHJcbiAgICAgIGAke3RoaXMuZGF5anModGhpcy5kYXRlKS5mb3JtYXQoJ0REX01NX1lZWVknKX1fTGlzdGBcclxuICAgICk7XHJcblxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlRXhjbHVkZWRLZXlzKGRhdGFBcnJheTogYW55W10sIGV4Y2x1ZGVLZXlzOiBzdHJpbmdbXSkge1xyXG4gICAgcmV0dXJuIGRhdGFBcnJheS5tYXAoaXRlbSA9PiB7XHJcbiAgICAgIGNvbnN0IG5ld0l0ZW06IGFueSA9IHt9O1xyXG5cclxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gaXRlbSkge1xyXG4gICAgICAgIGlmIChpdGVtLmhhc093blByb3BlcnR5KGtleSkgJiYgIWV4Y2x1ZGVLZXlzLmluY2x1ZGVzKGtleSkpIHtcclxuICAgICAgICAgIG5ld0l0ZW1ba2V5XSA9IGl0ZW1ba2V5XTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBuZXdJdGVtO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZXBsYWNlVW5kZXJzY29yZUluS2V5cyhkYXRhQXJyYXk6IGFueVtdKSB7XHJcbiAgICByZXR1cm4gZGF0YUFycmF5Lm1hcChpdGVtID0+IHtcclxuICAgICAgY29uc3QgbmV3SXRlbTogYW55ID0ge307XHJcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGl0ZW0pIHtcclxuICAgICAgICBpZiAoaXRlbS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgICBjb25zdCBuZXdLZXkgPSBrZXkucmVwbGFjZSgvXy9nLCAnICcpO1xyXG4gICAgICAgICAgbmV3SXRlbVtuZXdLZXldID0gaXRlbVtrZXldO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbmV3SXRlbTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiaXNBdXRob3JpemVkID09PSAnQVVUSE9SSVpFRCdcIiA+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBteS0yXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIgY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGJvcmRlci0wIHB0LTQgcHgtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiY2FyZC10aXRsZSBhbGlnbi1pdGVtcy1zdGFydCBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC1sYWJlbCBtYi0yXCI+VGFzayBDb25maWd1cmF0aW9uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLXRvb2xiYXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyICBwb3NpdGlvbi1yZWxhdGl2ZSBteS0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN2Zy1pY29uIGZvb3RmYWxsc2VhcmNoIHN2Zy1pY29uLTEgcG9zaXRpb24tYWJzb2x1dGUgIG1zLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTMuMzMzMyAxLjY2NjYzVjQuOTk5OTZNNi42NjY2NyAxLjY2NjYzVjQuOTk5OTZNMi41IDguMzMzMjlIMTcuNU00LjE2NjY3IDMuMzMzMjlIMTUuODMzM0MxNi43NTM4IDMuMzMzMjkgMTcuNSA0LjA3OTQ4IDE3LjUgNC45OTk5NlYxNi42NjY2QzE3LjUgMTcuNTg3MSAxNi43NTM4IDE4LjMzMzMgMTUuODMzMyAxOC4zMzMzSDQuMTY2NjdDMy4yNDYxOSAxOC4zMzMzIDIuNSAxNy41ODcxIDIuNSAxNi42NjY2VjQuOTk5OTZDMi41IDQuMDc5NDggMy4yNDYxOSAzLjMzMzI5IDQuMTY2NjcgMy4zMzMyOVpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmeC1kYXRlLXJhbmdlIGZvcm0tY29udHJvbCBwcy0xNFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6IDEwMHB4ICFpbXBvcnRhbnQ7XCIgdHlwZT1cInRleHRcIiBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5neERhdGVyYW5nZXBpY2tlck1kIFtzaW5nbGVEYXRlUGlja2VyXT1cInRydWVcIiBbZHJvcHNdPVwiJ2Rvd24nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3BlbnNdPVwiJ3JpZ2h0J1wiIFthbHdheXNTaG93Q2FsZW5kYXJzXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBba2VlcENhbGVuZGFyT3BlbmluZ1dpdGhSYW5nZV09XCJ0cnVlXCIgW3Nob3dDYW5jZWxdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiIFsobmdNb2RlbCldPVwic2VsZWN0ZWREYXRlUmFuZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGFydERhdGVDaGFuZ2VkKT1cIm9uRGF0ZUNoYW5nZSgkZXZlbnQpXCIgW2lzQ3VzdG9tRGF0ZV09XCJpc0N1c3RvbURhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvQXBwbHldPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xvY2FsZV09XCJ7IGZvcm1hdDogJ0RELU1NLVlZWVknLCBmaXJzdERheTogMSwgbW9udGhOYW1lczogWydKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ10gfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImRhdGVyYW5nZVwiIFtyZWFkb25seV09XCJ0cnVlXCIgLz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCIhZGF0YVNvdXJjZS5sZW5ndGhcIiAoY2xpY2spPVwiZXhwb3J0QXNFeGNlbCgpXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4tb3V0bGluZSBidG4gYWxpZ24taXRlbXMtZW5kIHRleHQtbm93cmFwIGludmhlYWRlciBtcy00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFeHBvcnQgSWNvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNMTcuNSAxMi41VjE1LjgzMzNDMTcuNSAxNi4yNzU0IDE3LjMyNDQgMTYuNjk5MyAxNy4wMTE4IDE3LjAxMThDMTYuNjk5MyAxNy4zMjQ0IDE2LjI3NTQgMTcuNSAxNS44MzMzIDE3LjVINC4xNjY2N0MzLjcyNDY0IDE3LjUgMy4zMDA3MiAxNy4zMjQ0IDIuOTg4MTYgMTcuMDExOEMyLjY3NTU5IDE2LjY5OTMgMi41IDE2LjI3NTQgMi41IDE1LjgzMzNWMTIuNU0xNC4xNjY3IDYuNjY2NjdMMTAgMi41TTEwIDIuNUw1LjgzMzMzIDYuNjY2NjdNMTAgMi41VjEyLjVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuNjdcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXMtMlwiPjwvc3Bhbj4gRXhwb3J0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHAtMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiKHRhYmxlQXBpU3RhdGUgfCBhc3luYykgPT09ICdsb2FkZWQnIFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZSBweC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0ZXh0LW5vd3JhcCBib3R0b20tYm9yZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+QWN0aW9uPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5UYXNrIElEPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5TZXJ2aWNlIFR5cGU8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkN1c3RvbWVyIE5hbWU8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkN1c3RvbWVyIENvbnRhY3Q8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkN1c3RvbWVyIEFkZHJlc3M8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPkNpdHk8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlN0YXRlPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5Db3VudHJ5PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5DdXN0b21lciBaaXBjb2RlPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5MYXRpdHVkZTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+TG9uZ2l0dWRlPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5UYXNrIERhdGU8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoPlRhc2sgU3RhcnQgVGltZTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+VGFzayBFbmQgVGltZTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+VEFUPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5QYXltZW50IE1ldGhvZDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+QW1vdW50PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5Ob3RlPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD51c2VyIElEPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHVuc2V0ICFpbXBvcnRhbnQ7IGJvcmRlci1ib3R0b206IHVuc2V0ICFpbXBvcnRhbnQ7XCIgPjwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogdW5zZXQgIWltcG9ydGFudDsgYm9yZGVyLWJvdHRvbTogdW5zZXQgIWltcG9ydGFudDtcIiA+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiB1bnNldCAhaW1wb3J0YW50OyBib3JkZXItYm90dG9tOiB1bnNldCAhaW1wb3J0YW50O1wiID48L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoICBzdHlsZT1cImJhY2tncm91bmQtY29sb3I6IHVuc2V0ICFpbXBvcnRhbnQ7IGJvcmRlci1ib3R0b206IHVuc2V0ICFpbXBvcnRhbnQ7IHBhZGRpbmctbGVmdDogdW5zZXQgIWltcG9ydGFudDtcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChrZXlkb3duLmVudGVyKT1cInVwZGF0ZU9yZGVyKClcIiBbKG5nTW9kZWwpXT1cInN0b3JlQ29kZXNcIiBzdHlsZT1cIm1pbi13aWR0aDogMjUwcHg7XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBlbGVtZW50IG9mIGRhdGFTb3VyY2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4ICBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIChjbGljayk9XCJkZWxldGVPcmRlcihlbGVtZW50Py5faWQpXCIgY2xhc3M9XCJjdXJzb3ItcG9pbnRlclwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE1IDVMNSAxNU01IDVMMTUgMTVcIiBzdHJva2U9XCIjNjY3MDg1XCIgc3Ryb2tlLXdpZHRoPVwiMS42NjY2N1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRhXCI+e3tlbGVtZW50Py5UYXNrX0lEfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGFcIiA+e3tlbGVtZW50Py5TZXJ2aWNlX1R5cGV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRhXCI+e3tlbGVtZW50Py5DdXN0b21lcl9OYW1lfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGFcIj57e2VsZW1lbnQ/LkN1c3RvbWVyX0NvbnRhY3R9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YVwiPnt7ZWxlbWVudD8uQ3VzdG9tZXJfQWRkcmVzc319PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRhXCIgPnt7ZWxlbWVudD8uQ2l0eX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGFcIj57e2VsZW1lbnQ/LlN0YXRlfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGFcIj57e2VsZW1lbnQ/LkNvdW50cnl9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YVwiPnt7ZWxlbWVudD8uQ3VzdG9tZXJfWmlwY29kZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRhXCIgPnt7ZWxlbWVudD8uTGF0aXR1ZGV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YVwiID57e2VsZW1lbnQ/LkxvbmdpdHVkZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGFcIj57e2VsZW1lbnQ/LlRhc2tfRGF0ZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRhXCI+e3tlbGVtZW50Py5UYXNrX1N0YXJ0X1RpbWV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YVwiPnt7ZWxlbWVudD8uVGFza19FbmRfVGltZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRhXCIgPnt7ZWxlbWVudD8uVEFUfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YVwiPnt7ZWxlbWVudD8uUGF5bWVudF9NZXRob2R9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YVwiPnt7ZWxlbWVudD8uQW1vdW50fX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGFcIj57e2VsZW1lbnQ/Lk5vdGV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YVwiPnt7ZWxlbWVudD8udXNlcl9JRH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIih0YWJsZUFwaVN0YXRlIHwgYXN5bmMpID09PSAnbG9hZGluZycgfHwgKHRhYmxlQXBpU3RhdGUgfCBhc3luYykgPT09ICdpbml0aWFsJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbG9hZGVyICBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaW1tZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIHRpdGxlXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0cm9rZSBhbmltYXRlIGxpbmtcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Ryb2tlIGFuaW1hdGUgZGVzY3JpcHRpb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgXHJcbiAgICA8L2Rpdj5cclxuPC9uZy1jb250YWluZXI+XHJcbiJdfQ==
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/common";
|
|
4
|
+
export class PaginationComponent {
|
|
5
|
+
totalItems = 0; // Total number of items
|
|
6
|
+
itemsPerPage = 10; // Items per page
|
|
7
|
+
currentPage = 1; // Current active page
|
|
8
|
+
pageChanged = new EventEmitter(); // Emit page change
|
|
9
|
+
totalPages = 0; // Total number of pages
|
|
10
|
+
maxVisiblePages = 5; // Number of visible pages at once
|
|
11
|
+
visiblePages = []; // Pages to display in the pagination component
|
|
12
|
+
ngOnChanges() {
|
|
13
|
+
this.totalPages = Math.ceil(this.totalItems / this.itemsPerPage);
|
|
14
|
+
this.visiblePages = this.getVisiblePages();
|
|
15
|
+
}
|
|
16
|
+
selectPage(page) {
|
|
17
|
+
if (page >= 1 && page <= this.totalPages) {
|
|
18
|
+
this.pageChanged.emit(page); // Emit the selected page to the parent component
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
// Pagination logic with ellipses
|
|
22
|
+
getVisiblePages() {
|
|
23
|
+
const pages = [];
|
|
24
|
+
const maxVisible = this.maxVisiblePages;
|
|
25
|
+
if (this.totalPages <= maxVisible) {
|
|
26
|
+
// If total pages are less than or equal to max visible, show all pages
|
|
27
|
+
for (let i = 1; i <= this.totalPages; i++) {
|
|
28
|
+
pages.push(i);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
if (this.currentPage <= 2) {
|
|
33
|
+
// Near the start
|
|
34
|
+
pages.push(1, 2, 3, '...', this.totalPages);
|
|
35
|
+
}
|
|
36
|
+
else if (this.currentPage >= this.totalPages - 1) {
|
|
37
|
+
// Near the end
|
|
38
|
+
pages.push(1, '...', this.totalPages - 2, this.totalPages - 1, this.totalPages);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
// Middle pages with ellipses
|
|
42
|
+
pages.push(1, '...', this.currentPage - 1, this.currentPage, this.currentPage + 1, '...', this.totalPages);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return pages;
|
|
46
|
+
}
|
|
47
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
48
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PaginationComponent, selector: "lib-pagination-v2", inputs: { totalItems: "totalItems", itemsPerPage: "itemsPerPage", currentPage: "currentPage" }, outputs: { pageChanged: "pageChanged" }, usesOnChanges: true, ngImport: i0, template: "<nav>\r\n <ul class=\"pagination justify-content-center\">\r\n <!-- Previous Button -->\r\n <li class=\"page-item\" [class.disabled]=\"currentPage === 1\">\r\n <a class=\"page-link\" (click)=\"selectPage(currentPage - 1)\" aria-label=\"Previous\">\r\n <span aria-hidden=\"true\">«</span>\r\n </a>\r\n </li>\r\n \r\n <!-- Page Numbers with Ellipses -->\r\n <li *ngFor=\"let page of visiblePages\" class=\"page-item\" \r\n [class.active]=\"page === currentPage\" \r\n [class.disabled]=\"page === '...'\">\r\n <a class=\"page-link\" *ngIf=\"page !== '...'; else ellipsis\" (click)=\"selectPage(page)\">\r\n {{ page }}\r\n </a>\r\n <ng-template #ellipsis><span class=\"page-link\">...</span></ng-template>\r\n </li>\r\n \r\n <!-- Next Button -->\r\n <li class=\"page-item\" [class.disabled]=\"currentPage === totalPages\">\r\n <a class=\"page-link\" (click)=\"selectPage(currentPage + 1)\" aria-label=\"Next\">\r\n <span aria-hidden=\"true\">»</span>\r\n </a>\r\n </li>\r\n </ul>\r\n </nav>\r\n ", styles: [".page-link{cursor:pointer}.page-item.disabled .page-link{cursor:not-allowed}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
49
|
+
}
|
|
50
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PaginationComponent, decorators: [{
|
|
51
|
+
type: Component,
|
|
52
|
+
args: [{ selector: 'lib-pagination-v2', template: "<nav>\r\n <ul class=\"pagination justify-content-center\">\r\n <!-- Previous Button -->\r\n <li class=\"page-item\" [class.disabled]=\"currentPage === 1\">\r\n <a class=\"page-link\" (click)=\"selectPage(currentPage - 1)\" aria-label=\"Previous\">\r\n <span aria-hidden=\"true\">«</span>\r\n </a>\r\n </li>\r\n \r\n <!-- Page Numbers with Ellipses -->\r\n <li *ngFor=\"let page of visiblePages\" class=\"page-item\" \r\n [class.active]=\"page === currentPage\" \r\n [class.disabled]=\"page === '...'\">\r\n <a class=\"page-link\" *ngIf=\"page !== '...'; else ellipsis\" (click)=\"selectPage(page)\">\r\n {{ page }}\r\n </a>\r\n <ng-template #ellipsis><span class=\"page-link\">...</span></ng-template>\r\n </li>\r\n \r\n <!-- Next Button -->\r\n <li class=\"page-item\" [class.disabled]=\"currentPage === totalPages\">\r\n <a class=\"page-link\" (click)=\"selectPage(currentPage + 1)\" aria-label=\"Next\">\r\n <span aria-hidden=\"true\">»</span>\r\n </a>\r\n </li>\r\n </ul>\r\n </nav>\r\n ", styles: [".page-link{cursor:pointer}.page-item.disabled .page-link{cursor:not-allowed}\n"] }]
|
|
53
|
+
}], propDecorators: { totalItems: [{
|
|
54
|
+
type: Input
|
|
55
|
+
}], itemsPerPage: [{
|
|
56
|
+
type: Input
|
|
57
|
+
}], currentPage: [{
|
|
58
|
+
type: Input
|
|
59
|
+
}], pageChanged: [{
|
|
60
|
+
type: Output
|
|
61
|
+
}] } });
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL3BhZ2luYXRpb24vcGFnaW5hdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1hbmFseXNlLXRyYXgvc3JjL2xpYi9jb21wb25lbnRzL3BhZ2luYXRpb24vcGFnaW5hdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFxQixNQUFNLGVBQWUsQ0FBQzs7O0FBUTFGLE1BQU0sT0FBTyxtQkFBbUI7SUFDckIsVUFBVSxHQUFXLENBQUMsQ0FBQyxDQUFDLHdCQUF3QjtJQUNoRCxZQUFZLEdBQVcsRUFBRSxDQUFDLENBQUMsaUJBQWlCO0lBQzVDLFdBQVcsR0FBVyxDQUFDLENBQUMsQ0FBQyxzQkFBc0I7SUFDOUMsV0FBVyxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDLENBQUMsbUJBQW1CO0lBRTdGLFVBQVUsR0FBVyxDQUFDLENBQUMsQ0FBQyx3QkFBd0I7SUFDaEQsZUFBZSxHQUFHLENBQUMsQ0FBQyxDQUFDLGtDQUFrQztJQUN2RCxZQUFZLEdBQVUsRUFBRSxDQUFDLENBQUMsK0NBQStDO0lBRXpFLFdBQVc7UUFDVCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDN0MsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFZO1FBQ3JCLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUN4QyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGlEQUFpRDtTQUMvRTtJQUNILENBQUM7SUFFRCxpQ0FBaUM7SUFDakMsZUFBZTtRQUNiLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNqQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBRXhDLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxVQUFVLEVBQUU7WUFDakMsdUVBQXVFO1lBQ3ZFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUN6QyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2Y7U0FDRjthQUFNO1lBQ0wsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsRUFBRTtnQkFDekIsaUJBQWlCO2dCQUNqQixLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDN0M7aUJBQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxFQUFFO2dCQUNsRCxlQUFlO2dCQUNmLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDakY7aUJBQU07Z0JBQ0wsNkJBQTZCO2dCQUM3QixLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzVHO1NBQ0Y7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7d0dBNUNVLG1CQUFtQjs0RkFBbkIsbUJBQW1CLHVOQ1JoQyxrb0NBMkJFOzs0RkRuQlcsbUJBQW1CO2tCQU4vQixTQUFTOytCQUNFLG1CQUFtQjs4QkFNcEIsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBPbkluaXQsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItcGFnaW5hdGlvbi12MicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3BhZ2luYXRpb24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9wYWdpbmF0aW9uLmNvbXBvbmVudC5zY3NzJ1xyXG59KVxyXG5cclxuZXhwb3J0IGNsYXNzIFBhZ2luYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG4gIEBJbnB1dCgpIHRvdGFsSXRlbXM6IG51bWJlciA9IDA7IC8vIFRvdGFsIG51bWJlciBvZiBpdGVtc1xyXG4gIEBJbnB1dCgpIGl0ZW1zUGVyUGFnZTogbnVtYmVyID0gMTA7IC8vIEl0ZW1zIHBlciBwYWdlXHJcbiAgQElucHV0KCkgY3VycmVudFBhZ2U6IG51bWJlciA9IDE7IC8vIEN1cnJlbnQgYWN0aXZlIHBhZ2VcclxuICBAT3V0cHV0KCkgcGFnZUNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7IC8vIEVtaXQgcGFnZSBjaGFuZ2VcclxuXHJcbiAgdG90YWxQYWdlczogbnVtYmVyID0gMDsgLy8gVG90YWwgbnVtYmVyIG9mIHBhZ2VzXHJcbiAgbWF4VmlzaWJsZVBhZ2VzID0gNTsgLy8gTnVtYmVyIG9mIHZpc2libGUgcGFnZXMgYXQgb25jZVxyXG4gIHZpc2libGVQYWdlczogYW55W10gPSBbXTsgLy8gUGFnZXMgdG8gZGlzcGxheSBpbiB0aGUgcGFnaW5hdGlvbiBjb21wb25lbnRcclxuXHJcbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnRvdGFsUGFnZXMgPSBNYXRoLmNlaWwodGhpcy50b3RhbEl0ZW1zIC8gdGhpcy5pdGVtc1BlclBhZ2UpO1xyXG4gICAgdGhpcy52aXNpYmxlUGFnZXMgPSB0aGlzLmdldFZpc2libGVQYWdlcygpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0UGFnZShwYWdlOiBudW1iZXIpIHtcclxuICAgIGlmIChwYWdlID49IDEgJiYgcGFnZSA8PSB0aGlzLnRvdGFsUGFnZXMpIHtcclxuICAgICAgdGhpcy5wYWdlQ2hhbmdlZC5lbWl0KHBhZ2UpOyAvLyBFbWl0IHRoZSBzZWxlY3RlZCBwYWdlIHRvIHRoZSBwYXJlbnQgY29tcG9uZW50XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBQYWdpbmF0aW9uIGxvZ2ljIHdpdGggZWxsaXBzZXNcclxuICBnZXRWaXNpYmxlUGFnZXMoKTogYW55W10ge1xyXG4gICAgY29uc3QgcGFnZXMgPSBbXTtcclxuICAgIGNvbnN0IG1heFZpc2libGUgPSB0aGlzLm1heFZpc2libGVQYWdlcztcclxuXHJcbiAgICBpZiAodGhpcy50b3RhbFBhZ2VzIDw9IG1heFZpc2libGUpIHtcclxuICAgICAgLy8gSWYgdG90YWwgcGFnZXMgYXJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBtYXggdmlzaWJsZSwgc2hvdyBhbGwgcGFnZXNcclxuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gdGhpcy50b3RhbFBhZ2VzOyBpKyspIHtcclxuICAgICAgICBwYWdlcy5wdXNoKGkpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA8PSAyKSB7XHJcbiAgICAgICAgLy8gTmVhciB0aGUgc3RhcnRcclxuICAgICAgICBwYWdlcy5wdXNoKDEsIDIsIDMsICcuLi4nLCB0aGlzLnRvdGFsUGFnZXMpO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFBhZ2UgPj0gdGhpcy50b3RhbFBhZ2VzIC0gMSkge1xyXG4gICAgICAgIC8vIE5lYXIgdGhlIGVuZFxyXG4gICAgICAgIHBhZ2VzLnB1c2goMSwgJy4uLicsIHRoaXMudG90YWxQYWdlcyAtIDIsIHRoaXMudG90YWxQYWdlcyAtIDEsIHRoaXMudG90YWxQYWdlcyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gTWlkZGxlIHBhZ2VzIHdpdGggZWxsaXBzZXNcclxuICAgICAgICBwYWdlcy5wdXNoKDEsICcuLi4nLCB0aGlzLmN1cnJlbnRQYWdlIC0gMSwgdGhpcy5jdXJyZW50UGFnZSwgdGhpcy5jdXJyZW50UGFnZSArIDEsICcuLi4nLCB0aGlzLnRvdGFsUGFnZXMpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFnZXM7XHJcbiAgfVxyXG59XHJcbiIsIjxuYXY+XHJcbiAgICA8dWwgY2xhc3M9XCJwYWdpbmF0aW9uIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgPCEtLSBQcmV2aW91cyBCdXR0b24gLS0+XHJcbiAgICAgIDxsaSBjbGFzcz1cInBhZ2UtaXRlbVwiIFtjbGFzcy5kaXNhYmxlZF09XCJjdXJyZW50UGFnZSA9PT0gMVwiPlxyXG4gICAgICAgIDxhIGNsYXNzPVwicGFnZS1saW5rXCIgKGNsaWNrKT1cInNlbGVjdFBhZ2UoY3VycmVudFBhZ2UgLSAxKVwiIGFyaWEtbGFiZWw9XCJQcmV2aW91c1wiPlxyXG4gICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JmxhcXVvOzwvc3Bhbj5cclxuICAgICAgICA8L2E+XHJcbiAgICAgIDwvbGk+XHJcbiAgXHJcbiAgICAgIDwhLS0gUGFnZSBOdW1iZXJzIHdpdGggRWxsaXBzZXMgLS0+XHJcbiAgICAgIDxsaSAqbmdGb3I9XCJsZXQgcGFnZSBvZiB2aXNpYmxlUGFnZXNcIiBjbGFzcz1cInBhZ2UtaXRlbVwiIFxyXG4gICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJwYWdlID09PSBjdXJyZW50UGFnZVwiIFxyXG4gICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cInBhZ2UgPT09ICcuLi4nXCI+XHJcbiAgICAgICAgPGEgY2xhc3M9XCJwYWdlLWxpbmtcIiAqbmdJZj1cInBhZ2UgIT09ICcuLi4nOyBlbHNlIGVsbGlwc2lzXCIgKGNsaWNrKT1cInNlbGVjdFBhZ2UocGFnZSlcIj5cclxuICAgICAgICAgIHt7IHBhZ2UgfX1cclxuICAgICAgICA8L2E+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNlbGxpcHNpcz48c3BhbiBjbGFzcz1cInBhZ2UtbGlua1wiPi4uLjwvc3Bhbj48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L2xpPlxyXG4gIFxyXG4gICAgICA8IS0tIE5leHQgQnV0dG9uIC0tPlxyXG4gICAgICA8bGkgY2xhc3M9XCJwYWdlLWl0ZW1cIiBbY2xhc3MuZGlzYWJsZWRdPVwiY3VycmVudFBhZ2UgPT09IHRvdGFsUGFnZXNcIj5cclxuICAgICAgICA8YSBjbGFzcz1cInBhZ2UtbGlua1wiIChjbGljayk9XCJzZWxlY3RQYWdlKGN1cnJlbnRQYWdlICsgMSlcIiBhcmlhLWxhYmVsPVwiTmV4dFwiPlxyXG4gICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnJhcXVvOzwvc3Bhbj5cclxuICAgICAgICA8L2E+XHJcbiAgICAgIDwvbGk+XHJcbiAgICA8L3VsPlxyXG4gIDwvbmF2PlxyXG4gICJdfQ==
|