From 7ff70824476d44eb610e41e3e258bd724af62d85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BOURREAU=20S=C3=A9bastien?= Date: Thu, 19 Jan 2023 12:14:17 +0100 Subject: [PATCH 1/4] Add JOBD viewer --- package.json | 3 + src/objectProvider.ts | 4 + src/types/jobDescription.ts | 356 ++++++++++++++++++++++++++++++++++++ 3 files changed, 363 insertions(+) create mode 100644 src/types/jobDescription.ts diff --git a/package.json b/package.json index a5ec923..2f2c504 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,9 @@ }, { "filenamePattern": "object*/**/*.FILE" + }, + { + "filenamePattern": "object*/**/*.JOBD" } ], "priority": "default" diff --git a/src/objectProvider.ts b/src/objectProvider.ts index 84f037a..34e6c10 100644 --- a/src/objectProvider.ts +++ b/src/objectProvider.ts @@ -7,6 +7,7 @@ import BindingDirectory from './types/bindingDirectory'; import { Command } from './types/command'; import { DataArea } from './types/dataarea'; import { DataQueue } from './types/dataqueue'; +import { JobDescription } from './types/jobDescription'; import Program from './types/program'; import { SaveFile } from './types/saveFile'; import { generatePage, generateError } from './webviewToolkit'; @@ -112,6 +113,9 @@ function getTypeFile(uri: vscode.Uri): Base | undefined { if (uri.fragment.toUpperCase() === 'SAVF') { return new SaveFile(uri, library, objectName); } + + case `JOBD`: + return new JobDescription(uri, library, objectName); } } else { throw new Error(`Invalid path.`); diff --git a/src/types/jobDescription.ts b/src/types/jobDescription.ts new file mode 100644 index 0000000..8f7ca00 --- /dev/null +++ b/src/types/jobDescription.ts @@ -0,0 +1,356 @@ +import * as vscode from 'vscode'; +import Base from "./base"; +import { Code4i } from '../tools'; + +interface JobDescriptionInfo { + jobDescriptionLibrary: string + jobDescription: string + authorizationName: string + jobDate: string + accountingCode: string + routingData: string + requestData: string + libraryListCount: number + libraryList: string + jobSwitches: string + textDescription: string + jobQueueLibrary: string + jobQueue: string + jobQueuePriority: number + holdOnJobQueue: string + outputQueueLibrary: string + outputQueue: string + outputQueuePriority: number + spooledFileAction: string + printerDevice: string + printText: string + jobMessageQueueMaximumSize: number + jobMessageQueueFullAction: string + syntaxCheckSeverity: string + jobEndSeverity: number + joblogOutput: string + inquiryMessageReply: string + messageLoggingLevel: number + messageLoggingSeverity: number + messageLoggingText: string + logClProgramCommands: string + deviceRecoveryAction: string + timeSliceEndPool: string + allowMultipleThreads: string + workloadGroup: string + aspgrp: string + ddmConversation: string +} + +interface JobDescriptionLibrary { + sequence: number + library: string +} + +export class JobDescription extends Base { + private jobDescriptionInfo: JobDescriptionInfo | undefined; + private jobDescriptionLibraries: JobDescriptionLibrary[] | undefined; + + async fetch(): Promise { + const connection = Code4i.getConnection(); + const content = Code4i.getContent(); + if (connection && content) { + // Job Description + const jobDescriptionInfo = await Code4i.getContent().runSQL([`SELECT JOB_DESCRIPTION_LIBRARY "jobDescriptionLibrary", + JOB_DESCRIPTION "jobDescription", + AUTHORIZATION_NAME "authorizationName", + ifnull(JOB_DATE, '0001-01-01') jobDate, + ACCOUNTING_CODE "accountingCode", + ROUTING_DATA "routingData", + ifnull(REQUEST_DATA,'') "requestData", + ifnull(LIBRARY_LIST_COUNT, 0) "libraryListCount", + ifnull(LIBRARY_LIST, '') "libraryList", + JOB_SWITCHES "jobSwitches", + ifnull(TEXT_DESCRIPTION, '') "textDescription", + JOB_QUEUE_LIBRARY "jobQueueLibrary", + JOB_QUEUE "jobQueue", + JOB_QUEUE_PRIORITY "jobQueuePriority", + HOLD_ON_JOB_QUEUE "holdOnJobQueue", + ifnull(OUTPUT_QUEUE_LIBRARY, '') "outputQueueLibrary", + OUTPUT_QUEUE "outputQueue", + OUTPUT_QUEUE_PRIORITY "outputQueuePriority", + SPOOLED_FILE_ACTION "spooledFileAction", + PRINTER_DEVICE "printerDevice", + PRINT_TEXT "printText", + ifnull(JOB_MESSAGE_QUEUE_MAXIMUM_SIZE, 0) jobMessageQueueMaximumSize, + JOB_MESSAGE_QUEUE_FULL_ACTION "jobMessageQueueFullAction", + ifnull(SYNTAX_CHECK_SEVERITY, 0) "syntaxCheckSeverity", + JOB_END_SEVERITY "jobEndSeverity", + JOBLOG_OUTPUT "joblogOutput", + INQUIRY_MESSAGE_REPLY "inquiryMessageReply", + MESSAGE_LOGGING_LEVEL "messageLoggingLevel", + MESSAGE_LOGGING_SEVERITY "messageLoggingSeverity", + MESSAGE_LOGGING_TEXT "messageLoggingText", + LOG_CL_PROGRAM_COMMANDS "logClProgramCommands", + DEVICE_RECOVERY_ACTION "deviceRecoveryAction", + TIME_SLICE_END_POOL "timeSliceEndPool", + ALLOW_MULTIPLE_THREADS "allowMultipleThreads", + WORKLOAD_GROUP "workloadGroup", + ASPGRP "aspgrp", + DDM_CONVERSATION "ddmConversation" + FROM QSYS2.JOB_DESCRIPTION_INFO + where JOB_DESCRIPTION_LIBRARY = '${this.library}' AND JOB_DESCRIPTION = '${this.name}' LIMIT 1`].join(` `)); + + if (jobDescriptionInfo && jobDescriptionInfo.length > 0) { + const resultJobDescription: JobDescriptionInfo[] = jobDescriptionInfo.map(row => ({ + jobDescriptionLibrary: String(row.jobDescriptionLibrary), + jobDescription: String(row.jobDescription), + authorizationName: String(row.authorizationName), + jobDate: String(row.jobDate), + accountingCode: String(row.accountingCode), + routingData: String(row.routingData), + requestData: String(row.requestData), + libraryListCount: Number(row.libraryListCount), + libraryList: String(row.libraryList), + jobSwitches: String(row.jobSwitches), + textDescription: String(row.textDescription), + jobQueueLibrary: String(row.jobQueueLibrary), + jobQueue: String(row.jobQueue), + jobQueuePriority: Number(row.jobQueuePriority), + holdOnJobQueue: String(row.holdOnJobQueue), + outputQueueLibrary: String(row.outputQueueLibrary), + outputQueue: String(row.outputQueue), + outputQueuePriority: Number(row.outputQueuePriority), + spooledFileAction: String(row.spooledFileAction), + printerDevice: String(row.printerDevice), + printText: String(row.printText), + jobMessageQueueMaximumSize: Number(row.jobMessageQueueMaximumSize), + jobMessageQueueFullAction: String(row.jobMessageQueueFullAction), + syntaxCheckSeverity: String(row.syntaxCheckSeverity), + jobEndSeverity: Number(row.jobEndSeverity), + joblogOutput: String(row.joblogOutput), + inquiryMessageReply: String(row.inquiryMessageReply), + messageLoggingLevel: Number(row.messageLoggingLevel), + messageLoggingSeverity: Number(row.messageLoggingSeverity), + messageLoggingText: String(row.messageLoggingText), + logClProgramCommands: String(row.logClProgramCommands), + deviceRecoveryAction: String(row.deviceRecoveryAction), + timeSliceEndPool: String(row.timeSliceEndPool), + allowMultipleThreads: String(row.allowMultipleThreads), + workloadGroup: String(row.workloadGroup), + aspgrp: String(row.aspgrp), + ddmConversation: String(row.ddmConversation) + })); + this.jobDescriptionInfo = resultJobDescription[0]; + } + + // Library list + this.jobDescriptionLibraries = await this.getLibraryList(); + + } else { + throw new Error("No connection."); + } + } + + generateHTML(): string { + const descriptionTab = `

Description

+ + + + + + + Job Description + ${this.jobDescriptionInfo?.jobDescription} + + + Job Description Library + ${this.jobDescriptionInfo?.jobDescriptionLibrary} + + + Authorization Name + ${this.jobDescriptionInfo?.authorizationName} + + + Job Date + ${this.jobDescriptionInfo?.jobDate} + + + Accounting Code + ${this.jobDescriptionInfo?.accountingCode} + + + Routing Data + ${this.jobDescriptionInfo?.routingData} + + + Request Data + ${this.jobDescriptionInfo?.requestData} + + + Job Switches + ${this.jobDescriptionInfo?.jobSwitches} + + + Text Description + ${this.jobDescriptionInfo?.textDescription} + + + Job Queue + ${this.jobDescriptionInfo?.jobQueue} + + + Job Queue Library + ${this.jobDescriptionInfo?.jobQueueLibrary} + + + Job Queue Priority + ${this.jobDescriptionInfo?.jobQueuePriority} + + + Hold On Job Queue + ${this.jobDescriptionInfo?.holdOnJobQueue} + + + Output Queue Library + ${this.jobDescriptionInfo?.outputQueueLibrary} + + + Output Queue + ${this.jobDescriptionInfo?.outputQueue} + + + Output Queue Priority + ${this.jobDescriptionInfo?.outputQueuePriority} + + + Spooled File Action + ${this.jobDescriptionInfo?.spooledFileAction} + + + Printer Device + ${this.jobDescriptionInfo?.printerDevice} + + + Print Text + ${this.jobDescriptionInfo?.printText} + + + Job Message Queue Maximum Size + ${this.jobDescriptionInfo?.jobMessageQueueMaximumSize} + + + Job Message Queue Full Action + ${this.jobDescriptionInfo?.jobMessageQueueFullAction} + + + Syntax Check Severity + ${this.jobDescriptionInfo?.syntaxCheckSeverity} + + + Job End Severity + ${this.jobDescriptionInfo?.jobEndSeverity} + + + Joblog Output + ${this.jobDescriptionInfo?.joblogOutput} + + + Inquiry Message Reply + ${this.jobDescriptionInfo?.inquiryMessageReply} + + + Message Logging Level + ${this.jobDescriptionInfo?.messageLoggingLevel} + + + Message Logging Severity + ${this.jobDescriptionInfo?.messageLoggingSeverity} + + + Message Logging Text + ${this.jobDescriptionInfo?.messageLoggingText} + + + Log CL Program Commands + ${this.jobDescriptionInfo?.logClProgramCommands} + + + Device Recovery Action + ${this.jobDescriptionInfo?.deviceRecoveryAction} + + + Time Slice End Pool + ${this.jobDescriptionInfo?.timeSliceEndPool} + + + Allow Multiple Threads + ${this.jobDescriptionInfo?.allowMultipleThreads} + + + Workload Group + ${this.jobDescriptionInfo?.workloadGroup} + + + ASPGRP + ${this.jobDescriptionInfo?.aspgrp} + + + DDM Conversation + ${this.jobDescriptionInfo?.ddmConversation} + + + `; + + const libraryListTab = `

Library list

+ + + Sequence + Library + + ${this.jobDescriptionLibraries?.map(library => { + return /*html*/` + + ${library.sequence} + ${library.library} + `; + }).join("")} + + `; + + const panels = /*html*/` + + + DESCRIPTION + + + LIBRARY LIST + ${this.jobDescriptionLibraries?.length ? this.jobDescriptionLibraries?.length: 0} + + ${descriptionTab} + ${libraryListTab} + `; + + return panels; + } + + // We do the same action when use the button or Save document + async handleAction(data: any): Promise { + // Nothing to do + return { + dirty: true + }; + } + + async save(): Promise { + // Nothing to do + } + + private async getLibraryList(): Promise { + let jobDescriptionLibraries: JobDescriptionLibrary[] = []; + if(this.jobDescriptionInfo!.libraryListCount > 0){ + for (let index = 0; index < this.jobDescriptionInfo!.libraryListCount; index++) { + const start = index*10+index*1; + const library = this.jobDescriptionInfo!.libraryList.substring(start, start+11); + const sequence = (index+1)*10; + jobDescriptionLibraries.push({sequence, library}); + } + } + return jobDescriptionLibraries; + } +} \ No newline at end of file From ae43f2db51e113dd5d83ff5af68e3e5be56121ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BOURREAU=20S=C3=A9bastien?= Date: Sun, 5 Feb 2023 17:53:17 +0100 Subject: [PATCH 2/4] optimize code --- src/types/jobDescription.ts | 580 ++++++++++++++++++------------------ 1 file changed, 286 insertions(+), 294 deletions(-) diff --git a/src/types/jobDescription.ts b/src/types/jobDescription.ts index 8f7ca00..b999e30 100644 --- a/src/types/jobDescription.ts +++ b/src/types/jobDescription.ts @@ -1,62 +1,64 @@ import * as vscode from 'vscode'; import Base from "./base"; import { Code4i } from '../tools'; +import { Components } from "../webviewToolkit"; interface JobDescriptionInfo { - jobDescriptionLibrary: string - jobDescription: string - authorizationName: string - jobDate: string - accountingCode: string - routingData: string - requestData: string - libraryListCount: number - libraryList: string - jobSwitches: string - textDescription: string - jobQueueLibrary: string - jobQueue: string - jobQueuePriority: number - holdOnJobQueue: string - outputQueueLibrary: string - outputQueue: string - outputQueuePriority: number - spooledFileAction: string - printerDevice: string - printText: string - jobMessageQueueMaximumSize: number - jobMessageQueueFullAction: string - syntaxCheckSeverity: string - jobEndSeverity: number - joblogOutput: string - inquiryMessageReply: string - messageLoggingLevel: number - messageLoggingSeverity: number - messageLoggingText: string - logClProgramCommands: string - deviceRecoveryAction: string - timeSliceEndPool: string - allowMultipleThreads: string - workloadGroup: string - aspgrp: string - ddmConversation: string + jobDescriptionLibrary: string + jobDescription: string + authorizationName: string + jobDate: string + accountingCode: string + routingData: string + requestData: string + libraryListCount: number + libraryList: string + jobSwitches: string + textDescription: string + jobQueueLibrary: string + jobQueue: string + jobQueuePriority: number + holdOnJobQueue: string + outputQueueLibrary: string + outputQueue: string + outputQueuePriority: number + spooledFileAction: string + printerDevice: string + printText: string + jobMessageQueueMaximumSize: number + jobMessageQueueFullAction: string + syntaxCheckSeverity: string + jobEndSeverity: number + joblogOutput: string + inquiryMessageReply: string + messageLoggingLevel: number + messageLoggingSeverity: number + messageLoggingText: string + logClProgramCommands: string + deviceRecoveryAction: string + timeSliceEndPool: string + allowMultipleThreads: string + workloadGroup: string + aspgrp: string + ddmConversation: string } interface JobDescriptionLibrary { - sequence: number - library: string + sequence: number + library: string } export class JobDescription extends Base { - private jobDescriptionInfo: JobDescriptionInfo | undefined; - private jobDescriptionLibraries: JobDescriptionLibrary[] | undefined; + // private jobDescriptionInfo: JobDescriptionInfo | undefined; + private jobDescriptionInfo: Record = {}; + private jobDescriptionLibraries: JobDescriptionLibrary[] | undefined; - async fetch(): Promise { - const connection = Code4i.getConnection(); - const content = Code4i.getContent(); - if (connection && content) { - // Job Description - const jobDescriptionInfo = await Code4i.getContent().runSQL([`SELECT JOB_DESCRIPTION_LIBRARY "jobDescriptionLibrary", + async fetch(): Promise { + const connection = Code4i.getConnection(); + const content = Code4i.getContent(); + if (connection && content) { + // Job Description + const [jobDescriptionInfo] = await Code4i.getContent().runSQL([`SELECT JOB_DESCRIPTION_LIBRARY "jobDescriptionLibrary", JOB_DESCRIPTION "jobDescription", AUTHORIZATION_NAME "authorizationName", ifnull(JOB_DATE, '0001-01-01') jobDate, @@ -91,266 +93,256 @@ export class JobDescription extends Base { TIME_SLICE_END_POOL "timeSliceEndPool", ALLOW_MULTIPLE_THREADS "allowMultipleThreads", WORKLOAD_GROUP "workloadGroup", - ASPGRP "aspgrp", + ifnull(ASPGRP, '') "aspgrp", DDM_CONVERSATION "ddmConversation" FROM QSYS2.JOB_DESCRIPTION_INFO where JOB_DESCRIPTION_LIBRARY = '${this.library}' AND JOB_DESCRIPTION = '${this.name}' LIMIT 1`].join(` `)); - if (jobDescriptionInfo && jobDescriptionInfo.length > 0) { - const resultJobDescription: JobDescriptionInfo[] = jobDescriptionInfo.map(row => ({ - jobDescriptionLibrary: String(row.jobDescriptionLibrary), - jobDescription: String(row.jobDescription), - authorizationName: String(row.authorizationName), - jobDate: String(row.jobDate), - accountingCode: String(row.accountingCode), - routingData: String(row.routingData), - requestData: String(row.requestData), - libraryListCount: Number(row.libraryListCount), - libraryList: String(row.libraryList), - jobSwitches: String(row.jobSwitches), - textDescription: String(row.textDescription), - jobQueueLibrary: String(row.jobQueueLibrary), - jobQueue: String(row.jobQueue), - jobQueuePriority: Number(row.jobQueuePriority), - holdOnJobQueue: String(row.holdOnJobQueue), - outputQueueLibrary: String(row.outputQueueLibrary), - outputQueue: String(row.outputQueue), - outputQueuePriority: Number(row.outputQueuePriority), - spooledFileAction: String(row.spooledFileAction), - printerDevice: String(row.printerDevice), - printText: String(row.printText), - jobMessageQueueMaximumSize: Number(row.jobMessageQueueMaximumSize), - jobMessageQueueFullAction: String(row.jobMessageQueueFullAction), - syntaxCheckSeverity: String(row.syntaxCheckSeverity), - jobEndSeverity: Number(row.jobEndSeverity), - joblogOutput: String(row.joblogOutput), - inquiryMessageReply: String(row.inquiryMessageReply), - messageLoggingLevel: Number(row.messageLoggingLevel), - messageLoggingSeverity: Number(row.messageLoggingSeverity), - messageLoggingText: String(row.messageLoggingText), - logClProgramCommands: String(row.logClProgramCommands), - deviceRecoveryAction: String(row.deviceRecoveryAction), - timeSliceEndPool: String(row.timeSliceEndPool), - allowMultipleThreads: String(row.allowMultipleThreads), - workloadGroup: String(row.workloadGroup), - aspgrp: String(row.aspgrp), - ddmConversation: String(row.ddmConversation) - })); - this.jobDescriptionInfo = resultJobDescription[0]; - } + if (jobDescriptionInfo) { + this.jobDescriptionInfo["Job Description Library"] = String(jobDescriptionInfo.jobDescriptionLibrary); + this.jobDescriptionInfo["Job Description"] = String(jobDescriptionInfo.jobDescription); + this.jobDescriptionInfo["authorizationName"] = String(jobDescriptionInfo.authorizationName); + this.jobDescriptionInfo["jobDate"] = String(jobDescriptionInfo.jobDate) === `0001-01-01` ? '' : String(jobDescriptionInfo.jobDate); + this.jobDescriptionInfo["accountingCode"] = String(jobDescriptionInfo.accountingCode); + this.jobDescriptionInfo["routingData"] = String(jobDescriptionInfo.routingData); + this.jobDescriptionInfo["requestData"] = String(jobDescriptionInfo.requestData); + this.jobDescriptionInfo["libraryListCount"] = String(jobDescriptionInfo.libraryListCount); + this.jobDescriptionInfo["libraryList"] = String(jobDescriptionInfo.libraryList); + this.jobDescriptionInfo["jobSwitches"] = String(jobDescriptionInfo.jobSwitches); + this.jobDescriptionInfo["textDescription"] = String(jobDescriptionInfo.textDescription); + this.jobDescriptionInfo["jobQueueLibrary"] = String(jobDescriptionInfo.jobQueueLibrary); + this.jobDescriptionInfo["jobQueue"] = String(jobDescriptionInfo.jobQueue); + this.jobDescriptionInfo["jobQueuePriority"] = String(jobDescriptionInfo.jobQueuePriority); + this.jobDescriptionInfo["holdOnJobQueue"] = String(jobDescriptionInfo.holdOnJobQueue); + this.jobDescriptionInfo["outputQueueLibrary"] = String(jobDescriptionInfo.outputQueueLibrary); + this.jobDescriptionInfo["outputQueue"] = String(jobDescriptionInfo.outputQueue); + this.jobDescriptionInfo["outputQueuePriority"] = String(jobDescriptionInfo.outputQueuePriority); + this.jobDescriptionInfo["spooledFileAction"] = String(jobDescriptionInfo.spooledFileAction); + this.jobDescriptionInfo["printerDevice"] = String(jobDescriptionInfo.printerDevice); + this.jobDescriptionInfo["printText"] = String(jobDescriptionInfo.printText); + this.jobDescriptionInfo["jobMessageQueueMaximumSize"] = String(jobDescriptionInfo.jobMessageQueueMaximumSize); + this.jobDescriptionInfo["jobMessageQueueFullAction"] = String(jobDescriptionInfo.jobMessageQueueFullAction); + this.jobDescriptionInfo["syntaxCheckSeverity"] = String(jobDescriptionInfo.syntaxCheckSeverity); + this.jobDescriptionInfo["jobEndSeverity"] = String(jobDescriptionInfo.jobEndSeverity); + this.jobDescriptionInfo["joblogOutput"] = String(jobDescriptionInfo.joblogOutput); + this.jobDescriptionInfo["inquiryMessageReply"] = String(jobDescriptionInfo.inquiryMessageReply); + this.jobDescriptionInfo["messageLoggingLevel"] = String(jobDescriptionInfo.messageLoggingLevel); + this.jobDescriptionInfo["messageLoggingSeverity"] = String(jobDescriptionInfo.messageLoggingSeverity); + this.jobDescriptionInfo["messageLoggingText"] = String(jobDescriptionInfo.messageLoggingText); + this.jobDescriptionInfo["logClProgramCommands"] = String(jobDescriptionInfo.logClProgramCommands); + this.jobDescriptionInfo["deviceRecoveryAction"] = String(jobDescriptionInfo.deviceRecoveryAction); + this.jobDescriptionInfo["timeSliceEndPool"] = String(jobDescriptionInfo.timeSliceEndPool); + this.jobDescriptionInfo["allowMultipleThreads"] = String(jobDescriptionInfo.allowMultipleThreads); + this.jobDescriptionInfo["workloadGroup"] = String(jobDescriptionInfo.workloadGroup); + this.jobDescriptionInfo["aspgrp"] = String(jobDescriptionInfo.aspgrp); + this.jobDescriptionInfo["ddmConversation"] = String(jobDescriptionInfo.ddmConversation); + // })); + } - // Library list - this.jobDescriptionLibraries = await this.getLibraryList(); + // Library list + this.jobDescriptionLibraries = await this.getLibraryList(); - } else { - throw new Error("No connection."); - } + } else { + throw new Error("No connection."); } + } - generateHTML(): string { - const descriptionTab = `

Description

- - - - - - - Job Description - ${this.jobDescriptionInfo?.jobDescription} - - - Job Description Library - ${this.jobDescriptionInfo?.jobDescriptionLibrary} - - - Authorization Name - ${this.jobDescriptionInfo?.authorizationName} - - - Job Date - ${this.jobDescriptionInfo?.jobDate} - - - Accounting Code - ${this.jobDescriptionInfo?.accountingCode} - - - Routing Data - ${this.jobDescriptionInfo?.routingData} - - - Request Data - ${this.jobDescriptionInfo?.requestData} - - - Job Switches - ${this.jobDescriptionInfo?.jobSwitches} - - - Text Description - ${this.jobDescriptionInfo?.textDescription} - - - Job Queue - ${this.jobDescriptionInfo?.jobQueue} - - - Job Queue Library - ${this.jobDescriptionInfo?.jobQueueLibrary} - - - Job Queue Priority - ${this.jobDescriptionInfo?.jobQueuePriority} - - - Hold On Job Queue - ${this.jobDescriptionInfo?.holdOnJobQueue} - - - Output Queue Library - ${this.jobDescriptionInfo?.outputQueueLibrary} - - - Output Queue - ${this.jobDescriptionInfo?.outputQueue} - - - Output Queue Priority - ${this.jobDescriptionInfo?.outputQueuePriority} - - - Spooled File Action - ${this.jobDescriptionInfo?.spooledFileAction} - - - Printer Device - ${this.jobDescriptionInfo?.printerDevice} - - - Print Text - ${this.jobDescriptionInfo?.printText} - - - Job Message Queue Maximum Size - ${this.jobDescriptionInfo?.jobMessageQueueMaximumSize} - - - Job Message Queue Full Action - ${this.jobDescriptionInfo?.jobMessageQueueFullAction} - - - Syntax Check Severity - ${this.jobDescriptionInfo?.syntaxCheckSeverity} - - - Job End Severity - ${this.jobDescriptionInfo?.jobEndSeverity} - - - Joblog Output - ${this.jobDescriptionInfo?.joblogOutput} - - - Inquiry Message Reply - ${this.jobDescriptionInfo?.inquiryMessageReply} - - - Message Logging Level - ${this.jobDescriptionInfo?.messageLoggingLevel} - - - Message Logging Severity - ${this.jobDescriptionInfo?.messageLoggingSeverity} - - - Message Logging Text - ${this.jobDescriptionInfo?.messageLoggingText} - - - Log CL Program Commands - ${this.jobDescriptionInfo?.logClProgramCommands} - - - Device Recovery Action - ${this.jobDescriptionInfo?.deviceRecoveryAction} - - - Time Slice End Pool - ${this.jobDescriptionInfo?.timeSliceEndPool} - - - Allow Multiple Threads - ${this.jobDescriptionInfo?.allowMultipleThreads} - - - Workload Group - ${this.jobDescriptionInfo?.workloadGroup} - - - ASPGRP - ${this.jobDescriptionInfo?.aspgrp} - - - DDM Conversation - ${this.jobDescriptionInfo?.ddmConversation} - - - `; + generateHTML(): string { + // const descriptionTab = `

Description

+ // + // + // + // + // + // + // Job Description + // ${this.jobDescriptionInfo?.jobDescription} + // + // + // Job Description Library + // ${this.jobDescriptionInfo?.jobDescriptionLibrary} + // + // + // Authorization Name + // ${this.jobDescriptionInfo?.authorizationName} + // + // + // Job Date + // ${this.jobDescriptionInfo?.jobDate} + // + // + // Accounting Code + // ${this.jobDescriptionInfo?.accountingCode} + // + // + // Routing Data + // ${this.jobDescriptionInfo?.routingData} + // + // + // Request Data + // ${this.jobDescriptionInfo?.requestData} + // + // + // Job Switches + // ${this.jobDescriptionInfo?.jobSwitches} + // + // + // Text Description + // ${this.jobDescriptionInfo?.textDescription} + // + // + // Job Queue + // ${this.jobDescriptionInfo?.jobQueue} + // + // + // Job Queue Library + // ${this.jobDescriptionInfo?.jobQueueLibrary} + // + // + // Job Queue Priority + // ${this.jobDescriptionInfo?.jobQueuePriority} + // + // + // Hold On Job Queue + // ${this.jobDescriptionInfo?.holdOnJobQueue} + // + // + // Output Queue Library + // ${this.jobDescriptionInfo?.outputQueueLibrary} + // + // + // Output Queue + // ${this.jobDescriptionInfo?.outputQueue} + // + // + // Output Queue Priority + // ${this.jobDescriptionInfo?.outputQueuePriority} + // + // + // Spooled File Action + // ${this.jobDescriptionInfo?.spooledFileAction} + // + // + // Printer Device + // ${this.jobDescriptionInfo?.printerDevice} + // + // + // Print Text + // ${this.jobDescriptionInfo?.printText} + // + // + // Job Message Queue Maximum Size + // ${this.jobDescriptionInfo?.jobMessageQueueMaximumSize} + // + // + // Job Message Queue Full Action + // ${this.jobDescriptionInfo?.jobMessageQueueFullAction} + // + // + // Syntax Check Severity + // ${this.jobDescriptionInfo?.syntaxCheckSeverity} + // + // + // Job End Severity + // ${this.jobDescriptionInfo?.jobEndSeverity} + // + // + // Joblog Output + // ${this.jobDescriptionInfo?.joblogOutput} + // + // + // Inquiry Message Reply + // ${this.jobDescriptionInfo?.inquiryMessageReply} + // + // + // Message Logging Level + // ${this.jobDescriptionInfo?.messageLoggingLevel} + // + // + // Message Logging Severity + // ${this.jobDescriptionInfo?.messageLoggingSeverity} + // + // + // Message Logging Text + // ${this.jobDescriptionInfo?.messageLoggingText} + // + // + // Log CL Program Commands + // ${this.jobDescriptionInfo?.logClProgramCommands} + // + // + // Device Recovery Action + // ${this.jobDescriptionInfo?.deviceRecoveryAction} + // + // + // Time Slice End Pool + // ${this.jobDescriptionInfo?.timeSliceEndPool} + // + // + // Allow Multiple Threads + // ${this.jobDescriptionInfo?.allowMultipleThreads} + // + // + // Workload Group + // ${this.jobDescriptionInfo?.workloadGroup} + // + // + // ASPGRP + // ${this.jobDescriptionInfo?.aspgrp} + // + // + // DDM Conversation + // ${this.jobDescriptionInfo?.ddmConversation} + // + // + // `; - const libraryListTab = `

Library list

- - - Sequence - Library - - ${this.jobDescriptionLibraries?.map(library => { - return /*html*/` - - ${library.sequence} - ${library.library} - `; - }).join("")} - - `; + const descriptionTab = /* html */ `

Description

+ ${Components.dataGrid<[string, string]>({ + columns: [ + { title: "", cellValue: entry => entry[0] }, + { title: "", cellValue: entry => entry[1] } + ] + }, Object.entries(this.jobDescriptionInfo))}`; - const panels = /*html*/` - - - DESCRIPTION - - - LIBRARY LIST - ${this.jobDescriptionLibraries?.length ? this.jobDescriptionLibraries?.length: 0} - - ${descriptionTab} - ${libraryListTab} - `; + const libraryListTab = /* html */ `

Library list

+ ${Components.dataGrid({ + columns: [ + { title: "Sequence", cellValue: l => String(l.sequence) }, + { title: "Library", cellValue: l => l.library } + ] + }, this.jobDescriptionLibraries!)}`; - return panels; - } + const panels = Components.panels([ + { title: "DESCRIPTION", content: descriptionTab }, + { title: "LIBRARY LIST", content: libraryListTab, badge: this.jobDescriptionLibraries?.length ? this.jobDescriptionLibraries?.length : 0 } + ]); - // We do the same action when use the button or Save document - async handleAction(data: any): Promise { - // Nothing to do - return { - dirty: true - }; - } + return panels; + } - async save(): Promise { - // Nothing to do - } + // We do the same action when use the button or Save document + async handleAction(data: any): Promise { + // Nothing to do + return { + dirty: true + }; + } + + async save(): Promise { + // Nothing to do + } - private async getLibraryList(): Promise { - let jobDescriptionLibraries: JobDescriptionLibrary[] = []; - if(this.jobDescriptionInfo!.libraryListCount > 0){ - for (let index = 0; index < this.jobDescriptionInfo!.libraryListCount; index++) { - const start = index*10+index*1; - const library = this.jobDescriptionInfo!.libraryList.substring(start, start+11); - const sequence = (index+1)*10; - jobDescriptionLibraries.push({sequence, library}); - } - } - return jobDescriptionLibraries; + private async getLibraryList(): Promise { + let jobDescriptionLibraries: JobDescriptionLibrary[] = []; + if (parseInt(this.jobDescriptionInfo["libraryListCount"]) > 0 ) { + for (let index = 0; index < parseInt(this.jobDescriptionInfo["libraryListCount"]); index++) { + const start = index * 10 + index * 1; + const library = this.jobDescriptionInfo!.libraryList.substring(start, start + 11); + const sequence = (index + 1) * 10; + jobDescriptionLibraries.push({ sequence, library }); + } } + return jobDescriptionLibraries; + } } \ No newline at end of file From e70293b68106e44e06c69d6bc8c36537d119a700 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?BOURREAU=20S=C3=A9bastien?= Date: Mon, 20 Feb 2023 14:09:17 +0100 Subject: [PATCH 3/4] Various small corrections --- src/types/jobDescription.ts | 276 ++++++------------------------------ 1 file changed, 41 insertions(+), 235 deletions(-) diff --git a/src/types/jobDescription.ts b/src/types/jobDescription.ts index b999e30..b2e2167 100644 --- a/src/types/jobDescription.ts +++ b/src/types/jobDescription.ts @@ -3,53 +3,12 @@ import Base from "./base"; import { Code4i } from '../tools'; import { Components } from "../webviewToolkit"; -interface JobDescriptionInfo { - jobDescriptionLibrary: string - jobDescription: string - authorizationName: string - jobDate: string - accountingCode: string - routingData: string - requestData: string - libraryListCount: number - libraryList: string - jobSwitches: string - textDescription: string - jobQueueLibrary: string - jobQueue: string - jobQueuePriority: number - holdOnJobQueue: string - outputQueueLibrary: string - outputQueue: string - outputQueuePriority: number - spooledFileAction: string - printerDevice: string - printText: string - jobMessageQueueMaximumSize: number - jobMessageQueueFullAction: string - syntaxCheckSeverity: string - jobEndSeverity: number - joblogOutput: string - inquiryMessageReply: string - messageLoggingLevel: number - messageLoggingSeverity: number - messageLoggingText: string - logClProgramCommands: string - deviceRecoveryAction: string - timeSliceEndPool: string - allowMultipleThreads: string - workloadGroup: string - aspgrp: string - ddmConversation: string -} - interface JobDescriptionLibrary { sequence: number library: string } export class JobDescription extends Base { - // private jobDescriptionInfo: JobDescriptionInfo | undefined; private jobDescriptionInfo: Record = {}; private jobDescriptionLibraries: JobDescriptionLibrary[] | undefined; @@ -61,7 +20,7 @@ export class JobDescription extends Base { const [jobDescriptionInfo] = await Code4i.getContent().runSQL([`SELECT JOB_DESCRIPTION_LIBRARY "jobDescriptionLibrary", JOB_DESCRIPTION "jobDescription", AUTHORIZATION_NAME "authorizationName", - ifnull(JOB_DATE, '0001-01-01') jobDate, + ifnull(JOB_DATE, '0001-01-01') "jobDate", ACCOUNTING_CODE "accountingCode", ROUTING_DATA "routingData", ifnull(REQUEST_DATA,'') "requestData", @@ -99,44 +58,43 @@ export class JobDescription extends Base { where JOB_DESCRIPTION_LIBRARY = '${this.library}' AND JOB_DESCRIPTION = '${this.name}' LIMIT 1`].join(` `)); if (jobDescriptionInfo) { - this.jobDescriptionInfo["Job Description Library"] = String(jobDescriptionInfo.jobDescriptionLibrary); - this.jobDescriptionInfo["Job Description"] = String(jobDescriptionInfo.jobDescription); - this.jobDescriptionInfo["authorizationName"] = String(jobDescriptionInfo.authorizationName); - this.jobDescriptionInfo["jobDate"] = String(jobDescriptionInfo.jobDate) === `0001-01-01` ? '' : String(jobDescriptionInfo.jobDate); - this.jobDescriptionInfo["accountingCode"] = String(jobDescriptionInfo.accountingCode); - this.jobDescriptionInfo["routingData"] = String(jobDescriptionInfo.routingData); - this.jobDescriptionInfo["requestData"] = String(jobDescriptionInfo.requestData); - this.jobDescriptionInfo["libraryListCount"] = String(jobDescriptionInfo.libraryListCount); - this.jobDescriptionInfo["libraryList"] = String(jobDescriptionInfo.libraryList); - this.jobDescriptionInfo["jobSwitches"] = String(jobDescriptionInfo.jobSwitches); - this.jobDescriptionInfo["textDescription"] = String(jobDescriptionInfo.textDescription); - this.jobDescriptionInfo["jobQueueLibrary"] = String(jobDescriptionInfo.jobQueueLibrary); - this.jobDescriptionInfo["jobQueue"] = String(jobDescriptionInfo.jobQueue); - this.jobDescriptionInfo["jobQueuePriority"] = String(jobDescriptionInfo.jobQueuePriority); - this.jobDescriptionInfo["holdOnJobQueue"] = String(jobDescriptionInfo.holdOnJobQueue); - this.jobDescriptionInfo["outputQueueLibrary"] = String(jobDescriptionInfo.outputQueueLibrary); - this.jobDescriptionInfo["outputQueue"] = String(jobDescriptionInfo.outputQueue); - this.jobDescriptionInfo["outputQueuePriority"] = String(jobDescriptionInfo.outputQueuePriority); - this.jobDescriptionInfo["spooledFileAction"] = String(jobDescriptionInfo.spooledFileAction); - this.jobDescriptionInfo["printerDevice"] = String(jobDescriptionInfo.printerDevice); - this.jobDescriptionInfo["printText"] = String(jobDescriptionInfo.printText); - this.jobDescriptionInfo["jobMessageQueueMaximumSize"] = String(jobDescriptionInfo.jobMessageQueueMaximumSize); - this.jobDescriptionInfo["jobMessageQueueFullAction"] = String(jobDescriptionInfo.jobMessageQueueFullAction); - this.jobDescriptionInfo["syntaxCheckSeverity"] = String(jobDescriptionInfo.syntaxCheckSeverity); - this.jobDescriptionInfo["jobEndSeverity"] = String(jobDescriptionInfo.jobEndSeverity); - this.jobDescriptionInfo["joblogOutput"] = String(jobDescriptionInfo.joblogOutput); - this.jobDescriptionInfo["inquiryMessageReply"] = String(jobDescriptionInfo.inquiryMessageReply); - this.jobDescriptionInfo["messageLoggingLevel"] = String(jobDescriptionInfo.messageLoggingLevel); - this.jobDescriptionInfo["messageLoggingSeverity"] = String(jobDescriptionInfo.messageLoggingSeverity); - this.jobDescriptionInfo["messageLoggingText"] = String(jobDescriptionInfo.messageLoggingText); - this.jobDescriptionInfo["logClProgramCommands"] = String(jobDescriptionInfo.logClProgramCommands); - this.jobDescriptionInfo["deviceRecoveryAction"] = String(jobDescriptionInfo.deviceRecoveryAction); - this.jobDescriptionInfo["timeSliceEndPool"] = String(jobDescriptionInfo.timeSliceEndPool); - this.jobDescriptionInfo["allowMultipleThreads"] = String(jobDescriptionInfo.allowMultipleThreads); - this.jobDescriptionInfo["workloadGroup"] = String(jobDescriptionInfo.workloadGroup); - this.jobDescriptionInfo["aspgrp"] = String(jobDescriptionInfo.aspgrp); - this.jobDescriptionInfo["ddmConversation"] = String(jobDescriptionInfo.ddmConversation); - // })); + this.jobDescriptionInfo["Job description library"] = String(jobDescriptionInfo.jobDescriptionLibrary); + this.jobDescriptionInfo["Job description"] = String(jobDescriptionInfo.jobDescription); + this.jobDescriptionInfo["Authorization name"] = String(jobDescriptionInfo.authorizationName); + this.jobDescriptionInfo["Job date"] = String(jobDescriptionInfo.jobDate) === `0001-01-01` ? '' : String(jobDescriptionInfo.jobDate); + this.jobDescriptionInfo["Accounting code"] = String(jobDescriptionInfo.accountingCode); + this.jobDescriptionInfo["Routing data"] = String(jobDescriptionInfo.routingData); + this.jobDescriptionInfo["Request data"] = String(jobDescriptionInfo.requestData); + this.jobDescriptionInfo["Library list count"] = String(jobDescriptionInfo.libraryListCount); + this.jobDescriptionInfo["Library list"] = String(jobDescriptionInfo.libraryList); + this.jobDescriptionInfo["Job switches"] = String(jobDescriptionInfo.jobSwitches); + this.jobDescriptionInfo["Text description"] = String(jobDescriptionInfo.textDescription); + this.jobDescriptionInfo["Job queue library"] = String(jobDescriptionInfo.jobQueueLibrary); + this.jobDescriptionInfo["Job queue"] = String(jobDescriptionInfo.jobQueue); + this.jobDescriptionInfo["Job queue priority"] = String(jobDescriptionInfo.jobQueuePriority); + this.jobDescriptionInfo["Hold on job queue"] = String(jobDescriptionInfo.holdOnJobQueue); + this.jobDescriptionInfo["Output queue library"] = String(jobDescriptionInfo.outputQueueLibrary); + this.jobDescriptionInfo["Output queue"] = String(jobDescriptionInfo.outputQueue); + this.jobDescriptionInfo["Output queue priority"] = String(jobDescriptionInfo.outputQueuePriority); + this.jobDescriptionInfo["Spooled file action"] = String(jobDescriptionInfo.spooledFileAction); + this.jobDescriptionInfo["Printer device"] = String(jobDescriptionInfo.printerDevice); + this.jobDescriptionInfo["Print text"] = String(jobDescriptionInfo.printText); + this.jobDescriptionInfo["Job message queue maximum size"] = String(jobDescriptionInfo.jobMessageQueueMaximumSize); + this.jobDescriptionInfo["Job message queue full action"] = String(jobDescriptionInfo.jobMessageQueueFullAction); + this.jobDescriptionInfo["Syntax check severity"] = String(jobDescriptionInfo.syntaxCheckSeverity); + this.jobDescriptionInfo["Job end severity"] = String(jobDescriptionInfo.jobEndSeverity); + this.jobDescriptionInfo["Joblog output"] = String(jobDescriptionInfo.joblogOutput); + this.jobDescriptionInfo["Inquiry message reply"] = String(jobDescriptionInfo.inquiryMessageReply); + this.jobDescriptionInfo["Message logging level"] = String(jobDescriptionInfo.messageLoggingLevel); + this.jobDescriptionInfo["Message logging severity"] = String(jobDescriptionInfo.messageLoggingSeverity); + this.jobDescriptionInfo["Message logging text"] = String(jobDescriptionInfo.messageLoggingText); + this.jobDescriptionInfo["Log cl program commands"] = String(jobDescriptionInfo.logClProgramCommands); + this.jobDescriptionInfo["Device recovery action"] = String(jobDescriptionInfo.deviceRecoveryAction); + this.jobDescriptionInfo["Time slice end pool"] = String(jobDescriptionInfo.timeSliceEndPool); + this.jobDescriptionInfo["Allow mltiple threads"] = String(jobDescriptionInfo.allowMultipleThreads); + this.jobDescriptionInfo["Workload group"] = String(jobDescriptionInfo.workloadGroup); + this.jobDescriptionInfo["ASP group"] = String(jobDescriptionInfo.aspgrp); + this.jobDescriptionInfo["DDM conversation"] = String(jobDescriptionInfo.ddmConversation); } // Library list @@ -148,156 +106,7 @@ export class JobDescription extends Base { } generateHTML(): string { - // const descriptionTab = `

Description

- // - // - // - // - // - // - // Job Description - // ${this.jobDescriptionInfo?.jobDescription} - // - // - // Job Description Library - // ${this.jobDescriptionInfo?.jobDescriptionLibrary} - // - // - // Authorization Name - // ${this.jobDescriptionInfo?.authorizationName} - // - // - // Job Date - // ${this.jobDescriptionInfo?.jobDate} - // - // - // Accounting Code - // ${this.jobDescriptionInfo?.accountingCode} - // - // - // Routing Data - // ${this.jobDescriptionInfo?.routingData} - // - // - // Request Data - // ${this.jobDescriptionInfo?.requestData} - // - // - // Job Switches - // ${this.jobDescriptionInfo?.jobSwitches} - // - // - // Text Description - // ${this.jobDescriptionInfo?.textDescription} - // - // - // Job Queue - // ${this.jobDescriptionInfo?.jobQueue} - // - // - // Job Queue Library - // ${this.jobDescriptionInfo?.jobQueueLibrary} - // - // - // Job Queue Priority - // ${this.jobDescriptionInfo?.jobQueuePriority} - // - // - // Hold On Job Queue - // ${this.jobDescriptionInfo?.holdOnJobQueue} - // - // - // Output Queue Library - // ${this.jobDescriptionInfo?.outputQueueLibrary} - // - // - // Output Queue - // ${this.jobDescriptionInfo?.outputQueue} - // - // - // Output Queue Priority - // ${this.jobDescriptionInfo?.outputQueuePriority} - // - // - // Spooled File Action - // ${this.jobDescriptionInfo?.spooledFileAction} - // - // - // Printer Device - // ${this.jobDescriptionInfo?.printerDevice} - // - // - // Print Text - // ${this.jobDescriptionInfo?.printText} - // - // - // Job Message Queue Maximum Size - // ${this.jobDescriptionInfo?.jobMessageQueueMaximumSize} - // - // - // Job Message Queue Full Action - // ${this.jobDescriptionInfo?.jobMessageQueueFullAction} - // - // - // Syntax Check Severity - // ${this.jobDescriptionInfo?.syntaxCheckSeverity} - // - // - // Job End Severity - // ${this.jobDescriptionInfo?.jobEndSeverity} - // - // - // Joblog Output - // ${this.jobDescriptionInfo?.joblogOutput} - // - // - // Inquiry Message Reply - // ${this.jobDescriptionInfo?.inquiryMessageReply} - // - // - // Message Logging Level - // ${this.jobDescriptionInfo?.messageLoggingLevel} - // - // - // Message Logging Severity - // ${this.jobDescriptionInfo?.messageLoggingSeverity} - // - // - // Message Logging Text - // ${this.jobDescriptionInfo?.messageLoggingText} - // - // - // Log CL Program Commands - // ${this.jobDescriptionInfo?.logClProgramCommands} - // - // - // Device Recovery Action - // ${this.jobDescriptionInfo?.deviceRecoveryAction} - // - // - // Time Slice End Pool - // ${this.jobDescriptionInfo?.timeSliceEndPool} - // - // - // Allow Multiple Threads - // ${this.jobDescriptionInfo?.allowMultipleThreads} - // - // - // Workload Group - // ${this.jobDescriptionInfo?.workloadGroup} - // - // - // ASPGRP - // ${this.jobDescriptionInfo?.aspgrp} - // - // - // DDM Conversation - // ${this.jobDescriptionInfo?.ddmConversation} - // - // - // `; - - const descriptionTab = /* html */ `

Description

+ const descriptionTab = /* html */ ` ${Components.dataGrid<[string, string]>({ columns: [ { title: "", cellValue: entry => entry[0] }, @@ -305,7 +114,7 @@ export class JobDescription extends Base { ] }, Object.entries(this.jobDescriptionInfo))}`; - const libraryListTab = /* html */ `

Library list

+ const libraryListTab = /* html */ ` ${Components.dataGrid({ columns: [ { title: "Sequence", cellValue: l => String(l.sequence) }, @@ -321,12 +130,9 @@ export class JobDescription extends Base { return panels; } - // We do the same action when use the button or Save document async handleAction(data: any): Promise { // Nothing to do - return { - dirty: true - }; + return { }; } async save(): Promise { From 39e06cdb129d95f0da95cea515017d8850a4b212 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20BOURREAU?= Date: Tue, 21 Feb 2023 12:32:15 +0100 Subject: [PATCH 4/4] Fix: Library list --- src/types/jobDescription.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/types/jobDescription.ts b/src/types/jobDescription.ts index b2e2167..0c0efec 100644 --- a/src/types/jobDescription.ts +++ b/src/types/jobDescription.ts @@ -141,10 +141,10 @@ export class JobDescription extends Base { private async getLibraryList(): Promise { let jobDescriptionLibraries: JobDescriptionLibrary[] = []; - if (parseInt(this.jobDescriptionInfo["libraryListCount"]) > 0 ) { - for (let index = 0; index < parseInt(this.jobDescriptionInfo["libraryListCount"]); index++) { + if (parseInt(this.jobDescriptionInfo["Library list count"]) > 0 ) { + for (let index = 0; index < parseInt(this.jobDescriptionInfo["Library list count"]); index++) { const start = index * 10 + index * 1; - const library = this.jobDescriptionInfo!.libraryList.substring(start, start + 11); + const library = this.jobDescriptionInfo["Library list"].substring(start, start + 11); const sequence = (index + 1) * 10; jobDescriptionLibraries.push({ sequence, library }); }