@@ -35,7 +35,11 @@ export default class KustomizeOverlay extends React.Component {
35
35
savingFinalize : false ,
36
36
displayConfirmModal : false ,
37
37
overlayToDelete : "" ,
38
+ addingNewResource : false ,
39
+ newResourceName : ""
38
40
} ;
41
+ this . addResourceWrapper = React . createRef ( ) ;
42
+ this . addResourceInput = React . createRef ( ) ;
39
43
}
40
44
41
45
toggleModal = ( overlayPath ) => {
@@ -108,6 +112,7 @@ export default class KustomizeOverlay extends React.Component {
108
112
}
109
113
110
114
setSelectedFile = async ( path ) => {
115
+ console . log ( path ) ;
111
116
this . setState ( { selectedFile : path } ) ;
112
117
await this . props . getFileContent ( path ) . then ( ( ) => {
113
118
// set state with new file content
@@ -173,11 +178,31 @@ export default class KustomizeOverlay extends React.Component {
173
178
await this . props . saveKustomizeOverlay ( payload ) . catch ( ) ;
174
179
await this . props . getCurrentStep ( ) ;
175
180
if ( finalize ) {
176
- this . setState ( { savingFinalize : true } ) ;
181
+ this . setState ( { savingFinalize : true , addingNewResource : false } ) ;
177
182
this . handleFinalize ( ) ;
178
183
}
179
184
}
180
185
186
+ handleCreateResource = async ( ) => {
187
+ const { newResourceName } = this . state ;
188
+ const contents = "---"
189
+ this . setState ( { patch : contents } ) ;
190
+
191
+ const payload = {
192
+ path : `/${ newResourceName } ` ,
193
+ contents,
194
+ isResource : true
195
+ } ;
196
+
197
+ await this . props . saveKustomizeOverlay ( payload )
198
+ . then ( ( ) => {
199
+ this . setSelectedFile ( `/${ newResourceName } ` ) ;
200
+ this . setState ( { addingNewResource : false , newResourceName : "" } )
201
+ } )
202
+ . catch ( ) ;
203
+ await this . props . getCurrentStep ( ) ;
204
+ }
205
+
181
206
handleGeneratePatch = async ( path ) => {
182
207
const current = this . aceEditorOverlay . editor . getValue ( ) ;
183
208
const { selectedFile, fileTreeBasePath } = this . state ;
@@ -223,6 +248,27 @@ export default class KustomizeOverlay extends React.Component {
223
248
}
224
249
} , 500 ) ;
225
250
251
+ handleAddResourceClick = async ( ) => {
252
+ // Ref input won't focus until state has been set
253
+ await this . setState ( { addingNewResource : true } ) ;
254
+ this . addResourceInput . current . focus ( ) ;
255
+ window . addEventListener ( "click" , this . handleClickOutsideResourceInput ) ;
256
+ }
257
+
258
+ handleClickOutsideResourceInput = ( e ) => {
259
+ const { addingNewResource } = this . state ;
260
+ if ( addingNewResource && ! this . addResourceWrapper . current . contains ( e . target ) ) {
261
+ this . setState ( { addingNewResource : false , newResourceName : "" } ) ;
262
+ window . removeEventListener ( "click" , this . handleClickOutsideResourceInput ) ;
263
+ }
264
+ }
265
+
266
+ handleCreateNewResource = ( e ) => {
267
+ if ( e . charCode === 13 ) {
268
+ this . handleCreateResource ( )
269
+ }
270
+ }
271
+
226
272
render ( ) {
227
273
const { dataLoading } = this . props ;
228
274
const {
@@ -233,6 +279,8 @@ export default class KustomizeOverlay extends React.Component {
233
279
patch,
234
280
savingFinalize,
235
281
fileContents,
282
+ addingNewResource,
283
+ newResourceName
236
284
} = this . state ;
237
285
const fileToView = defaultTo ( find ( fileContents , [ "key" , selectedFile ] ) , { } ) ;
238
286
const showOverlay = patch . length ;
@@ -260,6 +308,23 @@ export default class KustomizeOverlay extends React.Component {
260
308
/>
261
309
</ div >
262
310
) ) }
311
+ < div className = "add-new-resource u-position--relative" ref = { this . addResourceWrapper } >
312
+ < input
313
+ type = "text"
314
+ className = { `Input u-position--absolute ${ ! addingNewResource ? "u-visibility--hidden" : "" } ` }
315
+ name = "new-resource"
316
+ placeholder = "filename.yaml"
317
+ onChange = { ( e ) => { this . setState ( { newResourceName : e . target . value } ) } }
318
+ onKeyPress = { ( e ) => { this . handleCreateNewResource ( e ) } }
319
+ value = { newResourceName }
320
+ ref = { this . addResourceInput }
321
+ />
322
+ < p
323
+ className = { `add-resource-link u-position--absolute u-marginTop--small u-marginLeft--normal u-cursor--pointer u-fontSize--small u-color--silverSand u-fontWeight--bold ${ addingNewResource ? "u-visibility--hidden" : "" } ` }
324
+ onClick = { this . handleAddResourceClick }
325
+ > + Add Resource
326
+ </ p >
327
+ </ div >
263
328
</ div >
264
329
</ div >
265
330
</ div >
@@ -309,7 +374,7 @@ export default class KustomizeOverlay extends React.Component {
309
374
310
375
< div className = { `flex-column flex1 overlays-editor-wrapper ${ showOverlay ? "visible" : "" } ` } >
311
376
< div className = "u-paddingLeft--20 u-paddingRight--20 u-paddingTop--20" >
312
- < p className = "u-marginBottom--normal u-fontSize--large u-color--tuna u-fontWeight--bold" > Patch</ p >
377
+ < p className = "u-marginBottom--normal u-fontSize--large u-color--tuna u-fontWeight--bold" > { showBase ? " Patch" : "Resource" } </ p >
313
378
< p className = "u-fontSize--small u-lineHeight--more u-fontWeight--medium u-color--doveGray" > This YAML will be applied as a patch to the base YAML. Edit the values that you want patched. The current file you're editing will be automatically saved when you open a new file.</ p >
314
379
</ div >
315
380
< div className = "flex1 flex-column file-contents-wrapper u-position--relative" >
0 commit comments