Skip to content

Commit 2de1a59

Browse files
Tablecontents (#199)
* run selection with icon * refactor, update query panel
1 parent 31f68d2 commit 2de1a59

File tree

9 files changed

+137
-82
lines changed

9 files changed

+137
-82
lines changed

client/src/adt/conections.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { RemoteManager, createClient } from "../config"
2-
import { AFsService, Root } from "abapfs"
2+
import { AFsService, AbapStat, Root, isAbapStat } from "abapfs"
33
import { Uri, FileSystemError } from "vscode"
44
import { ADTClient } from "abap-adt-api"
55
import { LogOutPendingDebuggers } from "./debugger"
@@ -14,7 +14,7 @@ const missing = (connId: string) => {
1414
return FileSystemError.FileNotFound(`No ABAP server defined for ${connId}`)
1515
}
1616

17-
export const abapUri = (u: Uri) => u.scheme === ADTSCHEME
17+
export const abapUri = (u?: Uri) => u?.scheme === ADTSCHEME
1818

1919
async function create(connId: string) {
2020
const manager = RemoteManager.get()
@@ -71,7 +71,7 @@ export const getRoot = (connId: string) => {
7171
}
7272

7373
export const uriRoot = (uri: Uri) => {
74-
if (uri && uri.scheme === ADTSCHEME) return getRoot(uri.authority)
74+
if (abapUri(uri)) return getRoot(uri.authority)
7575
throw missing(uri.toString())
7676
}
7777

client/src/adt/operations/AdtObjectFinder.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ import {
2626
isAbapFile,
2727
isAbapStat,
2828
Root,
29-
AbapFile
29+
AbapFile,
30+
AbapStat
3031
} from "abapfs"
3132

3233
interface SearchObjectType {
@@ -255,6 +256,16 @@ export function findAbapObject(uri: Uri) {
255256
throw new Error("Not an ABAP object")
256257
}
257258

259+
export const uriAbapFile = (uri?: Uri): AbapStat | undefined => {
260+
try {
261+
if (!uri) return
262+
const root = uriRoot(uri)
263+
const file = root.getNode(uri.path)
264+
if (isAbapStat(file)) return file
265+
} catch (error) {
266+
}
267+
}
268+
258269
export const pathSequence = (root: Root, uri: Uri | undefined): FileStat[] => {
259270
if (uri)
260271
try {

client/src/commands/commands.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ import { AdtObjectActivator } from "../adt/operations/AdtObjectActivator"
2929
import {
3030
AdtObjectFinder,
3131
createUri,
32-
findAbapObject
32+
findAbapObject,
33+
uriAbapFile
3334
} from "../adt/operations/AdtObjectFinder"
3435
import { isAbapClassInclude } from "abapobject"
3536
import { IncludeProvider } from "../adt/includes" // resolve dependencies
@@ -39,12 +40,16 @@ import { types } from "util"
3940
import { atcProvider } from "../views/abaptestcockpit"
4041
import { context } from "../extension"
4142

42-
function currentUri() {
43+
export function currentUri() {
4344
if (!window.activeTextEditor) return
4445
const uri = window.activeTextEditor.document.uri
4546
if (uri.scheme !== ADTSCHEME) return
4647
return uri
4748
}
49+
export function currentAbapFile() {
50+
const uri = currentUri()
51+
return uriAbapFile(uri)
52+
}
4853

4954
export function currentEditState() {
5055
const uri = currentUri()
@@ -82,8 +87,8 @@ export class AdtCommands {
8287
}
8388

8489
@command(AbapFsCommands.selectDB)
85-
private static async selectDB() {
86-
return showQuery()
90+
private static async selectDB(table?: string) {
91+
return showQuery(table)
8792
}
8893

8994
@command(AbapFsCommands.changeInclude)
@@ -285,6 +290,16 @@ export class AdtCommands {
285290
FavouritesProvider.get().deleteFavourite(node)
286291
}
287292

293+
@command(AbapFsCommands.tableContents)
294+
private static showTableContents() {
295+
const file = currentAbapFile()
296+
if (!file) {
297+
window.showInformationMessage("Unable to determine the table to display")
298+
return
299+
}
300+
commands.executeCommand(AbapFsCommands.selectDB, file.object.name)
301+
}
302+
288303
@command(AbapFsCommands.unittest)
289304
private static async runAbapUnit() {
290305
try {

client/src/commands/registry.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export const AbapFsCommands = {
1818
createConnection: "abapfs.createConnection",
1919
showDump: "abapfs.showDump",
2020
refreshDumps: "abapfs.refreshDumps",
21+
tableContents: "abapfs.tableContents",
2122
// atc
2223
atcChecks: "abapfs.atcChecks",
2324
atcIgnore: "abapfs.atcIgnore",

client/src/lib/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ export * from "./externalmodules"
33
export * from "./logger"
44
export * from "./vscodefunctions"
55
export * from "./mongoClient"
6-
export * from "./rfsTaskEither"
6+
export * from "./rfsTaskEither"
7+
export const viewableObjecttypes: Set<string | undefined> = new Set(["TABL/DT", "VIEW/DV", "DDLS/DF"])

client/src/listeners.ts

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,14 @@ import {
1111
workspace
1212
} from "vscode"
1313

14-
import { caughtToString, debounce, log } from "./lib"
14+
import { caughtToString, debounce, log, viewableObjecttypes } from "./lib"
1515
import { ADTSCHEME, uriRoot, abapUri, getRoot } from "./adt/conections"
1616
import { AbapObject } from "abapobject"
1717
import { isAbapStat } from "abapfs"
1818
import { isCsrfError } from "abap-adt-api"
1919
import { LockStatus } from "abapfs/out/lockObject"
2020
import { IncludeProvider } from "./adt/includes"
21+
import { uriAbapFile } from "./adt/operations/AdtObjectFinder"
2122

2223
export const listenersubscribers: ((...x: any[]) => Disposable)[] = []
2324

@@ -147,24 +148,31 @@ function isInactive(obj: AbapObject): boolean {
147148
return inactive
148149
}
149150

151+
function showHidedbIcon(editor?: TextEditor) {
152+
try {
153+
const type = uriAbapFile(editor?.document.uri)?.object.type
154+
commands.executeCommand("setContext", "abapfs:showTableContentIcon", viewableObjecttypes.has(type))
155+
} catch (error) { }
156+
}
157+
150158
export async function showHideActivate(editor?: TextEditor, refresh = false) {
151159
let shouldShow = false
152160
const uri = editor?.document.uri
153-
if (editor && uri && uri.scheme === ADTSCHEME)
154-
try {
155-
const root = uriRoot(uri)
156-
const lockStatus = await root.lockManager.finalStatus(uri.path)
157-
shouldShow = editor.document.isDirty && lockStatus.status === "locked"
158-
if (!shouldShow) {
159-
const file = root.getNode(uri.path)
160-
const obj = isAbapStat(file) && file.object
161-
if (!obj) return
162-
if (refresh) await obj.loadStructure()
163-
shouldShow = obj && isInactive(obj)
164-
}
165-
} catch (e) {
166-
shouldShow = false
161+
if (!(uri && abapUri(uri))) return
162+
try {
163+
const root = uriRoot(uri)
164+
const lockStatus = await root.lockManager.finalStatus(uri.path)
165+
shouldShow = editor.document.isDirty && lockStatus.status === "locked"
166+
if (!shouldShow) {
167+
const file = root.getNode(uri.path)
168+
const obj = isAbapStat(file) && file.object
169+
if (!obj) return
170+
if (refresh) await obj.loadStructure()
171+
shouldShow = obj && isInactive(obj)
167172
}
173+
} catch (e) {
174+
shouldShow = false
175+
}
168176
// race condition, active editor might have changed while async operation was pending
169177
if (editor !== window.activeTextEditor) return
170178
await commands.executeCommand("setContext", "abapfs:showActivate", shouldShow)
@@ -181,6 +189,7 @@ export async function activationStateListener(uri: Uri) {
181189
export async function activeTextEditorChangedListener(
182190
editor: TextEditor | undefined
183191
) {
192+
showHidedbIcon(editor)
184193
try {
185194
if (editor && editor.document.uri.scheme === ADTSCHEME) {
186195
await showHideActivate(editor)

client/src/views/query/query.ts

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,20 @@
11
import { window } from "vscode"
2-
import { ADTSCHEME, getClient } from "../../adt/conections"
2+
import { ADTSCHEME, abapUri, getClient } from "../../adt/conections"
33
import { findAbapObject } from "../../adt/operations/AdtObjectFinder"
44
import { context } from "../../extension"
55
import { QueryPanel } from "./queryPanel"
6+
import { viewableObjecttypes } from "../../lib"
7+
import { currentAbapFile, currentUri } from "../../commands/commands"
68

7-
export async function showQuery() {
8-
const editor = window.activeTextEditor
9-
if (!editor) return
10-
const uri = editor.document.uri
11-
const sel = editor.selection.active
12-
if (uri.scheme !== ADTSCHEME) return
9+
export async function showQuery(table?: string) {
10+
const uri = currentUri()
11+
if (!(uri && abapUri(uri))) return
1312
const client = getClient(uri.authority)
14-
const obj = await findAbapObject(uri)
15-
16-
let tablename = ""
17-
18-
if (obj.type === 'DDLS/DF' || obj.type === 'TABL/DT') {
19-
tablename = obj.name;
13+
if (table) QueryPanel.createOrShow(context.extensionUri, client, table)
14+
else {
15+
const obj = await findAbapObject(uri)
16+
const tablename = viewableObjecttypes.has(obj.type) ? obj.name : ""
17+
QueryPanel.createOrShow(context.extensionUri, client, tablename)
2018
}
2119

22-
QueryPanel.createOrShow(context.extensionUri, client, tablename);
23-
2420
}

0 commit comments

Comments
 (0)