@@ -75,23 +75,62 @@ export function initRepoEditor() {
75
75
}
76
76
filenameInput . addEventListener ( 'input' , function ( ) {
77
77
const parts = filenameInput . value . split ( '/' ) ;
78
+ const links = Array . from ( document . querySelectorAll ( '.breadcrumb span.section' ) ) ;
79
+ const dividers = Array . from ( document . querySelectorAll ( '.breadcrumb .breadcrumb-divider' ) ) ;
80
+ let warningDiv = document . querySelector ( '.ui.warning.message.flash-message.flash-warning.space-related' ) ;
81
+ let containSpace = false ;
78
82
if ( parts . length > 1 ) {
79
83
for ( let i = 0 ; i < parts . length ; ++ i ) {
80
84
const value = parts [ i ] ;
85
+ const trimValue = value . trim ( ) ;
86
+ if ( trimValue === '..' ) {
87
+ // remove previous tree path
88
+ if ( links . length > 0 ) {
89
+ const link = links . pop ( ) ;
90
+ const divider = dividers . pop ( ) ;
91
+ link . remove ( ) ;
92
+ divider . remove ( ) ;
93
+ }
94
+ continue ;
95
+ }
81
96
if ( i < parts . length - 1 ) {
82
- if ( value . length ) {
83
- filenameInput . before ( createElementFromHTML (
97
+ if ( trimValue . length ) {
98
+ const linkElement = createElementFromHTML (
84
99
`<span class="section"><a href="#">${ htmlEscape ( value ) } </a></span>` ,
85
- ) ) ;
86
- filenameInput . before ( createElementFromHTML (
100
+ ) ;
101
+ const dividerElement = createElementFromHTML (
87
102
`<div class="breadcrumb-divider">/</div>` ,
88
- ) ) ;
103
+ ) ;
104
+ links . push ( linkElement ) ;
105
+ dividers . push ( dividerElement ) ;
106
+ filenameInput . before ( linkElement ) ;
107
+ filenameInput . before ( dividerElement ) ;
89
108
}
90
109
} else {
91
110
filenameInput . value = value ;
92
111
}
93
112
this . setSelectionRange ( 0 , 0 ) ;
113
+ containSpace |= ( trimValue !== value && trimValue !== '' ) ;
114
+ }
115
+ }
116
+ containSpace |= Array . from ( links ) . some ( ( link ) => {
117
+ const value = link . querySelector ( 'a' ) . textContent ;
118
+ return value . trim ( ) !== value ;
119
+ } ) ;
120
+ containSpace |= parts [ parts . length - 1 ] . trim ( ) !== parts [ parts . length - 1 ] ;
121
+ if ( containSpace ) {
122
+ if ( ! warningDiv ) {
123
+ warningDiv = document . createElement ( 'div' ) ;
124
+ warningDiv . classList . add ( 'ui' , 'warning' , 'message' , 'flash-message' , 'flash-warning' , 'space-related' ) ;
125
+ warningDiv . innerHTML = '<p>File path contains leading or trailing whitespace.</p>' ;
126
+ // Add display 'block' because display is set to 'none' in formantic\build\semantic.css
127
+ warningDiv . style . display = 'block' ;
128
+ const inputContainer = document . querySelector ( '.repo-editor-header' ) ;
129
+ inputContainer . insertAdjacentElement ( 'beforebegin' , warningDiv ) ;
94
130
}
131
+ showElem ( warningDiv ) ;
132
+ } else if ( warningDiv ) {
133
+ hideElem ( warningDiv ) ;
95
134
}
96
135
joinTreePath ( ) ;
97
136
} ) ;
0 commit comments