{"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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"}