@@ -76,17 +76,36 @@ export class FileSystemProvider implements vscode.FileSystemProvider {
76
76
const flat = query . flat && query . flat . length ? query . flat . toString ( ) : "0" ;
77
77
const notStudio = "0" ;
78
78
const generated = query . generated && query . generated . length ? query . generated . toString ( ) : "0" ;
79
+ // get all web apps that have a filepath (Studio dialog used below returns REST ones too)
80
+ const cspApps = csp ? await api . getCSPApps ( ) . then ( ( data ) => data . result . content || [ ] ) : [ ] ;
81
+ const cspSubfolderMap = new Map < string , vscode . FileType > ( ) ;
82
+ const prefix = folder === "" ? "/" : folder ;
83
+ for ( const app of cspApps ) {
84
+ if ( ( app + "/" ) . startsWith ( prefix ) ) {
85
+ const subfolder = app . slice ( prefix . length ) . split ( "/" ) [ 0 ] ;
86
+ if ( subfolder ) {
87
+ cspSubfolderMap . set ( subfolder , vscode . FileType . Directory ) ;
88
+ }
89
+ }
90
+ }
91
+ const cspSubfolders = Array . from ( cspSubfolderMap . entries ( ) ) ;
92
+ // Assemble the results
79
93
return api
80
94
. actionQuery ( sql , [ spec , dir , orderBy , system , flat , notStudio , generated ] )
81
95
. then ( ( data ) => data . result . content || [ ] )
82
96
. then ( ( data ) => {
83
97
const results = data
84
98
. filter ( ( item : StudioOpenDialog ) =>
85
- item . Type === "10" ? csp && item . Name !== "/" : item . Type === "9" ? ! csp : csp ? item . Type === "5" : true
99
+ item . Type === "10"
100
+ ? csp && ! item . Name . includes ( "/" ) // ignore web apps here because there may be REST ones
101
+ : item . Type === "9" // class package
102
+ ? ! csp
103
+ : csp
104
+ ? item . Type === "5" // web app file
105
+ : true
86
106
)
87
107
. map ( ( item : StudioOpenDialog ) => {
88
- // Handle how query returns web apps
89
- const name = item . Name . split ( "/" ) [ 0 ] ;
108
+ const name = item . Name ;
90
109
const fullName = folder === "" ? name : csp ? folder + name : folder + "/" + name ;
91
110
if ( item . Type === "10" || item . Type === "9" ) {
92
111
parent . entries . set ( name , new Directory ( name , fullName ) ) ;
@@ -98,43 +117,7 @@ export class FileSystemProvider implements vscode.FileSystemProvider {
98
117
if ( ! csp ) {
99
118
return results ;
100
119
}
101
- if ( folder !== "" ) {
102
- // For CSP-type access at least one folder down, a further root-level request is done to check for next level in CSP app names
103
- // e.g. folder root is isfs://server/?ns=USER&csp
104
- // and USER namespace is the home of /csp/app1 and /csp/app2
105
- // Initial expand showed the csp folder.
106
- // Expand of that came here and asked Studio dialog query for /csp/*
107
- // but this doesn't return app1 and app2 folders.
108
- // Filter out as much as possible on the server side.
109
- return api
110
- . actionQuery ( sql , [
111
- "*,'*.inc,'*.mac,'*.dtl,'*.cls,'*.bpl,'*.int,'*.prj" ,
112
- dir ,
113
- orderBy ,
114
- "0" ,
115
- "0" ,
116
- notStudio ,
117
- "0" ,
118
- ] )
119
- . then ( ( data ) => data . result . content || [ ] )
120
- . then ( ( data ) => {
121
- const piece = folder . split ( "/" ) . length - 1 ;
122
- const cspSubdirs : [ string , vscode . FileType ] [ ] = data
123
- . filter (
124
- ( item ) =>
125
- item . Type === "10" && item . Name . startsWith ( folder . slice ( 1 ) ) && item . Name . length >= folder . length
126
- )
127
- . map ( ( item ) => {
128
- const name = item . Name . split ( "/" ) [ piece - 1 ] ;
129
- parent . entries . set ( name , new Directory ( name , folder + name ) ) ;
130
- return [ name , vscode . FileType . Directory ] ;
131
- } ) ;
132
- return results . concat ( cspSubdirs ) ;
133
- } ) ;
134
- } else {
135
- // Nothing else to add.
136
- return results ;
137
- }
120
+ return results . concat ( cspSubfolders ) ;
138
121
} )
139
122
. catch ( ( error ) => {
140
123
error && console . error ( error ) ;
0 commit comments