Skip to content

Commit

Permalink
[FEATURE] Introduce hotkeys to scheduler task editing
Browse files Browse the repository at this point in the history
Similar to editing regular content elements, it is now possible to save
scheduler tasks being edited via keyboard shortcuts as well.

Resolves: #103563
Releases: main
Change-Id: Ia159293670f3f3dc762f3c23da35e0e71d5541fd
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/83702
Reviewed-by: Andreas Kienast <a.fernandez@scripting-base.de>
Tested-by: Stefan Bürk <stefan@buerk.tech>
Reviewed-by: Stefan Bürk <stefan@buerk.tech>
Tested-by: core-ci <typo3@b13.com>
Tested-by: Garvin Hicking <gh@faktor-e.de>
Tested-by: Andreas Kienast <a.fernandez@scripting-base.de>
Reviewed-by: Garvin Hicking <gh@faktor-e.de>
  • Loading branch information
andreaskienast committed Apr 8, 2024
1 parent e8e7d2a commit 8f0662e
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 6 deletions.
64 changes: 59 additions & 5 deletions Build/Sources/TypeScript/scheduler/scheduler.ts
Expand Up @@ -23,6 +23,7 @@ import { MultiRecordSelectionSelectors } from '@typo3/backend/multi-record-selec
import Severity from '@typo3/backend/severity';
import DocumentService from '@typo3/core/document-service';
import SubmitInterceptor from '@typo3/backend/form/submit-interceptor';
import Hotkeys, { ModifierKeys } from '@typo3/backend/hotkeys';

interface TableNumberMapping {
[s: string]: number;
Expand All @@ -37,6 +38,7 @@ class Scheduler {
DocumentService.ready().then((): void => {
this.initializeSubmitInterceptor();
this.initializeEvents();
this.registerHotKeys();
this.initializeDefaultStates();
this.initializeCloseConfirm();
});
Expand Down Expand Up @@ -245,12 +247,12 @@ class Scheduler {
new RegularEvent('click', (e: Event): void => {
e.preventDefault();

this.saveDocument(e);
this.saveDocument(e.target as HTMLElement);
}).delegateTo(document, 'button[form]');
}

private saveDocument(e: Event): void {
const schedulerForm: HTMLFormElement = document.querySelector('form[name=tx_scheduler_form]');
private saveDocument(submitter?: HTMLElement): void {
const schedulerForm = this.getTaskEditForm();
if (!schedulerForm) {
return;
}
Expand All @@ -261,7 +263,55 @@ class Scheduler {
hidden.name = 'CMD';

schedulerForm.append(hidden);
schedulerForm.requestSubmit(e.target as HTMLElement);
schedulerForm.requestSubmit(submitter);
}

private saveAndCloseDocument(submitter?: HTMLElement): void {
const schedulerForm = this.getTaskEditForm();
if (!schedulerForm) {
return;
}

const hidden = document.createElement('input')
hidden.type = 'hidden';
hidden.value = 'saveclose';
hidden.name = 'CMD';

schedulerForm.append(hidden);
schedulerForm.requestSubmit(submitter);
}

private registerHotKeys(): void {
const form = this.getTaskEditForm();
if (form === null) {
return;
}

let submitterElement = null;
if (form.CMD instanceof HTMLElement) {
submitterElement = form.CMD;
} else if (form.CMD instanceof NodeList) {
submitterElement = form.CMD.item(0) as HTMLButtonElement;
}

Hotkeys.setScope('scheduler/edit-task');
Hotkeys.register([Hotkeys.normalizedCtrlModifierKey, 's'], (e: KeyboardEvent): void => {
e.preventDefault();

this.saveDocument(submitterElement);
}, {
scope: 'scheduler/edit-task',
allowOnEditables: true,
bindElement: submitterElement,
});
Hotkeys.register([Hotkeys.normalizedCtrlModifierKey, ModifierKeys.SHIFT, 's'], (e: KeyboardEvent): void => {
e.preventDefault();

this.saveAndCloseDocument(submitterElement);
}, {
scope: 'scheduler/edit-task',
allowOnEditables: true,
});
}

/**
Expand Down Expand Up @@ -346,7 +396,7 @@ class Scheduler {
}

private initializeCloseConfirm() {
const schedulerForm: HTMLFormElement = document.querySelector('form[name=tx_scheduler_form]');
const schedulerForm = this.getTaskEditForm();
if(!schedulerForm) {
return;
}
Expand Down Expand Up @@ -404,6 +454,10 @@ class Scheduler {
}
})
}

private getTaskEditForm(): HTMLFormElement|null {
return document.querySelector('form[name=tx_scheduler_form]');
}
}

export default new Scheduler();
@@ -0,0 +1,25 @@
.. include:: /Includes.rst.txt

.. _feature-103563-1712569921:

=========================================================================
Feature: #103563 - Add saving-related hotkeys to scheduler backend module
=========================================================================

See :issue:`103563`

Description
===========

Similar to editing regular content elements, it is now possible to save
scheduler tasks being edited via keyboard shortcuts as well.


Impact
======

It is possible to invoke the :kbd:`Ctrl`/:kbd:`Cmd` + :kbd:`s` hotkey to save a
scheduler task, altogether with the hotkey :kbd:`Ctrl`/:kbd:`Cmd` + :kbd:`Shift` + :kbd:`S`
to save and close a scheduler task.

.. index:: Backend, JavaScript, ext:scheduler

0 comments on commit 8f0662e

Please sign in to comment.