From 28d66b010bab2ec91e355e60195da4f76245ebde Mon Sep 17 00:00:00 2001 From: worksofliam Date: Thu, 22 Feb 2024 14:42:55 -0500 Subject: [PATCH 1/3] Store that CL component was installed after installing Signed-off-by: worksofliam --- src/api/Storage.ts | 7 +++++++ src/languages/clle/clApi.ts | 6 +++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/api/Storage.ts b/src/api/Storage.ts index 017616fe4..9f24be1f7 100644 --- a/src/api/Storage.ts +++ b/src/api/Storage.ts @@ -97,6 +97,13 @@ export class GlobalStorage extends Storage { await this.set(SERVER_SETTINGS_CACHE_KEY(name), serverSettings); } + async setServerSettingsCacheSpecific(name: string, newSettings: Partial) { + await this.set(SERVER_SETTINGS_CACHE_KEY(name), { + ...this.getServerSettingsCache(name), + ...newSettings + }); + } + async deleteServerSettingsCache(name: string) { await this.set(SERVER_SETTINGS_CACHE_KEY(name), undefined); } diff --git a/src/languages/clle/clApi.ts b/src/languages/clle/clApi.ts index dbcb6c314..86f1bab15 100644 --- a/src/languages/clle/clApi.ts +++ b/src/languages/clle/clApi.ts @@ -2,6 +2,7 @@ import { window } from "vscode"; import { instance } from "../../instantiate"; import * as gencmdxml from "./gencmdxml"; +import { GlobalStorage } from "../../api/Storage"; export async function init() { const clComponentsInstalled = checkRequirements(); @@ -46,7 +47,10 @@ async function install() { noLibList: true }); - if (createResult.code !== 0) { + if (createResult.code === 0) { + connection.remoteFeatures[`GENCMDXML.PGM`] = `GENCMDXML`; + await GlobalStorage.get().setServerSettingsCacheSpecific(connection.currentConnectionName, { remoteFeatures: connection.remoteFeatures }); + } else { throw new Error(`Failed to create GENCMDXML program.`); } } \ No newline at end of file From 5dcaa7b8263ae8d36ce2fd316d283524feb697b2 Mon Sep 17 00:00:00 2001 From: Christian Jorgensen Date: Fri, 23 Feb 2024 21:46:02 +0100 Subject: [PATCH 2/3] Add tooltip for objects in object browser --- src/api/IBMiContent.ts | 38 +++++++++++++++++++++++++++++++++----- src/locale/ids/da.ts | 3 +++ src/locale/ids/en.ts | 3 +++ src/locale/ids/fr.ts | 3 +++ src/typings.ts | 5 +++++ src/views/objectBrowser.ts | 12 +++++++++++- 6 files changed, 58 insertions(+), 6 deletions(-) diff --git a/src/api/IBMiContent.ts b/src/api/IBMiContent.ts index c94f7c7b1..9ab60aa2d 100644 --- a/src/api/IBMiContent.ts +++ b/src/api/IBMiContent.ts @@ -475,7 +475,7 @@ export default class IBMiContent { /** * @param filters * @param sortOrder - * @returns an array of IBMiFile + * @returns an array of IBMiObject */ async getObjectList(filters: { library: string; object?: string; types?: string[]; filterType?: FilterType }, sortOrder?: SortOrder): Promise { const library = filters.library.toUpperCase(); @@ -521,7 +521,18 @@ export default class IBMiContent { `ODOBTP as TYPE, ` + `ODOBAT as ATTRIBUTE, ` + `ODOBTX as TEXT, ` + - `0 as IS_SOURCE ` + + `0 as IS_SOURCE, ` + + `ODOBSZ as SIZE, ` + + `ODCCEN, ` + + `ODCDAT, ` + + `ODCTIM, ` + + `ODLCEN, ` + + `ODLDAT, ` + + `ODLTIM, ` + + `ODOBOW as OWNER, ` + + `ODCRTU as CREATED_BY, ` + + `ODSIZU as SIZE_IN_UNITS, ` + + `ODBPUN as BYTES_PER_UNIT ` + `from QTEMP.CODE4IOBJD`; } else { @@ -533,7 +544,18 @@ export default class IBMiContent { `Case When PHDTAT = 'S' Then 1 Else 0 End as IS_SOURCE, ` + `PHNOMB as NB_MBR, ` + 'PHMXRL as SOURCE_LENGTH, ' + - 'PHCSID as CCSID ' + + 'PHCSID as CCSID, ' + + `ODOBSZ as SIZE, ` + + `ODCCEN, ` + + `ODCDAT, ` + + `ODCTIM, ` + + `ODLCEN, ` + + `ODLDAT, ` + + `ODLTIM, ` + + `ODOBOW as OWNER, ` + + `ODCRTU as CREATED_BY, ` + + `ODSIZU as SIZE_IN_UNITS, ` + + `ODBPUN as BYTES_PER_UNIT ` + `from QTEMP.CODE4IOBJD ` + `left join QTEMP.CODE4IFD on PHFILE = ODOBNM And PHDTAT = 'S'`; } @@ -550,7 +572,12 @@ export default class IBMiContent { memberCount: object.NB_MBR !== undefined ? Number(object.NB_MBR) : undefined, sourceFile: Boolean(object.IS_SOURCE), sourceLength: object.SOURCE_LENGTH !== undefined ? Number(object.SOURCE_LENGTH) : undefined, - CCSID: object.CCSID !== undefined ? Number(object.CCSID) : undefined + CCSID: object.CCSID !== undefined ? Number(object.CCSID) : undefined, + size: Number(object.SIZE) !== 9999999999 ? Number(object.SIZE) : Number(object.SIZE_IN_UNITS) * Number(object.BYTES_PER_UNIT), + created: this.getDspObjDdDate(String(object.ODCCEN), String(object.ODCDAT), String(object.ODCTIM)), + changed: this.getDspObjDdDate(String(object.ODLCEN), String(object.ODLDAT), String(object.ODLTIM)), + created_by: object.CREATED_BY, + owner: object.OWNER, } as IBMiObject)) .filter(object => !typeFilter || typeFilter(object.type)) .filter(object => nameFilter.test(object.name)) @@ -806,8 +833,9 @@ export default class IBMiContent { * @param timeString: string in HHMMSS * @returns date */ - getDspfdDate(century: string = `0`, YYMMDD: string = `010101`, HHMMSS: string = `000000`): Date { + getDspObjDdDate(century: string = `0`, MMDDYY: string = `010101`, HHMMSS: string = `000000`): Date { let year: string, month: string, day: string, hours: string, minutes: string, seconds: string; + let YYMMDD: string = MMDDYY.slice(4,).concat(MMDDYY.slice(0, 4)); let dateString: string = (century === `1` ? `20` : `19`).concat(YYMMDD.padStart(6, `0`)).concat(HHMMSS.padStart(6, `0`)); [, year, month, day, hours, minutes, seconds] = /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/.exec(dateString) || []; return new Date(Date.UTC(Number(year), Number(month) - 1, Number(day), Number(hours), Number(minutes), Number(seconds))); diff --git a/src/locale/ids/da.ts b/src/locale/ids/da.ts index 57b0637c2..bb142dd93 100644 --- a/src/locale/ids/da.ts +++ b/src/locale/ids/da.ts @@ -30,6 +30,9 @@ export const da: Locale = { 'size': 'Størrelse', 'modified': 'Ændret', 'owner': 'Ejer', + 'type': 'Type', + 'attribute': 'Attribut', + 'created_by': 'Oprettet af', // Sandbox: 'sandbox.input.user.title': `Bruger for server`, 'sandbox.input.user.prompt': `Indtast brugernavn for {0}`, diff --git a/src/locale/ids/en.ts b/src/locale/ids/en.ts index 1c2472a1b..2a1ee60fb 100644 --- a/src/locale/ids/en.ts +++ b/src/locale/ids/en.ts @@ -30,6 +30,9 @@ export const en: Locale = { 'size': 'Size', 'modified': 'Modified', 'owner': 'Owner', + 'type': 'Type', + 'attribute': 'Attribute', + 'created_by': 'Created by', // Sandbox: 'sandbox.input.user.title': `User for server`, 'sandbox.input.user.prompt': `Enter username for {0}`, diff --git a/src/locale/ids/fr.ts b/src/locale/ids/fr.ts index 8a52440ca..d3eded936 100644 --- a/src/locale/ids/fr.ts +++ b/src/locale/ids/fr.ts @@ -30,6 +30,9 @@ export const fr: Locale = { 'size': 'Taille', 'modified': 'Modifié', 'owner': 'Propriétaire', + 'type': 'Type', + 'attribute': 'Attribute', + 'created_by': 'Created by', // Sandbox: 'sandbox.input.user.title': `Nom d'utilisateur`, 'sandbox.input.user.prompt': `Entrez le nom d'utilisateur pour {0}`, diff --git a/src/typings.ts b/src/typings.ts index 8cd3008dc..1eac62698 100644 --- a/src/typings.ts +++ b/src/typings.ts @@ -103,6 +103,11 @@ export interface IBMiObject extends QsysPath { memberCount?: number sourceLength?: number CCSID?: number + size?: number + created?: Date + changed?: Date + created_by?: string + owner?: string } export interface IBMiMember { diff --git a/src/views/objectBrowser.ts b/src/views/objectBrowser.ts index a211e78fd..629a80759 100644 --- a/src/views/objectBrowser.ts +++ b/src/views/objectBrowser.ts @@ -288,7 +288,17 @@ class ObjectBrowserObjectItem extends ObjectBrowserItem implements ObjectItem { this.updateDescription(); this.contextValue = `object.${type.toLowerCase()}${object.attribute ? `.${object.attribute}` : ``}${isProtected(this.filter) ? `_readonly` : ``}`; - this.tooltip = new vscode.MarkdownString(``); + this.tooltip = new vscode.MarkdownString(Tools.generateTooltipHtmlTable(this.path, { + type: object.type, + attribute: object.attribute, + text: object.text, + size: object.size, + created: object.created?.toISOString().slice(0, 19).replace(`T`, ` `), + changed: object.changed?.toISOString().slice(0, 19).replace(`T`, ` `), + created_by: object.created_by, + owner: object.owner, + })); + this.tooltip.supportHtml = true; this.resourceUri = vscode.Uri.from({ scheme: `object`, From 725454fea8d6a0b0f20d647830bec0b9e90e3732 Mon Sep 17 00:00:00 2001 From: Christian Jorgensen Date: Fri, 23 Feb 2024 23:48:24 +0100 Subject: [PATCH 3/3] Translate new texts into French MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sébastien Julliand --- src/locale/ids/fr.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/locale/ids/fr.ts b/src/locale/ids/fr.ts index d3eded936..1660ecd0f 100644 --- a/src/locale/ids/fr.ts +++ b/src/locale/ids/fr.ts @@ -31,8 +31,8 @@ export const fr: Locale = { 'modified': 'Modifié', 'owner': 'Propriétaire', 'type': 'Type', - 'attribute': 'Attribute', - 'created_by': 'Created by', + 'attribute': 'Attribut', + 'created_by': 'Créé par', // Sandbox: 'sandbox.input.user.title': `Nom d'utilisateur`, 'sandbox.input.user.prompt': `Entrez le nom d'utilisateur pour {0}`,