3 Commits
v1.4 ... v1.5

8 changed files with 124 additions and 10 deletions

View File

@@ -19,6 +19,7 @@ class ConfigController extends BaseController
'organon_tweaks_quick_click_only' => (int) $this->configModel->get('organon_tweaks_quick_click_only', 1), 'organon_tweaks_quick_click_only' => (int) $this->configModel->get('organon_tweaks_quick_click_only', 1),
'organon_tweaks_enhance_recurrence' => (int) $this->configModel->get('organon_tweaks_enhance_recurrence', 1), 'organon_tweaks_enhance_recurrence' => (int) $this->configModel->get('organon_tweaks_enhance_recurrence', 1),
'organon_tweaks_emphasize_duedate_default' => (int) $this->configModel->get('organon_tweaks_emphasize_duedate_default', 0), 'organon_tweaks_emphasize_duedate_default' => (int) $this->configModel->get('organon_tweaks_emphasize_duedate_default', 0),
'organon_tweaks_show_all_filter' => (int) $this->configModel->get('organon_tweaks_show_all_filter', 1),
), ),
'errors' => array(), 'errors' => array(),
))); )));
@@ -31,19 +32,33 @@ class ConfigController extends BaseController
$alwaysCommentIcon = isset($values['organon_tweaks_always_comment_icon']) ? 1 : 0; $alwaysCommentIcon = isset($values['organon_tweaks_always_comment_icon']) ? 1 : 0;
$keepScroll = isset($values['organon_tweaks_keep_scroll']) ? 1 : 0; $keepScroll = isset($values['organon_tweaks_keep_scroll']) ? 1 : 0;
$quickClickOnly = isset($values['organon_tweaks_quick_click_only']) ? 1 : 0; $quickClickOnly = isset($values['organon_tweaks_quick_click_only']) ? 1 : 0;
$enhanceRecurrence = isset($values['organon_tweaks_enhance_recurrence']) ? 1 : 0;
$emphasizeDueDateDefault = isset($values['organon_tweaks_emphasize_duedate_default']) ? 1 : 0; $emphasizeDueDateDefault = isset($values['organon_tweaks_emphasize_duedate_default']) ? 1 : 0;
$showAllFilter = isset($values['organon_tweaks_show_all_filter']) ? 1 : 0;
if ($this->configModel->save(array( if ($this->configModel->save(array(
'organon_tweaks_always_comment_icon' => $alwaysCommentIcon, 'organon_tweaks_always_comment_icon' => $alwaysCommentIcon,
'organon_tweaks_keep_scroll' => $keepScroll, 'organon_tweaks_keep_scroll' => $keepScroll,
'organon_tweaks_quick_click_only' => $quickClickOnly, 'organon_tweaks_quick_click_only' => $quickClickOnly,
'organon_tweaks_enhance_recurrence' => $enhanceRecurrence,
'organon_tweaks_emphasize_duedate_default' => $emphasizeDueDateDefault, 'organon_tweaks_emphasize_duedate_default' => $emphasizeDueDateDefault,
'organon_tweaks_show_all_filter' => $showAllFilter,
))) { ))) {
$this->flash->success(t('Settings saved successfully.')); $this->flash->success(t('Settings saved successfully.'));
} else { } else {
$this->flash->failure(t('Unable to save your settings.')); $this->flash->failure(t('Unable to save your settings.'));
} }
// Apply the "Show all tasks" toggle across all boards immediately: on -> (re)create the
// filter everywhere, off -> remove every one (it is a plugin-managed, reserved-name filter).
$projectHelper = new \Kanboard\Plugin\OrganonTweaks\Helper\OrganonProjectHelper($this->container);
if ($showAllFilter === 1) {
$projectHelper->addShowAllFilterToAllProjects();
} else {
$projectHelper->removeAllShowAllFilters();
}
$this->response->redirect($this->helper->url->to('ConfigController', 'show', array('plugin' => 'OrganonTweaks'))); $this->response->redirect($this->helper->url->to('ConfigController', 'show', array('plugin' => 'OrganonTweaks')));
} }
} }

View File

@@ -3,19 +3,33 @@
namespace Kanboard\Plugin\OrganonTweaks\Helper; namespace Kanboard\Plugin\OrganonTweaks\Helper;
use Kanboard\Core\Base; use Kanboard\Core\Base;
use Kanboard\Model\CustomFilterModel;
/** /**
* Per-board helper for OrganonTweaks. * Per-board helper for OrganonTweaks.
* *
* Resolves the 3-state "emphasize due date" setting for the CURRENT board (read from the route * Resolves the 3-state "emphasize due date" setting for the CURRENT board (read from the route
* project_id, which the router populates for pretty URLs before the layout renders): * project_id, which the router populates for pretty URLs before the layout renders):
* per-board '1' -> on, '0' -> off, 'default'/absent -> follow the LIVE global default. * per-board 'on' -> on, 'off' -> off, 'default'/absent -> follow the LIVE global default.
*
* The stored values are the non-falsy strings 'on'/'off' (not '1'/'0'): Kanboard's
* MetadataModel::get() uses `?:`, and PHP treats the string "0" as falsy, so a stored "0" would
* come back as the 'default' fallback and "Always off" would never be honored.
*
* Also maintains a shared "Show all tasks" custom filter (an empty query) on every board, so there
* is always a one-click way to clear the board filter and reveal open + closed tasks.
*/ */
class OrganonProjectHelper extends Base class OrganonProjectHelper extends Base
{ {
const EMPHASIZE_KEY = 'organon_tweaks_emphasize_duedate'; const EMPHASIZE_KEY = 'organon_tweaks_emphasize_duedate';
const EMPHASIZE_DEFAULT_KEY = 'organon_tweaks_emphasize_duedate_default'; const EMPHASIZE_DEFAULT_KEY = 'organon_tweaks_emphasize_duedate_default';
const SHOW_ALL_FILTER_KEY = 'organon_tweaks_show_all_filter';
// The plugin RESERVES this custom-filter name: a fixed (non-translated) string so the dedup is
// stable across locales. A user's own filter with this name is absorbed into the canonical form.
const SHOW_ALL_FILTER_NAME = 'Show all tasks';
/** /**
* Should the current board emphasize the due date? Board pages only (project_id in the route). * Should the current board emphasize the due date? Board pages only (project_id in the route).
* *
@@ -31,15 +45,85 @@ class OrganonProjectHelper extends Base
$value = $this->projectMetadataModel->get($project_id, self::EMPHASIZE_KEY, 'default'); $value = $this->projectMetadataModel->get($project_id, self::EMPHASIZE_KEY, 'default');
if ($value === '1') { if ($value === 'on') {
return true; return true;
} }
if ($value === '0') { if ($value === 'off') {
return false; return false;
} }
// 'default' (or absent) -> follow the live global default. // 'default' (or absent) -> follow the live global default.
return (int) $this->configModel->get(self::EMPHASIZE_DEFAULT_KEY, 0) === 1; return (int) $this->configModel->get(self::EMPHASIZE_DEFAULT_KEY, 0) === 1;
} }
/**
* Ensure the board has exactly one canonical "Show all tasks" filter (empty query, shared).
* Idempotent: create it when absent, force a same-named one back to the canonical form (reserved
* name), and drop any duplicates. Called lazily on every project-header render, so it covers old
* and new boards alike. No-op without a real project and a real owner (custom_filters.user_id has
* a FK to users, so a system id like 0 would fail the insert).
*
* @param int $project_id
*/
public function ensureShowAllFilter($project_id)
{
$project_id = (int) $project_id;
$user_id = (int) $this->userSession->getId();
if ($project_id <= 0 || $user_id <= 0) {
return;
}
$existing = $this->db->table(CustomFilterModel::TABLE)
->eq('project_id', $project_id)
->eq('name', self::SHOW_ALL_FILTER_NAME)
->findAll();
if (empty($existing)) {
$this->db->table(CustomFilterModel::TABLE)->insert(array(
'filter' => '',
'project_id' => $project_id,
'user_id' => $user_id,
'name' => self::SHOW_ALL_FILTER_NAME,
'is_shared' => 1,
'append' => 0,
));
return;
}
// Reserved name: keep one, force it to the canonical empty + shared form, drop the rest.
$keep = array_shift($existing);
if ($keep['filter'] !== '' || (int) $keep['is_shared'] !== 1) {
$this->db->table(CustomFilterModel::TABLE)
->eq('id', $keep['id'])
->update(array('filter' => '', 'is_shared' => 1));
}
foreach ($existing as $duplicate) {
$this->db->table(CustomFilterModel::TABLE)->eq('id', $duplicate['id'])->remove();
}
}
/**
* Toggle turned ON: eagerly (re)create the "Show all tasks" filter on every existing board.
* ensureShowAllFilter() keeps covering boards created afterwards.
*/
public function addShowAllFilterToAllProjects()
{
foreach ($this->projectModel->getAll() as $project) {
$this->ensureShowAllFilter((int) $project['id']);
}
}
/**
* Toggle turned OFF: remove every "Show all tasks" filter across all boards (reserved name).
*/
public function removeAllShowAllFilters()
{
$this->db->table(CustomFilterModel::TABLE)
->eq('name', self::SHOW_ALL_FILTER_NAME)
->remove();
}
} }

View File

@@ -57,6 +57,13 @@ class Plugin extends Base
'template' => 'plugins/OrganonTweaks/Asset/js/enhance-recurrence.js', 'template' => 'plugins/OrganonTweaks/Asset/js/enhance-recurrence.js',
)); ));
} }
// Tweak: keep a shared "Show all tasks" custom filter (empty query -> open + closed) on every
// board as a one-click "clear the filter". Ensured lazily when a project header renders, so
// it covers old and new boards. The config toggle bulk-adds/removes them (ConfigController).
if ((int) $this->configModel->get('organon_tweaks_show_all_filter', 1) === 1) {
$this->template->hook->attach('template:project:header:before', 'organonTweaks:project_header/show_all_filter');
}
} }
public function getHelpers() public function getHelpers()
@@ -83,7 +90,7 @@ class Plugin extends Base
public function getPluginVersion() public function getPluginVersion()
{ {
return '1.4.0'; return '1.5.0';
} }
public function getPluginHomepage() public function getPluginHomepage()

View File

@@ -27,7 +27,7 @@
</fieldset> </fieldset>
<fieldset> <fieldset>
<?= $this->form->checkbox('organon_tweaks_enhance_recurrence', t('Enhance the recurrence dialog'), 1, isset($values['organon_tweaks_enhance_recurrence']) && $values['organon_tweaks_enhance_recurrence'] == 1) ?> <?= $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"> <p class="form-help">
<?= t('In the native "Edit recurrence" dialog, replace the Generate recurrent task dropdown with Yes/No radio buttons (one click), and add a [+7] button next to the factor that adds 7 (one week of days).') ?> <?= t('In the native "Edit recurrence" dialog, replace the Generate recurrent task dropdown with Yes/No radio buttons (one click), and add a [+7] button next to the factor that adds 7 (one week of days).') ?>
</p> </p>
@@ -40,6 +40,13 @@
</p> </p>
</fieldset> </fieldset>
<fieldset>
<?= $this->form->checkbox('organon_tweaks_show_all_filter', t('Add a "Show all tasks" filter to every board'), 1, isset($values['organon_tweaks_show_all_filter']) && $values['organon_tweaks_show_all_filter'] == 1) ?>
<p class="form-help">
<?= t('Keep a shared "Show all tasks" custom filter (an empty query, so open and closed tasks are shown) on every board, old and new. It appears in the board filter bookmark menu as a one-click way to clear the filter. Turning this off removes it from all boards; turning it on recreates it everywhere.') ?>
</p>
</fieldset>
<div class="form-actions"> <div class="form-actions">
<button type="submit" class="btn btn-blue"><?= t('Save') ?></button> <button type="submit" class="btn btn-blue"><?= t('Save') ?></button>
</div> </div>

View File

@@ -1,3 +1,3 @@
<?php if ($this->OrganonProjectHelper->isEmphasizeDueDate()): ?> <?php if ($this->OrganonProjectHelper->isEmphasizeDueDate()): ?>
<style>.task-date { font-size: 1.25em; font-weight: bold; }</style> <style>.task-date { font-size: 1.375em; font-weight: bold; }</style>
<?php endif ?> <?php endif ?>

View File

@@ -1,4 +1,4 @@
<?php $choice = isset($values['organon_tweaks_emphasize_duedate']) && in_array($values['organon_tweaks_emphasize_duedate'], array('1', '0'), true) ? $values['organon_tweaks_emphasize_duedate'] : 'default' ?> <?php $choice = isset($values['organon_tweaks_emphasize_duedate']) && in_array($values['organon_tweaks_emphasize_duedate'], array('on', 'off'), true) ? $values['organon_tweaks_emphasize_duedate'] : 'default' ?>
<h3><i class="fa fa-umbrella fa-fw" aria-hidden="true"></i> <?= t('OrganonTweaks') ?></h3> <h3><i class="fa fa-umbrella fa-fw" aria-hidden="true"></i> <?= t('OrganonTweaks') ?></h3>
<div class="listing"> <div class="listing">
@@ -8,10 +8,10 @@
<input type="radio" name="organon_tweaks_emphasize_duedate" value="default" <?= $choice === 'default' ? 'checked="checked"' : '' ?>> <?= t('Use default') ?> <input type="radio" name="organon_tweaks_emphasize_duedate" value="default" <?= $choice === 'default' ? 'checked="checked"' : '' ?>> <?= t('Use default') ?>
</label> </label>
<label style="display:inline-block; margin-right:16px;"> <label style="display:inline-block; margin-right:16px;">
<input type="radio" name="organon_tweaks_emphasize_duedate" value="1" <?= $choice === '1' ? 'checked="checked"' : '' ?>> <?= t('Always on') ?> <input type="radio" name="organon_tweaks_emphasize_duedate" value="on" <?= $choice === 'on' ? 'checked="checked"' : '' ?>> <?= t('Always on') ?>
</label> </label>
<label style="display:inline-block; margin-right:16px;"> <label style="display:inline-block; margin-right:16px;">
<input type="radio" name="organon_tweaks_emphasize_duedate" value="0" <?= $choice === '0' ? 'checked="checked"' : '' ?>> <?= t('Always off') ?> <input type="radio" name="organon_tweaks_emphasize_duedate" value="off" <?= $choice === 'off' ? 'checked="checked"' : '' ?>> <?= t('Always off') ?>
</label> </label>
<p class="form-help"> <p class="form-help">

View File

@@ -0,0 +1 @@
<?php $this->OrganonProjectHelper->ensureShowAllFilter($project['id']) ?>

View File

@@ -1 +1 @@
OrganonTweaks v1.4 OrganonTweaks v1.5