1
- import { Event , EventEmitter , ExtensionContext , MarkdownString , ThemeIcon , TreeDataProvider , TreeItem , TreeItemCollapsibleState , Uri , commands , window , workspace } from "vscode" ;
1
+ import { Event , EventEmitter , ExtensionContext , MarkdownString , TextDocument , ThemeIcon , TreeDataProvider , TreeItem , TreeItemCollapsibleState , Uri , commands , window , workspace } from "vscode" ;
2
2
import { Examples , SQLExample , ServiceInfoLabel , getMergedExamples } from "." ;
3
3
import { notebookFromStatements } from "../../notebooks/logic/openAsNotebook" ;
4
4
import { osDetail } from "../../config" ;
5
5
import Configuration from "../../configuration" ;
6
+ import * as path from 'path' ;
6
7
7
8
export const openExampleCommand = `vscode-db2i.examples.open` ;
8
9
@@ -49,6 +50,61 @@ export class ExampleBrowser implements TreeDataProvider<any> {
49
50
this . refresh ( ) ;
50
51
} ) ,
51
52
53
+ commands . registerCommand ( "vscode-db2i.examples.save" , async ( ) => {
54
+ const editor = window . activeTextEditor ;
55
+ if ( editor ) {
56
+ const document = editor . document ;
57
+ if ( document . languageId === `sql` ) {
58
+ const existingDirectories = Configuration . get < string [ ] > ( `examples.customExampleDirectories` ) || [ ] ;
59
+ if ( existingDirectories . length === 0 ) {
60
+ window . showErrorMessage ( `You must first add a custom examples directory before saving new examples.` , { modal : true } , `Add Custom Examples Directory` ) . then ( async selection => {
61
+ if ( selection === `Add Custom Examples Directory` ) {
62
+ const isAdded = await commands . executeCommand ( `vscode-db2i.examples.add` ) ;
63
+ if ( isAdded ) {
64
+ await commands . executeCommand ( `vscode-db2i.examples.save` ) ;
65
+ }
66
+
67
+ return ;
68
+ } ;
69
+ } ) ;
70
+ } else {
71
+ const quickPickItems = existingDirectories . map ( dir => ( { label : dir } ) ) ;
72
+ const selectedDirectory = await window . showQuickPick ( quickPickItems , {
73
+ title : `Select a custom example directories to save this example to`
74
+ } ) ;
75
+ if ( selectedDirectory ) {
76
+ const suggestedFileName = path . basename ( document . fileName ) ;
77
+ let exampleFileName = await window . showInputBox ( {
78
+ title : `Example file name` ,
79
+ prompt : `Enter example file name` ,
80
+ value : suggestedFileName ,
81
+ } ) ;
82
+
83
+ if ( exampleFileName ) {
84
+ if ( ! exampleFileName . includes ( `.` ) ) {
85
+ exampleFileName = `${ exampleFileName } .sql` ;
86
+ }
87
+
88
+ try {
89
+ const filePath = Uri . joinPath ( Uri . file ( selectedDirectory . label ) , exampleFileName ) ;
90
+ const fileContent = Buffer . from ( document . getText ( ) , 'utf8' )
91
+ await workspace . fs . writeFile ( filePath , fileContent ) ;
92
+ window . showInformationMessage ( `Example saved to ${ filePath . fsPath } ` ) ;
93
+ this . refresh ( ) ;
94
+ } catch ( error ) {
95
+ window . showErrorMessage ( `Failed to save example: ${ error } ` ) ;
96
+ }
97
+ }
98
+ }
99
+ }
100
+ } else {
101
+ window . showErrorMessage ( `The active document is not a SQL file.` ) ;
102
+ }
103
+ } else {
104
+ window . showErrorMessage ( `No SQL file open.` ) ;
105
+ }
106
+ } ) ,
107
+
52
108
commands . registerCommand ( "vscode-db2i.examples.add" , async ( ) => {
53
109
const dirsToAdd = await window . showOpenDialog ( {
54
110
title : "Add Custom Example Directory" ,
@@ -62,6 +118,9 @@ export class ExampleBrowser implements TreeDataProvider<any> {
62
118
const newDirectoryPaths = dirsToAdd . map ( dir => dir . fsPath ) ;
63
119
const updatedDirectories = Array . from ( new Set ( [ ...existingDirectories , ...newDirectoryPaths ] ) ) ;
64
120
await Configuration . set ( `examples.customExampleDirectories` , updatedDirectories ) ;
121
+ return true ;
122
+ } else {
123
+ return false ;
65
124
}
66
125
} ) ,
67
126
@@ -74,7 +133,7 @@ export class ExampleBrowser implements TreeDataProvider<any> {
74
133
75
134
const quickPickItems = existingDirectories . map ( dir => ( { label : dir } ) ) ;
76
135
const selectedDirectories = await window . showQuickPick ( quickPickItems , {
77
- title : `Select custom example directories to remove` ,
136
+ title : `Select a custom example directories to remove` ,
78
137
canPickMany : true
79
138
} ) ;
80
139
@@ -96,7 +155,7 @@ export class ExampleBrowser implements TreeDataProvider<any> {
96
155
if ( e . affectsConfiguration ( 'vscode-db2i.examples.customExampleDirectories' ) ) {
97
156
this . refresh ( ) ;
98
157
}
99
- } ) ,
158
+ } )
100
159
) ;
101
160
}
102
161
0 commit comments