Skip to content

Commit aad0c32

Browse files
authoredJun 15, 2021
fix(ui5-upload-collection-item): fixed keyboard navigation (#3327)
1 parent ffa2c4c commit aad0c32

File tree

3 files changed

+105
-83
lines changed

3 files changed

+105
-83
lines changed
 

‎packages/fiori/src/UploadCollectionItem.hbs

+15-7
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,9 @@
1212
<div class="ui5-uci-edit-container">
1313
<ui5-input
1414
id="ui5-uci-edit-input"
15-
value="{{_fileNameWithoutExtension}}"
1615
data-sap-focus-ref
17-
@keyup="{{_onInputKeyUp}}"
18-
@keydown="{{_onInputKeydown}}"
19-
@ui5-change="{{_onInputChange}}"
16+
@focusin="{{_onInputFocusin}}"
17+
@keydown="{{_onInputKeyDown}}"
2018
></ui5-input>
2119
<span class="ui5-uci-file-extension">{{_fileExtension}}</span>
2220
</div>
@@ -50,23 +48,33 @@
5048
</div>
5149
<div class="ui5-uci-edit-buttons">
5250
{{#if _editing}}
53-
<ui5-button design="Transparent" class="ui5-uci-edit-rename-btn" @click="{{_onRename}}">{{_renameBtnText}}</ui5-button>
54-
<ui5-button design="Transparent" id="ui5-uci-edit-cancel" @click="{{_onRenameCancel}}">{{_cancelRenameBtnText}}</ui5-button>
51+
<ui5-button
52+
design="Transparent"
53+
class="ui5-uci-edit-rename-btn"
54+
@click="{{_onRename}}"
55+
@keyup="{{_onRenameKeyup}}">{{_renameBtnText}}</ui5-button>
56+
<ui5-button
57+
design="Transparent"
58+
id="ui5-uci-edit-cancel"
59+
@click="{{_onRenameCancel}}"
60+
@keyup="{{_onRenameCancelKeyup}}">{{_cancelRenameBtnText}}</ui5-button>
5561
{{else}}
5662
{{#if _showRetry}}
5763
<ui5-button
5864
icon="refresh"
5965
design="Transparent"
6066
title="{{_retryButtonTooltip}}"
6167
@click="{{_onRetry}}"
68+
@keyup="{{_onRetryKeyup}}"
6269
></ui5-button>
6370
{{/if}}
6471
{{#if _showTerminate}}
6572
<ui5-button
6673
icon="stop"
6774
design="Transparent"
6875
title="{{_terminateButtonTooltip}}"
69-
@click="{{_onTerminate}}">
76+
@click="{{_onTerminate}}"
77+
@keyup="{{_onTerminateKeyup}}">
7078
</ui5-button>
7179
{{/if}}
7280

‎packages/fiori/src/UploadCollectionItem.js

+56-73
Original file line numberDiff line numberDiff line change
@@ -269,37 +269,32 @@ class UploadCollectionItem extends ListItem {
269269
constructor() {
270270
super();
271271
this.i18nFioriBundle = getI18nBundle("@ui5/webcomponents-fiori");
272-
273-
this._editPressed = false; // indicates if the edit btn has been pressed
274-
this.doNotCloseInput = false; // Indicates whether the input should be closed when using keybord for navigation
275-
this.isEnter = false;
276-
}
277-
278-
onAfterRendering() {
279-
if (this._editPressed) {
280-
this._editing = true;
281-
this._editPressed = false;
282-
this.focusAndSelectText();
283-
}
284272
}
285273

286-
async focusAndSelectText() {
287-
await this.focus();
274+
async _initInputField() {
275+
await renderFinished();
288276

289277
const inp = this.shadowRoot.getElementById("ui5-uci-edit-input");
278+
inp.value = this._fileNameWithoutExtension;
290279

291280
await renderFinished();
292-
if (inp.getFocusDomRef()) {
293-
inp.getFocusDomRef().setSelectionRange(0, this._fileNameWithoutExtension.length);
281+
282+
const inpFocusDomRef = inp.getFocusDomRef();
283+
284+
if (inpFocusDomRef) {
285+
inpFocusDomRef.focus();
286+
inpFocusDomRef.setSelectionRange(0, this._fileNameWithoutExtension.length);
294287
}
295288
}
296289

297290
/**
298291
* @override
299292
*/
300-
onDetailClick(event) {
293+
async onDetailClick(event) {
301294
super.onDetailClick(event);
302295
this._editing = true;
296+
297+
await this._initInputField();
303298
}
304299

305300
_onDetailKeyup(event) {
@@ -308,79 +303,51 @@ class UploadCollectionItem extends ListItem {
308303
}
309304
}
310305

311-
/**
312-
* @override
313-
*/
314-
_onfocusout(event) {
315-
super._onfocusout(event);
316-
317-
const path = event.path || (event.composedPath && event.composedPath());
318-
319-
this._editPressed = this.isDetailPressed(event);
320-
321-
if (!this._editPressed && path.indexOf(this) > -1) {
322-
this._editing = false;
323-
}
324-
}
325-
326-
_onInputKeydown(event) {
327-
this.isEnter = isEnter(event);
328-
this.isEscape = isEscape(event);
306+
_onInputFocusin(event) {
307+
// prevent focusing the whole upload collection item.
308+
event.stopPropagation();
329309
}
330310

331-
_onInputKeyUp(event) {
332-
this.doNotCloseInput = true;
333-
this.tempValue = event.target.value + this._fileExtension;
334-
335-
if (this.isEscape) {
336-
[this.fileName, this.tempValue] = [this.tempValue, this.fileName];
337-
return this._onRenameCancel();
311+
_onInputKeyDown(event) {
312+
if (isEscape(event)) {
313+
this._onRenameCancel(event);
314+
} else if (isEnter(event)) {
315+
this._onRename();
316+
} else if (isSpace(event)) {
317+
event.stopImmediatePropagation();
338318
}
339319
}
340320

341-
isDetailPressed(event) {
342-
const path = event.path || (event.composedPath && event.composedPath());
321+
_onRename(event) {
322+
const inp = this.shadowRoot.getElementById("ui5-uci-edit-input");
323+
this.fileName = inp.value + this._fileExtension;
324+
this.fireEvent("rename");
343325

344-
return path.some(e => {
345-
return e.classList && e.classList.contains("ui5-uci-edit");
346-
});
326+
this._editing = false;
327+
this._focus();
347328
}
348329

349-
_onInputChange(event) {
350-
if (this.shadowRoot.getElementById("ui5-uci-edit-cancel").active) {
351-
return;
352-
}
353-
354-
if ((!this.isEnter && this.doNotCloseInput) || this.isEscape) {
355-
[this.fileName, this.tempValue] = [this.tempValue, this.fileName];
356-
this.isEscape = false;
357-
return;
330+
_onRenameKeyup(event) {
331+
if (isSpace(event)) {
332+
this._onRename(event);
358333
}
334+
}
359335

336+
async _onRenameCancel(event) {
360337
this._editing = false;
361-
this.fileName = event.target.value + this._fileExtension;
362-
this.fireEvent("rename");
363338

364-
if (this.isEnter) {
339+
if (isEscape(event)) {
340+
await renderFinished();
341+
this.shadowRoot.getElementById(`${this._id}-editing-button`).focus();
342+
} else {
365343
this._focus();
366344
}
367345
}
368346

369-
_onRename(event) {
370-
this.doNotCloseInput = false;
371-
this._editing = false;
372-
this._focus();
373-
}
374-
375-
_onRenameCancel(event) {
376-
if (!this.isEscape) {
377-
[this.fileName, this.tempValue] = [this.tempValue, this.fileName];
347+
_onRenameCancelKeyup(event) {
348+
if (isSpace(event)) {
349+
this._onRenameCancel(event);
378350
}
379-
380-
this._editing = false;
381-
this.doNotCloseInput = false;
382-
383-
this._focus();
384351
}
385352

386353
_focus() {
@@ -395,10 +362,26 @@ class UploadCollectionItem extends ListItem {
395362
this.fireEvent("retry");
396363
}
397364

365+
_onRetryKeyup(event) {
366+
if (isSpace(event)) {
367+
this._onRetry(event);
368+
}
369+
}
370+
398371
_onTerminate(event) {
399372
this.fireEvent("terminate");
400373
}
401374

375+
_onTerminateKeyup(event) {
376+
if (isSpace(event)) {
377+
this._onTerminate(event);
378+
}
379+
}
380+
381+
getFocusDomRef() {
382+
return this.getDomRef();
383+
}
384+
402385
get list() {
403386
return this.assignedSlot.parentElement;
404387
}

‎packages/fiori/test/specs/UploadCollection.spec.js

+34-3
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@ describe("UploadCollection", () => {
2626
assert.ok(secondItem.shadow$(".ui5-uci-edit-buttons").isDisplayed(), "edit buttons should be rendered");
2727
assert.notOk(secondItem.shadow$(".ui5-li-detailbtn").isDisplayed(), "detail button should be hidden");
2828

29-
// focus out the second item, to hide edit buttons (reset state for the following tests)
30-
browser.$("#firstItem").click();
29+
// reset the item
30+
browser.execute(() => {
31+
document.getElementById("secondItem").removeAttribute("_editing");
32+
});
3133
});
3234

3335
it("should show NOT show any buttons besides 'Terminate', when uploadState is 'Uploading'", () => {
@@ -48,6 +50,11 @@ describe("UploadCollection", () => {
4850

4951
assert.notOk(errorStateItem.shadow$("ui5-button[icon=refresh]").isDisplayed(), "'Retry' button is NOT displayed when editing");
5052
assert.notOk(errorStateItem.shadow$(".ui5-li-detailbtn").isDisplayed(), "detail button is NOT displayed when editing");
53+
54+
// reset the item
55+
browser.execute(() => {
56+
document.getElementById("errorState").removeAttribute("_editing");
57+
});
5158
});
5259
});
5360

@@ -61,7 +68,12 @@ describe("UploadCollection", () => {
6168
browser.keys("fileNameSuffix");
6269
browser.keys("Enter");
6370

64-
assert.strictEqual(parseInt(browser.$("#renamedFileIndex").getText()), secondItemIndex, "renamed file index should be updated after rename")
71+
assert.strictEqual(parseInt(browser.$("#renamedFileIndex").getText()), secondItemIndex, "renamed file index should be updated after rename");
72+
73+
// reset the item
74+
browser.execute(() => {
75+
document.getElementById("secondItem").removeAttribute("_editing");
76+
});
6577
});
6678

6779
it("upload collection should fire 'item-delete'", () => {
@@ -105,6 +117,11 @@ describe("UploadCollection", () => {
105117
browser.keys("Enter");
106118

107119
assert.strictEqual(latestReportsPdf.getProperty("fileName"), "last.reports-edited.pdf", "file extension '.pdf' should be preserved");
120+
121+
// reset the item
122+
browser.execute(() => {
123+
document.getElementById("latestReportsPdf").removeAttribute("_editing");
124+
});
108125
});
109126

110127
it("should be able to add extension, if there isn't such", () => {
@@ -125,6 +142,11 @@ describe("UploadCollection", () => {
125142
browser.keys("Enter");
126143

127144
assert.strictEqual(noFileExtensionItem.getProperty("fileName"), newFileName2 + ".newExtension", "the string after the last dot is considered as extension");
145+
146+
// reset the item
147+
browser.execute(() => {
148+
document.getElementById("noFileExtension").removeAttribute("_editing");
149+
});
128150
});
129151

130152
it("should NOT consider hidden file name as extension", () => {
@@ -135,6 +157,10 @@ describe("UploadCollection", () => {
135157

136158
assert.notOk(secondItem.shadow$(".ui5-uci-file-extension").getText(), "no extension is calculated for .gitignore.");
137159

160+
// reset the item
161+
browser.execute(() => {
162+
document.getElementById("secondItem").removeAttribute("_editing");
163+
});
138164
});
139165

140166
it("tests cancelling of name change via keyboard", () => {
@@ -151,6 +177,11 @@ describe("UploadCollection", () => {
151177
browser.keys("Enter"); // Press cancel button
152178

153179
assert.strictEqual(secondItem.shadow$(".ui5-uci-file-name").getText(), "Graph.docx", "The name of the file is not changed");
180+
181+
// reset the item
182+
browser.execute(() => {
183+
document.getElementById("keyboardNavigation").removeAttribute("_editing");
184+
});
154185
});
155186
});
156187

0 commit comments

Comments
 (0)
Please sign in to comment.