@@ -91,24 +91,27 @@ export function initRepoEditor() {
91
91
$ ( '#commit-button' ) . text ( $ ( this ) . attr ( 'button_text' ) ) ;
92
92
} ) ;
93
93
94
+ const joinTreePath = ( $fileNameEl ) => {
95
+ const parts = [ ] ;
96
+ $ ( '.breadcrumb span.section' ) . each ( function ( ) {
97
+ const element = $ ( this ) ;
98
+ if ( element . find ( 'a' ) . length ) {
99
+ parts . push ( element . find ( 'a' ) . text ( ) ) ;
100
+ } else {
101
+ parts . push ( element . text ( ) ) ;
102
+ }
103
+ } ) ;
104
+ if ( $fileNameEl . val ( ) ) parts . push ( $fileNameEl . val ( ) ) ;
105
+ $ ( '#tree_path' ) . val ( parts . join ( '/' ) ) ;
106
+ } ;
107
+
94
108
const $editFilename = $ ( '#file-name' ) ;
95
- $editFilename . on ( 'keyup' , function ( e ) {
96
- const $section = $ ( '.breadcrumb span.section' ) ;
97
- const $divider = $ ( '.breadcrumb div.divider' ) ;
98
- let value ;
99
- let parts ;
109
+ $editFilename . on ( 'input' , function ( ) {
110
+ const parts = $ ( this ) . val ( ) . split ( '/' ) ;
100
111
101
- if ( e . keyCode === 8 && getCursorPosition ( $ ( this ) ) === 0 && $section . length > 0 ) {
102
- value = $section . last ( ) . find ( 'a' ) . text ( ) ;
103
- $ ( this ) . val ( value + $ ( this ) . val ( ) ) ;
104
- $ ( this ) [ 0 ] . setSelectionRange ( value . length , value . length ) ;
105
- $section . last ( ) . remove ( ) ;
106
- $divider . last ( ) . remove ( ) ;
107
- }
108
- if ( e . keyCode === 191 ) {
109
- parts = $ ( this ) . val ( ) . split ( '/' ) ;
112
+ if ( parts . length > 1 ) {
110
113
for ( let i = 0 ; i < parts . length ; ++ i ) {
111
- value = parts [ i ] ;
114
+ const value = parts [ i ] ;
112
115
if ( i < parts . length - 1 ) {
113
116
if ( value . length ) {
114
117
$ ( `<span class="section"><a href="#">${ htmlEscape ( value ) } </a></span>` ) . insertBefore ( $ ( this ) ) ;
@@ -117,21 +120,28 @@ export function initRepoEditor() {
117
120
} else {
118
121
$ ( this ) . val ( value ) ;
119
122
}
120
- $ ( this ) [ 0 ] . setSelectionRange ( 0 , 0 ) ;
123
+ this . setSelectionRange ( 0 , 0 ) ;
121
124
}
122
125
}
123
- parts = [ ] ;
124
- $ ( '.breadcrumb span.section' ) . each ( function ( ) {
125
- const element = $ ( this ) ;
126
- if ( element . find ( 'a' ) . length ) {
127
- parts . push ( element . find ( 'a' ) . text ( ) ) ;
128
- } else {
129
- parts . push ( element . text ( ) ) ;
130
- }
131
- } ) ;
132
- if ( $ ( this ) . val ( ) ) parts . push ( $ ( this ) . val ( ) ) ;
133
- $ ( '#tree_path' ) . val ( parts . join ( '/' ) ) ;
134
- } ) . trigger ( 'keyup' ) ;
126
+
127
+ joinTreePath ( $ ( this ) ) ;
128
+ } ) ;
129
+
130
+ $editFilename . on ( 'keydown' , function ( e ) {
131
+ const $section = $ ( '.breadcrumb span.section' ) ;
132
+
133
+ // Jump back to last directory once the filename is empty
134
+ if ( e . code === 'Backspace' && getCursorPosition ( $ ( this ) ) === 0 && $section . length > 0 ) {
135
+ e . preventDefault ( ) ;
136
+ const $divider = $ ( '.breadcrumb div.divider' ) ;
137
+ const value = $section . last ( ) . find ( 'a' ) . text ( ) ;
138
+ $ ( this ) . val ( value + $ ( this ) . val ( ) ) ;
139
+ this . setSelectionRange ( value . length , value . length ) ;
140
+ $section . last ( ) . remove ( ) ;
141
+ $divider . last ( ) . remove ( ) ;
142
+ joinTreePath ( $ ( this ) ) ;
143
+ }
144
+ } ) ;
135
145
136
146
const $editArea = $ ( '.repository.editor textarea#edit_area' ) ;
137
147
if ( ! $editArea . length ) return ;
0 commit comments