diff --git a/src/api/IBMiContent.ts b/src/api/IBMiContent.ts index 4106bc339..ec25e9ed4 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/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 diff --git a/src/locale/ids/da.ts b/src/locale/ids/da.ts index c67287f1a..ac4a4aba8 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 6a8439a3e..14145de0e 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 bc183fefc..0521af4c8 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': 'Attribut', + 'created_by': 'Créé par', // 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 329a71c7e..7f428236e 100644 --- a/src/views/objectBrowser.ts +++ b/src/views/objectBrowser.ts @@ -321,8 +321,18 @@ class ObjectBrowserObjectItem extends ObjectBrowserItem implements ObjectItem { this.path = [object.library, object.name].join(`/`); this.updateDescription(); - this.contextValue = `object.${type.toLowerCase()}${object.attribute ? `.${object.attribute}` : ``}${this.isProtected() ? `_readonly` : ``}`; - this.tooltip = new vscode.MarkdownString(``); + this.contextValue = `object.${type.toLowerCase()}${object.attribute ? `.${object.attribute}` : ``}${isProtected(this.filter) ? `_readonly` : ``}`; + 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`, @@ -636,7 +646,7 @@ export function initializeObjectBrowser(context: vscode.ExtensionContext) { }) const copyMessages = Tools.parseMessages(copyResult.stderr); - if (copyMessages.messages.length && !copyMessages.findId(`CPF2869`)) { + if (copyResult.code !== 0 && copyMessages.messages.length && !(copyMessages.findId(`CPF2869`) && copyMessages.findId(`CPF2817`))) { throw (copyResult.stderr) }