4 Commits
v1.8 ... v1.8.4

9 changed files with 53 additions and 110 deletions

View File

@@ -1,39 +0,0 @@
/*
* OrganonTweaks -- the "Save & Close" button on the task edit form. It is a plain type=button (so it
* never becomes the Enter default -- Enter still triggers the core Save), and on click it repoints
* the form to the plugin's TaskSaveCloseController and lets Kanboard's own modal submit it. Kanboard
* keeps ownership of the POST, CSRF, error re-render, and the X-Ajax-Redirect navigation; we only
* change the destination, so the controller redirects to the board instead of the card view.
*/
(function () {
"use strict";
document.addEventListener("click", function (e) {
if (!e.target || !e.target.closest) {
return;
}
var btn = e.target.closest("[data-organon-save-close]");
if (!btn) {
return;
}
e.preventDefault();
var form = btn.closest("form");
var url = btn.getAttribute("data-url");
if (!form || !url) {
return;
}
form.setAttribute("action", url);
if (window.KB && KB.modal && KB.modal.isOpen && KB.modal.isOpen() && KB.modal.submitForm) {
KB.modal.submitForm();
} else if (form.requestSubmit) {
form.requestSubmit();
} else {
form.submit();
}
}, false);
})();

View File

@@ -24,7 +24,6 @@ class ConfigController extends BaseController
'organon_tweaks_recurring_filters' => (int) $this->configModel->get('organon_tweaks_recurring_filters', 1),
'organon_tweaks_shortcut_labels' => (int) $this->configModel->get('organon_tweaks_shortcut_labels', 1),
'organon_tweaks_title_click_edit' => (int) $this->configModel->get('organon_tweaks_title_click_edit', 1),
'organon_tweaks_save_close_button' => (int) $this->configModel->get('organon_tweaks_save_close_button', 1),
),
'errors' => array(),
)));
@@ -44,7 +43,6 @@ class ConfigController extends BaseController
$recurringFilters = isset($values['organon_tweaks_recurring_filters']) ? 1 : 0;
$shortcutLabels = isset($values['organon_tweaks_shortcut_labels']) ? 1 : 0;
$titleClickEdit = isset($values['organon_tweaks_title_click_edit']) ? 1 : 0;
$saveCloseButton = isset($values['organon_tweaks_save_close_button']) ? 1 : 0;
if ($this->configModel->save(array(
'organon_tweaks_always_comment_icon' => $alwaysCommentIcon,
@@ -57,7 +55,6 @@ class ConfigController extends BaseController
'organon_tweaks_recurring_filters' => $recurringFilters,
'organon_tweaks_shortcut_labels' => $shortcutLabels,
'organon_tweaks_title_click_edit' => $titleClickEdit,
'organon_tweaks_save_close_button' => $saveCloseButton,
))) {
$this->flash->success(t('Settings saved successfully.'));
} else {

View File

@@ -1,33 +0,0 @@
<?php
namespace Kanboard\Plugin\OrganonTweaks\Controller;
use Kanboard\Controller\TaskModificationController;
/**
* "Save & Close": the exact core task update, but on success it redirects to the BOARD instead of
* reopening the card view. The plugin's "Save & Close" button repoints the edit form here (via JS),
* so everything else -- validation, permission checks, CSRF, and the modal error re-render -- is
* inherited unchanged from core TaskModificationController. This mirrors core update() line for line
* except the one redirect target (kept in sync on Kanboard upgrades).
*/
class TaskSaveCloseController extends TaskModificationController
{
public function update()
{
$task = $this->getTask();
$values = $this->request->getValues();
$values['id'] = $task['id'];
$values['project_id'] = $task['project_id'];
list($valid, $errors) = $this->taskValidator->validateModification($values);
if ($valid && $this->updateTask($task, $values, $errors)) {
$this->flash->success(t('Task updated successfully.'));
$this->response->redirect($this->helper->url->to('BoardViewController', 'show', array('project_id' => $task['project_id'])), true);
} else {
$this->flash->failure(t('Unable to update your task.'));
$this->edit($values, $errors);
}
}
}

View File

@@ -77,17 +77,6 @@ class Plugin extends Base
$this->template->hook->attach('template:board:private:task:before-title', 'organonTweaks:board/title_edit');
}
// Tweak: a "Save & Close" button on the task edit form that saves and returns to the board
// (core only reopens the card view). The button posts to a small plugin controller that
// reuses core's update and changes only the redirect; the JS repoints the form action, so
// Kanboard's modal still owns the submit, CSRF, and error re-render.
if ((int) $this->configModel->get('organon_tweaks_save_close_button', 1) === 1) {
$this->template->hook->attach('template:task:form:bottom-before-buttons', 'organonTweaks:task_form/save_close_button');
$this->hook->on('template:layout:js', array(
'template' => 'plugins/OrganonTweaks/Asset/js/save-close.js',
));
}
// Auto-managed shared custom filters (v1.5 "Show all tasks", v1.6 month filters, v1.7
// recurring filters). Ensured lazily whenever a project header renders (covers old + new
// boards); each group is gated by its own config toggle inside
@@ -139,7 +128,7 @@ class Plugin extends Base
public function getPluginVersion()
{
return '1.8.0';
return '1.8.4';
}
public function getPluginHomepage()

View File

@@ -52,12 +52,37 @@ board stays where you were.
Dropping a card sometimes leaks a trailing "click" that opens the card -- an unwanted side
effect of the drag. A real click is a quick press-release; a drag is a press held much
longer. So `Asset/js/click-guard.js` times the press on a card (`mousedown`/`touchstart` to
the following `click`) and, if it was held longer than **100 ms**, swallows the click in the
the following `click`) and, if it was held longer than **120 ms**, swallows the click in the
capture phase before Kanboard's open handler -- so a drag never opens the card. Normal
clicks (well under 100 ms) still open cards as usual. The 100 ms threshold is fixed.
clicks (well under 120 ms) still open cards as usual. The 120 ms threshold is fixed.
- **On by default.** Toggle it under "Settings -> Organon Tweaks".
### Show keyboard shortcuts on the task menu
Kanboard already binds handy keys on the task view (`e` = edit, `s` = new sub-task, `c` = new
comment, `l` = new internal link) but never shows them, so they go undiscovered. This tweak adds a
small key hint next to each of those items in the task **Actions** sidebar. It is **display only**:
it adds no new bindings, it just surfaces the ones Kanboard already has.
- Implemented in `Asset/js/shortcut-labels.js`, matching the menu items by their FontAwesome icon
class, so it is independent of the URL format and the interface language.
- **On by default.** Toggle it under "Settings -> Organon Tweaks".
### Click a title to edit
By default, clicking a card title (on the board) or the title on the card view lands you on the
read-only card view. With this tweak on, clicking the title opens the **edit** form directly,
reusing Kanboard's own modal -- so from the board you edit and, on Save, come straight back to the
board. It applies only where you may edit (a read-only viewer keeps the normal title), and
shared/public boards are untouched.
- Implemented in `Asset/js/title-click-edit.js` -- a capture-phase click that reuses `KB.modal.open`.
On the board, a hidden marker (`Template/board/title_edit.php`, rendered by
`template:board:private:task:before-title` only when the user may edit) carries the
server-generated edit URL; on the card view the title reuses `#task-view`'s `data-edit-url`.
- **On by default.** Toggle it under "Settings -> Organon Tweaks".
### Enhance the recurrence dialog
Kanboard's native "Edit recurrence" dialog is a plain form. This makes two small usability
@@ -73,11 +98,29 @@ edits when it opens (there is no template hook, so it is done in JS,
## Settings
Global (per Kanboard instance) and admin-only, under "Settings -> Organon Tweaks":
Global (per Kanboard instance) and admin-only, under "Settings -> Organon Tweaks", grouped as on
the page:
**Board card readability**
- **Always show the comment icon on board cards** -- default on.
- **Keep the board scroll position across refreshes** -- default on.
- **Emphasize due date by default** -- default off (overridable per board under Settings -> Integrations).
**Board filters** (shared custom filters added to every board)
- **Add a "Show all tasks" filter to every board** -- default on.
- **Add month filters to every board** -- default on.
- **Add recurring filters to every board** -- default on.
**Card interaction**
- **Open a card only on a quick click** -- default on.
- **Show keyboard shortcuts on the task menu** -- default on.
- **Clicking a task title opens the edit form** -- default on.
Standalone:
- **Keep the board scroll position across refreshes** -- default on.
- **Enhance the recurrence dialog** -- default on.
## Requirements

View File

@@ -22,13 +22,6 @@
</p>
</fieldset>
<fieldset>
<?= $this->form->checkbox('organon_tweaks_quick_click_only', t('Open a card only on a quick click'), 1, isset($values['organon_tweaks_quick_click_only']) && $values['organon_tweaks_quick_click_only'] == 1) ?>
<p class="form-help">
<?= t('A press held longer than 120 ms is treated as a drag, so releasing it does not open the card. Fixes a drag sometimes opening the card on release.') ?>
</p>
</fieldset>
<fieldset>
<?= $this->form->checkbox('organon_tweaks_enhance_recurrence', t('Enhance the native recurrence dialog'), 1, isset($values['organon_tweaks_enhance_recurrence']) && $values['organon_tweaks_enhance_recurrence'] == 1) ?>
<p class="form-help">
@@ -52,14 +45,14 @@
<fieldset>
<legend><?= t('Card interaction') ?></legend>
<?= $this->form->checkbox('organon_tweaks_quick_click_only', t('Open a card only on a quick click'), 1, isset($values['organon_tweaks_quick_click_only']) && $values['organon_tweaks_quick_click_only'] == 1) ?>
<p class="form-help"><?= t('A press held longer than 120 ms is treated as a drag, so releasing it does not open the card. Fixes a drag sometimes opening the card on release.') ?></p>
<?= $this->form->checkbox('organon_tweaks_shortcut_labels', t('Show keyboard shortcuts on the task menu'), 1, isset($values['organon_tweaks_shortcut_labels']) && $values['organon_tweaks_shortcut_labels'] == 1) ?>
<p class="form-help"><?= t('Adds the existing key hints (e, s, c, l) next to the task Actions items.') ?></p>
<?= $this->form->checkbox('organon_tweaks_title_click_edit', t('Clicking a task title opens the edit form'), 1, isset($values['organon_tweaks_title_click_edit']) && $values['organon_tweaks_title_click_edit'] == 1) ?>
<p class="form-help"><?= t('On the board and the card view, click the title to open the edit modal (only where you may edit).') ?></p>
<?= $this->form->checkbox('organon_tweaks_save_close_button', t('Add a "Save & Close" button to the task edit form'), 1, isset($values['organon_tweaks_save_close_button']) && $values['organon_tweaks_save_close_button'] == 1) ?>
<p class="form-help"><?= t('Saves the task and returns to the board, instead of reopening the card view.') ?></p>
</fieldset>
<div class="form-actions">

View File

@@ -22,3 +22,4 @@
<div class="form-actions">
<button type="submit" class="btn btn-blue"><?= t('Save') ?></button>
</div>
<hr>

View File

@@ -1,8 +0,0 @@
<?php $task_id = isset($values['id']) ? (int) $values['id'] : 0 ?>
<?php if ($task_id > 0): ?>
<button type="button" class="btn"
data-organon-save-close="1"
data-url="<?= $this->url->href('TaskSaveCloseController', 'update', array('plugin' => 'OrganonTweaks', 'task_id' => $task_id)) ?>">
<?= t('Save & Close') ?>
</button>
<?php endif ?>

View File

@@ -1 +1 @@
OrganonTweaks v1.8
OrganonTweaks v1.8.4