Modal keyboard navigation changes

This commit is contained in:
mProjectsCode 2022-10-02 22:07:11 +02:00
parent 5aa9108509
commit 805d9d3fb8
6 changed files with 79 additions and 31 deletions

View file

@ -96,14 +96,19 @@ export class MediaDbAdvancedSearchModal extends Modal {
contentEl.createDiv({cls: 'media-db-plugin-spacer'}); contentEl.createDiv({cls: 'media-db-plugin-spacer'});
new Setting(contentEl) new Setting(contentEl)
.addButton(btn => btn.setButtonText('Cancel').onClick(() => this.close()))
.addButton(btn => { .addButton(btn => {
return (this.searchBtn = btn btn.setButtonText('Cancel');
.setButtonText('Ok') btn.onClick(() => this.close());
.setCta() btn.buttonEl.addClass('media-db-plugin-button');
.onClick(() => { })
.addButton(btn => {
btn.setButtonText('Ok');
btn.setCta();
btn.onClick(() => {
this.search(); this.search();
})); });
btn.buttonEl.addClass('media-db-plugin-button');
this.searchBtn = btn;
}); });
} }

View file

@ -76,8 +76,20 @@ export class MediaDbFolderImportModal extends Modal {
contentEl.createDiv({cls: 'media-db-plugin-spacer'}); contentEl.createDiv({cls: 'media-db-plugin-spacer'});
new Setting(contentEl) new Setting(contentEl)
.addButton(btn => btn.setButtonText('Cancel').onClick(() => this.close())) .addButton(btn => {
.addButton(btn => btn.setButtonText('Ok').setCta().onClick(() => this.submit())); btn.setButtonText('Cancel');
btn.onClick(() => this.close());
btn.buttonEl.addClass('media-db-plugin-button');
})
.addButton(btn => {
btn.setButtonText('Ok');
btn.setCta();
btn.onClick(() => {
this.submit();
});
btn.buttonEl.addClass('media-db-plugin-button');
this.searchBtn = btn;
});
} }
onClose() { onClose() {

View file

@ -84,14 +84,19 @@ export class MediaDbIdSearchModal extends Modal {
contentEl.createDiv({cls: 'media-db-plugin-spacer'}); contentEl.createDiv({cls: 'media-db-plugin-spacer'});
new Setting(contentEl) new Setting(contentEl)
.addButton(btn => btn.setButtonText('Cancel').onClick(() => this.close()))
.addButton(btn => { .addButton(btn => {
return (this.searchBtn = btn btn.setButtonText('Cancel');
.setButtonText('Ok') btn.onClick(() => this.close());
.setCta() btn.buttonEl.addClass('media-db-plugin-button');
.onClick(() => { })
.addButton(btn => {
btn.setButtonText('Ok');
btn.setCta();
btn.onClick(() => {
this.search(); this.search();
})); });
btn.buttonEl.addClass('media-db-plugin-button');
this.searchBtn = btn;
}); });
} }

View file

@ -59,6 +59,7 @@ export class MediaDbSearchResultModal extends SelectModal<MediaTypeModel> {
} }
onClose() { onClose() {
console.log('close');
this.closeCallback(); this.closeCallback();
} }
} }

View file

@ -12,6 +12,8 @@ export abstract class SelectModal<T> extends Modal {
skipButton?: ButtonComponent; skipButton?: ButtonComponent;
submitButton?: ButtonComponent; submitButton?: ButtonComponent;
elementWrapper?: HTMLDivElement;
elements: T[]; elements: T[];
selectModalElements: SelectModalElement<T>[]; selectModalElements: SelectModalElement<T>[];
@ -27,18 +29,28 @@ export abstract class SelectModal<T> extends Modal {
this.skipButton = undefined; this.skipButton = undefined;
this.submitButton = undefined; this.submitButton = undefined;
this.elementWrapper = undefined;
this.elements = elements; this.elements = elements;
this.selectModalElements = []; this.selectModalElements = [];
this.scope.register([], 'ArrowUp', () => { this.scope.register([], 'ArrowUp', (evt) => {
this.highlightUp(); this.highlightUp();
evt.preventDefault();
}); });
this.scope.register([], 'ArrowDown', () => { this.scope.register([], 'ArrowDown', (evt) => {
this.highlightDown(); this.highlightDown();
evt.preventDefault();
}); });
this.scope.register([], 'ArrowRight', () => { this.scope.register([], 'ArrowRight', () => {
this.activateHighlighted(); this.activateHighlighted();
}); });
this.scope.register([], ' ', (evt) => {
if (this.elementWrapper && this.elementWrapper === document.activeElement) {
this.activateHighlighted();
evt.preventDefault();
}
});
this.scope.register([], 'Enter', () => this.submit()); this.scope.register([], 'Enter', () => this.submit());
} }
@ -67,24 +79,17 @@ export abstract class SelectModal<T> extends Modal {
async onOpen() { async onOpen() {
const {contentEl} = this; const {contentEl} = this;
/*
contentEl.id = 'media-db-plugin-modal'
contentEl.on('keydown', '#' + contentEl.id, (ev, delegateTarget) => {
console.log(ev.key);
});
*/
contentEl.createEl('h2', {text: this.title}); contentEl.createEl('h2', {text: this.title});
contentEl.createEl('p', {text: this.description}); contentEl.createEl('p', {text: this.description});
contentEl.addClass('media-db-plugin-select-modal'); contentEl.addClass('media-db-plugin-select-modal');
const elementWrapper = contentEl.createDiv({cls: 'media-db-plugin-select-wrapper'}); this.elementWrapper = contentEl.createDiv({cls: 'media-db-plugin-select-wrapper'});
this.elementWrapper.tabIndex = 0;
let i = 0; let i = 0;
for (const element of this.elements) { for (const element of this.elements) {
const selectModalElement = new SelectModalElement(element, elementWrapper, i, this, false); const selectModalElement = new SelectModalElement(element, this.elementWrapper, i, this, false);
this.selectModalElements.push(selectModalElement); this.selectModalElements.push(selectModalElement);
@ -96,11 +101,27 @@ export abstract class SelectModal<T> extends Modal {
this.selectModalElements.first()?.element.scrollIntoView(); this.selectModalElements.first()?.element.scrollIntoView();
const bottomSettingRow = new Setting(contentEl); const bottomSettingRow = new Setting(contentEl);
bottomSettingRow.addButton(btn => this.cancelButton = btn.setButtonText('Cancel').onClick(() => this.close())); bottomSettingRow.addButton(btn => {
btn.setButtonText('Cancel');
btn.onClick(() => this.close());
btn.buttonEl.addClass('media-db-plugin-button');
this.cancelButton = btn;
});
if (this.addSkipButton) { if (this.addSkipButton) {
bottomSettingRow.addButton(btn => this.skipButton = btn.setButtonText('Skip').onClick(() => this.skip())); bottomSettingRow.addButton(btn => {
btn.setButtonText('Skip');
btn.onClick(() => this.skip());
btn.buttonEl.addClass('media-db-plugin-button');
this.skipButton = btn;
});
} }
bottomSettingRow.addButton(btn => this.submitButton = btn.setButtonText('Ok').setCta().onClick(() => this.submit())); bottomSettingRow.addButton(btn => {
btn.setButtonText('Ok');
btn.setCta();
btn.onClick(() => this.submit());
btn.buttonEl.addClass('media-db-plugin-button');
this.submitButton = btn;
});
} }
activateHighlighted() { activateHighlighted() {

View file

@ -105,4 +105,8 @@ small.media-db-plugin-list-text{
margin-bottom: 5px; margin-bottom: 5px;
} }
.media-db-plugin-button:focus {
outline: 1px solid white;
}
/* endregion */ /* endregion */