cat-documents-ng 0.3.50 → 0.3.51
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.
|
@@ -37,12 +37,12 @@ import * as i6 from 'primeng/inputtext';
|
|
|
37
37
|
import { InputTextModule } from 'primeng/inputtext';
|
|
38
38
|
import * as i2$1 from 'primeng/table';
|
|
39
39
|
import { TableModule } from 'primeng/table';
|
|
40
|
+
import * as i1 from '@angular/router';
|
|
40
41
|
import * as XLSX from 'xlsx';
|
|
41
42
|
import * as i7 from 'ng2-pdf-viewer';
|
|
42
43
|
import { PdfViewerModule } from 'ng2-pdf-viewer';
|
|
43
44
|
import * as i8 from 'ngx-doc-viewer';
|
|
44
45
|
import { NgxDocViewerModule } from 'ngx-doc-viewer';
|
|
45
|
-
import * as i1 from '@angular/router';
|
|
46
46
|
import * as i6$1 from 'primeng/inputtextarea';
|
|
47
47
|
import { InputTextareaModule } from 'primeng/inputtextarea';
|
|
48
48
|
import * as i8$2 from 'primeng/menu';
|
|
@@ -5768,6 +5768,151 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
5768
5768
|
}]
|
|
5769
5769
|
}] });
|
|
5770
5770
|
|
|
5771
|
+
/**
|
|
5772
|
+
* Service for managing user session details.
|
|
5773
|
+
* @class SessionService
|
|
5774
|
+
* @typedef {SessionService}
|
|
5775
|
+
*/
|
|
5776
|
+
class SessionService {
|
|
5777
|
+
router;
|
|
5778
|
+
/**
|
|
5779
|
+
* Creates an instance of SessionService.
|
|
5780
|
+
* @param {Router} router - Angular Router for navigation.
|
|
5781
|
+
*/
|
|
5782
|
+
constructor(router) {
|
|
5783
|
+
this.router = router;
|
|
5784
|
+
}
|
|
5785
|
+
/**
|
|
5786
|
+
* Retrieves the current user's role from local storage.
|
|
5787
|
+
* @returns {string | null} The user's role, or null if not found.
|
|
5788
|
+
*/
|
|
5789
|
+
getUserRole() {
|
|
5790
|
+
return localStorage.getItem('role');
|
|
5791
|
+
}
|
|
5792
|
+
/**
|
|
5793
|
+
* Stores the user session data in local storage.
|
|
5794
|
+
* @param {any} data - The session data to store.
|
|
5795
|
+
*/
|
|
5796
|
+
setUserSession(data) {
|
|
5797
|
+
localStorage.setItem(SHARED.SESSIONKEY, JSON.stringify(data));
|
|
5798
|
+
}
|
|
5799
|
+
/**
|
|
5800
|
+
* Retrieves the stored user session data.
|
|
5801
|
+
* @returns {any | null} The parsed session data, or null if not found.
|
|
5802
|
+
*/
|
|
5803
|
+
getUserSession() {
|
|
5804
|
+
const sessionData = localStorage.getItem(SHARED.SESSIONKEY);
|
|
5805
|
+
return sessionData ? JSON.parse(sessionData) : null;
|
|
5806
|
+
}
|
|
5807
|
+
/**
|
|
5808
|
+
* Retrieves the user's permissions from the stored session data.
|
|
5809
|
+
* @returns {any | null} The user's permissions, or null if not found.
|
|
5810
|
+
*/
|
|
5811
|
+
getUserPermissions() {
|
|
5812
|
+
const sessionData = localStorage.getItem(SHARED.SESSIONKEY);
|
|
5813
|
+
return sessionData ? JSON.parse(sessionData).permissions : null;
|
|
5814
|
+
}
|
|
5815
|
+
/**
|
|
5816
|
+
* Retrieves the session ID from the stored session data.
|
|
5817
|
+
* @returns {any | null} The session ID, or null if not found.
|
|
5818
|
+
*/
|
|
5819
|
+
getSessionID() {
|
|
5820
|
+
const sessionData = localStorage.getItem(SHARED.SESSIONKEY);
|
|
5821
|
+
console.log(sessionData);
|
|
5822
|
+
if (sessionData) {
|
|
5823
|
+
const sessionId = JSON.parse(sessionData);
|
|
5824
|
+
console.log(sessionId);
|
|
5825
|
+
return sessionId;
|
|
5826
|
+
}
|
|
5827
|
+
return null;
|
|
5828
|
+
}
|
|
5829
|
+
/**
|
|
5830
|
+
* Clears all stored session data from local storage.
|
|
5831
|
+
*/
|
|
5832
|
+
clearSession() {
|
|
5833
|
+
localStorage.clear();
|
|
5834
|
+
}
|
|
5835
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: SessionService, deps: [{ token: i1.Router }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
5836
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: SessionService, providedIn: 'root' });
|
|
5837
|
+
}
|
|
5838
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: SessionService, decorators: [{
|
|
5839
|
+
type: Injectable,
|
|
5840
|
+
args: [{
|
|
5841
|
+
providedIn: 'root'
|
|
5842
|
+
}]
|
|
5843
|
+
}], ctorParameters: () => [{ type: i1.Router }] });
|
|
5844
|
+
|
|
5845
|
+
/**
|
|
5846
|
+
* Directive to conditionally show or hide elements based on user permissions.
|
|
5847
|
+
* @class HasPermissionDirective
|
|
5848
|
+
* @typedef {HasPermissionDirective}
|
|
5849
|
+
*/
|
|
5850
|
+
class HasPermissionDirective {
|
|
5851
|
+
el;
|
|
5852
|
+
renderer;
|
|
5853
|
+
sessionService;
|
|
5854
|
+
/**
|
|
5855
|
+
* The required permission(s) to display the element.
|
|
5856
|
+
* Accepts a single string or an array of strings.
|
|
5857
|
+
* @type {string | string[]}
|
|
5858
|
+
*/
|
|
5859
|
+
permission;
|
|
5860
|
+
/**
|
|
5861
|
+
* Creates an instance of HasPermissionDirective.
|
|
5862
|
+
* @param {ElementRef} el - Reference to the host element.
|
|
5863
|
+
* @param {Renderer2} renderer - Angular Renderer for DOM manipulation.
|
|
5864
|
+
* @param {SessionService} sessionService - Service to retrieve user permissions.
|
|
5865
|
+
*/
|
|
5866
|
+
constructor(el, renderer, sessionService) {
|
|
5867
|
+
this.el = el;
|
|
5868
|
+
this.renderer = renderer;
|
|
5869
|
+
this.sessionService = sessionService;
|
|
5870
|
+
}
|
|
5871
|
+
/**
|
|
5872
|
+
* Lifecycle hook that is called when input properties change.
|
|
5873
|
+
* @param {SimpleChanges} changes - The changes in input properties.
|
|
5874
|
+
*/
|
|
5875
|
+
ngOnChanges(changes) {
|
|
5876
|
+
if (changes['permission']) {
|
|
5877
|
+
this.checkPermission();
|
|
5878
|
+
}
|
|
5879
|
+
}
|
|
5880
|
+
/**
|
|
5881
|
+
* Checks if the user has the required permission(s).
|
|
5882
|
+
* Hides the element if the permission is not found.
|
|
5883
|
+
*/
|
|
5884
|
+
checkPermission() {
|
|
5885
|
+
// If no permission is required (empty string, null, or undefined), show the element
|
|
5886
|
+
if (!this.permission || this.permission === '' || (Array.isArray(this.permission) && this.permission.length === 0)) {
|
|
5887
|
+
this.renderer.removeStyle(this.el.nativeElement, 'display');
|
|
5888
|
+
return;
|
|
5889
|
+
}
|
|
5890
|
+
const userPermissionsObjects = this.sessionService.getUserPermissions();
|
|
5891
|
+
const userPermissionNames = userPermissionsObjects?.map((perm) => perm.name) || [];
|
|
5892
|
+
const requiredPermissions = Array.isArray(this.permission)
|
|
5893
|
+
? this.permission
|
|
5894
|
+
: [this.permission];
|
|
5895
|
+
const hasPermission = requiredPermissions.some(permission => userPermissionNames.includes(permission));
|
|
5896
|
+
if (!hasPermission) {
|
|
5897
|
+
this.renderer.setStyle(this.el.nativeElement, 'display', 'none');
|
|
5898
|
+
}
|
|
5899
|
+
else {
|
|
5900
|
+
this.renderer.removeStyle(this.el.nativeElement, 'display');
|
|
5901
|
+
}
|
|
5902
|
+
}
|
|
5903
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HasPermissionDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: SessionService }], target: i0.ɵɵFactoryTarget.Directive });
|
|
5904
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.14", type: HasPermissionDirective, isStandalone: false, selector: "[permission]", inputs: { permission: "permission" }, usesOnChanges: true, ngImport: i0 });
|
|
5905
|
+
}
|
|
5906
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HasPermissionDirective, decorators: [{
|
|
5907
|
+
type: Directive,
|
|
5908
|
+
args: [{
|
|
5909
|
+
selector: '[permission]',
|
|
5910
|
+
standalone: false
|
|
5911
|
+
}]
|
|
5912
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: SessionService }], propDecorators: { permission: [{
|
|
5913
|
+
type: Input
|
|
5914
|
+
}] } });
|
|
5915
|
+
|
|
5771
5916
|
/**
|
|
5772
5917
|
* Component for displaying document history in a timeline format.
|
|
5773
5918
|
*/
|
|
@@ -6023,11 +6168,11 @@ class DocumentHistoryComponent {
|
|
|
6023
6168
|
}
|
|
6024
6169
|
}
|
|
6025
6170
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DocumentHistoryComponent, deps: [{ token: DocumentHistoryService }, { token: DocumentViewerService }, { token: DocumentActionsService }, { token: i3.ConfirmationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
6026
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: DocumentHistoryComponent, isStandalone: false, selector: "document-history", inputs: { historyData: "historyData", showHistory: "showHistory", contextId: "contextId", selectedDocument: "selectedDocument" }, outputs: { deleteTaskRequested: "deleteTaskRequested", documentSelected: "documentSelected" }, host: { listeners: { "document:click": "onDocumentClickOutside($event)" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"document-review-container\" *ngIf=\"showHistory && historyData.length > 0\">\r\n <!-- Header Section -->\r\n <div class=\"review-header\">\r\n <h2 class=\"review-title\">Document Review</h2>\r\n <div class=\"actions-menu\" *ngIf=\"selectedDocument?.isUploaded || selectedDocument?.status == 'Approved'\">\r\n <button class=\"actions-btn\" (click)=\"toggleActionsMenu()\" [class.active]=\"showActionsMenu\">\r\n Actions\r\n <i class=\"pi pi-chevron-down\" [class.rotated]=\"showActionsMenu\"></i>\r\n </button>\r\n\r\n <!-- Actions Dropdown Menu -->\r\n <div class=\"actions-dropdown\" *ngIf=\"showActionsMenu\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"dropdown-item\" *ngIf=\"selectedDocument?.status == 'Approved'\">\r\n <ng-content [select]=\"'action-launcher'\"></ng-content>\r\n </div>\r\n <div *ngIf=\"selectedDocument?.isUploaded\" class=\"dropdown-item\" (click)=\"onDeleteTask()\">\r\n <span>Delete task</span>\r\n </div>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n\r\n <!-- Document Actions Component - Below Header -->\r\n <div class=\"document-actions-section\">\r\n <ng-content select=\"[actions-component]\"></ng-content>\r\n </div>\r\n\r\n\r\n <!-- Alerts Section -->\r\n <!-- <div class=\"alerts-section\">\r\n <div class=\"alert-card\">\r\n <div class=\"alert-header\">\r\n <i class=\"pi pi-exclamation-triangle alert-icon\"></i>\r\n <span class=\"alert-text\">Alerts</span>\r\n <div class=\"alert-badge\">\r\n <span class=\"alert-count\">{{ getAlertCount() }}</span>\r\n <i class=\"pi pi-chevron-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Timeline Section -->\r\n <div class=\"timeline-section\">\r\n <h3 class=\"timeline-title\">Timeline</h3>\r\n <div class=\"timeline-container\">\r\n <div class=\"timeline-item\" *ngFor=\"let section of processedHistoryData\">\r\n <ng-container *ngFor=\"let item of section.list; let i = index\">\r\n <div class=\"timeline-event mb-2\" *ngIf=\"!item.shouldHide\">\r\n <div class=\"event-card\" [ngClass]=\"item.eventCardClass\">\r\n <!-- Event Header -->\r\n <div class=\"event-header\">\r\n <div class=\"event-info\">\r\n <i [class]=\"item.eventIcon\"></i>\r\n <span class=\"event-label\">{{ item.label }}</span>\r\n </div>\r\n <div class=\"event-timestamp\">{{ item.dateTime }}</div>\r\n </div>\r\n <!-- User Information -->\r\n <div class=\"event-user mb-2\">\r\n <span class=\"user-name\">{{ item.userName }}</span>\r\n <span class=\"user-role\">({{ item.userRole }})</span>\r\n </div>\r\n <!-- Event Description -->\r\n <div class=\"event-description\" *ngIf=\"item.requestDescription\">\r\n <ul class=\"event-description-list\" *ngIf=\"item.label.toLowerCase().includes('requested')\">\r\n <li class=\"event-description-item\">{{ item.requestDescription }}</li>\r\n </ul>\r\n <p *ngIf=\"!item.label.toLowerCase().includes('requested')\">{{ item.requestDescription }}</p>\r\n </div>\r\n\r\n <!-- Document Upload Cards -->\r\n <div class=\"document-uploads\" *ngIf=\"item.documentList && item.documentList.length > 0\">\r\n <div class=\"uploaded-documents\">\r\n <div class=\"document-card\" *ngFor=\"let doc of item.documentList\" (click)=\"onDocumentClick(doc)\">\r\n <div class=\"document-icon\">\r\n <i class=\"pi pi-file\"></i>\r\n </div>\r\n <span class=\"document-name\">{{ doc.docName }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- <ng-content [select]=\"'actions-component'\"></ng-content> -->\r\n</div>", styles: [".document-review-container{border-radius:8px;max-height:100%;overflow-y:auto;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.document-review-container .review-header{display:flex;justify-content:space-between;align-items:center;padding-bottom:1rem;border-bottom:1px solid #e5e7eb}.document-review-container .review-header .review-title{font-size:1.5rem;font-weight:600;color:#1f2937;margin:0}.document-review-container .review-header .actions-menu{position:relative}.document-review-container .review-header .actions-menu .actions-btn{background:#fff;border:1px solid #d1d5db;border-radius:6px;padding:.5rem 1rem;color:#374151;font-size:.875rem;cursor:pointer;display:flex;align-items:center;gap:.5rem;transition:all .2s}.document-review-container .review-header .actions-menu .actions-btn:hover{background:#f9fafb}.document-review-container .review-header .actions-menu .actions-btn.active{background:#f3f4f6;border-color:#9ca3af}.document-review-container .review-header .actions-menu .actions-btn i{font-size:.75rem;transition:transform .2s}.document-review-container .review-header .actions-menu .actions-btn i.rotated{transform:rotate(180deg)}.document-review-container .review-header .actions-menu .actions-dropdown{position:absolute;top:100%;right:0;background:#fff;border:1px solid #d1d5db;border-radius:8px;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -1px #0000000f;z-index:1000;min-width:180px;margin-top:.25rem}.document-review-container .review-header .actions-menu .actions-dropdown .dropdown-item{padding:.75rem 1rem;cursor:pointer;color:#374151;font-size:.875rem;border-bottom:1px solid #f3f4f6;transition:background-color .2s}.document-review-container .review-header .actions-menu .actions-dropdown .dropdown-item:last-child{border-bottom:none;border-radius:0 0 8px 8px}.document-review-container .review-header .actions-menu .actions-dropdown .dropdown-item:first-child{border-radius:8px 8px 0 0}.document-review-container .review-header .actions-menu .actions-dropdown .dropdown-item:hover{background:#f9fafb}.document-review-container .review-header .actions-menu .actions-dropdown .dropdown-item span{display:block}.document-review-container ::ng-deep document-actions{margin-bottom:1.5rem}.document-review-container ::ng-deep document-actions .actions-card{margin:0;width:100%}.document-review-container .document-actions-section{padding:1rem 0}.document-review-container .alerts-section{margin-bottom:2rem}.document-review-container .alerts-section .alert-card{background:#fff;border:1px solid #e5e7eb;border-radius:8px;padding:1rem}.document-review-container .alerts-section .alert-card .alert-header{display:flex;align-items:center;gap:.75rem}.document-review-container .alerts-section .alert-card .alert-header .alert-icon{color:#ef4444;font-size:1.25rem}.document-review-container .alerts-section .alert-card .alert-header .alert-text{font-weight:500;color:#1f2937;font-size:1rem}.document-review-container .alerts-section .alert-card .alert-header .alert-badge{margin-left:auto;display:flex;align-items:center;gap:.5rem;background:#ef4444;color:#fff;border-radius:50%;width:24px;height:24px;justify-content:center;position:relative}.document-review-container .alerts-section .alert-card .alert-header .alert-badge .alert-count{font-size:.75rem;font-weight:600}.document-review-container .alerts-section .alert-card .alert-header .alert-badge i{position:absolute;right:-8px;font-size:.75rem;color:#ef4444;background:#fff;border-radius:50%;width:16px;height:16px;display:flex;align-items:center;justify-content:center}.document-review-container .timeline-section .timeline-title{font-size:1.25rem;font-weight:600;color:#1f2937;margin:0 0 1.5rem}.document-review-container .timeline-section .timeline-container .timeline-item{margin-bottom:1.5rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card{background:#fff;border:1px solid #e5e7eb;border-radius:8px;padding:1.25rem;position:relative}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info{display:flex;align-items:center;gap:.75rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-icon{width:25px;height:25px;border-radius:50%;display:flex;align-items:center;justify-content:center;color:#fff}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-icon i{font-size:1rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-icon.icon-requested{background:#3b82f6}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-icon.icon-accepted{background:#10b981}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-icon.icon-rejected{background:#ef4444}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-icon.icon-default{background:#6b7280}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-label{font-weight:600;color:#1f2937;font-size:1rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-timestamp{color:#6b7280;font-size:.875rem;font-weight:500}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-description{margin-bottom:1rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-description p{color:#374151;line-height:1.5;margin:0;font-size:.875rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads{margin-bottom:1rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads .uploaded-documents{display:flex;flex-direction:column;gap:.75rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads .uploaded-documents .document-card{background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:.5rem;display:flex;align-items:center;gap:.75rem;cursor:pointer;transition:all .2s ease}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads .uploaded-documents .document-card:hover{background:#e2e8f0;border-color:#3b82f6;transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads .uploaded-documents .document-card:active{transform:translateY(0);box-shadow:0 1px 2px #0000001a}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads .uploaded-documents .document-card .document-icon{color:#3b82f6;font-size:1.25rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads .uploaded-documents .document-card .document-name{color:#1f2937;font-size:.875rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-user{font-size:.875rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-user .user-name{color:rgb(75,85,99,var(--tw-text-opacity, 1));font-weight:500}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-user .user-role{color:#6b7280;margin-left:.25rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card.event-requested{border-left:4px solid #3b82f6;background:#dbeafe;border-radius:16px;font-size:.875rem;line-height:1.25rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card.event-accepted{border-left:4px solid #10b981;background:#dcfce7;border-radius:16px;font-size:.875rem;line-height:1.25rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card.event-rejected{border-left:4px solid #ef4444;background:#fee2e2;border-radius:16px;font-size:.875rem;line-height:1.25rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card.event-default{border-left:4px solid #6b7280}@media (max-width: 768px){.document-review-container{padding:1rem}.document-review-container .review-header{flex-direction:column;gap:1rem;align-items:flex-start}.document-review-container .review-header .actions-menu{align-self:flex-end}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header{flex-direction:column;align-items:flex-start;gap:.5rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-timestamp{align-self:flex-end}}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
6171
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: DocumentHistoryComponent, isStandalone: false, selector: "document-history", inputs: { historyData: "historyData", showHistory: "showHistory", contextId: "contextId", selectedDocument: "selectedDocument" }, outputs: { deleteTaskRequested: "deleteTaskRequested", documentSelected: "documentSelected" }, host: { listeners: { "document:click": "onDocumentClickOutside($event)" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"document-review-container\" *ngIf=\"showHistory && historyData.length > 0\">\r\n <!-- Header Section -->\r\n <div class=\"review-header\">\r\n <h2 class=\"review-title\">Document Review</h2>\r\n <div class=\"actions-menu\" *ngIf=\"selectedDocument?.isUploaded || selectedDocument?.status == 'Approved'\">\r\n <button class=\"actions-btn\" (click)=\"toggleActionsMenu()\" [class.active]=\"showActionsMenu\">\r\n Actions\r\n <i class=\"pi pi-chevron-down\" [class.rotated]=\"showActionsMenu\"></i>\r\n </button>\r\n\r\n <!-- Actions Dropdown Menu -->\r\n <div class=\"actions-dropdown\" *ngIf=\"showActionsMenu\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"dropdown-item\" *ngIf=\"selectedDocument?.status == 'Approved'\">\r\n <ng-content [select]=\"'action-launcher'\"></ng-content>\r\n </div>\r\n <div *ngIf=\"selectedDocument?.isUploaded\" [permission]=\"'documents-deleteDocumentByDocumentId'\" class=\"dropdown-item\" (click)=\"onDeleteTask()\">\r\n <span>Delete task</span>\r\n </div>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n\r\n <!-- Document Actions Component - Below Header -->\r\n <div class=\"document-actions-section\">\r\n <ng-content select=\"[actions-component]\"></ng-content>\r\n </div>\r\n\r\n\r\n <!-- Alerts Section -->\r\n <!-- <div class=\"alerts-section\">\r\n <div class=\"alert-card\">\r\n <div class=\"alert-header\">\r\n <i class=\"pi pi-exclamation-triangle alert-icon\"></i>\r\n <span class=\"alert-text\">Alerts</span>\r\n <div class=\"alert-badge\">\r\n <span class=\"alert-count\">{{ getAlertCount() }}</span>\r\n <i class=\"pi pi-chevron-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Timeline Section -->\r\n <div class=\"timeline-section\">\r\n <h3 class=\"timeline-title\">Timeline</h3>\r\n <div class=\"timeline-container\">\r\n <div class=\"timeline-item\" *ngFor=\"let section of processedHistoryData\">\r\n <ng-container *ngFor=\"let item of section.list; let i = index\">\r\n <div class=\"timeline-event mb-2\" *ngIf=\"!item.shouldHide\">\r\n <div class=\"event-card\" [ngClass]=\"item.eventCardClass\">\r\n <!-- Event Header -->\r\n <div class=\"event-header\">\r\n <div class=\"event-info\">\r\n <i [class]=\"item.eventIcon\"></i>\r\n <span class=\"event-label\">{{ item.label }}</span>\r\n </div>\r\n <div class=\"event-timestamp\">{{ item.dateTime }}</div>\r\n </div>\r\n <!-- User Information -->\r\n <div class=\"event-user mb-2\">\r\n <span class=\"user-name\">{{ item.userName }}</span>\r\n <span class=\"user-role\">({{ item.userRole }})</span>\r\n </div>\r\n <!-- Event Description -->\r\n <div class=\"event-description\" *ngIf=\"item.requestDescription\">\r\n <ul class=\"event-description-list\" *ngIf=\"item.label.toLowerCase().includes('requested')\">\r\n <li class=\"event-description-item\">{{ item.requestDescription }}</li>\r\n </ul>\r\n <p *ngIf=\"!item.label.toLowerCase().includes('requested')\">{{ item.requestDescription }}</p>\r\n </div>\r\n\r\n <!-- Document Upload Cards -->\r\n <div class=\"document-uploads\" *ngIf=\"item.documentList && item.documentList.length > 0\">\r\n <div class=\"uploaded-documents\">\r\n <div class=\"document-card\" *ngFor=\"let doc of item.documentList\" (click)=\"onDocumentClick(doc)\">\r\n <div class=\"document-icon\">\r\n <i class=\"pi pi-file\"></i>\r\n </div>\r\n <span class=\"document-name\">{{ doc.docName }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- <ng-content [select]=\"'actions-component'\"></ng-content> -->\r\n</div>", styles: [".document-review-container{border-radius:8px;max-height:100%;overflow-y:auto;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.document-review-container .review-header{display:flex;justify-content:space-between;align-items:center;padding-bottom:1rem;border-bottom:1px solid #e5e7eb}.document-review-container .review-header .review-title{font-size:1.5rem;font-weight:600;color:#1f2937;margin:0}.document-review-container .review-header .actions-menu{position:relative}.document-review-container .review-header .actions-menu .actions-btn{background:#fff;border:1px solid #d1d5db;border-radius:6px;padding:.5rem 1rem;color:#374151;font-size:.875rem;cursor:pointer;display:flex;align-items:center;gap:.5rem;transition:all .2s}.document-review-container .review-header .actions-menu .actions-btn:hover{background:#f9fafb}.document-review-container .review-header .actions-menu .actions-btn.active{background:#f3f4f6;border-color:#9ca3af}.document-review-container .review-header .actions-menu .actions-btn i{font-size:.75rem;transition:transform .2s}.document-review-container .review-header .actions-menu .actions-btn i.rotated{transform:rotate(180deg)}.document-review-container .review-header .actions-menu .actions-dropdown{position:absolute;top:100%;right:0;background:#fff;border:1px solid #d1d5db;border-radius:8px;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -1px #0000000f;z-index:1000;min-width:180px;margin-top:.25rem}.document-review-container .review-header .actions-menu .actions-dropdown .dropdown-item{padding:.75rem 1rem;cursor:pointer;color:#374151;font-size:.875rem;border-bottom:1px solid #f3f4f6;transition:background-color .2s}.document-review-container .review-header .actions-menu .actions-dropdown .dropdown-item:last-child{border-bottom:none;border-radius:0 0 8px 8px}.document-review-container .review-header .actions-menu .actions-dropdown .dropdown-item:first-child{border-radius:8px 8px 0 0}.document-review-container .review-header .actions-menu .actions-dropdown .dropdown-item:hover{background:#f9fafb}.document-review-container .review-header .actions-menu .actions-dropdown .dropdown-item span{display:block}.document-review-container ::ng-deep document-actions{margin-bottom:1.5rem}.document-review-container ::ng-deep document-actions .actions-card{margin:0;width:100%}.document-review-container .document-actions-section{padding:1rem 0}.document-review-container .alerts-section{margin-bottom:2rem}.document-review-container .alerts-section .alert-card{background:#fff;border:1px solid #e5e7eb;border-radius:8px;padding:1rem}.document-review-container .alerts-section .alert-card .alert-header{display:flex;align-items:center;gap:.75rem}.document-review-container .alerts-section .alert-card .alert-header .alert-icon{color:#ef4444;font-size:1.25rem}.document-review-container .alerts-section .alert-card .alert-header .alert-text{font-weight:500;color:#1f2937;font-size:1rem}.document-review-container .alerts-section .alert-card .alert-header .alert-badge{margin-left:auto;display:flex;align-items:center;gap:.5rem;background:#ef4444;color:#fff;border-radius:50%;width:24px;height:24px;justify-content:center;position:relative}.document-review-container .alerts-section .alert-card .alert-header .alert-badge .alert-count{font-size:.75rem;font-weight:600}.document-review-container .alerts-section .alert-card .alert-header .alert-badge i{position:absolute;right:-8px;font-size:.75rem;color:#ef4444;background:#fff;border-radius:50%;width:16px;height:16px;display:flex;align-items:center;justify-content:center}.document-review-container .timeline-section .timeline-title{font-size:1.25rem;font-weight:600;color:#1f2937;margin:0 0 1.5rem}.document-review-container .timeline-section .timeline-container .timeline-item{margin-bottom:1.5rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card{background:#fff;border:1px solid #e5e7eb;border-radius:8px;padding:1.25rem;position:relative}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info{display:flex;align-items:center;gap:.75rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-icon{width:25px;height:25px;border-radius:50%;display:flex;align-items:center;justify-content:center;color:#fff}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-icon i{font-size:1rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-icon.icon-requested{background:#3b82f6}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-icon.icon-accepted{background:#10b981}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-icon.icon-rejected{background:#ef4444}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-icon.icon-default{background:#6b7280}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-label{font-weight:600;color:#1f2937;font-size:1rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-timestamp{color:#6b7280;font-size:.875rem;font-weight:500}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-description{margin-bottom:1rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-description p{color:#374151;line-height:1.5;margin:0;font-size:.875rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads{margin-bottom:1rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads .uploaded-documents{display:flex;flex-direction:column;gap:.75rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads .uploaded-documents .document-card{background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:.5rem;display:flex;align-items:center;gap:.75rem;cursor:pointer;transition:all .2s ease}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads .uploaded-documents .document-card:hover{background:#e2e8f0;border-color:#3b82f6;transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads .uploaded-documents .document-card:active{transform:translateY(0);box-shadow:0 1px 2px #0000001a}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads .uploaded-documents .document-card .document-icon{color:#3b82f6;font-size:1.25rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads .uploaded-documents .document-card .document-name{color:#1f2937;font-size:.875rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-user{font-size:.875rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-user .user-name{color:rgb(75,85,99,var(--tw-text-opacity, 1));font-weight:500}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-user .user-role{color:#6b7280;margin-left:.25rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card.event-requested{border-left:4px solid #3b82f6;background:#dbeafe;border-radius:16px;font-size:.875rem;line-height:1.25rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card.event-accepted{border-left:4px solid #10b981;background:#dcfce7;border-radius:16px;font-size:.875rem;line-height:1.25rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card.event-rejected{border-left:4px solid #ef4444;background:#fee2e2;border-radius:16px;font-size:.875rem;line-height:1.25rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card.event-default{border-left:4px solid #6b7280}@media (max-width: 768px){.document-review-container{padding:1rem}.document-review-container .review-header{flex-direction:column;gap:1rem;align-items:flex-start}.document-review-container .review-header .actions-menu{align-self:flex-end}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header{flex-direction:column;align-items:flex-start;gap:.5rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-timestamp{align-self:flex-end}}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: HasPermissionDirective, selector: "[permission]", inputs: ["permission"] }] });
|
|
6027
6172
|
}
|
|
6028
6173
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DocumentHistoryComponent, decorators: [{
|
|
6029
6174
|
type: Component,
|
|
6030
|
-
args: [{ selector: 'document-history', standalone: false, template: "<div class=\"document-review-container\" *ngIf=\"showHistory && historyData.length > 0\">\r\n <!-- Header Section -->\r\n <div class=\"review-header\">\r\n <h2 class=\"review-title\">Document Review</h2>\r\n <div class=\"actions-menu\" *ngIf=\"selectedDocument?.isUploaded || selectedDocument?.status == 'Approved'\">\r\n <button class=\"actions-btn\" (click)=\"toggleActionsMenu()\" [class.active]=\"showActionsMenu\">\r\n Actions\r\n <i class=\"pi pi-chevron-down\" [class.rotated]=\"showActionsMenu\"></i>\r\n </button>\r\n\r\n <!-- Actions Dropdown Menu -->\r\n <div class=\"actions-dropdown\" *ngIf=\"showActionsMenu\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"dropdown-item\" *ngIf=\"selectedDocument?.status == 'Approved'\">\r\n <ng-content [select]=\"'action-launcher'\"></ng-content>\r\n </div>\r\n <div *ngIf=\"selectedDocument?.isUploaded\" class=\"dropdown-item\" (click)=\"onDeleteTask()\">\r\n <span>Delete task</span>\r\n </div>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n\r\n <!-- Document Actions Component - Below Header -->\r\n <div class=\"document-actions-section\">\r\n <ng-content select=\"[actions-component]\"></ng-content>\r\n </div>\r\n\r\n\r\n <!-- Alerts Section -->\r\n <!-- <div class=\"alerts-section\">\r\n <div class=\"alert-card\">\r\n <div class=\"alert-header\">\r\n <i class=\"pi pi-exclamation-triangle alert-icon\"></i>\r\n <span class=\"alert-text\">Alerts</span>\r\n <div class=\"alert-badge\">\r\n <span class=\"alert-count\">{{ getAlertCount() }}</span>\r\n <i class=\"pi pi-chevron-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Timeline Section -->\r\n <div class=\"timeline-section\">\r\n <h3 class=\"timeline-title\">Timeline</h3>\r\n <div class=\"timeline-container\">\r\n <div class=\"timeline-item\" *ngFor=\"let section of processedHistoryData\">\r\n <ng-container *ngFor=\"let item of section.list; let i = index\">\r\n <div class=\"timeline-event mb-2\" *ngIf=\"!item.shouldHide\">\r\n <div class=\"event-card\" [ngClass]=\"item.eventCardClass\">\r\n <!-- Event Header -->\r\n <div class=\"event-header\">\r\n <div class=\"event-info\">\r\n <i [class]=\"item.eventIcon\"></i>\r\n <span class=\"event-label\">{{ item.label }}</span>\r\n </div>\r\n <div class=\"event-timestamp\">{{ item.dateTime }}</div>\r\n </div>\r\n <!-- User Information -->\r\n <div class=\"event-user mb-2\">\r\n <span class=\"user-name\">{{ item.userName }}</span>\r\n <span class=\"user-role\">({{ item.userRole }})</span>\r\n </div>\r\n <!-- Event Description -->\r\n <div class=\"event-description\" *ngIf=\"item.requestDescription\">\r\n <ul class=\"event-description-list\" *ngIf=\"item.label.toLowerCase().includes('requested')\">\r\n <li class=\"event-description-item\">{{ item.requestDescription }}</li>\r\n </ul>\r\n <p *ngIf=\"!item.label.toLowerCase().includes('requested')\">{{ item.requestDescription }}</p>\r\n </div>\r\n\r\n <!-- Document Upload Cards -->\r\n <div class=\"document-uploads\" *ngIf=\"item.documentList && item.documentList.length > 0\">\r\n <div class=\"uploaded-documents\">\r\n <div class=\"document-card\" *ngFor=\"let doc of item.documentList\" (click)=\"onDocumentClick(doc)\">\r\n <div class=\"document-icon\">\r\n <i class=\"pi pi-file\"></i>\r\n </div>\r\n <span class=\"document-name\">{{ doc.docName }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- <ng-content [select]=\"'actions-component'\"></ng-content> -->\r\n</div>", styles: [".document-review-container{border-radius:8px;max-height:100%;overflow-y:auto;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.document-review-container .review-header{display:flex;justify-content:space-between;align-items:center;padding-bottom:1rem;border-bottom:1px solid #e5e7eb}.document-review-container .review-header .review-title{font-size:1.5rem;font-weight:600;color:#1f2937;margin:0}.document-review-container .review-header .actions-menu{position:relative}.document-review-container .review-header .actions-menu .actions-btn{background:#fff;border:1px solid #d1d5db;border-radius:6px;padding:.5rem 1rem;color:#374151;font-size:.875rem;cursor:pointer;display:flex;align-items:center;gap:.5rem;transition:all .2s}.document-review-container .review-header .actions-menu .actions-btn:hover{background:#f9fafb}.document-review-container .review-header .actions-menu .actions-btn.active{background:#f3f4f6;border-color:#9ca3af}.document-review-container .review-header .actions-menu .actions-btn i{font-size:.75rem;transition:transform .2s}.document-review-container .review-header .actions-menu .actions-btn i.rotated{transform:rotate(180deg)}.document-review-container .review-header .actions-menu .actions-dropdown{position:absolute;top:100%;right:0;background:#fff;border:1px solid #d1d5db;border-radius:8px;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -1px #0000000f;z-index:1000;min-width:180px;margin-top:.25rem}.document-review-container .review-header .actions-menu .actions-dropdown .dropdown-item{padding:.75rem 1rem;cursor:pointer;color:#374151;font-size:.875rem;border-bottom:1px solid #f3f4f6;transition:background-color .2s}.document-review-container .review-header .actions-menu .actions-dropdown .dropdown-item:last-child{border-bottom:none;border-radius:0 0 8px 8px}.document-review-container .review-header .actions-menu .actions-dropdown .dropdown-item:first-child{border-radius:8px 8px 0 0}.document-review-container .review-header .actions-menu .actions-dropdown .dropdown-item:hover{background:#f9fafb}.document-review-container .review-header .actions-menu .actions-dropdown .dropdown-item span{display:block}.document-review-container ::ng-deep document-actions{margin-bottom:1.5rem}.document-review-container ::ng-deep document-actions .actions-card{margin:0;width:100%}.document-review-container .document-actions-section{padding:1rem 0}.document-review-container .alerts-section{margin-bottom:2rem}.document-review-container .alerts-section .alert-card{background:#fff;border:1px solid #e5e7eb;border-radius:8px;padding:1rem}.document-review-container .alerts-section .alert-card .alert-header{display:flex;align-items:center;gap:.75rem}.document-review-container .alerts-section .alert-card .alert-header .alert-icon{color:#ef4444;font-size:1.25rem}.document-review-container .alerts-section .alert-card .alert-header .alert-text{font-weight:500;color:#1f2937;font-size:1rem}.document-review-container .alerts-section .alert-card .alert-header .alert-badge{margin-left:auto;display:flex;align-items:center;gap:.5rem;background:#ef4444;color:#fff;border-radius:50%;width:24px;height:24px;justify-content:center;position:relative}.document-review-container .alerts-section .alert-card .alert-header .alert-badge .alert-count{font-size:.75rem;font-weight:600}.document-review-container .alerts-section .alert-card .alert-header .alert-badge i{position:absolute;right:-8px;font-size:.75rem;color:#ef4444;background:#fff;border-radius:50%;width:16px;height:16px;display:flex;align-items:center;justify-content:center}.document-review-container .timeline-section .timeline-title{font-size:1.25rem;font-weight:600;color:#1f2937;margin:0 0 1.5rem}.document-review-container .timeline-section .timeline-container .timeline-item{margin-bottom:1.5rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card{background:#fff;border:1px solid #e5e7eb;border-radius:8px;padding:1.25rem;position:relative}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info{display:flex;align-items:center;gap:.75rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-icon{width:25px;height:25px;border-radius:50%;display:flex;align-items:center;justify-content:center;color:#fff}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-icon i{font-size:1rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-icon.icon-requested{background:#3b82f6}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-icon.icon-accepted{background:#10b981}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-icon.icon-rejected{background:#ef4444}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-icon.icon-default{background:#6b7280}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-label{font-weight:600;color:#1f2937;font-size:1rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-timestamp{color:#6b7280;font-size:.875rem;font-weight:500}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-description{margin-bottom:1rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-description p{color:#374151;line-height:1.5;margin:0;font-size:.875rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads{margin-bottom:1rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads .uploaded-documents{display:flex;flex-direction:column;gap:.75rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads .uploaded-documents .document-card{background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:.5rem;display:flex;align-items:center;gap:.75rem;cursor:pointer;transition:all .2s ease}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads .uploaded-documents .document-card:hover{background:#e2e8f0;border-color:#3b82f6;transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads .uploaded-documents .document-card:active{transform:translateY(0);box-shadow:0 1px 2px #0000001a}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads .uploaded-documents .document-card .document-icon{color:#3b82f6;font-size:1.25rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads .uploaded-documents .document-card .document-name{color:#1f2937;font-size:.875rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-user{font-size:.875rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-user .user-name{color:rgb(75,85,99,var(--tw-text-opacity, 1));font-weight:500}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-user .user-role{color:#6b7280;margin-left:.25rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card.event-requested{border-left:4px solid #3b82f6;background:#dbeafe;border-radius:16px;font-size:.875rem;line-height:1.25rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card.event-accepted{border-left:4px solid #10b981;background:#dcfce7;border-radius:16px;font-size:.875rem;line-height:1.25rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card.event-rejected{border-left:4px solid #ef4444;background:#fee2e2;border-radius:16px;font-size:.875rem;line-height:1.25rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card.event-default{border-left:4px solid #6b7280}@media (max-width: 768px){.document-review-container{padding:1rem}.document-review-container .review-header{flex-direction:column;gap:1rem;align-items:flex-start}.document-review-container .review-header .actions-menu{align-self:flex-end}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header{flex-direction:column;align-items:flex-start;gap:.5rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-timestamp{align-self:flex-end}}\n"] }]
|
|
6175
|
+
args: [{ selector: 'document-history', standalone: false, template: "<div class=\"document-review-container\" *ngIf=\"showHistory && historyData.length > 0\">\r\n <!-- Header Section -->\r\n <div class=\"review-header\">\r\n <h2 class=\"review-title\">Document Review</h2>\r\n <div class=\"actions-menu\" *ngIf=\"selectedDocument?.isUploaded || selectedDocument?.status == 'Approved'\">\r\n <button class=\"actions-btn\" (click)=\"toggleActionsMenu()\" [class.active]=\"showActionsMenu\">\r\n Actions\r\n <i class=\"pi pi-chevron-down\" [class.rotated]=\"showActionsMenu\"></i>\r\n </button>\r\n\r\n <!-- Actions Dropdown Menu -->\r\n <div class=\"actions-dropdown\" *ngIf=\"showActionsMenu\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"dropdown-item\" *ngIf=\"selectedDocument?.status == 'Approved'\">\r\n <ng-content [select]=\"'action-launcher'\"></ng-content>\r\n </div>\r\n <div *ngIf=\"selectedDocument?.isUploaded\" [permission]=\"'documents-deleteDocumentByDocumentId'\" class=\"dropdown-item\" (click)=\"onDeleteTask()\">\r\n <span>Delete task</span>\r\n </div>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n\r\n <!-- Document Actions Component - Below Header -->\r\n <div class=\"document-actions-section\">\r\n <ng-content select=\"[actions-component]\"></ng-content>\r\n </div>\r\n\r\n\r\n <!-- Alerts Section -->\r\n <!-- <div class=\"alerts-section\">\r\n <div class=\"alert-card\">\r\n <div class=\"alert-header\">\r\n <i class=\"pi pi-exclamation-triangle alert-icon\"></i>\r\n <span class=\"alert-text\">Alerts</span>\r\n <div class=\"alert-badge\">\r\n <span class=\"alert-count\">{{ getAlertCount() }}</span>\r\n <i class=\"pi pi-chevron-right\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n </div> -->\r\n\r\n <!-- Timeline Section -->\r\n <div class=\"timeline-section\">\r\n <h3 class=\"timeline-title\">Timeline</h3>\r\n <div class=\"timeline-container\">\r\n <div class=\"timeline-item\" *ngFor=\"let section of processedHistoryData\">\r\n <ng-container *ngFor=\"let item of section.list; let i = index\">\r\n <div class=\"timeline-event mb-2\" *ngIf=\"!item.shouldHide\">\r\n <div class=\"event-card\" [ngClass]=\"item.eventCardClass\">\r\n <!-- Event Header -->\r\n <div class=\"event-header\">\r\n <div class=\"event-info\">\r\n <i [class]=\"item.eventIcon\"></i>\r\n <span class=\"event-label\">{{ item.label }}</span>\r\n </div>\r\n <div class=\"event-timestamp\">{{ item.dateTime }}</div>\r\n </div>\r\n <!-- User Information -->\r\n <div class=\"event-user mb-2\">\r\n <span class=\"user-name\">{{ item.userName }}</span>\r\n <span class=\"user-role\">({{ item.userRole }})</span>\r\n </div>\r\n <!-- Event Description -->\r\n <div class=\"event-description\" *ngIf=\"item.requestDescription\">\r\n <ul class=\"event-description-list\" *ngIf=\"item.label.toLowerCase().includes('requested')\">\r\n <li class=\"event-description-item\">{{ item.requestDescription }}</li>\r\n </ul>\r\n <p *ngIf=\"!item.label.toLowerCase().includes('requested')\">{{ item.requestDescription }}</p>\r\n </div>\r\n\r\n <!-- Document Upload Cards -->\r\n <div class=\"document-uploads\" *ngIf=\"item.documentList && item.documentList.length > 0\">\r\n <div class=\"uploaded-documents\">\r\n <div class=\"document-card\" *ngFor=\"let doc of item.documentList\" (click)=\"onDocumentClick(doc)\">\r\n <div class=\"document-icon\">\r\n <i class=\"pi pi-file\"></i>\r\n </div>\r\n <span class=\"document-name\">{{ doc.docName }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- <ng-content [select]=\"'actions-component'\"></ng-content> -->\r\n</div>", styles: [".document-review-container{border-radius:8px;max-height:100%;overflow-y:auto;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.document-review-container .review-header{display:flex;justify-content:space-between;align-items:center;padding-bottom:1rem;border-bottom:1px solid #e5e7eb}.document-review-container .review-header .review-title{font-size:1.5rem;font-weight:600;color:#1f2937;margin:0}.document-review-container .review-header .actions-menu{position:relative}.document-review-container .review-header .actions-menu .actions-btn{background:#fff;border:1px solid #d1d5db;border-radius:6px;padding:.5rem 1rem;color:#374151;font-size:.875rem;cursor:pointer;display:flex;align-items:center;gap:.5rem;transition:all .2s}.document-review-container .review-header .actions-menu .actions-btn:hover{background:#f9fafb}.document-review-container .review-header .actions-menu .actions-btn.active{background:#f3f4f6;border-color:#9ca3af}.document-review-container .review-header .actions-menu .actions-btn i{font-size:.75rem;transition:transform .2s}.document-review-container .review-header .actions-menu .actions-btn i.rotated{transform:rotate(180deg)}.document-review-container .review-header .actions-menu .actions-dropdown{position:absolute;top:100%;right:0;background:#fff;border:1px solid #d1d5db;border-radius:8px;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -1px #0000000f;z-index:1000;min-width:180px;margin-top:.25rem}.document-review-container .review-header .actions-menu .actions-dropdown .dropdown-item{padding:.75rem 1rem;cursor:pointer;color:#374151;font-size:.875rem;border-bottom:1px solid #f3f4f6;transition:background-color .2s}.document-review-container .review-header .actions-menu .actions-dropdown .dropdown-item:last-child{border-bottom:none;border-radius:0 0 8px 8px}.document-review-container .review-header .actions-menu .actions-dropdown .dropdown-item:first-child{border-radius:8px 8px 0 0}.document-review-container .review-header .actions-menu .actions-dropdown .dropdown-item:hover{background:#f9fafb}.document-review-container .review-header .actions-menu .actions-dropdown .dropdown-item span{display:block}.document-review-container ::ng-deep document-actions{margin-bottom:1.5rem}.document-review-container ::ng-deep document-actions .actions-card{margin:0;width:100%}.document-review-container .document-actions-section{padding:1rem 0}.document-review-container .alerts-section{margin-bottom:2rem}.document-review-container .alerts-section .alert-card{background:#fff;border:1px solid #e5e7eb;border-radius:8px;padding:1rem}.document-review-container .alerts-section .alert-card .alert-header{display:flex;align-items:center;gap:.75rem}.document-review-container .alerts-section .alert-card .alert-header .alert-icon{color:#ef4444;font-size:1.25rem}.document-review-container .alerts-section .alert-card .alert-header .alert-text{font-weight:500;color:#1f2937;font-size:1rem}.document-review-container .alerts-section .alert-card .alert-header .alert-badge{margin-left:auto;display:flex;align-items:center;gap:.5rem;background:#ef4444;color:#fff;border-radius:50%;width:24px;height:24px;justify-content:center;position:relative}.document-review-container .alerts-section .alert-card .alert-header .alert-badge .alert-count{font-size:.75rem;font-weight:600}.document-review-container .alerts-section .alert-card .alert-header .alert-badge i{position:absolute;right:-8px;font-size:.75rem;color:#ef4444;background:#fff;border-radius:50%;width:16px;height:16px;display:flex;align-items:center;justify-content:center}.document-review-container .timeline-section .timeline-title{font-size:1.25rem;font-weight:600;color:#1f2937;margin:0 0 1.5rem}.document-review-container .timeline-section .timeline-container .timeline-item{margin-bottom:1.5rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card{background:#fff;border:1px solid #e5e7eb;border-radius:8px;padding:1.25rem;position:relative}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info{display:flex;align-items:center;gap:.75rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-icon{width:25px;height:25px;border-radius:50%;display:flex;align-items:center;justify-content:center;color:#fff}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-icon i{font-size:1rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-icon.icon-requested{background:#3b82f6}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-icon.icon-accepted{background:#10b981}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-icon.icon-rejected{background:#ef4444}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-icon.icon-default{background:#6b7280}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-info .event-label{font-weight:600;color:#1f2937;font-size:1rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-timestamp{color:#6b7280;font-size:.875rem;font-weight:500}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-description{margin-bottom:1rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-description p{color:#374151;line-height:1.5;margin:0;font-size:.875rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads{margin-bottom:1rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads .uploaded-documents{display:flex;flex-direction:column;gap:.75rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads .uploaded-documents .document-card{background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:.5rem;display:flex;align-items:center;gap:.75rem;cursor:pointer;transition:all .2s ease}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads .uploaded-documents .document-card:hover{background:#e2e8f0;border-color:#3b82f6;transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads .uploaded-documents .document-card:active{transform:translateY(0);box-shadow:0 1px 2px #0000001a}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads .uploaded-documents .document-card .document-icon{color:#3b82f6;font-size:1.25rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .document-uploads .uploaded-documents .document-card .document-name{color:#1f2937;font-size:.875rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-user{font-size:.875rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-user .user-name{color:rgb(75,85,99,var(--tw-text-opacity, 1));font-weight:500}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-user .user-role{color:#6b7280;margin-left:.25rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card.event-requested{border-left:4px solid #3b82f6;background:#dbeafe;border-radius:16px;font-size:.875rem;line-height:1.25rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card.event-accepted{border-left:4px solid #10b981;background:#dcfce7;border-radius:16px;font-size:.875rem;line-height:1.25rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card.event-rejected{border-left:4px solid #ef4444;background:#fee2e2;border-radius:16px;font-size:.875rem;line-height:1.25rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card.event-default{border-left:4px solid #6b7280}@media (max-width: 768px){.document-review-container{padding:1rem}.document-review-container .review-header{flex-direction:column;gap:1rem;align-items:flex-start}.document-review-container .review-header .actions-menu{align-self:flex-end}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header{flex-direction:column;align-items:flex-start;gap:.5rem}.document-review-container .timeline-section .timeline-container .timeline-item .timeline-event .event-card .event-header .event-timestamp{align-self:flex-end}}\n"] }]
|
|
6031
6176
|
}], ctorParameters: () => [{ type: DocumentHistoryService }, { type: DocumentViewerService }, { type: DocumentActionsService }, { type: i3.ConfirmationService }], propDecorators: { historyData: [{
|
|
6032
6177
|
type: Input
|
|
6033
6178
|
}], showHistory: [{
|
|
@@ -7509,80 +7654,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
7509
7654
|
args: ['wheel', ['$event']]
|
|
7510
7655
|
}] } });
|
|
7511
7656
|
|
|
7512
|
-
/**
|
|
7513
|
-
* Service for managing user session details.
|
|
7514
|
-
* @class SessionService
|
|
7515
|
-
* @typedef {SessionService}
|
|
7516
|
-
*/
|
|
7517
|
-
class SessionService {
|
|
7518
|
-
router;
|
|
7519
|
-
/**
|
|
7520
|
-
* Creates an instance of SessionService.
|
|
7521
|
-
* @param {Router} router - Angular Router for navigation.
|
|
7522
|
-
*/
|
|
7523
|
-
constructor(router) {
|
|
7524
|
-
this.router = router;
|
|
7525
|
-
}
|
|
7526
|
-
/**
|
|
7527
|
-
* Retrieves the current user's role from local storage.
|
|
7528
|
-
* @returns {string | null} The user's role, or null if not found.
|
|
7529
|
-
*/
|
|
7530
|
-
getUserRole() {
|
|
7531
|
-
return localStorage.getItem('role');
|
|
7532
|
-
}
|
|
7533
|
-
/**
|
|
7534
|
-
* Stores the user session data in local storage.
|
|
7535
|
-
* @param {any} data - The session data to store.
|
|
7536
|
-
*/
|
|
7537
|
-
setUserSession(data) {
|
|
7538
|
-
localStorage.setItem(SHARED.SESSIONKEY, JSON.stringify(data));
|
|
7539
|
-
}
|
|
7540
|
-
/**
|
|
7541
|
-
* Retrieves the stored user session data.
|
|
7542
|
-
* @returns {any | null} The parsed session data, or null if not found.
|
|
7543
|
-
*/
|
|
7544
|
-
getUserSession() {
|
|
7545
|
-
const sessionData = localStorage.getItem(SHARED.SESSIONKEY);
|
|
7546
|
-
return sessionData ? JSON.parse(sessionData) : null;
|
|
7547
|
-
}
|
|
7548
|
-
/**
|
|
7549
|
-
* Retrieves the user's permissions from the stored session data.
|
|
7550
|
-
* @returns {any | null} The user's permissions, or null if not found.
|
|
7551
|
-
*/
|
|
7552
|
-
getUserPermissions() {
|
|
7553
|
-
const sessionData = localStorage.getItem(SHARED.SESSIONKEY);
|
|
7554
|
-
return sessionData ? JSON.parse(sessionData).permissions : null;
|
|
7555
|
-
}
|
|
7556
|
-
/**
|
|
7557
|
-
* Retrieves the session ID from the stored session data.
|
|
7558
|
-
* @returns {any | null} The session ID, or null if not found.
|
|
7559
|
-
*/
|
|
7560
|
-
getSessionID() {
|
|
7561
|
-
const sessionData = localStorage.getItem(SHARED.SESSIONKEY);
|
|
7562
|
-
console.log(sessionData);
|
|
7563
|
-
if (sessionData) {
|
|
7564
|
-
const sessionId = JSON.parse(sessionData);
|
|
7565
|
-
console.log(sessionId);
|
|
7566
|
-
return sessionId;
|
|
7567
|
-
}
|
|
7568
|
-
return null;
|
|
7569
|
-
}
|
|
7570
|
-
/**
|
|
7571
|
-
* Clears all stored session data from local storage.
|
|
7572
|
-
*/
|
|
7573
|
-
clearSession() {
|
|
7574
|
-
localStorage.clear();
|
|
7575
|
-
}
|
|
7576
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: SessionService, deps: [{ token: i1.Router }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
7577
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: SessionService, providedIn: 'root' });
|
|
7578
|
-
}
|
|
7579
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: SessionService, decorators: [{
|
|
7580
|
-
type: Injectable,
|
|
7581
|
-
args: [{
|
|
7582
|
-
providedIn: 'root'
|
|
7583
|
-
}]
|
|
7584
|
-
}], ctorParameters: () => [{ type: i1.Router }] });
|
|
7585
|
-
|
|
7586
7657
|
class DocumentActionsComponent {
|
|
7587
7658
|
documentActionsService;
|
|
7588
7659
|
sessionService;
|
|
@@ -9200,77 +9271,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
9200
9271
|
type: Output
|
|
9201
9272
|
}] } });
|
|
9202
9273
|
|
|
9203
|
-
/**
|
|
9204
|
-
* Directive to conditionally show or hide elements based on user permissions.
|
|
9205
|
-
* @class HasPermissionDirective
|
|
9206
|
-
* @typedef {HasPermissionDirective}
|
|
9207
|
-
*/
|
|
9208
|
-
class HasPermissionDirective {
|
|
9209
|
-
el;
|
|
9210
|
-
renderer;
|
|
9211
|
-
sessionService;
|
|
9212
|
-
/**
|
|
9213
|
-
* The required permission(s) to display the element.
|
|
9214
|
-
* Accepts a single string or an array of strings.
|
|
9215
|
-
* @type {string | string[]}
|
|
9216
|
-
*/
|
|
9217
|
-
permission;
|
|
9218
|
-
/**
|
|
9219
|
-
* Creates an instance of HasPermissionDirective.
|
|
9220
|
-
* @param {ElementRef} el - Reference to the host element.
|
|
9221
|
-
* @param {Renderer2} renderer - Angular Renderer for DOM manipulation.
|
|
9222
|
-
* @param {SessionService} sessionService - Service to retrieve user permissions.
|
|
9223
|
-
*/
|
|
9224
|
-
constructor(el, renderer, sessionService) {
|
|
9225
|
-
this.el = el;
|
|
9226
|
-
this.renderer = renderer;
|
|
9227
|
-
this.sessionService = sessionService;
|
|
9228
|
-
}
|
|
9229
|
-
/**
|
|
9230
|
-
* Lifecycle hook that is called when input properties change.
|
|
9231
|
-
* @param {SimpleChanges} changes - The changes in input properties.
|
|
9232
|
-
*/
|
|
9233
|
-
ngOnChanges(changes) {
|
|
9234
|
-
if (changes['permission']) {
|
|
9235
|
-
this.checkPermission();
|
|
9236
|
-
}
|
|
9237
|
-
}
|
|
9238
|
-
/**
|
|
9239
|
-
* Checks if the user has the required permission(s).
|
|
9240
|
-
* Hides the element if the permission is not found.
|
|
9241
|
-
*/
|
|
9242
|
-
checkPermission() {
|
|
9243
|
-
// If no permission is required (empty string, null, or undefined), show the element
|
|
9244
|
-
if (!this.permission || this.permission === '' || (Array.isArray(this.permission) && this.permission.length === 0)) {
|
|
9245
|
-
this.renderer.removeStyle(this.el.nativeElement, 'display');
|
|
9246
|
-
return;
|
|
9247
|
-
}
|
|
9248
|
-
const userPermissionsObjects = this.sessionService.getUserPermissions();
|
|
9249
|
-
const userPermissionNames = userPermissionsObjects?.map((perm) => perm.name) || [];
|
|
9250
|
-
const requiredPermissions = Array.isArray(this.permission)
|
|
9251
|
-
? this.permission
|
|
9252
|
-
: [this.permission];
|
|
9253
|
-
const hasPermission = requiredPermissions.some(permission => userPermissionNames.includes(permission));
|
|
9254
|
-
if (!hasPermission) {
|
|
9255
|
-
this.renderer.setStyle(this.el.nativeElement, 'display', 'none');
|
|
9256
|
-
}
|
|
9257
|
-
else {
|
|
9258
|
-
this.renderer.removeStyle(this.el.nativeElement, 'display');
|
|
9259
|
-
}
|
|
9260
|
-
}
|
|
9261
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HasPermissionDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: SessionService }], target: i0.ɵɵFactoryTarget.Directive });
|
|
9262
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.14", type: HasPermissionDirective, isStandalone: false, selector: "[permission]", inputs: { permission: "permission" }, usesOnChanges: true, ngImport: i0 });
|
|
9263
|
-
}
|
|
9264
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HasPermissionDirective, decorators: [{
|
|
9265
|
-
type: Directive,
|
|
9266
|
-
args: [{
|
|
9267
|
-
selector: '[permission]',
|
|
9268
|
-
standalone: false
|
|
9269
|
-
}]
|
|
9270
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: SessionService }], propDecorators: { permission: [{
|
|
9271
|
-
type: Input
|
|
9272
|
-
}] } });
|
|
9273
|
-
|
|
9274
9274
|
class SharedModule {
|
|
9275
9275
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: SharedModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
9276
9276
|
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: SharedModule, declarations: [TablePrimaryComponent, HasPermissionDirective, ConfirmationDialogComponent], imports: [CommonModule,
|