mesauth-angular 1.5.6 → 1.6.1
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/README.md +12 -1
- package/fesm2022/mesauth-angular.mjs +240 -29
- package/fesm2022/mesauth-angular.mjs.map +1 -1
- package/index.d.ts +28 -3
- package/package.json +1 -1
|
@@ -3,7 +3,7 @@ import { InjectionToken, makeEnvironmentProviders, provideAppInitializer, inject
|
|
|
3
3
|
import * as i4 from '@angular/common/http';
|
|
4
4
|
import { HttpClient } from '@angular/common/http';
|
|
5
5
|
import { HubConnectionBuilder, LogLevel } from '@microsoft/signalr';
|
|
6
|
-
import { BehaviorSubject, Subject, EMPTY, of, timer, throwError } from 'rxjs';
|
|
6
|
+
import { BehaviorSubject, Subject, EMPTY, of, timer, throwError, forkJoin } from 'rxjs';
|
|
7
7
|
import { tap, catchError, switchMap, takeUntil } from 'rxjs/operators';
|
|
8
8
|
import * as i2 from '@angular/router';
|
|
9
9
|
import { Router } from '@angular/router';
|
|
@@ -1124,11 +1124,11 @@ class NotificationPanelComponent {
|
|
|
1124
1124
|
<div class="tabs">
|
|
1125
1125
|
<button class="tab-btn" [class.active]="activeTab === 'unread'" (click)="switchTab('unread')">
|
|
1126
1126
|
Unread
|
|
1127
|
-
<span class="tab-
|
|
1127
|
+
<span class="tab-badge" *ngIf="unreadNotifications.length > 0">{{ unreadNotifications.length }}</span>
|
|
1128
1128
|
</button>
|
|
1129
1129
|
<button class="tab-btn" [class.active]="activeTab === 'read'" (click)="switchTab('read')">
|
|
1130
1130
|
Read
|
|
1131
|
-
<span class="tab-
|
|
1131
|
+
<span class="tab-badge read-badge" *ngIf="readNotifications.length > 0">{{ readNotifications.length }}</span>
|
|
1132
1132
|
</button>
|
|
1133
1133
|
</div>
|
|
1134
1134
|
|
|
@@ -1260,7 +1260,7 @@ class NotificationPanelComponent {
|
|
|
1260
1260
|
</div>
|
|
1261
1261
|
</div>
|
|
1262
1262
|
</div>
|
|
1263
|
-
`, isInline: true, styles: [":
|
|
1263
|
+
`, isInline: true, styles: [".panel-header{display:flex;justify-content:space-between;align-items:center;padding:16px 18px;border-bottom:1px solid var(--border-color);background:var(--bg-secondary);flex-shrink:0}.panel-header-left{display:flex;align-items:center;gap:9px;color:var(--primary)}.panel-header h3{margin:0;font-size:16px;font-weight:700;color:var(--text-primary)}.close-btn{background:none;border:none;cursor:pointer;color:var(--text-muted);width:32px;height:32px;border-radius:8px;display:flex;align-items:center;justify-content:center;transition:background .15s,color .15s}.close-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.tabs{display:flex;border-bottom:1px solid var(--border-color);background:var(--bg-secondary);flex-shrink:0}.tab-btn{flex:1;display:flex;align-items:center;justify-content:center;gap:6px;padding:11px 8px;background:none;border:none;border-bottom:2px solid transparent;color:var(--text-muted);cursor:pointer;font-size:13px;font-weight:500;transition:color .15s,border-color .15s}.tab-btn.active{color:var(--primary);border-bottom-color:var(--primary)}.tab-btn:hover:not(.active){color:var(--text-secondary)}.tab-badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;background:var(--primary);color:#fff;font-size:11px;font-weight:700;border-radius:9px}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;gap:12px;color:var(--text-muted)}.empty-state p{margin:0;font-size:13px}.loading-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px;gap:12px;color:var(--text-muted);font-size:13px}.spinner{width:24px;height:24px;border:2px solid var(--border-color);border-top-color:var(--primary);border-radius:50%;animation:spin .7s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n", ":host{display:block;position:relative;--primary: #1976d2;--primary-hover: #1565c0;--success: #43a047;--error: #f44336;--error-hover: #d32f2f;--info-color: #2196f3;--info-bg: rgba(33, 150, 243, .1);--success-bg: rgba(67, 160, 71, .1);--warning-color: #f57c00;--warning-bg: rgba(245, 124, 0, .1);--error-bg: rgba(244, 67, 54, .1);--text-primary: #212121;--text-secondary: #616161;--text-muted: #9e9e9e;--bg-primary: #ffffff;--bg-secondary: #f8f9fa;--bg-hover: #f0f4ff;--bg-unread: rgba(25, 118, 210, .06);--border-color: #e0e0e0;--border-light: #eeeeee;--shadow: rgba(0, 0, 0, .15)}:host(.theme-dark){--primary: #90caf9;--primary-hover: #64b5f6;--success: #66bb6a;--error: #ef5350;--error-hover: #c62828;--info-color: #64b5f6;--info-bg: rgba(100, 181, 246, .12);--success-bg: rgba(102, 187, 106, .12);--warning-color: #ffb74d;--warning-bg: rgba(255, 183, 77, .12);--error-bg: rgba(239, 83, 80, .12);--text-primary: #e0e0e0;--text-secondary: #b0b0b0;--text-muted: #757575;--bg-primary: #1e1e2e;--bg-secondary: #27273a;--bg-hover: #2a2d4a;--bg-unread: rgba(144, 202, 249, .08);--border-color: #383850;--border-light: #2e2e42;--shadow: rgba(0, 0, 0, .4)}.tab-btn:not(.active) .tab-badge{background:var(--error)}.read-badge{background:var(--text-muted)}.notification-panel{position:fixed;top:0;right:-360px;width:360px;height:100vh;background:var(--bg-primary);box-shadow:-4px 0 24px var(--shadow);display:flex;flex-direction:column;z-index:1030;transition:right .3s cubic-bezier(.16,1,.3,1)}.notification-panel.open{right:0}.notifications-list{flex:1;overflow-y:auto}.notification-item{display:flex;align-items:flex-start;gap:0;border-bottom:1px solid var(--border-light);cursor:pointer;background:var(--bg-primary);transition:background-color .15s;position:relative}.notification-item:hover{background:var(--bg-hover)}.notification-item.unread{background:var(--bg-unread)}.notif-accent{width:3px;align-self:stretch;flex-shrink:0;background:transparent;border-radius:0 2px 2px 0;opacity:.3}.notification-item.unread .notif-accent{opacity:1}.notif-accent.type-info{background:var(--info-color)}.notif-accent.type-success{background:var(--success)}.notif-accent.type-warning{background:var(--warning-color)}.notif-accent.type-error{background:var(--error)}.notif-type-icon{flex-shrink:0;width:26px;height:26px;border-radius:7px;display:flex;align-items:center;justify-content:center;align-self:center;margin-left:10px}.notif-type-icon.type-info{color:var(--info-color);background:var(--info-bg)}.notif-type-icon.type-success{color:var(--success);background:var(--success-bg)}.notif-type-icon.type-warning{color:var(--warning-color);background:var(--warning-bg)}.notif-type-icon.type-error{color:var(--error);background:var(--error-bg)}.notification-content{flex:1;min-width:0;padding:12px 8px 12px 12px}.notification-title{font-weight:600;color:var(--text-primary);font-size:13.5px;margin-bottom:3px;line-height:1.35}.notification-message{color:var(--text-secondary);font-size:12px;line-height:1.45;margin-bottom:7px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.notification-meta{display:flex;justify-content:space-between;font-size:11px;color:var(--text-muted)}.app-name{font-weight:600;color:var(--primary)}.icon-btn{background:none;border:none;cursor:pointer;width:32px;height:32px;border-radius:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0;align-self:center;margin-right:8px;transition:color .15s,background-color .15s;color:var(--text-muted)}.read-btn:hover{color:var(--success);background:#43a0471a}.delete-btn:hover{color:var(--error);background:#f443361a}.panel-footer{padding:10px 14px;border-top:1px solid var(--border-color);background:var(--bg-secondary);flex-shrink:0}.footer-actions{display:flex;gap:8px}.footer-actions .action-btn{flex:1}.action-btn{display:flex;align-items:center;justify-content:center;gap:6px;width:100%;padding:8px 12px;background:var(--primary);color:#fff;border:none;border-radius:8px;cursor:pointer;font-size:12.5px;font-weight:600;transition:background-color .18s,transform .12s}.action-btn:hover{background:var(--primary-hover);transform:translateY(-1px)}.delete-all-btn{background:var(--error)}.delete-all-btn:hover{background:var(--error-hover)}.modal-overlay{position:fixed;inset:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1060;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.modal-container{background:var(--bg-primary);border-radius:14px;width:90%;max-width:580px;max-height:80vh;display:flex;flex-direction:column;box-shadow:0 16px 48px #00000040;animation:modal-in .2s cubic-bezier(.16,1,.3,1)}@keyframes modal-in{0%{opacity:0;transform:scale(.94) translateY(8px)}to{opacity:1;transform:scale(1) translateY(0)}}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid var(--border-color);background:var(--bg-secondary);border-radius:14px 14px 0 0;border-top:3px solid transparent}.modal-header.modal-type-info{border-top-color:var(--info-color)}.modal-header.modal-type-success{border-top-color:var(--success)}.modal-header.modal-type-warning{border-top-color:var(--warning-color)}.modal-header.modal-type-error{border-top-color:var(--error)}.modal-header-left{display:flex;align-items:center;gap:10px;min-width:0}.modal-type-icon{flex-shrink:0;width:32px;height:32px;border-radius:8px;display:flex;align-items:center;justify-content:center}.modal-type-info .modal-type-icon{color:var(--info-color);background:var(--info-bg)}.modal-type-success .modal-type-icon{color:var(--success);background:var(--success-bg)}.modal-type-warning .modal-type-icon{color:var(--warning-color);background:var(--warning-bg)}.modal-type-error .modal-type-icon{color:var(--error);background:var(--error-bg)}.modal-header h3{margin:0;font-size:15px;font-weight:700;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.modal-meta{display:flex;justify-content:space-between;padding:8px 20px;font-size:11.5px;color:var(--text-muted);border-bottom:1px solid var(--border-light)}.modal-body{padding:20px;overflow-y:auto;flex:1;color:var(--text-primary);font-size:14px;line-height:1.65}.modal-body-iframe{padding:0}.notification-iframe{width:100%;height:100%;border:none;display:block}.modal-footer{padding:12px 20px;border-top:1px solid var(--border-color);background:var(--bg-secondary);border-radius:0 0 14px 14px;display:flex;justify-content:flex-end}.modal-footer .action-btn{width:auto;padding:8px 24px}@media(max-width:600px){.notification-panel{width:100%;right:-100%}.modal-container{width:95%;max-height:90vh}}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
1264
1264
|
}
|
|
1265
1265
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: NotificationPanelComponent, decorators: [{
|
|
1266
1266
|
type: Component,
|
|
@@ -1286,11 +1286,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
|
|
|
1286
1286
|
<div class="tabs">
|
|
1287
1287
|
<button class="tab-btn" [class.active]="activeTab === 'unread'" (click)="switchTab('unread')">
|
|
1288
1288
|
Unread
|
|
1289
|
-
<span class="tab-
|
|
1289
|
+
<span class="tab-badge" *ngIf="unreadNotifications.length > 0">{{ unreadNotifications.length }}</span>
|
|
1290
1290
|
</button>
|
|
1291
1291
|
<button class="tab-btn" [class.active]="activeTab === 'read'" (click)="switchTab('read')">
|
|
1292
1292
|
Read
|
|
1293
|
-
<span class="tab-
|
|
1293
|
+
<span class="tab-badge read-badge" *ngIf="readNotifications.length > 0">{{ readNotifications.length }}</span>
|
|
1294
1294
|
</button>
|
|
1295
1295
|
</div>
|
|
1296
1296
|
|
|
@@ -1422,7 +1422,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
|
|
|
1422
1422
|
</div>
|
|
1423
1423
|
</div>
|
|
1424
1424
|
</div>
|
|
1425
|
-
`, styles: [":
|
|
1425
|
+
`, styles: [".panel-header{display:flex;justify-content:space-between;align-items:center;padding:16px 18px;border-bottom:1px solid var(--border-color);background:var(--bg-secondary);flex-shrink:0}.panel-header-left{display:flex;align-items:center;gap:9px;color:var(--primary)}.panel-header h3{margin:0;font-size:16px;font-weight:700;color:var(--text-primary)}.close-btn{background:none;border:none;cursor:pointer;color:var(--text-muted);width:32px;height:32px;border-radius:8px;display:flex;align-items:center;justify-content:center;transition:background .15s,color .15s}.close-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.tabs{display:flex;border-bottom:1px solid var(--border-color);background:var(--bg-secondary);flex-shrink:0}.tab-btn{flex:1;display:flex;align-items:center;justify-content:center;gap:6px;padding:11px 8px;background:none;border:none;border-bottom:2px solid transparent;color:var(--text-muted);cursor:pointer;font-size:13px;font-weight:500;transition:color .15s,border-color .15s}.tab-btn.active{color:var(--primary);border-bottom-color:var(--primary)}.tab-btn:hover:not(.active){color:var(--text-secondary)}.tab-badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;background:var(--primary);color:#fff;font-size:11px;font-weight:700;border-radius:9px}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;gap:12px;color:var(--text-muted)}.empty-state p{margin:0;font-size:13px}.loading-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px;gap:12px;color:var(--text-muted);font-size:13px}.spinner{width:24px;height:24px;border:2px solid var(--border-color);border-top-color:var(--primary);border-radius:50%;animation:spin .7s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n", ":host{display:block;position:relative;--primary: #1976d2;--primary-hover: #1565c0;--success: #43a047;--error: #f44336;--error-hover: #d32f2f;--info-color: #2196f3;--info-bg: rgba(33, 150, 243, .1);--success-bg: rgba(67, 160, 71, .1);--warning-color: #f57c00;--warning-bg: rgba(245, 124, 0, .1);--error-bg: rgba(244, 67, 54, .1);--text-primary: #212121;--text-secondary: #616161;--text-muted: #9e9e9e;--bg-primary: #ffffff;--bg-secondary: #f8f9fa;--bg-hover: #f0f4ff;--bg-unread: rgba(25, 118, 210, .06);--border-color: #e0e0e0;--border-light: #eeeeee;--shadow: rgba(0, 0, 0, .15)}:host(.theme-dark){--primary: #90caf9;--primary-hover: #64b5f6;--success: #66bb6a;--error: #ef5350;--error-hover: #c62828;--info-color: #64b5f6;--info-bg: rgba(100, 181, 246, .12);--success-bg: rgba(102, 187, 106, .12);--warning-color: #ffb74d;--warning-bg: rgba(255, 183, 77, .12);--error-bg: rgba(239, 83, 80, .12);--text-primary: #e0e0e0;--text-secondary: #b0b0b0;--text-muted: #757575;--bg-primary: #1e1e2e;--bg-secondary: #27273a;--bg-hover: #2a2d4a;--bg-unread: rgba(144, 202, 249, .08);--border-color: #383850;--border-light: #2e2e42;--shadow: rgba(0, 0, 0, .4)}.tab-btn:not(.active) .tab-badge{background:var(--error)}.read-badge{background:var(--text-muted)}.notification-panel{position:fixed;top:0;right:-360px;width:360px;height:100vh;background:var(--bg-primary);box-shadow:-4px 0 24px var(--shadow);display:flex;flex-direction:column;z-index:1030;transition:right .3s cubic-bezier(.16,1,.3,1)}.notification-panel.open{right:0}.notifications-list{flex:1;overflow-y:auto}.notification-item{display:flex;align-items:flex-start;gap:0;border-bottom:1px solid var(--border-light);cursor:pointer;background:var(--bg-primary);transition:background-color .15s;position:relative}.notification-item:hover{background:var(--bg-hover)}.notification-item.unread{background:var(--bg-unread)}.notif-accent{width:3px;align-self:stretch;flex-shrink:0;background:transparent;border-radius:0 2px 2px 0;opacity:.3}.notification-item.unread .notif-accent{opacity:1}.notif-accent.type-info{background:var(--info-color)}.notif-accent.type-success{background:var(--success)}.notif-accent.type-warning{background:var(--warning-color)}.notif-accent.type-error{background:var(--error)}.notif-type-icon{flex-shrink:0;width:26px;height:26px;border-radius:7px;display:flex;align-items:center;justify-content:center;align-self:center;margin-left:10px}.notif-type-icon.type-info{color:var(--info-color);background:var(--info-bg)}.notif-type-icon.type-success{color:var(--success);background:var(--success-bg)}.notif-type-icon.type-warning{color:var(--warning-color);background:var(--warning-bg)}.notif-type-icon.type-error{color:var(--error);background:var(--error-bg)}.notification-content{flex:1;min-width:0;padding:12px 8px 12px 12px}.notification-title{font-weight:600;color:var(--text-primary);font-size:13.5px;margin-bottom:3px;line-height:1.35}.notification-message{color:var(--text-secondary);font-size:12px;line-height:1.45;margin-bottom:7px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.notification-meta{display:flex;justify-content:space-between;font-size:11px;color:var(--text-muted)}.app-name{font-weight:600;color:var(--primary)}.icon-btn{background:none;border:none;cursor:pointer;width:32px;height:32px;border-radius:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0;align-self:center;margin-right:8px;transition:color .15s,background-color .15s;color:var(--text-muted)}.read-btn:hover{color:var(--success);background:#43a0471a}.delete-btn:hover{color:var(--error);background:#f443361a}.panel-footer{padding:10px 14px;border-top:1px solid var(--border-color);background:var(--bg-secondary);flex-shrink:0}.footer-actions{display:flex;gap:8px}.footer-actions .action-btn{flex:1}.action-btn{display:flex;align-items:center;justify-content:center;gap:6px;width:100%;padding:8px 12px;background:var(--primary);color:#fff;border:none;border-radius:8px;cursor:pointer;font-size:12.5px;font-weight:600;transition:background-color .18s,transform .12s}.action-btn:hover{background:var(--primary-hover);transform:translateY(-1px)}.delete-all-btn{background:var(--error)}.delete-all-btn:hover{background:var(--error-hover)}.modal-overlay{position:fixed;inset:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1060;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.modal-container{background:var(--bg-primary);border-radius:14px;width:90%;max-width:580px;max-height:80vh;display:flex;flex-direction:column;box-shadow:0 16px 48px #00000040;animation:modal-in .2s cubic-bezier(.16,1,.3,1)}@keyframes modal-in{0%{opacity:0;transform:scale(.94) translateY(8px)}to{opacity:1;transform:scale(1) translateY(0)}}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid var(--border-color);background:var(--bg-secondary);border-radius:14px 14px 0 0;border-top:3px solid transparent}.modal-header.modal-type-info{border-top-color:var(--info-color)}.modal-header.modal-type-success{border-top-color:var(--success)}.modal-header.modal-type-warning{border-top-color:var(--warning-color)}.modal-header.modal-type-error{border-top-color:var(--error)}.modal-header-left{display:flex;align-items:center;gap:10px;min-width:0}.modal-type-icon{flex-shrink:0;width:32px;height:32px;border-radius:8px;display:flex;align-items:center;justify-content:center}.modal-type-info .modal-type-icon{color:var(--info-color);background:var(--info-bg)}.modal-type-success .modal-type-icon{color:var(--success);background:var(--success-bg)}.modal-type-warning .modal-type-icon{color:var(--warning-color);background:var(--warning-bg)}.modal-type-error .modal-type-icon{color:var(--error);background:var(--error-bg)}.modal-header h3{margin:0;font-size:15px;font-weight:700;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.modal-meta{display:flex;justify-content:space-between;padding:8px 20px;font-size:11.5px;color:var(--text-muted);border-bottom:1px solid var(--border-light)}.modal-body{padding:20px;overflow-y:auto;flex:1;color:var(--text-primary);font-size:14px;line-height:1.65}.modal-body-iframe{padding:0}.notification-iframe{width:100%;height:100%;border:none;display:block}.modal-footer{padding:12px 20px;border-top:1px solid var(--border-color);background:var(--bg-secondary);border-radius:0 0 14px 14px;display:flex;justify-content:flex-end}.modal-footer .action-btn{width:auto;padding:8px 24px}@media(max-width:600px){.notification-panel{width:100%;right:-100%}.modal-container{width:95%;max-height:90vh}}\n"] }]
|
|
1426
1426
|
}], ctorParameters: () => [{ type: MesAuthService }, { type: ToastService }, { type: ThemeService }], propDecorators: { notificationRead: [{
|
|
1427
1427
|
type: Output
|
|
1428
1428
|
}], themeClass: [{
|
|
@@ -1508,6 +1508,9 @@ class MaApprovalService {
|
|
|
1508
1508
|
deleteTemplate(id) {
|
|
1509
1509
|
return this.http.delete(`${this.apiBase}/approval/templates/${id}`, this.opts);
|
|
1510
1510
|
}
|
|
1511
|
+
previewRole(orgCode, level) {
|
|
1512
|
+
return this.http.get(`${this.apiBase}/approval/roles/preview?orgCode=${encodeURIComponent(orgCode)}&level=${encodeURIComponent(level)}`, this.opts);
|
|
1513
|
+
}
|
|
1511
1514
|
// ====================== Create (used by ma-arv-container) ======================
|
|
1512
1515
|
createApproval(request) {
|
|
1513
1516
|
return this.http.post(`${this.apiBase}/approval/documents`, request, this.opts);
|
|
@@ -1760,7 +1763,7 @@ class MaApprovalPanelComponent {
|
|
|
1760
1763
|
</ng-container>
|
|
1761
1764
|
</div>
|
|
1762
1765
|
</div>
|
|
1763
|
-
`, isInline: true, styles: ["
|
|
1766
|
+
`, isInline: true, styles: [".panel-header{display:flex;justify-content:space-between;align-items:center;padding:16px 18px;border-bottom:1px solid var(--border-color);background:var(--bg-secondary);flex-shrink:0}.panel-header-left{display:flex;align-items:center;gap:9px;color:var(--primary)}.panel-header h3{margin:0;font-size:16px;font-weight:700;color:var(--text-primary)}.close-btn{background:none;border:none;cursor:pointer;color:var(--text-muted);width:32px;height:32px;border-radius:8px;display:flex;align-items:center;justify-content:center;transition:background .15s,color .15s}.close-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.tabs{display:flex;border-bottom:1px solid var(--border-color);background:var(--bg-secondary);flex-shrink:0}.tab-btn{flex:1;display:flex;align-items:center;justify-content:center;gap:6px;padding:11px 8px;background:none;border:none;border-bottom:2px solid transparent;color:var(--text-muted);cursor:pointer;font-size:13px;font-weight:500;transition:color .15s,border-color .15s}.tab-btn.active{color:var(--primary);border-bottom-color:var(--primary)}.tab-btn:hover:not(.active){color:var(--text-secondary)}.tab-badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;background:var(--primary);color:#fff;font-size:11px;font-weight:700;border-radius:9px}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;gap:12px;color:var(--text-muted)}.empty-state p{margin:0;font-size:13px}.loading-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px;gap:12px;color:var(--text-muted);font-size:13px}.spinner{width:24px;height:24px;border:2px solid var(--border-color);border-top-color:var(--primary);border-radius:50%;animation:spin .7s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n", ":host{--primary: #90caf9;--success: #66bb6a;--error: #ef5350;--text-primary: #e0e0e0;--text-secondary: #b0b0b0;--text-muted: #757575;--bg-primary: #1e1e2e;--bg-secondary: #27273a;--bg-hover: #2a2d4a;--border-color: #383850;--shadow: rgba(0,0,0,.4)}:host(.theme-light){--primary: #1565c0;--success: #2e7d32;--error: #c62828;--text-primary: #212121;--text-secondary: #616161;--text-muted: #9e9e9e;--bg-primary: #ffffff;--bg-secondary: #f5f5f5;--bg-hover: #e8eaf6;--border-color: #e0e0e0;--shadow: rgba(0,0,0,.15)}.approval-backdrop{display:none;position:fixed;inset:0;background:#0006;z-index:1029}.approval-backdrop.open{display:block}.approval-panel{position:fixed;top:0;right:-380px;width:380px;height:100vh;background:var(--bg-primary);box-shadow:-4px 0 24px var(--shadow);display:flex;flex-direction:column;z-index:1030;transition:right .3s cubic-bezier(.16,1,.3,1)}.approval-panel.open{right:0}.panel-content{flex:1;overflow-y:auto;padding:8px 0}.approval-item{padding:14px 18px;border-bottom:1px solid var(--border-color);cursor:pointer;transition:background .15s}.approval-item:hover{background:var(--bg-hover)}.approval-item:last-child{border-bottom:none}.item-title{font-size:14px;font-weight:600;color:var(--text-primary);margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.item-meta{font-size:12px;color:var(--text-muted);margin-bottom:8px;display:flex;gap:4px;flex-wrap:wrap}.item-footer{display:flex;align-items:center;gap:8px}.item-time{font-size:11px;color:var(--text-muted);margin-right:auto}.item-link{font-size:12px;color:var(--primary);font-weight:500}.status-badge{display:inline-block;padding:2px 8px;border-radius:10px;font-size:11px;font-weight:600;letter-spacing:.3px}.approved-badge{background:#66bb6a26;color:var(--success)}.rejected-badge{background:#ef53501f;color:var(--error)}.show-more{text-align:center;padding:14px;font-size:13px;color:var(--primary);cursor:pointer;font-weight:500}.show-more:hover{text-decoration:underline}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: DatePipe, name: "date" }] });
|
|
1764
1767
|
}
|
|
1765
1768
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: MaApprovalPanelComponent, decorators: [{
|
|
1766
1769
|
type: Component,
|
|
@@ -1868,7 +1871,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
|
|
|
1868
1871
|
</ng-container>
|
|
1869
1872
|
</div>
|
|
1870
1873
|
</div>
|
|
1871
|
-
`, styles: ["
|
|
1874
|
+
`, styles: [".panel-header{display:flex;justify-content:space-between;align-items:center;padding:16px 18px;border-bottom:1px solid var(--border-color);background:var(--bg-secondary);flex-shrink:0}.panel-header-left{display:flex;align-items:center;gap:9px;color:var(--primary)}.panel-header h3{margin:0;font-size:16px;font-weight:700;color:var(--text-primary)}.close-btn{background:none;border:none;cursor:pointer;color:var(--text-muted);width:32px;height:32px;border-radius:8px;display:flex;align-items:center;justify-content:center;transition:background .15s,color .15s}.close-btn:hover{background:var(--bg-hover);color:var(--text-primary)}.tabs{display:flex;border-bottom:1px solid var(--border-color);background:var(--bg-secondary);flex-shrink:0}.tab-btn{flex:1;display:flex;align-items:center;justify-content:center;gap:6px;padding:11px 8px;background:none;border:none;border-bottom:2px solid transparent;color:var(--text-muted);cursor:pointer;font-size:13px;font-weight:500;transition:color .15s,border-color .15s}.tab-btn.active{color:var(--primary);border-bottom-color:var(--primary)}.tab-btn:hover:not(.active){color:var(--text-secondary)}.tab-badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;background:var(--primary);color:#fff;font-size:11px;font-weight:700;border-radius:9px}.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 20px;gap:12px;color:var(--text-muted)}.empty-state p{margin:0;font-size:13px}.loading-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px;gap:12px;color:var(--text-muted);font-size:13px}.spinner{width:24px;height:24px;border:2px solid var(--border-color);border-top-color:var(--primary);border-radius:50%;animation:spin .7s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n", ":host{--primary: #90caf9;--success: #66bb6a;--error: #ef5350;--text-primary: #e0e0e0;--text-secondary: #b0b0b0;--text-muted: #757575;--bg-primary: #1e1e2e;--bg-secondary: #27273a;--bg-hover: #2a2d4a;--border-color: #383850;--shadow: rgba(0,0,0,.4)}:host(.theme-light){--primary: #1565c0;--success: #2e7d32;--error: #c62828;--text-primary: #212121;--text-secondary: #616161;--text-muted: #9e9e9e;--bg-primary: #ffffff;--bg-secondary: #f5f5f5;--bg-hover: #e8eaf6;--border-color: #e0e0e0;--shadow: rgba(0,0,0,.15)}.approval-backdrop{display:none;position:fixed;inset:0;background:#0006;z-index:1029}.approval-backdrop.open{display:block}.approval-panel{position:fixed;top:0;right:-380px;width:380px;height:100vh;background:var(--bg-primary);box-shadow:-4px 0 24px var(--shadow);display:flex;flex-direction:column;z-index:1030;transition:right .3s cubic-bezier(.16,1,.3,1)}.approval-panel.open{right:0}.panel-content{flex:1;overflow-y:auto;padding:8px 0}.approval-item{padding:14px 18px;border-bottom:1px solid var(--border-color);cursor:pointer;transition:background .15s}.approval-item:hover{background:var(--bg-hover)}.approval-item:last-child{border-bottom:none}.item-title{font-size:14px;font-weight:600;color:var(--text-primary);margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.item-meta{font-size:12px;color:var(--text-muted);margin-bottom:8px;display:flex;gap:4px;flex-wrap:wrap}.item-footer{display:flex;align-items:center;gap:8px}.item-time{font-size:11px;color:var(--text-muted);margin-right:auto}.item-link{font-size:12px;color:var(--primary);font-weight:500}.status-badge{display:inline-block;padding:2px 8px;border-radius:10px;font-size:11px;font-weight:600;letter-spacing:.3px}.approved-badge{background:#66bb6a26;color:var(--success)}.rejected-badge{background:#ef53501f;color:var(--error)}.show-more{text-align:center;padding:14px;font-size:13px;color:var(--primary);cursor:pointer;font-weight:500}.show-more:hover{text-decoration:underline}\n"] }]
|
|
1872
1875
|
}], propDecorators: { approvalActioned: [{
|
|
1873
1876
|
type: Output
|
|
1874
1877
|
}] } });
|
|
@@ -2016,12 +2019,18 @@ class MaArvContainerComponent {
|
|
|
2016
2019
|
callbackUrl;
|
|
2017
2020
|
deadlineHours;
|
|
2018
2021
|
approvalSubmitted = new EventEmitter();
|
|
2019
|
-
|
|
2022
|
+
approvalSubmitting = new EventEmitter();
|
|
2020
2023
|
cancelled = new EventEmitter();
|
|
2021
2024
|
contentBody;
|
|
2022
2025
|
routingMode = 'template';
|
|
2023
2026
|
templates = [];
|
|
2024
2027
|
selectedTemplateId = null;
|
|
2028
|
+
selectedTemplate = null;
|
|
2029
|
+
loadingTemplate = false;
|
|
2030
|
+
// Per-step role candidates and selected user
|
|
2031
|
+
stepCandidates = [];
|
|
2032
|
+
stepLoadingCandidates = [];
|
|
2033
|
+
stepSelectedUsers = [];
|
|
2025
2034
|
adHocSteps = [];
|
|
2026
2035
|
referenceUserIds = [];
|
|
2027
2036
|
refSearchQuery = '';
|
|
@@ -2032,11 +2041,17 @@ class MaArvContainerComponent {
|
|
|
2032
2041
|
isSubmitted = false;
|
|
2033
2042
|
errorMessage = '';
|
|
2034
2043
|
userLabelMap = {};
|
|
2044
|
+
get themeClass() { return `theme-${this.currentTheme}`; }
|
|
2045
|
+
currentTheme = 'light';
|
|
2035
2046
|
destroy$ = new Subject();
|
|
2036
2047
|
mesAuth = inject(MesAuthService);
|
|
2048
|
+
themeService = inject(ThemeService);
|
|
2037
2049
|
approvalSvc = null;
|
|
2038
2050
|
http = inject(HttpClient);
|
|
2039
2051
|
ngOnInit() {
|
|
2052
|
+
this.themeService.currentTheme$
|
|
2053
|
+
.pipe(takeUntil(this.destroy$))
|
|
2054
|
+
.subscribe(t => this.currentTheme = t);
|
|
2040
2055
|
const config = this.mesAuth.getConfig();
|
|
2041
2056
|
if (config) {
|
|
2042
2057
|
this.approvalSvc = new MaApprovalService();
|
|
@@ -2051,13 +2066,63 @@ class MaArvContainerComponent {
|
|
|
2051
2066
|
}
|
|
2052
2067
|
loadTemplates() {
|
|
2053
2068
|
this.approvalSvc.getTemplates().pipe(takeUntil(this.destroy$)).subscribe({
|
|
2054
|
-
next: (t) =>
|
|
2069
|
+
next: (t) => {
|
|
2070
|
+
this.templates = t;
|
|
2071
|
+
if (this.templateId != null && this.selectedTemplateId == null) {
|
|
2072
|
+
this.selectedTemplateId = this.templateId;
|
|
2073
|
+
this.loadTemplateDetail(this.templateId);
|
|
2074
|
+
}
|
|
2075
|
+
},
|
|
2055
2076
|
error: () => { }
|
|
2056
2077
|
});
|
|
2057
2078
|
}
|
|
2079
|
+
loadTemplateDetail(id) {
|
|
2080
|
+
this.loadingTemplate = true;
|
|
2081
|
+
this.selectedTemplate = null;
|
|
2082
|
+
this.stepCandidates = [];
|
|
2083
|
+
this.stepLoadingCandidates = [];
|
|
2084
|
+
this.stepSelectedUsers = [];
|
|
2085
|
+
this.approvalSvc.getTemplate(id).pipe(takeUntil(this.destroy$)).subscribe({
|
|
2086
|
+
next: (t) => {
|
|
2087
|
+
this.selectedTemplate = t;
|
|
2088
|
+
this.loadingTemplate = false;
|
|
2089
|
+
this.loadStepCandidates(t.steps);
|
|
2090
|
+
},
|
|
2091
|
+
error: () => { this.loadingTemplate = false; }
|
|
2092
|
+
});
|
|
2093
|
+
}
|
|
2094
|
+
loadStepCandidates(steps) {
|
|
2095
|
+
this.stepCandidates = steps.map(() => []);
|
|
2096
|
+
this.stepLoadingCandidates = steps.map(() => false);
|
|
2097
|
+
this.stepSelectedUsers = steps.map(() => '');
|
|
2098
|
+
steps.forEach((step, i) => {
|
|
2099
|
+
if (!step.roles || step.roles.length === 0)
|
|
2100
|
+
return;
|
|
2101
|
+
this.stepLoadingCandidates[i] = true;
|
|
2102
|
+
const calls = step.roles.map(r => this.approvalSvc.previewRole(r.orgCode, r.positionLevel));
|
|
2103
|
+
forkJoin(calls.length > 0 ? calls : [of([])])
|
|
2104
|
+
.pipe(takeUntil(this.destroy$))
|
|
2105
|
+
.subscribe({
|
|
2106
|
+
next: results => {
|
|
2107
|
+
const merged = new Map();
|
|
2108
|
+
results.forEach(list => list.forEach(u => merged.set(u.userId, u)));
|
|
2109
|
+
this.stepCandidates[i] = Array.from(merged.values());
|
|
2110
|
+
this.stepLoadingCandidates[i] = false;
|
|
2111
|
+
},
|
|
2112
|
+
error: () => { this.stepLoadingCandidates[i] = false; }
|
|
2113
|
+
});
|
|
2114
|
+
});
|
|
2115
|
+
}
|
|
2116
|
+
onStepUserChange(stepIndex, event) {
|
|
2117
|
+
this.stepSelectedUsers[stepIndex] = event.target.value;
|
|
2118
|
+
}
|
|
2058
2119
|
onTemplateChange(event) {
|
|
2059
2120
|
const val = event.target.value;
|
|
2060
2121
|
this.selectedTemplateId = val ? parseInt(val, 10) : null;
|
|
2122
|
+
this.selectedTemplate = null;
|
|
2123
|
+
if (this.selectedTemplateId) {
|
|
2124
|
+
this.loadTemplateDetail(this.selectedTemplateId);
|
|
2125
|
+
}
|
|
2061
2126
|
}
|
|
2062
2127
|
addStep() {
|
|
2063
2128
|
const order = this.adHocSteps.length + 1;
|
|
@@ -2138,6 +2203,8 @@ class MaArvContainerComponent {
|
|
|
2138
2203
|
.catch(() => []);
|
|
2139
2204
|
}
|
|
2140
2205
|
async submit() {
|
|
2206
|
+
if (this.submitting)
|
|
2207
|
+
return;
|
|
2141
2208
|
this.errorMessage = '';
|
|
2142
2209
|
if (!this.approvalSvc) {
|
|
2143
2210
|
this.errorMessage = 'Approval service not initialized. Ensure provideMesAuth() is configured.';
|
|
@@ -2159,10 +2226,21 @@ class MaArvContainerComponent {
|
|
|
2159
2226
|
this.errorMessage = 'Please add at least one approval step.';
|
|
2160
2227
|
return;
|
|
2161
2228
|
}
|
|
2162
|
-
|
|
2163
|
-
if (this.
|
|
2164
|
-
this.
|
|
2229
|
+
// Validate role-based steps have a selected approver
|
|
2230
|
+
if (this.routingMode === 'template' && this.selectedTemplate) {
|
|
2231
|
+
for (let i = 0; i < this.selectedTemplate.steps.length; i++) {
|
|
2232
|
+
const step = this.selectedTemplate.steps[i];
|
|
2233
|
+
if (step.roles?.length > 0 && !this.stepSelectedUsers[i]) {
|
|
2234
|
+
this.errorMessage = `Please select an approver for step "${step.stepName}".`;
|
|
2235
|
+
return;
|
|
2236
|
+
}
|
|
2237
|
+
}
|
|
2165
2238
|
}
|
|
2239
|
+
// Emit before capture so parent can hide edit controls (inputs, buttons)
|
|
2240
|
+
// then wait one tick for Angular CD to update the DOM before snapshotting
|
|
2241
|
+
this.approvalSubmitting.emit();
|
|
2242
|
+
await new Promise(resolve => setTimeout(resolve));
|
|
2243
|
+
this.submitting = true;
|
|
2166
2244
|
try {
|
|
2167
2245
|
const contentHtml = await this.captureContent();
|
|
2168
2246
|
const thumbnailBase64 = await this.captureThumbnail().catch(() => undefined);
|
|
@@ -2178,6 +2256,20 @@ class MaArvContainerComponent {
|
|
|
2178
2256
|
};
|
|
2179
2257
|
if (this.routingMode === 'template') {
|
|
2180
2258
|
request.templateId = this.selectedTemplateId ?? this.templateId;
|
|
2259
|
+
// If template has role-based steps with selected approvers, pass explicit steps
|
|
2260
|
+
if (this.selectedTemplate) {
|
|
2261
|
+
const hasRoleSteps = this.selectedTemplate.steps.some(s => s.roles?.length > 0);
|
|
2262
|
+
if (hasRoleSteps) {
|
|
2263
|
+
request.steps = this.selectedTemplate.steps.map((s, i) => ({
|
|
2264
|
+
stepOrder: s.stepOrder,
|
|
2265
|
+
stepName: s.stepName,
|
|
2266
|
+
mode: s.mode,
|
|
2267
|
+
approverUserIds: s.roles?.length > 0
|
|
2268
|
+
? (this.stepSelectedUsers[i] ? [this.stepSelectedUsers[i]] : s.assigneeUserIds)
|
|
2269
|
+
: s.assigneeUserIds
|
|
2270
|
+
}));
|
|
2271
|
+
}
|
|
2272
|
+
}
|
|
2181
2273
|
}
|
|
2182
2274
|
else {
|
|
2183
2275
|
request.steps = this.adHocSteps.map((s, i) => ({
|
|
@@ -2231,7 +2323,27 @@ class MaArvContainerComponent {
|
|
|
2231
2323
|
if (img)
|
|
2232
2324
|
cloneCanvas.replaceWith(img.cloneNode(true));
|
|
2233
2325
|
});
|
|
2234
|
-
// Step 4: Inline
|
|
2326
|
+
// Step 4: Inline all <img> sources as base64 data URIs for content integrity
|
|
2327
|
+
const imgElements = Array.from(clone.querySelectorAll('img'));
|
|
2328
|
+
await Promise.all(imgElements.map(async (img) => {
|
|
2329
|
+
const src = img.getAttribute('src');
|
|
2330
|
+
if (!src || src.startsWith('data:'))
|
|
2331
|
+
return;
|
|
2332
|
+
try {
|
|
2333
|
+
const resp = await fetch(src, { mode: 'cors', credentials: 'same-origin' });
|
|
2334
|
+
if (!resp.ok)
|
|
2335
|
+
return;
|
|
2336
|
+
const blob = await resp.blob();
|
|
2337
|
+
const dataUri = await new Promise((resolve) => {
|
|
2338
|
+
const reader = new FileReader();
|
|
2339
|
+
reader.onloadend = () => resolve(reader.result);
|
|
2340
|
+
reader.readAsDataURL(blob);
|
|
2341
|
+
});
|
|
2342
|
+
img.setAttribute('src', dataUri);
|
|
2343
|
+
}
|
|
2344
|
+
catch { /* keep original src if fetch fails */ }
|
|
2345
|
+
}));
|
|
2346
|
+
// Step 5: Inline only essential layout styles (skip colors, widths, cursors)
|
|
2235
2347
|
const liveElements = Array.from(host.querySelectorAll('*'));
|
|
2236
2348
|
const cloneElements = Array.from(clone.querySelectorAll('*'));
|
|
2237
2349
|
const styleProps = this.getStyleProperties();
|
|
@@ -2253,7 +2365,7 @@ class MaArvContainerComponent {
|
|
|
2253
2365
|
}
|
|
2254
2366
|
catch { }
|
|
2255
2367
|
});
|
|
2256
|
-
// Step
|
|
2368
|
+
// Step 6: Strip scripts, Angular attributes, style/link tags, and form elements
|
|
2257
2369
|
clone.querySelectorAll('script, link, style').forEach(el => el.remove());
|
|
2258
2370
|
clone.querySelectorAll('*').forEach(el => {
|
|
2259
2371
|
// Remove Angular-specific attributes
|
|
@@ -2271,7 +2383,7 @@ class MaArvContainerComponent {
|
|
|
2271
2383
|
// Remove class attribute (framework-specific classes add no value)
|
|
2272
2384
|
el.removeAttribute('class');
|
|
2273
2385
|
});
|
|
2274
|
-
// Step
|
|
2386
|
+
// Step 7: Wrap in a clean, print-friendly HTML document
|
|
2275
2387
|
return `<!DOCTYPE html>
|
|
2276
2388
|
<html>
|
|
2277
2389
|
<head>
|
|
@@ -2328,7 +2440,7 @@ ${clone.outerHTML}
|
|
|
2328
2440
|
];
|
|
2329
2441
|
}
|
|
2330
2442
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: MaArvContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2331
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: MaArvContainerComponent, isStandalone: true, selector: "ma-arv-container", inputs: { title: "title", description: "description", referenceId: "referenceId", templateId: "templateId", callbackUrl: "callbackUrl", deadlineHours: "deadlineHours" }, outputs: { approvalSubmitted: "approvalSubmitted",
|
|
2443
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.18", type: MaArvContainerComponent, isStandalone: true, selector: "ma-arv-container", inputs: { title: "title", description: "description", referenceId: "referenceId", templateId: "templateId", callbackUrl: "callbackUrl", deadlineHours: "deadlineHours" }, outputs: { approvalSubmitted: "approvalSubmitted", approvalSubmitting: "approvalSubmitting", cancelled: "cancelled" }, host: { properties: { "class": "this.themeClass" } }, viewQueries: [{ propertyName: "contentBody", first: true, predicate: ["contentBody"], descendants: true, static: true }], ngImport: i0, template: `
|
|
2332
2444
|
<div class="arv-container">
|
|
2333
2445
|
<!-- Content Area -->
|
|
2334
2446
|
<div class="arv-content-body" #contentBody>
|
|
@@ -2343,7 +2455,8 @@ ${clone.outerHTML}
|
|
|
2343
2455
|
<div class="arv-routing">
|
|
2344
2456
|
<div class="arv-routing-header">
|
|
2345
2457
|
<h4 class="arv-section-title">Approval Routing</h4>
|
|
2346
|
-
|
|
2458
|
+
<!-- Show routing toggle only when templateId is NOT locked -->
|
|
2459
|
+
<div *ngIf="!templateId" class="arv-routing-mode">
|
|
2347
2460
|
<label class="arv-radio">
|
|
2348
2461
|
<input type="radio" name="routingMode" value="template" [checked]="routingMode === 'template'" (change)="routingMode = 'template'"> Use Template
|
|
2349
2462
|
</label>
|
|
@@ -2353,15 +2466,62 @@ ${clone.outerHTML}
|
|
|
2353
2466
|
</div>
|
|
2354
2467
|
</div>
|
|
2355
2468
|
|
|
2356
|
-
<!--
|
|
2357
|
-
<div *ngIf="routingMode === 'template'" class="arv-template-select">
|
|
2469
|
+
<!-- Locked template: show name only, no selector -->
|
|
2470
|
+
<div *ngIf="templateId && routingMode === 'template'" class="arv-template-select">
|
|
2471
|
+
<div *ngIf="loadingTemplate" class="arv-template-loading">Loading template...</div>
|
|
2472
|
+
<div *ngIf="selectedTemplate && !loadingTemplate" class="arv-locked-template">
|
|
2473
|
+
<span class="arv-locked-label">Template</span>
|
|
2474
|
+
<span class="arv-locked-name">{{ selectedTemplate.name }}</span>
|
|
2475
|
+
</div>
|
|
2476
|
+
</div>
|
|
2477
|
+
|
|
2478
|
+
<!-- Free template selector (no locked templateId) -->
|
|
2479
|
+
<div *ngIf="!templateId && routingMode === 'template'" class="arv-template-select">
|
|
2358
2480
|
<label class="arv-label">Select Template</label>
|
|
2359
2481
|
<select class="arv-select" (change)="onTemplateChange($event)">
|
|
2360
2482
|
<option value="">-- Select a template --</option>
|
|
2361
|
-
<option *ngFor="let t of templates" [value]="t.id">{{ t.name }}</option>
|
|
2483
|
+
<option *ngFor="let t of templates" [value]="t.id" [selected]="t.id === selectedTemplateId">{{ t.name }}</option>
|
|
2362
2484
|
</select>
|
|
2363
2485
|
</div>
|
|
2364
2486
|
|
|
2487
|
+
<!-- Step pickers (shared for both locked and free template) -->
|
|
2488
|
+
<div *ngIf="routingMode === 'template'" class="arv-template-select">
|
|
2489
|
+
<div *ngIf="!loadingTemplate && selectedTemplate" class="arv-template-steps">
|
|
2490
|
+
<div class="arv-step-card" *ngFor="let s of selectedTemplate.steps; let i = index">
|
|
2491
|
+
<div class="arv-step-card-header">
|
|
2492
|
+
<span class="arv-step-preview-num">Step {{ s.stepOrder }}</span>
|
|
2493
|
+
<span class="arv-step-preview-name">{{ s.stepName }}</span>
|
|
2494
|
+
<span *ngIf="s.roles && s.roles.length > 0" class="arv-step-role-badge">
|
|
2495
|
+
{{ s.roles[0].positionLevel }}{{ s.roles[0].orgName ? ' · ' + s.roles[0].orgName : '' }}
|
|
2496
|
+
</span>
|
|
2497
|
+
</div>
|
|
2498
|
+
<!-- Role-based step: show approver picker -->
|
|
2499
|
+
<div *ngIf="s.roles && s.roles.length > 0" class="arv-step-picker">
|
|
2500
|
+
<div *ngIf="stepLoadingCandidates[i]" class="arv-template-loading">Loading candidates...</div>
|
|
2501
|
+
<select *ngIf="!stepLoadingCandidates[i]" class="arv-select arv-select-sm"
|
|
2502
|
+
(change)="onStepUserChange(i, $event)">
|
|
2503
|
+
<option value="">-- Select approver --</option>
|
|
2504
|
+
<option *ngFor="let u of stepCandidates[i]" [value]="u.userId"
|
|
2505
|
+
[selected]="u.userId === stepSelectedUsers[i]">
|
|
2506
|
+
{{ u.fullName || u.userId }}{{ u.department ? ' · ' + u.department : '' }}{{ u.position ? ' (' + u.position + ')' : '' }}
|
|
2507
|
+
</option>
|
|
2508
|
+
</select>
|
|
2509
|
+
<div *ngIf="!stepLoadingCandidates[i] && stepCandidates[i]?.length === 0" class="arv-template-loading">
|
|
2510
|
+
No candidates found for this role.
|
|
2511
|
+
</div>
|
|
2512
|
+
</div>
|
|
2513
|
+
<!-- Fixed-user step -->
|
|
2514
|
+
<div *ngIf="!s.roles || s.roles.length === 0" class="arv-step-fixed">
|
|
2515
|
+
{{ s.assigneeUserIds.length }} pre-configured approver(s)
|
|
2516
|
+
</div>
|
|
2517
|
+
</div>
|
|
2518
|
+
<div *ngIf="selectedTemplate.referenceUserIds.length > 0" class="arv-step-preview arv-step-preview-cc">
|
|
2519
|
+
<span class="arv-step-preview-num">CC</span>
|
|
2520
|
+
<span class="arv-step-preview-name">{{ selectedTemplate.referenceUserIds.length }} reference user(s) from template</span>
|
|
2521
|
+
</div>
|
|
2522
|
+
</div>
|
|
2523
|
+
</div>
|
|
2524
|
+
|
|
2365
2525
|
<!-- Ad-hoc steps -->
|
|
2366
2526
|
<div *ngIf="routingMode === 'adhoc'" class="arv-steps">
|
|
2367
2527
|
<div class="arv-step" *ngFor="let step of adHocSteps; let i = index">
|
|
@@ -2443,7 +2603,7 @@ ${clone.outerHTML}
|
|
|
2443
2603
|
<p>Submitted for approval successfully.</p>
|
|
2444
2604
|
</div>
|
|
2445
2605
|
</div>
|
|
2446
|
-
`, isInline: true, styles: [":host{display:block;--arv-primary: #90caf9;--arv-primary-hover: #64b5f6;--arv-success: #66bb6a;--arv-danger: #ef5350;--arv-text: #e0e0e0;--arv-text-muted: #9e9e9e;--arv-bg: #1e1e2e;--arv-bg2: #27273a;--arv-border: #383850;--arv-radius: 8px}:host(.theme-light){--arv-primary: #1565c0;--arv-primary-hover: #0d47a1;--arv-success: #2e7d32;--arv-danger: #c62828;--arv-text: #212121;--arv-text-muted: #616161;--arv-bg: #ffffff;--arv-bg2: #f5f5f5;--arv-border: #e0e0e0}.arv-container{display:flex;flex-direction:column;height:100%}.arv-content-body{flex:1;overflow:auto}.arv-footer{border-top:1px solid var(--arv-border);background:var(--arv-bg2)}.arv-footer-inner{padding:16px;display:flex;flex-direction:column;gap:14px}.arv-section-title{margin:0 0 8px;font-size:13px;font-weight:700;color:var(--arv-primary);text-transform:uppercase;letter-spacing:.5px}.arv-routing-header{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px}.arv-routing-mode{display:flex;gap:12px}.arv-radio{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--arv-text);cursor:pointer}.arv-label{font-size:12px;color:var(--arv-text-muted);display:block;margin-bottom:4px}.arv-select{width:100%;padding:8px 10px;border:1px solid var(--arv-border);border-radius:var(--arv-radius);background:var(--arv-bg);color:var(--arv-text);font-size:13px}.arv-input{padding:7px 10px;border:1px solid var(--arv-border);border-radius:var(--arv-radius);background:var(--arv-bg);color:var(--arv-text);font-size:13px}.arv-input-sm{width:100%;margin-top:4px}.arv-steps{display:flex;flex-direction:column;gap:10px}.arv-step{background:var(--arv-bg);border:1px solid var(--arv-border);border-radius:var(--arv-radius);padding:10px}.arv-step-header{display:flex;align-items:center;gap:8px;margin-bottom:8px}.arv-step-num{font-size:12px;font-weight:700;color:var(--arv-primary);min-width:44px}.arv-approver-tags{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:6px}.arv-tag{display:inline-flex;align-items:center;gap:4px;padding:3px 8px;background:#90caf91f;border:1px solid rgba(144,202,249,.3);border-radius:12px;font-size:12px;color:var(--arv-primary)}.arv-tag-remove{background:none;border:none;cursor:pointer;color:var(--arv-text-muted);font-size:11px;padding:0 2px;line-height:1}.arv-tag-remove:hover{color:var(--arv-danger)}.arv-user-search{position:relative}.arv-search-results{position:absolute;left:0;right:0;z-index:100;background:var(--arv-bg2);border:1px solid var(--arv-border);border-radius:var(--arv-radius);max-height:150px;overflow-y:auto}.arv-search-item{padding:8px 12px;cursor:pointer;font-size:13px;color:var(--arv-text)}.arv-search-item:hover{background:var(--arv-bg)}.arv-hint{font-size:12px;color:var(--arv-text-muted);margin:0 0 8px}.arv-btn-icon{background:none;border:none;cursor:pointer;padding:2px;border-radius:4px;display:inline-flex;align-items:center;justify-content:center}.arv-btn-danger{color:var(--arv-danger)}.arv-btn-danger:hover{background:#ef53501a}.arv-actions{display:flex;justify-content:flex-end;gap:10px}.arv-btn{padding:9px 18px;border-radius:var(--arv-radius);font-size:13px;font-weight:600;cursor:pointer;border:none;transition:background .15s}.arv-btn-primary{background:var(--arv-primary);color:#fff}.arv-btn-primary:hover:not(:disabled){background:var(--arv-primary-hover)}.arv-btn-primary:disabled{opacity:.6;cursor:not-allowed}.arv-btn-secondary{background:transparent;border:1px solid var(--arv-border);color:var(--arv-text-muted)}.arv-btn-secondary:hover{color:var(--arv-text);border-color:var(--arv-text-muted)}.arv-btn-outline{background:transparent;border:1px dashed var(--arv-border);color:var(--arv-text-muted);font-size:12px;padding:6px 12px}.arv-btn-outline:hover{border-color:var(--arv-primary);color:var(--arv-primary)}.arv-spinner{display:inline-block;width:14px;height:14px;border:2px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:arv-spin .6s linear infinite;margin-right:6px}@keyframes arv-spin{to{transform:rotate(360deg)}}.arv-error{padding:8px 12px;background:#ef53501a;border:1px solid rgba(239,83,80,.3);border-radius:var(--arv-radius);font-size:13px;color:var(--arv-danger)}.arv-success{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:32px;gap:12px;text-align:center}.arv-success p{color:var(--arv-success);font-size:15px;font-weight:600;margin:0}.arv-references{border-top:1px solid var(--arv-border);padding-top:12px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
2606
|
+
`, isInline: true, styles: [":host{display:block;--arv-primary: #90caf9;--arv-primary-hover: #64b5f6;--arv-success: #66bb6a;--arv-danger: #ef5350;--arv-text: #e0e0e0;--arv-text-muted: #9e9e9e;--arv-bg: #1e1e2e;--arv-bg2: #27273a;--arv-border: #383850;--arv-radius: 8px}:host(.theme-light){--arv-primary: #1565c0;--arv-primary-hover: #0d47a1;--arv-success: #2e7d32;--arv-danger: #c62828;--arv-text: #212121;--arv-text-muted: #616161;--arv-bg: #ffffff;--arv-bg2: #f5f5f5;--arv-border: #e0e0e0}.arv-container{display:flex;flex-direction:column;height:100%}.arv-content-body{flex:1;overflow:auto}.arv-footer{border-top:1px solid var(--arv-border);background:var(--arv-bg2)}.arv-footer-inner{padding:16px;display:flex;flex-direction:column;gap:14px}.arv-section-title{margin:0 0 8px;font-size:13px;font-weight:700;color:var(--arv-primary);text-transform:uppercase;letter-spacing:.5px}.arv-routing-header{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px}.arv-routing-mode{display:flex;gap:12px}.arv-radio{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--arv-text);cursor:pointer}.arv-label{font-size:12px;color:var(--arv-text-muted);display:block;margin-bottom:4px}.arv-select{width:100%;padding:8px 10px;border:1px solid var(--arv-border);border-radius:var(--arv-radius);background:var(--arv-bg);color:var(--arv-text);font-size:13px}.arv-input{padding:7px 10px;border:1px solid var(--arv-border);border-radius:var(--arv-radius);background:var(--arv-bg);color:var(--arv-text);font-size:13px}.arv-input-sm{width:100%;margin-top:4px}.arv-steps{display:flex;flex-direction:column;gap:10px}.arv-step{background:var(--arv-bg);border:1px solid var(--arv-border);border-radius:var(--arv-radius);padding:10px}.arv-step-header{display:flex;align-items:center;gap:8px;margin-bottom:8px}.arv-step-num{font-size:12px;font-weight:700;color:var(--arv-primary);min-width:44px}.arv-approver-tags{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:6px}.arv-tag{display:inline-flex;align-items:center;gap:4px;padding:3px 8px;background:#90caf91f;border:1px solid rgba(144,202,249,.3);border-radius:12px;font-size:12px;color:var(--arv-primary)}.arv-tag-remove{background:none;border:none;cursor:pointer;color:var(--arv-text-muted);font-size:11px;padding:0 2px;line-height:1}.arv-tag-remove:hover{color:var(--arv-danger)}.arv-user-search{position:relative}.arv-search-results{position:absolute;left:0;right:0;z-index:100;background:var(--arv-bg2);border:1px solid var(--arv-border);border-radius:var(--arv-radius);max-height:150px;overflow-y:auto}.arv-search-item{padding:8px 12px;cursor:pointer;font-size:13px;color:var(--arv-text)}.arv-search-item:hover{background:var(--arv-bg)}.arv-hint{font-size:12px;color:var(--arv-text-muted);margin:0 0 8px}.arv-btn-icon{background:none;border:none;cursor:pointer;padding:2px;border-radius:4px;display:inline-flex;align-items:center;justify-content:center}.arv-btn-danger{color:var(--arv-danger)}.arv-btn-danger:hover{background:#ef53501a}.arv-actions{display:flex;justify-content:flex-end;gap:10px}.arv-btn{padding:9px 18px;border-radius:var(--arv-radius);font-size:13px;font-weight:600;cursor:pointer;border:none;transition:background .15s}.arv-btn-primary{background:var(--arv-primary);color:#fff}.arv-btn-primary:hover:not(:disabled){background:var(--arv-primary-hover)}.arv-btn-primary:disabled{opacity:.6;cursor:not-allowed}.arv-btn-secondary{background:transparent;border:1px solid var(--arv-border);color:var(--arv-text-muted)}.arv-btn-secondary:hover{color:var(--arv-text);border-color:var(--arv-text-muted)}.arv-btn-outline{background:transparent;border:1px dashed var(--arv-border);color:var(--arv-text-muted);font-size:12px;padding:6px 12px}.arv-btn-outline:hover{border-color:var(--arv-primary);color:var(--arv-primary)}.arv-spinner{display:inline-block;width:14px;height:14px;border:2px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:arv-spin .6s linear infinite;margin-right:6px}@keyframes arv-spin{to{transform:rotate(360deg)}}.arv-error{padding:8px 12px;background:#ef53501a;border:1px solid rgba(239,83,80,.3);border-radius:var(--arv-radius);font-size:13px;color:var(--arv-danger)}.arv-success{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:32px;gap:12px;text-align:center}.arv-success p{color:var(--arv-success);font-size:15px;font-weight:600;margin:0}.arv-references{border-top:1px solid var(--arv-border);padding-top:12px}.arv-template-loading{font-size:12px;color:var(--arv-text-muted);margin-top:8px;padding:4px 0}.arv-template-steps{margin-top:8px;display:flex;flex-direction:column;gap:6px}.arv-step-card{background:var(--arv-bg);border:1px solid var(--arv-border);border-radius:var(--arv-radius);overflow:hidden}.arv-step-card-header{display:flex;align-items:center;gap:8px;padding:7px 10px;background:#00000008;border-bottom:1px solid var(--arv-border);flex-wrap:wrap}.arv-step-preview{display:flex;align-items:center;gap:8px;padding:5px 8px;background:var(--arv-bg);border:1px solid var(--arv-border);border-radius:4px;font-size:12px}.arv-step-preview-num{font-weight:700;color:var(--arv-primary);min-width:44px;flex-shrink:0;font-size:12px}.arv-step-preview-name{flex:1;color:var(--arv-text);font-size:12px;font-weight:600}.arv-step-role-badge{font-size:11px;color:var(--arv-text-muted);background:#90caf91a;border:1px solid rgba(144,202,249,.25);border-radius:10px;padding:1px 7px}.arv-step-preview-cc .arv-step-preview-num{color:var(--arv-text-muted)}.arv-locked-template{display:flex;align-items:center;gap:8px;padding:7px 10px;background:var(--arv-bg);border:1px solid var(--arv-border);border-radius:var(--arv-radius);margin-top:6px}.arv-locked-label{font-size:11px;color:var(--arv-text-muted);text-transform:uppercase;letter-spacing:.5px;flex-shrink:0}.arv-locked-name{font-size:13px;font-weight:600;color:var(--arv-text)}.arv-step-picker{padding:8px 10px}.arv-select-sm{font-size:12px;padding:6px 8px}.arv-step-fixed{padding:6px 10px;font-size:12px;color:var(--arv-text-muted)}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
2447
2607
|
}
|
|
2448
2608
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: MaArvContainerComponent, decorators: [{
|
|
2449
2609
|
type: Component,
|
|
@@ -2462,7 +2622,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
|
|
|
2462
2622
|
<div class="arv-routing">
|
|
2463
2623
|
<div class="arv-routing-header">
|
|
2464
2624
|
<h4 class="arv-section-title">Approval Routing</h4>
|
|
2465
|
-
|
|
2625
|
+
<!-- Show routing toggle only when templateId is NOT locked -->
|
|
2626
|
+
<div *ngIf="!templateId" class="arv-routing-mode">
|
|
2466
2627
|
<label class="arv-radio">
|
|
2467
2628
|
<input type="radio" name="routingMode" value="template" [checked]="routingMode === 'template'" (change)="routingMode = 'template'"> Use Template
|
|
2468
2629
|
</label>
|
|
@@ -2472,15 +2633,62 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
|
|
|
2472
2633
|
</div>
|
|
2473
2634
|
</div>
|
|
2474
2635
|
|
|
2475
|
-
<!--
|
|
2476
|
-
<div *ngIf="routingMode === 'template'" class="arv-template-select">
|
|
2636
|
+
<!-- Locked template: show name only, no selector -->
|
|
2637
|
+
<div *ngIf="templateId && routingMode === 'template'" class="arv-template-select">
|
|
2638
|
+
<div *ngIf="loadingTemplate" class="arv-template-loading">Loading template...</div>
|
|
2639
|
+
<div *ngIf="selectedTemplate && !loadingTemplate" class="arv-locked-template">
|
|
2640
|
+
<span class="arv-locked-label">Template</span>
|
|
2641
|
+
<span class="arv-locked-name">{{ selectedTemplate.name }}</span>
|
|
2642
|
+
</div>
|
|
2643
|
+
</div>
|
|
2644
|
+
|
|
2645
|
+
<!-- Free template selector (no locked templateId) -->
|
|
2646
|
+
<div *ngIf="!templateId && routingMode === 'template'" class="arv-template-select">
|
|
2477
2647
|
<label class="arv-label">Select Template</label>
|
|
2478
2648
|
<select class="arv-select" (change)="onTemplateChange($event)">
|
|
2479
2649
|
<option value="">-- Select a template --</option>
|
|
2480
|
-
<option *ngFor="let t of templates" [value]="t.id">{{ t.name }}</option>
|
|
2650
|
+
<option *ngFor="let t of templates" [value]="t.id" [selected]="t.id === selectedTemplateId">{{ t.name }}</option>
|
|
2481
2651
|
</select>
|
|
2482
2652
|
</div>
|
|
2483
2653
|
|
|
2654
|
+
<!-- Step pickers (shared for both locked and free template) -->
|
|
2655
|
+
<div *ngIf="routingMode === 'template'" class="arv-template-select">
|
|
2656
|
+
<div *ngIf="!loadingTemplate && selectedTemplate" class="arv-template-steps">
|
|
2657
|
+
<div class="arv-step-card" *ngFor="let s of selectedTemplate.steps; let i = index">
|
|
2658
|
+
<div class="arv-step-card-header">
|
|
2659
|
+
<span class="arv-step-preview-num">Step {{ s.stepOrder }}</span>
|
|
2660
|
+
<span class="arv-step-preview-name">{{ s.stepName }}</span>
|
|
2661
|
+
<span *ngIf="s.roles && s.roles.length > 0" class="arv-step-role-badge">
|
|
2662
|
+
{{ s.roles[0].positionLevel }}{{ s.roles[0].orgName ? ' · ' + s.roles[0].orgName : '' }}
|
|
2663
|
+
</span>
|
|
2664
|
+
</div>
|
|
2665
|
+
<!-- Role-based step: show approver picker -->
|
|
2666
|
+
<div *ngIf="s.roles && s.roles.length > 0" class="arv-step-picker">
|
|
2667
|
+
<div *ngIf="stepLoadingCandidates[i]" class="arv-template-loading">Loading candidates...</div>
|
|
2668
|
+
<select *ngIf="!stepLoadingCandidates[i]" class="arv-select arv-select-sm"
|
|
2669
|
+
(change)="onStepUserChange(i, $event)">
|
|
2670
|
+
<option value="">-- Select approver --</option>
|
|
2671
|
+
<option *ngFor="let u of stepCandidates[i]" [value]="u.userId"
|
|
2672
|
+
[selected]="u.userId === stepSelectedUsers[i]">
|
|
2673
|
+
{{ u.fullName || u.userId }}{{ u.department ? ' · ' + u.department : '' }}{{ u.position ? ' (' + u.position + ')' : '' }}
|
|
2674
|
+
</option>
|
|
2675
|
+
</select>
|
|
2676
|
+
<div *ngIf="!stepLoadingCandidates[i] && stepCandidates[i]?.length === 0" class="arv-template-loading">
|
|
2677
|
+
No candidates found for this role.
|
|
2678
|
+
</div>
|
|
2679
|
+
</div>
|
|
2680
|
+
<!-- Fixed-user step -->
|
|
2681
|
+
<div *ngIf="!s.roles || s.roles.length === 0" class="arv-step-fixed">
|
|
2682
|
+
{{ s.assigneeUserIds.length }} pre-configured approver(s)
|
|
2683
|
+
</div>
|
|
2684
|
+
</div>
|
|
2685
|
+
<div *ngIf="selectedTemplate.referenceUserIds.length > 0" class="arv-step-preview arv-step-preview-cc">
|
|
2686
|
+
<span class="arv-step-preview-num">CC</span>
|
|
2687
|
+
<span class="arv-step-preview-name">{{ selectedTemplate.referenceUserIds.length }} reference user(s) from template</span>
|
|
2688
|
+
</div>
|
|
2689
|
+
</div>
|
|
2690
|
+
</div>
|
|
2691
|
+
|
|
2484
2692
|
<!-- Ad-hoc steps -->
|
|
2485
2693
|
<div *ngIf="routingMode === 'adhoc'" class="arv-steps">
|
|
2486
2694
|
<div class="arv-step" *ngFor="let step of adHocSteps; let i = index">
|
|
@@ -2562,7 +2770,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
|
|
|
2562
2770
|
<p>Submitted for approval successfully.</p>
|
|
2563
2771
|
</div>
|
|
2564
2772
|
</div>
|
|
2565
|
-
`, styles: [":host{display:block;--arv-primary: #90caf9;--arv-primary-hover: #64b5f6;--arv-success: #66bb6a;--arv-danger: #ef5350;--arv-text: #e0e0e0;--arv-text-muted: #9e9e9e;--arv-bg: #1e1e2e;--arv-bg2: #27273a;--arv-border: #383850;--arv-radius: 8px}:host(.theme-light){--arv-primary: #1565c0;--arv-primary-hover: #0d47a1;--arv-success: #2e7d32;--arv-danger: #c62828;--arv-text: #212121;--arv-text-muted: #616161;--arv-bg: #ffffff;--arv-bg2: #f5f5f5;--arv-border: #e0e0e0}.arv-container{display:flex;flex-direction:column;height:100%}.arv-content-body{flex:1;overflow:auto}.arv-footer{border-top:1px solid var(--arv-border);background:var(--arv-bg2)}.arv-footer-inner{padding:16px;display:flex;flex-direction:column;gap:14px}.arv-section-title{margin:0 0 8px;font-size:13px;font-weight:700;color:var(--arv-primary);text-transform:uppercase;letter-spacing:.5px}.arv-routing-header{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px}.arv-routing-mode{display:flex;gap:12px}.arv-radio{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--arv-text);cursor:pointer}.arv-label{font-size:12px;color:var(--arv-text-muted);display:block;margin-bottom:4px}.arv-select{width:100%;padding:8px 10px;border:1px solid var(--arv-border);border-radius:var(--arv-radius);background:var(--arv-bg);color:var(--arv-text);font-size:13px}.arv-input{padding:7px 10px;border:1px solid var(--arv-border);border-radius:var(--arv-radius);background:var(--arv-bg);color:var(--arv-text);font-size:13px}.arv-input-sm{width:100%;margin-top:4px}.arv-steps{display:flex;flex-direction:column;gap:10px}.arv-step{background:var(--arv-bg);border:1px solid var(--arv-border);border-radius:var(--arv-radius);padding:10px}.arv-step-header{display:flex;align-items:center;gap:8px;margin-bottom:8px}.arv-step-num{font-size:12px;font-weight:700;color:var(--arv-primary);min-width:44px}.arv-approver-tags{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:6px}.arv-tag{display:inline-flex;align-items:center;gap:4px;padding:3px 8px;background:#90caf91f;border:1px solid rgba(144,202,249,.3);border-radius:12px;font-size:12px;color:var(--arv-primary)}.arv-tag-remove{background:none;border:none;cursor:pointer;color:var(--arv-text-muted);font-size:11px;padding:0 2px;line-height:1}.arv-tag-remove:hover{color:var(--arv-danger)}.arv-user-search{position:relative}.arv-search-results{position:absolute;left:0;right:0;z-index:100;background:var(--arv-bg2);border:1px solid var(--arv-border);border-radius:var(--arv-radius);max-height:150px;overflow-y:auto}.arv-search-item{padding:8px 12px;cursor:pointer;font-size:13px;color:var(--arv-text)}.arv-search-item:hover{background:var(--arv-bg)}.arv-hint{font-size:12px;color:var(--arv-text-muted);margin:0 0 8px}.arv-btn-icon{background:none;border:none;cursor:pointer;padding:2px;border-radius:4px;display:inline-flex;align-items:center;justify-content:center}.arv-btn-danger{color:var(--arv-danger)}.arv-btn-danger:hover{background:#ef53501a}.arv-actions{display:flex;justify-content:flex-end;gap:10px}.arv-btn{padding:9px 18px;border-radius:var(--arv-radius);font-size:13px;font-weight:600;cursor:pointer;border:none;transition:background .15s}.arv-btn-primary{background:var(--arv-primary);color:#fff}.arv-btn-primary:hover:not(:disabled){background:var(--arv-primary-hover)}.arv-btn-primary:disabled{opacity:.6;cursor:not-allowed}.arv-btn-secondary{background:transparent;border:1px solid var(--arv-border);color:var(--arv-text-muted)}.arv-btn-secondary:hover{color:var(--arv-text);border-color:var(--arv-text-muted)}.arv-btn-outline{background:transparent;border:1px dashed var(--arv-border);color:var(--arv-text-muted);font-size:12px;padding:6px 12px}.arv-btn-outline:hover{border-color:var(--arv-primary);color:var(--arv-primary)}.arv-spinner{display:inline-block;width:14px;height:14px;border:2px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:arv-spin .6s linear infinite;margin-right:6px}@keyframes arv-spin{to{transform:rotate(360deg)}}.arv-error{padding:8px 12px;background:#ef53501a;border:1px solid rgba(239,83,80,.3);border-radius:var(--arv-radius);font-size:13px;color:var(--arv-danger)}.arv-success{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:32px;gap:12px;text-align:center}.arv-success p{color:var(--arv-success);font-size:15px;font-weight:600;margin:0}.arv-references{border-top:1px solid var(--arv-border);padding-top:12px}\n"] }]
|
|
2773
|
+
`, styles: [":host{display:block;--arv-primary: #90caf9;--arv-primary-hover: #64b5f6;--arv-success: #66bb6a;--arv-danger: #ef5350;--arv-text: #e0e0e0;--arv-text-muted: #9e9e9e;--arv-bg: #1e1e2e;--arv-bg2: #27273a;--arv-border: #383850;--arv-radius: 8px}:host(.theme-light){--arv-primary: #1565c0;--arv-primary-hover: #0d47a1;--arv-success: #2e7d32;--arv-danger: #c62828;--arv-text: #212121;--arv-text-muted: #616161;--arv-bg: #ffffff;--arv-bg2: #f5f5f5;--arv-border: #e0e0e0}.arv-container{display:flex;flex-direction:column;height:100%}.arv-content-body{flex:1;overflow:auto}.arv-footer{border-top:1px solid var(--arv-border);background:var(--arv-bg2)}.arv-footer-inner{padding:16px;display:flex;flex-direction:column;gap:14px}.arv-section-title{margin:0 0 8px;font-size:13px;font-weight:700;color:var(--arv-primary);text-transform:uppercase;letter-spacing:.5px}.arv-routing-header{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px}.arv-routing-mode{display:flex;gap:12px}.arv-radio{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--arv-text);cursor:pointer}.arv-label{font-size:12px;color:var(--arv-text-muted);display:block;margin-bottom:4px}.arv-select{width:100%;padding:8px 10px;border:1px solid var(--arv-border);border-radius:var(--arv-radius);background:var(--arv-bg);color:var(--arv-text);font-size:13px}.arv-input{padding:7px 10px;border:1px solid var(--arv-border);border-radius:var(--arv-radius);background:var(--arv-bg);color:var(--arv-text);font-size:13px}.arv-input-sm{width:100%;margin-top:4px}.arv-steps{display:flex;flex-direction:column;gap:10px}.arv-step{background:var(--arv-bg);border:1px solid var(--arv-border);border-radius:var(--arv-radius);padding:10px}.arv-step-header{display:flex;align-items:center;gap:8px;margin-bottom:8px}.arv-step-num{font-size:12px;font-weight:700;color:var(--arv-primary);min-width:44px}.arv-approver-tags{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:6px}.arv-tag{display:inline-flex;align-items:center;gap:4px;padding:3px 8px;background:#90caf91f;border:1px solid rgba(144,202,249,.3);border-radius:12px;font-size:12px;color:var(--arv-primary)}.arv-tag-remove{background:none;border:none;cursor:pointer;color:var(--arv-text-muted);font-size:11px;padding:0 2px;line-height:1}.arv-tag-remove:hover{color:var(--arv-danger)}.arv-user-search{position:relative}.arv-search-results{position:absolute;left:0;right:0;z-index:100;background:var(--arv-bg2);border:1px solid var(--arv-border);border-radius:var(--arv-radius);max-height:150px;overflow-y:auto}.arv-search-item{padding:8px 12px;cursor:pointer;font-size:13px;color:var(--arv-text)}.arv-search-item:hover{background:var(--arv-bg)}.arv-hint{font-size:12px;color:var(--arv-text-muted);margin:0 0 8px}.arv-btn-icon{background:none;border:none;cursor:pointer;padding:2px;border-radius:4px;display:inline-flex;align-items:center;justify-content:center}.arv-btn-danger{color:var(--arv-danger)}.arv-btn-danger:hover{background:#ef53501a}.arv-actions{display:flex;justify-content:flex-end;gap:10px}.arv-btn{padding:9px 18px;border-radius:var(--arv-radius);font-size:13px;font-weight:600;cursor:pointer;border:none;transition:background .15s}.arv-btn-primary{background:var(--arv-primary);color:#fff}.arv-btn-primary:hover:not(:disabled){background:var(--arv-primary-hover)}.arv-btn-primary:disabled{opacity:.6;cursor:not-allowed}.arv-btn-secondary{background:transparent;border:1px solid var(--arv-border);color:var(--arv-text-muted)}.arv-btn-secondary:hover{color:var(--arv-text);border-color:var(--arv-text-muted)}.arv-btn-outline{background:transparent;border:1px dashed var(--arv-border);color:var(--arv-text-muted);font-size:12px;padding:6px 12px}.arv-btn-outline:hover{border-color:var(--arv-primary);color:var(--arv-primary)}.arv-spinner{display:inline-block;width:14px;height:14px;border:2px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:arv-spin .6s linear infinite;margin-right:6px}@keyframes arv-spin{to{transform:rotate(360deg)}}.arv-error{padding:8px 12px;background:#ef53501a;border:1px solid rgba(239,83,80,.3);border-radius:var(--arv-radius);font-size:13px;color:var(--arv-danger)}.arv-success{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:32px;gap:12px;text-align:center}.arv-success p{color:var(--arv-success);font-size:15px;font-weight:600;margin:0}.arv-references{border-top:1px solid var(--arv-border);padding-top:12px}.arv-template-loading{font-size:12px;color:var(--arv-text-muted);margin-top:8px;padding:4px 0}.arv-template-steps{margin-top:8px;display:flex;flex-direction:column;gap:6px}.arv-step-card{background:var(--arv-bg);border:1px solid var(--arv-border);border-radius:var(--arv-radius);overflow:hidden}.arv-step-card-header{display:flex;align-items:center;gap:8px;padding:7px 10px;background:#00000008;border-bottom:1px solid var(--arv-border);flex-wrap:wrap}.arv-step-preview{display:flex;align-items:center;gap:8px;padding:5px 8px;background:var(--arv-bg);border:1px solid var(--arv-border);border-radius:4px;font-size:12px}.arv-step-preview-num{font-weight:700;color:var(--arv-primary);min-width:44px;flex-shrink:0;font-size:12px}.arv-step-preview-name{flex:1;color:var(--arv-text);font-size:12px;font-weight:600}.arv-step-role-badge{font-size:11px;color:var(--arv-text-muted);background:#90caf91a;border:1px solid rgba(144,202,249,.25);border-radius:10px;padding:1px 7px}.arv-step-preview-cc .arv-step-preview-num{color:var(--arv-text-muted)}.arv-locked-template{display:flex;align-items:center;gap:8px;padding:7px 10px;background:var(--arv-bg);border:1px solid var(--arv-border);border-radius:var(--arv-radius);margin-top:6px}.arv-locked-label{font-size:11px;color:var(--arv-text-muted);text-transform:uppercase;letter-spacing:.5px;flex-shrink:0}.arv-locked-name{font-size:13px;font-weight:600;color:var(--arv-text)}.arv-step-picker{padding:8px 10px}.arv-select-sm{font-size:12px;padding:6px 8px}.arv-step-fixed{padding:6px 10px;font-size:12px;color:var(--arv-text-muted)}\n"] }]
|
|
2566
2774
|
}], propDecorators: { title: [{
|
|
2567
2775
|
type: Input
|
|
2568
2776
|
}], description: [{
|
|
@@ -2577,13 +2785,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
|
|
|
2577
2785
|
type: Input
|
|
2578
2786
|
}], approvalSubmitted: [{
|
|
2579
2787
|
type: Output
|
|
2580
|
-
}],
|
|
2788
|
+
}], approvalSubmitting: [{
|
|
2581
2789
|
type: Output
|
|
2582
2790
|
}], cancelled: [{
|
|
2583
2791
|
type: Output
|
|
2584
2792
|
}], contentBody: [{
|
|
2585
2793
|
type: ViewChild,
|
|
2586
2794
|
args: ['contentBody', { static: true }]
|
|
2795
|
+
}], themeClass: [{
|
|
2796
|
+
type: HostBinding,
|
|
2797
|
+
args: ['class']
|
|
2587
2798
|
}] } });
|
|
2588
2799
|
|
|
2589
2800
|
/**
|