77import { updateOptionsArr , updateOptionsMap } from "./utils/selectUtils" ;
88import { objectDeepCopy } from "./utils/deepCopy" ;
99import { config , sendAuthenticatedMessage } from "./crypto" ;
10+ import { ObjectMap } from "../extension/service" ;
1011
1112const editorDefaultText = "<---- Select a service instance to start editing it in here" ;
1213const editorCreateText = "<---- Create a new service instance on the left and then you can edit it in here" ;
@@ -23,10 +24,12 @@ document.addEventListener("DOMContentLoaded", () => {
2324// Inputs
2425const selectInstance = document . getElementById ( "selectInstance" ) as HTMLSelectElement ;
2526const selectService = document . getElementById ( "selectService" ) as HTMLSelectElement ;
27+ const selectPreset = document . getElementById ( "selectPreset" ) as HTMLSelectElement ;
2628const inputInstanceName = document . getElementById ( "inputInstanceName" ) as HTMLInputElement ;
2729
2830// Website areas
2931const instanceServiceSelector = document . getElementById ( "instanceServiceSelector" ) ;
32+ const instancePreset = document . getElementById ( "instancePreset" ) ;
3033const instanceNameField = document . getElementById ( "instanceNameField" ) ;
3134const instanceEditButtons = document . getElementById ( "instanceEditButtons" ) ;
3235const instanceCreateButton = document . getElementById ( "instanceCreateButton" ) ;
@@ -62,33 +65,59 @@ export function onInstanceSelectChange(value: string): void {
6265 showNotice ( undefined ) ;
6366 switch ( value ) {
6467 case "new" :
65- showInMonaco ( "text" , true , editorCreateText ) ;
66- setCreateInputs ( true , false , true ) ;
68+ showInMonaco ( true , editorCreateText ) ;
69+ setCreateInputs ( true , false , true , false ) ;
6770 inputInstanceName . value = "" ;
6871 break ;
6972 case "select" :
70- showInMonaco ( "text" , true , editorDefaultText ) ;
71- setCreateInputs ( false , false , true ) ;
73+ showInMonaco ( true , editorDefaultText ) ;
74+ setCreateInputs ( false , false , true , false ) ;
7275 break ;
7376 default :
7477 showConfig ( value ) ;
7578 }
7679}
7780
78- function showConfig ( value : string ) {
79- const inst = config . data ?. instances [ value ] ;
81+ function showConfig ( instName : string ) {
82+ const inst = config . data ?. instances [ instName ] ;
8083 const service = config . data ?. services . find ( ( svc ) => svc . serviceType === inst ?. serviceType ) ;
8184
8285 if ( ! service ) {
83- showInMonaco ( "text" , true , editorInvalidServiceText ) ;
86+ showInMonaco ( true , editorInvalidServiceText ) ;
8487 } else if ( service . requiresNoConfig ) {
85- showInMonaco ( "text" , true , editorNotConfigurableText ) ;
88+ showInMonaco ( true , editorNotConfigurableText ) ;
8689 } else {
87- const jsonString = JSON . stringify ( inst ?. config || { } , null , 4 ) ;
88- showInMonaco ( "json" , false , jsonString , service ?. schema ) ;
90+ showInMonaco ( false , inst ?. config ?? { } , service ?. schema ) ;
8991 }
9092
91- setCreateInputs ( false , true , ! ( service ?. requiresNoConfig ?? false ) ) ;
93+ setCreateInputs ( false , true , ! ( service ?. requiresNoConfig ?? false ) , service ?. presets !== undefined ) ;
94+
95+ if ( service ?. presets ) {
96+ renderPresets ( service . presets ) ;
97+ }
98+ }
99+
100+ // Preset drop-down
101+ export function selectInstanceConfigPreset ( ) : void {
102+ const selectedPresetName = selectPreset . options [ selectPreset . selectedIndex ] ?. value ;
103+ if ( ! selectedPresetName ) {
104+ return ;
105+ }
106+
107+ const instName = selectInstance . options [ selectInstance . selectedIndex ] ?. value ;
108+ if ( ! instName ) {
109+ return ;
110+ }
111+
112+ const instance = config . data ?. instances [ instName ] ;
113+ if ( ! instance ) {
114+ return ;
115+ }
116+
117+ const service = config . data ?. services . find ( ( svc ) => svc . serviceType === instance . serviceType ) ;
118+ const presetValue = service ?. presets ?. [ selectedPresetName ] ?? { } ;
119+
120+ showInMonaco ( false , presetValue , service ?. schema ) ;
92121}
93122
94123// Save button
@@ -191,6 +220,17 @@ function renderInstances() {
191220 selectServiceInstance ( previousSelected ) ;
192221}
193222
223+ function renderPresets ( presets : ObjectMap < unknown > ) {
224+ updateOptionsMap ( selectPreset , presets ) ;
225+
226+ // Add "Select..." element that hints the user that he can use this select box
227+ // to choose a preset
228+ const selectHintOption = document . createElement ( "option" ) ;
229+ selectHintOption . innerText = "Select..." ;
230+ selectPreset . prepend ( selectHintOption ) ;
231+ selectPreset . selectedIndex = 0 ; // Select newly added hint
232+ }
233+
194234// Util functions
195235
196236function selectServiceInstance ( instanceName : string ) {
@@ -208,7 +248,12 @@ function selectServiceInstance(instanceName: string) {
208248}
209249
210250// Hides/unhides parts of the website based on the passed parameters
211- function setCreateInputs ( createMode : boolean , instanceSelected : boolean , showSave : boolean ) {
251+ function setCreateInputs (
252+ createMode : boolean ,
253+ instanceSelected : boolean ,
254+ showSave : boolean ,
255+ serviceHasPresets : boolean ,
256+ ) {
212257 function setVisible ( node : HTMLElement | null , visible : boolean ) {
213258 if ( visible && node ?. classList . contains ( "hidden" ) ) {
214259 node ?. classList . remove ( "hidden" ) ;
@@ -218,6 +263,7 @@ function setCreateInputs(createMode: boolean, instanceSelected: boolean, showSav
218263 }
219264
220265 setVisible ( instanceEditButtons , ! createMode && instanceSelected ) ;
266+ setVisible ( instancePreset , ! createMode && instanceSelected && serviceHasPresets ) ;
221267 setVisible ( instanceCreateButton , createMode ) ;
222268 setVisible ( instanceNameField , createMode ) ;
223269 setVisible ( instanceServiceSelector , createMode ) ;
@@ -231,12 +277,14 @@ export function showNotice(msg: string | undefined): void {
231277}
232278
233279function showInMonaco (
234- type : "text" | "json" ,
235280 readOnly : boolean ,
236- content : string ,
281+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
282+ content : any ,
237283 schema ?: Record < string , unknown > ,
238284) : void {
239285 editor ?. updateOptions ( { readOnly } ) ;
286+ const type = typeof content === "object" ? "json" : "text" ;
287+ const contentStr = typeof content === "object" ? JSON . stringify ( content , null , 4 ) : content ;
240288
241289 // JSON Schema stuff
242290 // Get rid of old models, as they have to be unique and we may add the same again
@@ -263,5 +311,5 @@ function showInMonaco(
263311 } ,
264312 ) ;
265313
266- editor ?. setModel ( monaco . editor . createModel ( content , type , schema ? modelUri : undefined ) ) ;
314+ editor ?. setModel ( monaco . editor . createModel ( contentStr , type , schema ? modelUri : undefined ) ) ;
267315}
0 commit comments