diff --git a/Controller/ConfigController.php b/Controller/ConfigController.php index 3c2bc3d..e118975 100644 --- a/Controller/ConfigController.php +++ b/Controller/ConfigController.php @@ -25,6 +25,8 @@ class ConfigController extends BaseController '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_persistent_sort' => (int) $this->configModel->get('organon_tweaks_persistent_sort', 1), + 'organon_tweaks_done_badge' => (int) $this->configModel->get('organon_tweaks_done_badge', 0), + 'organon_tweaks_done_closes_task' => (int) $this->configModel->get('organon_tweaks_done_closes_task', 0), ), 'errors' => array(), ))); @@ -45,6 +47,8 @@ class ConfigController extends BaseController $shortcutLabels = isset($values['organon_tweaks_shortcut_labels']) ? 1 : 0; $titleClickEdit = isset($values['organon_tweaks_title_click_edit']) ? 1 : 0; $persistentSort = isset($values['organon_tweaks_persistent_sort']) ? 1 : 0; + $doneBadge = isset($values['organon_tweaks_done_badge']) ? 1 : 0; + $doneClosesTask = isset($values['organon_tweaks_done_closes_task']) ? 1 : 0; if ($this->configModel->save(array( 'organon_tweaks_always_comment_icon' => $alwaysCommentIcon, @@ -58,6 +62,8 @@ class ConfigController extends BaseController 'organon_tweaks_shortcut_labels' => $shortcutLabels, 'organon_tweaks_title_click_edit' => $titleClickEdit, 'organon_tweaks_persistent_sort' => $persistentSort, + 'organon_tweaks_done_badge' => $doneBadge, + 'organon_tweaks_done_closes_task' => $doneClosesTask, ))) { $this->flash->success(t('Settings saved successfully.')); } else { diff --git a/Controller/DoneController.php b/Controller/DoneController.php new file mode 100644 index 0000000..0f063a5 --- /dev/null +++ b/Controller/DoneController.php @@ -0,0 +1,47 @@ +getTask(); + $this->checkCSRFParam(); + + $helper = new OrganonDoneHelper($this->container); + $done = $helper->isDone($task); + + if ($helper->closesTask()) { + if ($done) { + $this->taskStatusModel->open($task['id']); + } else { + $this->taskStatusModel->close($task['id']); + } + } else { + if ($done) { + $this->taskMetadataModel->remove($task['id'], OrganonDoneHelper::DONE_KEY); + } else { + $this->taskMetadataModel->save($task['id'], array(OrganonDoneHelper::DONE_KEY => 'on')); + } + } + + if ($this->request->getStringParam('from') === 'board') { + $this->response->redirect($this->helper->url->to('BoardViewController', 'show', array('project_id' => $task['project_id'])), true); + } else { + $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'])), true); + } + } +} diff --git a/Helper/OrganonDoneHelper.php b/Helper/OrganonDoneHelper.php new file mode 100644 index 0000000..b94c6b4 --- /dev/null +++ b/Helper/OrganonDoneHelper.php @@ -0,0 +1,50 @@ +closesTask()) { + return isset($task['is_active']) && (int) $task['is_active'] === 0; + } + + return $this->taskMetadataModel->get((int) $task['id'], self::DONE_KEY, '') === 'on'; + } + + /** + * Should toggling Done also close (and reopen) the task? Global setting, default off. + * + * @return bool + */ + public function closesTask() + { + return (int) $this->configModel->get(self::CLOSES_KEY, 0) === 1; + } +} diff --git a/Plugin.php b/Plugin.php index 896367f..6c2b9a9 100644 --- a/Plugin.php +++ b/Plugin.php @@ -111,6 +111,16 @@ class Plugin extends Base }); } + // Tweak: a Done/Due status badge on the card face (top-right, below the header) and in the + // task view (4th column, near the due date). Two-state toggle; single source of truth per + // mode -- close-mode ON => Done == closed (reads is_active, so native Close/Open stay in + // sync); close-mode OFF => a task-metadata marker (organon_done). Server-rendered, no JS. + if ((int) $this->configModel->get('organon_tweaks_done_badge', 0) === 1) { + $this->template->hook->attach('template:board:private:task:before-title', 'organonTweaks:board/done_badge'); + $this->template->hook->attach('template:task:details:fourth-column', 'organonTweaks:task/done_badge'); + $this->template->hook->attach('template:layout:head', 'organonTweaks:layout/done_style'); + } + // 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 @@ -141,7 +151,7 @@ class Plugin extends Base public function getHelpers() { return array( - 'Plugin\OrganonTweaks\Helper' => array('OrganonColumnHelper', 'OrganonProjectHelper', 'OrganonSortHelper'), + 'Plugin\OrganonTweaks\Helper' => array('OrganonColumnHelper', 'OrganonProjectHelper', 'OrganonSortHelper', 'OrganonDoneHelper'), ); } @@ -162,7 +172,7 @@ class Plugin extends Base public function getPluginVersion() { - return '1.9.1'; + return '2.0.0'; } public function getPluginHomepage() diff --git a/README.md b/README.md index 70aafe4..31cb9f6 100644 --- a/README.md +++ b/README.md @@ -117,6 +117,26 @@ single arrow** (up for ascending, down for descending) when it is ON. (which also hides the native sort menu). Per-column state lives in project metadata. - **On by default.** Toggle it under "Settings -> Organon Tweaks". +### Done/Due badge + +A two-state toggle badge for marking a card done, shown on the board card face (top-right, below the +header) and on the task view (4th column, near the due date). It reads **`[ ] Due`** (dark red) while +the task is pending; one click flips it to **`[x] Done`** (light green). The card itself is not +recolored -- only the badge. The "Due" colors reuse FinanceBuddy's debit badge for consistency. + +- Rendered server-side (no JavaScript) via `template:board:private:task:before-title` + (`Template/board/done_badge.php`), `template:task:details:fourth-column` + (`Template/task/done_badge.php`), and a small head ` diff --git a/Template/task/done_badge.php b/Template/task/done_badge.php new file mode 100644 index 0000000..150d9ef --- /dev/null +++ b/Template/task/done_badge.php @@ -0,0 +1,24 @@ + fields. Same + * two-state toggle as the board badge; only shown to users who may edit the task. + */ +if (! $this->user->hasProjectAccess('TaskModificationController', 'edit', $task['project_id'])) { + return; +} +$done = $this->OrganonDoneHelper->isDone($task); +?> +
  • + + url->link( + $done ? ' '.t('Done') : ' '.t('Due'), + 'DoneController', + 'toggle', + array('plugin' => 'OrganonTweaks', 'task_id' => $task['id'], 'project_id' => $task['project_id'], 'from' => 'task'), + true, + '', + $done ? t('Mark as not done') : t('Mark as done') + ) ?> + +
  • diff --git a/VERSION b/VERSION index 6c2b60b..0d4322f 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -OrganonTweaks v1.9.1 +OrganonTweaks v2.0.0