verben-workflow-ui 0.5.73 → 0.5.75
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/src/lib/components/flowable-status/flowable-status.component.mjs +10 -3
- package/esm2022/src/lib/components/task-history/task-history.component.mjs +2 -2
- package/esm2022/src/lib/components/workflow-designer/escalation-dialog/escalation-dialog.component.mjs +2 -2
- package/esm2022/src/lib/components/workflow-designer/workflow-data.service.mjs +38 -20
- package/fesm2022/verben-workflow-ui-src-lib-components-flowable-status.mjs +9 -2
- package/fesm2022/verben-workflow-ui-src-lib-components-flowable-status.mjs.map +1 -1
- package/fesm2022/verben-workflow-ui-src-lib-components-task-history.mjs +1 -1
- package/fesm2022/verben-workflow-ui-src-lib-components-task-history.mjs.map +1 -1
- package/fesm2022/verben-workflow-ui-src-lib-components-workflow-designer.mjs +38 -20
- package/fesm2022/verben-workflow-ui-src-lib-components-workflow-designer.mjs.map +1 -1
- package/package.json +29 -29
- package/src/lib/components/workflow-designer/workflow-data.service.d.ts +10 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verben-workflow-ui-src-lib-components-task-history.mjs","sources":["../../../projects/verben-workflow-ui/src/lib/components/task-history/task-history.service.ts","../../../projects/verben-workflow-ui/src/lib/components/task-history/task-history.component.ts","../../../projects/verben-workflow-ui/src/lib/components/task-history/task-history.component.html","../../../projects/verben-workflow-ui/src/lib/components/task-history/task-history.module.ts","../../../projects/verben-workflow-ui/src/lib/components/task-history/verben-workflow-ui-src-lib-components-task-history.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { ActionHistory } from 'verben-workflow-ui/src/lib/models';\nimport { EnvironmentService, HttpWebRequestService } from 'verben-workflow-ui/src/lib/services';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TaskHistoryService {\n constructor(\n private httpService: HttpWebRequestService,\n private envSvc: EnvironmentService\n ) { }\n\n getTaskHistory(taskCode: string): Promise<any> {\n const url = `GetTaskHistory/${taskCode}`;\n return this.httpService.get(url) as Promise<ActionHistory[]>;\n }\n\n saveActionHistory(actionHistory: ActionHistory[]): Promise<any> {\n const url = `SaveActionHistories`;\n return this.httpService.post(url, actionHistory);\n }\n\n uploadFiles(files: any[]): Promise<any> {\n const url = `SaveFiles`;\n return this.httpService.post(\n url,\n files,\n this.envSvc.environment.FILE_BASE_URL\n );\n }\n}\n","import { Location } from '@angular/common';\nimport { Component, input, OnInit } from '@angular/core';\nimport { ActionHistory, ActionType, Actor, File as FileData, ObjectState, OperationType } from 'verben-workflow-ui/src/lib/models';\nimport { EnvironmentService, UtilService } from 'verben-workflow-ui/src/lib/services';\nimport { TaskHistoryService } from './task-history.service';\n\n@Component({\n selector: 'lib-task-history',\n templateUrl: './task-history.component.html',\n styleUrl: './task-history.component.css',\n})\nexport class TaskHistoryComponent implements OnInit {\n taskCode = input.required<string>();\n operationType = OperationType;\n active: number = 0;\n showCommentBox: boolean = false;\n newComment: string = '';\n selectedFiles: FileData[] = [];\n // ActionType = ActionType;\n\n constructor(\n private _location: Location,\n private service: TaskHistoryService,\n private envSvc: EnvironmentService,\n private utilService: UtilService\n ) { }\n // singleHistory: TimelineEvent[] = [\n // {\n // Date: '4:05 PM',\n // Operation: OperationType.Comment,\n // Details: {},\n // Actions: [\n // { Label: 'View Comments', Type: 'button', Action: 'viewComments' },\n // ],\n // },\n // {\n // Date: 'Yesterday',\n // Operation: OperationType.Comment,\n // Details: {},\n // Actions: [\n // { Label: 'View Comments', Type: 'button', Action: 'viewComments' },\n // ],\n // },\n // {\n // Date: 'Mar 2',\n // Operation: OperationType.Forms,\n // Details: {\n // FilledBy: 'Anonymous',\n // },\n // Actions: [{ Label: 'View Form', Type: 'button', Action: 'viewForm' }],\n // },\n // {\n // Date: 'Nov 4',\n // Operation: OperationType.Assignment,\n // Details: {\n // From: 'John Doe',\n // To: 'Jane Doe',\n // },\n // Actions: [],\n // },\n // {\n // Date: 'Nov 6',\n // Operation: OperationType.Comment,\n // Details: {},\n // Actions: [\n // { Label: 'View Comments', Type: 'button', Action: 'viewComments' },\n // ],\n // },\n // ];\n\n history: ActionHistory[] = [];\n\n ngOnInit(): void {\n this.service.getTaskHistory(this.taskCode()).then((res) => {\n this.history = res;\n console.log(this.history);\n });\n }\n\n goBack() {\n this._location.back();\n }\n\n setActive(i: number) {\n this.active = i;\n }\n\n getTagsFromActor(actor: Actor) {\n return actor.Tags.map((tag) => tag.Name).join(', ');\n }\n\n addComment() {\n this.showCommentBox = !this.showCommentBox;\n }\n\n async saveComment() {\n console.log(this.newComment);\n if (!this.newComment.trim() && this.selectedFiles.length === 0) {\n return;\n }\n\n let uploadedFiles: string[] = [];\n if (this.selectedFiles.length > 0) {\n try {\n this.utilService.sendBI(true);\n const res = await this.service.uploadFiles(this.selectedFiles);\n if (res) {\n uploadedFiles = res;\n }\n } catch (error) {\n console.error('File upload failed', error);\n this.utilService.sendBI(false);\n return;\n } finally {\n this.utilService.sendBI(false);\n }\n }\n\n const actionHistory = {\n TaskCode: this.taskCode() ?? '',\n Description: this.newComment,\n ActionType: ActionType.Comment,\n DataState: ObjectState.New,\n Files: uploadedFiles,\n // Actor: {\n // Id: this.selectedDetail.ActorId,\n // Name: this.selectedDetail.ActorName,\n // Tags: this.selectedDetail.Tags,\n // },\n Workflow: '',\n FromStage: '',\n ToStage: '',\n Code: '',\n TenantId: 'PDLTC6',\n } as ActionHistory;\n\n this.service.saveActionHistory([actionHistory]).then(() => {\n this.newComment = '';\n this.selectedFiles = [];\n this.showCommentBox = false;\n this.service.getTaskHistory(this.taskCode()).then((res) => {\n this.history = res;\n });\n });\n }\n\n onFileSelect(data: any): void {\n const files: any = data;\n\n if (!files || files.length === 0) return;\n\n const fileArray: FileData[] = [];\n const readers: Promise<void>[] = [];\n\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n const reader = new FileReader();\n\n const promise = new Promise<void>((resolve, reject) => {\n reader.onload = () => {\n const base64 = reader.result as string;\n fileArray.push({\n Extension: file.name.split('.').pop(),\n Name: this.generateRandomCode(),\n Data: base64,\n DataState: ObjectState.New,\n });\n resolve();\n };\n\n reader.onerror = (error) => reject(error);\n reader.readAsDataURL(file);\n });\n\n readers.push(promise);\n }\n\n Promise.all(readers).then(() => {\n console.log('Files ready to upload:', fileArray);\n this.selectedFiles = fileArray;\n });\n }\n\n private generateRandomCode(length: number = 10): string {\n const chars =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n }\n\n getFileExtension(fileUrl: string): string {\n const parts = fileUrl.split('.');\n return parts[parts.length - 1].toLowerCase();\n }\n\n setPreview(val: string): string {\n if (!val) return '';\n const first = val.split(',')[0].trim();\n\n if (first.startsWith('http') || first.startsWith('data:')) {\n return first;\n }\n return `${this.envSvc.environment.FILE_URL}/${first}`;\n }\n\n showFromAndTo(actionType: ActionType): boolean {\n switch (actionType) {\n case ActionType.PassOn:\n case ActionType.PassBack:\n case ActionType.SkipForward:\n case ActionType.SkipBackward:\n return true;\n case ActionType.Comment:\n case ActionType.FormFilling:\n case ActionType.StatusChange:\n return false;\n }\n }\n\n getFileName(fileUrl: string): string {\n if (!fileUrl) return '';\n return fileUrl.split('/').pop() || '';\n }\n\n openFile(fileUrl: string) {\n if (!fileUrl) {\n return;\n }\n this.utilService.openFullRouteInNewWindow(\n `${this.envSvc.environment.FILE_BASE_URL}${fileUrl}`\n );\n }\n}\n","<div class=\"bg-[#F9FAFB]\">\n <header class=\"mx-8 rounded-lg shadow-lg flex justify-between items-center px-6 py-2 bg-[#D4A00773]\">\n <h4 class=\"font-semibold\">{{ taskCode() }}</h4>\n <div class=\"flex gap-4 items-center\">\n <verbena-button (click)=\"addComment()\" text=\"+ Add Comment\" styleType=\"ylw-outline\"\n class=\"ml-auto\"></verbena-button>\n <verben-svg (click)=\"goBack()\" class=\"cursor-pointer\" [width]=\"17\" [height]=\"17\" [icon]=\"'go-back'\"></verben-svg>\n </div>\n </header>\n <section class=\"grid grid-cols-12\">\n <div class=\"bg-[#fff] col-span-7 pl-16 pt-20 relative\">\n <div *ngIf=\"showCommentBox\" class=\"mb-6 mr-10\">\n <h4 class=\"font-bold text-lg mb-2\">Add Comment</h4>\n <!-- <verbena-textarea [(ngModel)]=\"newComment\" label=\"Comment\" class=\"w-full\"></verbena-textarea> -->\n <textarea [(ngModel)]=\"newComment\" label=\"Comment\" class=\"w-full border rounded-md p-2\"></textarea>\n <div class=\"mt-4\">\n <file-upload (selectedFilesChange)=\"onFileSelect($event)\" [multiple]=\"true\" label=\"Attach Files\">\n </file-upload>\n <div *ngIf=\"selectedFiles.length > 0\" class=\"flex flex-wrap gap-3 mt-3\">\n <div *ngFor=\"let file of selectedFiles\">\n <ng-container [ngSwitch]=\"file.Extension\">\n <img *ngSwitchCase=\"'jpg'\" [src]=\"file.Data\"\n class=\"w-[100px] h-[100px] object-cover rounded-md border\" />\n <img *ngSwitchCase=\"'png'\" [src]=\"file.Data\"\n class=\"w-[100px] h-[100px] object-cover rounded-md border\" />\n <video *ngSwitchCase=\"'mp4'\" [src]=\"file.Data\" class=\"w-[150px] rounded-md shadow\" controls></video>\n <audio *ngSwitchCase=\"'mp3'\" [src]=\"file.Data\" controls class=\"w-[150px]\"></audio>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"flex justify-end gap-2 mt-2\">\n <verbena-button (click)=\"addComment()\" text=\"Cancel\" styleType=\"ylw-outline\"></verbena-button>\n <verbena-button (click)=\"saveComment()\" text=\"Save\" bgColor=\"#FFE681\" textColor=\"#404040\" borderRadius=\"10px\"\n pd=\"10px 20px\" width=\"114px\" height=\"39px\"></verbena-button>\n </div>\n </div>\n <span class=\"absolute block h-[90%] h-ninety border border-secondary-200 left-[150px]\"></span>\n <div *ngFor=\"let timeline of history; let i = index\">\n <div>\n <div class=\"flex mb-7\">\n <h5 class=\"w-[100px] cursor-pointer\" (click)=\"setActive(i)\">\n {{ timeline?.CreatedAt | date }}\n </h5>\n <div class=\"ml-24 cursor-pointer min-w-[250px] p-6 rounded-md border-l-2\" [ngClass]=\"{\n 'bg-[#FEFAF1] border-[#FFE681]': active === i,\n 'bg-transparent border-transparent hover:bg-[#F9FAFB]': active !== i\n }\" (click)=\"setActive(i)\">\n <!-- ActionName as primary heading, fallback to ActionType -->\n <h4 class=\"font-bold text-xl text-[#101828] mb-2\">\n {{ timeline.ActionName || timeline.ActionType }}\n </h4>\n\n <!-- Actor information with tooltip -->\n <div class=\"mb-3\">\n <verben-tooltip [top]=\"'0px'\" [left]=\"'0px'\" [textColor]=\"'#000'\" [backgroundColor]=\"'#FFF'\"\n [tooltipContent]=\"actorTooltipTemplate\">\n <p class=\"text-sm text-[#667085] cursor-help inline-flex items-center gap-2\">\n <verben-svg [width]=\"14\" [height]=\"14\" [icon]=\"'user'\" stroke=\"#667085\"></verben-svg>\n <span class=\"font-medium text-[#344054]\">{{ timeline.Actor.Name }}</span>\n </p>\n </verben-tooltip>\n\n <ng-template #actorTooltipTemplate>\n <div class=\"bg-white border border-[#E4E7EC] rounded-lg p-4 shadow-lg w-[280px]\">\n <div class=\"flex gap-3 items-start\">\n <div\n class=\"w-[40px] h-[40px] rounded-full bg-gradient-to-r from-[#D9AEAE] via-[#E3C79F] to-[#FFE681] flex-shrink-0\">\n </div>\n <div class=\"flex-1 min-w-0\">\n <p class=\"font-bold text-sm text-[#101828] mb-1\">\n {{ timeline.Actor.Name }}\n </p>\n <p class=\"text-xs text-[#667085] break-words flex items-start gap-1\">\n <verben-svg [width]=\"12\" [height]=\"12\" [icon]=\"'mail'\" stroke=\"#667085\"></verben-svg>\n <span>{{ timeline.Actor.Identifier }}</span>\n </p>\n <p *ngIf=\"getTagsFromActor(timeline.Actor)\" class=\"text-xs text-[#667085] mt-2\">\n <span class=\"font-medium\">Tags:</span> {{ getTagsFromActor(timeline.Actor) }}\n </p>\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n\n <!-- Action Type (if different from ActionName) -->\n <p *ngIf=\"timeline.ActionName\" class=\"text-sm text-[#667085] mb-2\">\n <span class=\"font-medium\">Operation:</span> {{ timeline.ActionType }}\n </p>\n\n <!-- Stage information for transfer actions -->\n @if (showFromAndTo(timeline.ActionType)) {\n <div class=\"bg-[#F9FAFB] rounded-md p-3 mt-2 space-y-1.5\">\n <p class=\"text-sm flex items-center gap-2\">\n <span class=\"text-[#667085] font-medium\">From:</span>\n <span class=\"text-[#6172F3] font-mono text-xs\">{{ timeline.FromStage }}</span>\n </p>\n <p class=\"text-sm flex items-center gap-2\">\n <span class=\"text-[#667085] font-medium\">To:</span>\n <span class=\"text-[#6172F3] font-mono text-xs\">{{ timeline.ToStage }}</span>\n </p>\n </div>\n }\n\n <!-- View comments button -->\n <button *ngIf=\"timeline.Description\"\n class=\"flex gap-2 items-center w-fit text-[#667085] text-sm border px-3 py-2 rounded-lg bg-[#FCFCFD] mt-3 border-[#E4E7EC] hover:bg-[#F9FAFB] hover:border-[#D0D5DD] transition-colors\">\n <verben-svg [width]=\"15\" [height]=\"15\" [icon]=\"'chat'\"></verben-svg>\n View comments\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-span-5\">\n <div class=\"h-[50px] bg-[#fff]\"></div>\n <div *ngIf=\"active >= 0\" class=\"w-[480px] pl-16 pt-10\">\n <h1 class=\"font-bold text-lg py-2\">Comments</h1>\n <p class=\"text-xs text-[#667085] text-right py-2\">\n {{ history[active].CreatedAt | date }}\n </p>\n <div class=\"bg-[#fff] text-[#101828] leading-relaxed p-8 shadow-md rounded-md\">\n {{ history[active].Description }}\n\n <div *ngIf=\"history[active]?.Files?.length\" class=\"mt-4 border-t pt-4\">\n <h5 class=\"font-bold text-sm mb-2\">Attachments</h5>\n <div class=\"flex flex-col gap-2\">\n <div *ngFor=\"let file of history[active]?.Files\"\n class=\"file-container p-2 flex items-center justify-between gap-3 border rounded-md bg-gray-50\">\n <div class=\"text-sm overflow-x-auto font-semibold\">\n {{ getFileName(file) }}\n </div>\n <span (click)=\"openFile(file)\" class=\"cursor-pointer\">\n <verben-svg [icon]=\"'download-icon'\" [width]=\"20\" [height]=\"20\"></verben-svg>\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </section>\n</div>\n","import { NgModule } from '@angular/core';\nimport { TooltipModule } from 'verben-ng-ui';\nimport { FileUploadModule } from 'verben-workflow-ui/src/lib/components/file-upload';\nimport { SharedModule } from 'verben-workflow-ui/src/lib/shared';\nimport { TaskHistoryComponent } from './task-history.component';\n@NgModule({\n declarations: [TaskHistoryComponent],\n imports: [SharedModule, FileUploadModule, TooltipModule],\n exports: [TaskHistoryComponent],\n})\nexport class TaskHistoryModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2.TaskHistoryService","i3"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"verben-workflow-ui-src-lib-components-task-history.mjs","sources":["../../../projects/verben-workflow-ui/src/lib/components/task-history/task-history.service.ts","../../../projects/verben-workflow-ui/src/lib/components/task-history/task-history.component.ts","../../../projects/verben-workflow-ui/src/lib/components/task-history/task-history.component.html","../../../projects/verben-workflow-ui/src/lib/components/task-history/task-history.module.ts","../../../projects/verben-workflow-ui/src/lib/components/task-history/verben-workflow-ui-src-lib-components-task-history.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { ActionHistory } from 'verben-workflow-ui/src/lib/models';\nimport { EnvironmentService, HttpWebRequestService } from 'verben-workflow-ui/src/lib/services';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class TaskHistoryService {\n constructor(\n private httpService: HttpWebRequestService,\n private envSvc: EnvironmentService\n ) { }\n\n getTaskHistory(taskCode: string): Promise<any> {\n const url = `GetTaskHistory/${taskCode}`;\n return this.httpService.get(url) as Promise<ActionHistory[]>;\n }\n\n saveActionHistory(actionHistory: ActionHistory[]): Promise<any> {\n const url = `SaveActionHistories`;\n return this.httpService.post(url, actionHistory);\n }\n\n uploadFiles(files: any[]): Promise<any> {\n const url = `SaveFiles`;\n return this.httpService.post(\n url,\n files,\n this.envSvc.environment.FILE_BASE_URL\n );\n }\n}\n","import { Location } from '@angular/common';\nimport { Component, input, OnInit } from '@angular/core';\nimport { ActionHistory, ActionType, Actor, File as FileData, ObjectState, OperationType } from 'verben-workflow-ui/src/lib/models';\nimport { EnvironmentService, UtilService } from 'verben-workflow-ui/src/lib/services';\nimport { TaskHistoryService } from './task-history.service';\n\n@Component({\n selector: 'lib-task-history',\n templateUrl: './task-history.component.html',\n styleUrl: './task-history.component.css',\n})\nexport class TaskHistoryComponent implements OnInit {\n taskCode = input.required<string>();\n operationType = OperationType;\n active: number = 0;\n showCommentBox: boolean = false;\n newComment: string = '';\n selectedFiles: FileData[] = [];\n // ActionType = ActionType;\n\n constructor(\n private _location: Location,\n private service: TaskHistoryService,\n private envSvc: EnvironmentService,\n private utilService: UtilService\n ) { }\n // singleHistory: TimelineEvent[] = [\n // {\n // Date: '4:05 PM',\n // Operation: OperationType.Comment,\n // Details: {},\n // Actions: [\n // { Label: 'View Comments', Type: 'button', Action: 'viewComments' },\n // ],\n // },\n // {\n // Date: 'Yesterday',\n // Operation: OperationType.Comment,\n // Details: {},\n // Actions: [\n // { Label: 'View Comments', Type: 'button', Action: 'viewComments' },\n // ],\n // },\n // {\n // Date: 'Mar 2',\n // Operation: OperationType.Forms,\n // Details: {\n // FilledBy: 'Anonymous',\n // },\n // Actions: [{ Label: 'View Form', Type: 'button', Action: 'viewForm' }],\n // },\n // {\n // Date: 'Nov 4',\n // Operation: OperationType.Assignment,\n // Details: {\n // From: 'John Doe',\n // To: 'Jane Doe',\n // },\n // Actions: [],\n // },\n // {\n // Date: 'Nov 6',\n // Operation: OperationType.Comment,\n // Details: {},\n // Actions: [\n // { Label: 'View Comments', Type: 'button', Action: 'viewComments' },\n // ],\n // },\n // ];\n\n history: ActionHistory[] = [];\n\n ngOnInit(): void {\n this.service.getTaskHistory(this.taskCode()).then((res) => {\n this.history = res;\n console.log(this.history);\n });\n }\n\n goBack() {\n this._location.back();\n }\n\n setActive(i: number) {\n this.active = i;\n }\n\n getTagsFromActor(actor: Actor) {\n return actor.Tags.map((tag) => tag.Name).join(', ');\n }\n\n addComment() {\n this.showCommentBox = !this.showCommentBox;\n }\n\n async saveComment() {\n console.log(this.newComment);\n if (!this.newComment.trim() && this.selectedFiles.length === 0) {\n return;\n }\n\n let uploadedFiles: string[] = [];\n if (this.selectedFiles.length > 0) {\n try {\n this.utilService.sendBI(true);\n const res = await this.service.uploadFiles(this.selectedFiles);\n if (res) {\n uploadedFiles = res;\n }\n } catch (error) {\n console.error('File upload failed', error);\n this.utilService.sendBI(false);\n return;\n } finally {\n this.utilService.sendBI(false);\n }\n }\n\n const actionHistory = {\n TaskCode: this.taskCode() ?? '',\n Description: this.newComment,\n ActionType: ActionType.Comment,\n DataState: ObjectState.New,\n Files: uploadedFiles,\n // Actor: {\n // Id: this.selectedDetail.ActorId,\n // Name: this.selectedDetail.ActorName,\n // Tags: this.selectedDetail.Tags,\n // },\n Workflow: '',\n FromStage: '',\n ToStage: '',\n Code: '',\n TenantId: '',\n } as ActionHistory;\n\n this.service.saveActionHistory([actionHistory]).then(() => {\n this.newComment = '';\n this.selectedFiles = [];\n this.showCommentBox = false;\n this.service.getTaskHistory(this.taskCode()).then((res) => {\n this.history = res;\n });\n });\n }\n\n onFileSelect(data: any): void {\n const files: any = data;\n\n if (!files || files.length === 0) return;\n\n const fileArray: FileData[] = [];\n const readers: Promise<void>[] = [];\n\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n const reader = new FileReader();\n\n const promise = new Promise<void>((resolve, reject) => {\n reader.onload = () => {\n const base64 = reader.result as string;\n fileArray.push({\n Extension: file.name.split('.').pop(),\n Name: this.generateRandomCode(),\n Data: base64,\n DataState: ObjectState.New,\n });\n resolve();\n };\n\n reader.onerror = (error) => reject(error);\n reader.readAsDataURL(file);\n });\n\n readers.push(promise);\n }\n\n Promise.all(readers).then(() => {\n console.log('Files ready to upload:', fileArray);\n this.selectedFiles = fileArray;\n });\n }\n\n private generateRandomCode(length: number = 10): string {\n const chars =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n }\n\n getFileExtension(fileUrl: string): string {\n const parts = fileUrl.split('.');\n return parts[parts.length - 1].toLowerCase();\n }\n\n setPreview(val: string): string {\n if (!val) return '';\n const first = val.split(',')[0].trim();\n\n if (first.startsWith('http') || first.startsWith('data:')) {\n return first;\n }\n return `${this.envSvc.environment.FILE_URL}/${first}`;\n }\n\n showFromAndTo(actionType: ActionType): boolean {\n switch (actionType) {\n case ActionType.PassOn:\n case ActionType.PassBack:\n case ActionType.SkipForward:\n case ActionType.SkipBackward:\n return true;\n case ActionType.Comment:\n case ActionType.FormFilling:\n case ActionType.StatusChange:\n return false;\n }\n }\n\n getFileName(fileUrl: string): string {\n if (!fileUrl) return '';\n return fileUrl.split('/').pop() || '';\n }\n\n openFile(fileUrl: string) {\n if (!fileUrl) {\n return;\n }\n this.utilService.openFullRouteInNewWindow(\n `${this.envSvc.environment.FILE_BASE_URL}${fileUrl}`\n );\n }\n}\n","<div class=\"bg-[#F9FAFB]\">\n <header class=\"mx-8 rounded-lg shadow-lg flex justify-between items-center px-6 py-2 bg-[#D4A00773]\">\n <h4 class=\"font-semibold\">{{ taskCode() }}</h4>\n <div class=\"flex gap-4 items-center\">\n <verbena-button (click)=\"addComment()\" text=\"+ Add Comment\" styleType=\"ylw-outline\"\n class=\"ml-auto\"></verbena-button>\n <verben-svg (click)=\"goBack()\" class=\"cursor-pointer\" [width]=\"17\" [height]=\"17\" [icon]=\"'go-back'\"></verben-svg>\n </div>\n </header>\n <section class=\"grid grid-cols-12\">\n <div class=\"bg-[#fff] col-span-7 pl-16 pt-20 relative\">\n <div *ngIf=\"showCommentBox\" class=\"mb-6 mr-10\">\n <h4 class=\"font-bold text-lg mb-2\">Add Comment</h4>\n <!-- <verbena-textarea [(ngModel)]=\"newComment\" label=\"Comment\" class=\"w-full\"></verbena-textarea> -->\n <textarea [(ngModel)]=\"newComment\" label=\"Comment\" class=\"w-full border rounded-md p-2\"></textarea>\n <div class=\"mt-4\">\n <file-upload (selectedFilesChange)=\"onFileSelect($event)\" [multiple]=\"true\" label=\"Attach Files\">\n </file-upload>\n <div *ngIf=\"selectedFiles.length > 0\" class=\"flex flex-wrap gap-3 mt-3\">\n <div *ngFor=\"let file of selectedFiles\">\n <ng-container [ngSwitch]=\"file.Extension\">\n <img *ngSwitchCase=\"'jpg'\" [src]=\"file.Data\"\n class=\"w-[100px] h-[100px] object-cover rounded-md border\" />\n <img *ngSwitchCase=\"'png'\" [src]=\"file.Data\"\n class=\"w-[100px] h-[100px] object-cover rounded-md border\" />\n <video *ngSwitchCase=\"'mp4'\" [src]=\"file.Data\" class=\"w-[150px] rounded-md shadow\" controls></video>\n <audio *ngSwitchCase=\"'mp3'\" [src]=\"file.Data\" controls class=\"w-[150px]\"></audio>\n </ng-container>\n </div>\n </div>\n </div>\n <div class=\"flex justify-end gap-2 mt-2\">\n <verbena-button (click)=\"addComment()\" text=\"Cancel\" styleType=\"ylw-outline\"></verbena-button>\n <verbena-button (click)=\"saveComment()\" text=\"Save\" bgColor=\"#FFE681\" textColor=\"#404040\" borderRadius=\"10px\"\n pd=\"10px 20px\" width=\"114px\" height=\"39px\"></verbena-button>\n </div>\n </div>\n <span class=\"absolute block h-[90%] h-ninety border border-secondary-200 left-[150px]\"></span>\n <div *ngFor=\"let timeline of history; let i = index\">\n <div>\n <div class=\"flex mb-7\">\n <h5 class=\"w-[100px] cursor-pointer\" (click)=\"setActive(i)\">\n {{ timeline?.CreatedAt | date }}\n </h5>\n <div class=\"ml-24 cursor-pointer min-w-[250px] p-6 rounded-md border-l-2\" [ngClass]=\"{\n 'bg-[#FEFAF1] border-[#FFE681]': active === i,\n 'bg-transparent border-transparent hover:bg-[#F9FAFB]': active !== i\n }\" (click)=\"setActive(i)\">\n <!-- ActionName as primary heading, fallback to ActionType -->\n <h4 class=\"font-bold text-xl text-[#101828] mb-2\">\n {{ timeline.ActionName || timeline.ActionType }}\n </h4>\n\n <!-- Actor information with tooltip -->\n <div class=\"mb-3\">\n <verben-tooltip [top]=\"'0px'\" [left]=\"'0px'\" [textColor]=\"'#000'\" [backgroundColor]=\"'#FFF'\"\n [tooltipContent]=\"actorTooltipTemplate\">\n <p class=\"text-sm text-[#667085] cursor-help inline-flex items-center gap-2\">\n <verben-svg [width]=\"14\" [height]=\"14\" [icon]=\"'user'\" stroke=\"#667085\"></verben-svg>\n <span class=\"font-medium text-[#344054]\">{{ timeline.Actor.Name }}</span>\n </p>\n </verben-tooltip>\n\n <ng-template #actorTooltipTemplate>\n <div class=\"bg-white border border-[#E4E7EC] rounded-lg p-4 shadow-lg w-[280px]\">\n <div class=\"flex gap-3 items-start\">\n <div\n class=\"w-[40px] h-[40px] rounded-full bg-gradient-to-r from-[#D9AEAE] via-[#E3C79F] to-[#FFE681] flex-shrink-0\">\n </div>\n <div class=\"flex-1 min-w-0\">\n <p class=\"font-bold text-sm text-[#101828] mb-1\">\n {{ timeline.Actor.Name }}\n </p>\n <p class=\"text-xs text-[#667085] break-words flex items-start gap-1\">\n <verben-svg [width]=\"12\" [height]=\"12\" [icon]=\"'mail'\" stroke=\"#667085\"></verben-svg>\n <span>{{ timeline.Actor.Identifier }}</span>\n </p>\n <p *ngIf=\"getTagsFromActor(timeline.Actor)\" class=\"text-xs text-[#667085] mt-2\">\n <span class=\"font-medium\">Tags:</span> {{ getTagsFromActor(timeline.Actor) }}\n </p>\n </div>\n </div>\n </div>\n </ng-template>\n </div>\n\n <!-- Action Type (if different from ActionName) -->\n <p *ngIf=\"timeline.ActionName\" class=\"text-sm text-[#667085] mb-2\">\n <span class=\"font-medium\">Operation:</span> {{ timeline.ActionType }}\n </p>\n\n <!-- Stage information for transfer actions -->\n @if (showFromAndTo(timeline.ActionType)) {\n <div class=\"bg-[#F9FAFB] rounded-md p-3 mt-2 space-y-1.5\">\n <p class=\"text-sm flex items-center gap-2\">\n <span class=\"text-[#667085] font-medium\">From:</span>\n <span class=\"text-[#6172F3] font-mono text-xs\">{{ timeline.FromStage }}</span>\n </p>\n <p class=\"text-sm flex items-center gap-2\">\n <span class=\"text-[#667085] font-medium\">To:</span>\n <span class=\"text-[#6172F3] font-mono text-xs\">{{ timeline.ToStage }}</span>\n </p>\n </div>\n }\n\n <!-- View comments button -->\n <button *ngIf=\"timeline.Description\"\n class=\"flex gap-2 items-center w-fit text-[#667085] text-sm border px-3 py-2 rounded-lg bg-[#FCFCFD] mt-3 border-[#E4E7EC] hover:bg-[#F9FAFB] hover:border-[#D0D5DD] transition-colors\">\n <verben-svg [width]=\"15\" [height]=\"15\" [icon]=\"'chat'\"></verben-svg>\n View comments\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"col-span-5\">\n <div class=\"h-[50px] bg-[#fff]\"></div>\n <div *ngIf=\"active >= 0\" class=\"w-[480px] pl-16 pt-10\">\n <h1 class=\"font-bold text-lg py-2\">Comments</h1>\n <p class=\"text-xs text-[#667085] text-right py-2\">\n {{ history[active].CreatedAt | date }}\n </p>\n <div class=\"bg-[#fff] text-[#101828] leading-relaxed p-8 shadow-md rounded-md\">\n {{ history[active].Description }}\n\n <div *ngIf=\"history[active]?.Files?.length\" class=\"mt-4 border-t pt-4\">\n <h5 class=\"font-bold text-sm mb-2\">Attachments</h5>\n <div class=\"flex flex-col gap-2\">\n <div *ngFor=\"let file of history[active]?.Files\"\n class=\"file-container p-2 flex items-center justify-between gap-3 border rounded-md bg-gray-50\">\n <div class=\"text-sm overflow-x-auto font-semibold\">\n {{ getFileName(file) }}\n </div>\n <span (click)=\"openFile(file)\" class=\"cursor-pointer\">\n <verben-svg [icon]=\"'download-icon'\" [width]=\"20\" [height]=\"20\"></verben-svg>\n </span>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </section>\n</div>\n","import { NgModule } from '@angular/core';\nimport { TooltipModule } from 'verben-ng-ui';\nimport { FileUploadModule } from 'verben-workflow-ui/src/lib/components/file-upload';\nimport { SharedModule } from 'verben-workflow-ui/src/lib/shared';\nimport { TaskHistoryComponent } from './task-history.component';\n@NgModule({\n declarations: [TaskHistoryComponent],\n imports: [SharedModule, FileUploadModule, TooltipModule],\n exports: [TaskHistoryComponent],\n})\nexport class TaskHistoryModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2.TaskHistoryService","i3"],"mappings":"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"}
|
|
@@ -773,53 +773,71 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
773
773
|
class WorkflowDataService {
|
|
774
774
|
httpService;
|
|
775
775
|
envSvc;
|
|
776
|
-
|
|
776
|
+
utilService;
|
|
777
|
+
pendingRequests = 0;
|
|
778
|
+
constructor(httpService, envSvc, utilService) {
|
|
777
779
|
this.httpService = httpService;
|
|
778
780
|
this.envSvc = envSvc;
|
|
781
|
+
this.utilService = utilService;
|
|
782
|
+
}
|
|
783
|
+
/**
|
|
784
|
+
* Wraps an API call so a busy indicator is shown while it is in flight.
|
|
785
|
+
* A ref-count keeps the loader visible until the last concurrent request
|
|
786
|
+
* settles, mirroring how the workflows facade toggles `sendBI`.
|
|
787
|
+
*/
|
|
788
|
+
withLoader(request) {
|
|
789
|
+
if (this.pendingRequests++ === 0) {
|
|
790
|
+
this.utilService.sendBI(true);
|
|
791
|
+
}
|
|
792
|
+
return request().finally(() => {
|
|
793
|
+
if (--this.pendingRequests === 0) {
|
|
794
|
+
this.utilService.sendBI(false);
|
|
795
|
+
}
|
|
796
|
+
});
|
|
779
797
|
}
|
|
780
798
|
getWorkflowWithParam(param, skip = 0, limit = 1, sortParam = 'CreatedAt', sortOrder = 'Asc') {
|
|
781
799
|
const url = `GetWorkflowsWithParam/${param}/${skip}/${limit}/${sortParam}/${sortOrder}`;
|
|
782
|
-
return this.httpService.get(url);
|
|
800
|
+
return this.withLoader(() => this.httpService.get(url));
|
|
783
801
|
}
|
|
784
802
|
getWorkflows(skip = 0, limit = 0) {
|
|
785
803
|
const url = `GetWorkflows/${skip}/${limit}`;
|
|
786
|
-
return this.httpService.get(url, this.envSvc.environment.WorkFlowAPI);
|
|
804
|
+
return this.withLoader(() => this.httpService.get(url, this.envSvc.environment.WorkFlowAPI));
|
|
787
805
|
}
|
|
788
806
|
getForms(skip = 0, limit = 0) {
|
|
789
807
|
const url = `GetForms/${skip}/${limit}`;
|
|
790
|
-
return this.httpService.get(url, this.envSvc.environment.WorkFlowAPI);
|
|
808
|
+
return this.withLoader(() => this.httpService.get(url, this.envSvc.environment.WorkFlowAPI));
|
|
791
809
|
}
|
|
792
810
|
getTags(skip = 0, limit = 0) {
|
|
793
811
|
const url = `GetTags/${skip}/${limit}`;
|
|
794
|
-
return this.httpService.get(url, this.envSvc.environment.AuthAPI);
|
|
812
|
+
return this.withLoader(() => this.httpService.get(url, this.envSvc.environment.AuthAPI));
|
|
795
813
|
}
|
|
796
814
|
saveWorkflows(requests) {
|
|
797
815
|
const url = `SaveWorkflows`;
|
|
798
816
|
// console.log('Saving workflows', requests);
|
|
799
|
-
return this.httpService.post(url, requests, this.envSvc.environment.WorkFlowAPI);
|
|
817
|
+
return this.withLoader(() => this.httpService.post(url, requests, this.envSvc.environment.WorkFlowAPI));
|
|
800
818
|
}
|
|
801
819
|
deleteWorkflowStages(requests) {
|
|
802
820
|
const url = `DeleteWorkflowStage`;
|
|
803
821
|
// console.log('Saving workflows', requests);
|
|
804
|
-
return this.httpService.post(url, requests, this.envSvc.environment.WorkFlowAPI);
|
|
822
|
+
return this.withLoader(() => this.httpService.post(url, requests, this.envSvc.environment.WorkFlowAPI));
|
|
805
823
|
}
|
|
806
824
|
deleteWorkflowActions(requests) {
|
|
807
825
|
const url = `DeleteWorkflowAction`;
|
|
808
|
-
return this.httpService.post(url, requests, this.envSvc.environment.WorkFlowAPI);
|
|
826
|
+
return this.withLoader(() => this.httpService.post(url, requests, this.envSvc.environment.WorkFlowAPI));
|
|
809
827
|
}
|
|
810
828
|
deleteSwimLanes(requests) {
|
|
811
829
|
const url = `DeleteSwimLane`;
|
|
812
|
-
return this.httpService.post(url, requests, this.envSvc.environment.WorkFlowAPI);
|
|
830
|
+
return this.withLoader(() => this.httpService.post(url, requests, this.envSvc.environment.WorkFlowAPI));
|
|
813
831
|
}
|
|
814
832
|
saveEscalations(requests) {
|
|
815
833
|
const url = `SaveEscalations`;
|
|
816
834
|
// console.log('Saving workflows', requests);
|
|
817
|
-
return this.httpService.post(url, requests, this.envSvc.environment.WorkFlowAPI);
|
|
835
|
+
return this.withLoader(() => this.httpService.post(url, requests, this.envSvc.environment.WorkFlowAPI));
|
|
818
836
|
}
|
|
819
837
|
deleteEscalations(requests) {
|
|
820
838
|
const url = `DeleteEscalation`;
|
|
821
839
|
// console.log('Saving workflows', requests);
|
|
822
|
-
return this.httpService.post(url, requests, this.envSvc.environment.WorkFlowAPI);
|
|
840
|
+
return this.withLoader(() => this.httpService.post(url, requests, this.envSvc.environment.WorkFlowAPI));
|
|
823
841
|
}
|
|
824
842
|
searchEscalationWithParam(params, skip = 0, limit = 1, sortOrder = 'Asc') {
|
|
825
843
|
const url = `SearchEscalations/${skip}/${limit}`;
|
|
@@ -834,27 +852,27 @@ class WorkflowDataService {
|
|
|
834
852
|
Sort: sortOrder,
|
|
835
853
|
// Fields: ['string'],
|
|
836
854
|
}));
|
|
837
|
-
return this.httpService.post(url, payload);
|
|
855
|
+
return this.withLoader(() => this.httpService.post(url, payload));
|
|
838
856
|
}
|
|
839
857
|
getEscalationWithParam(param, skip = 0, limit = 1, sortParam = 'CreatedAt', sortOrder = 'Asc') {
|
|
840
858
|
const url = `GetEscalationsWithParam/${param}/${skip}/${limit}/${sortParam}/${sortOrder}`;
|
|
841
|
-
return this.httpService.get(url);
|
|
859
|
+
return this.withLoader(() => this.httpService.get(url));
|
|
842
860
|
}
|
|
843
861
|
getReportSchedules(skip = 0, limit = 0) {
|
|
844
862
|
const url = `GetReportSchedules/${skip}/${limit}`;
|
|
845
|
-
return this.httpService.get(url, this.envSvc.environment.ReportingAPI);
|
|
863
|
+
return this.withLoader(() => this.httpService.get(url, this.envSvc.environment.ReportingAPI));
|
|
846
864
|
}
|
|
847
865
|
getOperationActions(skip = 0, limit = 0) {
|
|
848
866
|
const url = `GetOperationAction`;
|
|
849
|
-
return this.httpService.get(url);
|
|
867
|
+
return this.withLoader(() => this.httpService.get(url));
|
|
850
868
|
}
|
|
851
869
|
saveActorTags(requests) {
|
|
852
870
|
const url = `SaveActorTags`;
|
|
853
|
-
return this.httpService.post(url, requests, this.envSvc.environment.WorkFlowAPI);
|
|
871
|
+
return this.withLoader(() => this.httpService.post(url, requests, this.envSvc.environment.WorkFlowAPI));
|
|
854
872
|
}
|
|
855
873
|
getFlowableStatuses(skip = 0, limit = 0) {
|
|
856
874
|
const url = `GetFlowableStatus/${skip}/${limit}/CreatedAt/Desc`;
|
|
857
|
-
return this.httpService.get(url);
|
|
875
|
+
return this.withLoader(() => this.httpService.get(url));
|
|
858
876
|
}
|
|
859
877
|
// Helper to create a mock workflow (just for demo)
|
|
860
878
|
createMockWorkflow(code) {
|
|
@@ -924,7 +942,7 @@ class WorkflowDataService {
|
|
|
924
942
|
};
|
|
925
943
|
return workflow;
|
|
926
944
|
}
|
|
927
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WorkflowDataService, deps: [{ token: i1.HttpWebRequestService }, { token: i1.EnvironmentService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
945
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WorkflowDataService, deps: [{ token: i1.HttpWebRequestService }, { token: i1.EnvironmentService }, { token: i1.UtilService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
928
946
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WorkflowDataService, providedIn: 'root' });
|
|
929
947
|
}
|
|
930
948
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WorkflowDataService, decorators: [{
|
|
@@ -932,7 +950,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
932
950
|
args: [{
|
|
933
951
|
providedIn: 'root',
|
|
934
952
|
}]
|
|
935
|
-
}], ctorParameters: () => [{ type: i1.HttpWebRequestService }, { type: i1.EnvironmentService }] });
|
|
953
|
+
}], ctorParameters: () => [{ type: i1.HttpWebRequestService }, { type: i1.EnvironmentService }, { type: i1.UtilService }] });
|
|
936
954
|
|
|
937
955
|
class NodeManagementService {
|
|
938
956
|
state;
|
|
@@ -2268,7 +2286,7 @@ class EscalationDialogComponent {
|
|
|
2268
2286
|
...(this.escalation() ?? {
|
|
2269
2287
|
Id: '',
|
|
2270
2288
|
Code: '',
|
|
2271
|
-
TenantId: '
|
|
2289
|
+
TenantId: '',
|
|
2272
2290
|
Workflow: this.workflowCode(),
|
|
2273
2291
|
Stage: this.stageCode(),
|
|
2274
2292
|
Type: this.type(),
|