Modal keyboard navigation changes
This commit is contained in:
parent
5aa9108509
commit
805d9d3fb8
6 changed files with 79 additions and 31 deletions
|
|
@ -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(() => {
|
})
|
||||||
this.search();
|
.addButton(btn => {
|
||||||
}));
|
btn.setButtonText('Ok');
|
||||||
|
btn.setCta();
|
||||||
|
btn.onClick(() => {
|
||||||
|
this.search();
|
||||||
|
});
|
||||||
|
btn.buttonEl.addClass('media-db-plugin-button');
|
||||||
|
this.searchBtn = btn;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -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(() => {
|
})
|
||||||
this.search();
|
.addButton(btn => {
|
||||||
}));
|
btn.setButtonText('Ok');
|
||||||
|
btn.setCta();
|
||||||
|
btn.onClick(() => {
|
||||||
|
this.search();
|
||||||
|
});
|
||||||
|
btn.buttonEl.addClass('media-db-plugin-button');
|
||||||
|
this.searchBtn = btn;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,7 @@ export class MediaDbSearchResultModal extends SelectModal<MediaTypeModel> {
|
||||||
}
|
}
|
||||||
|
|
||||||
onClose() {
|
onClose() {
|
||||||
|
console.log('close');
|
||||||
this.closeCallback();
|
this.closeCallback();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -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 */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue