2026-07-18 21:24:36 -03:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace Kanboard\Plugin\OrganonTweaks\Helper;
|
|
|
|
|
|
|
|
|
|
use Kanboard\Core\Base;
|
|
|
|
|
|
|
|
|
|
/**
|
2026-07-18 22:43:41 -03:00
|
|
|
* Done/Todo badge helper.
|
2026-07-18 21:24:36 -03:00
|
|
|
*
|
|
|
|
|
* "Done" has a single source of truth PER MODE (no drift with native Close/Open):
|
|
|
|
|
* - close-mode on ("check done also closes tasks"): Done == the task is CLOSED (is_active == 0).
|
|
|
|
|
* The badge reads the task's own is_active, so however a task is closed/reopened (badge, native
|
|
|
|
|
* sidebar, bulk, API) the badge always matches. No metadata is stored in this mode.
|
|
|
|
|
* - close-mode off (marker only): Done == the task metadata DONE_KEY == 'on', independent of the
|
|
|
|
|
* open/closed status. Stored as the non-falsy string 'on' (never '0'/'1'): MetadataModel::get()
|
|
|
|
|
* uses `?:` and PHP treats "0" as falsy, so a stored "0" would read back as the default.
|
|
|
|
|
*
|
|
|
|
|
* Templates cannot read models directly, so the board/task-view badge templates call isDone() here,
|
|
|
|
|
* passing the task array (which carries both id and is_active) so the close-mode read needs no query.
|
|
|
|
|
*/
|
|
|
|
|
class OrganonDoneHelper extends Base
|
|
|
|
|
{
|
|
|
|
|
const DONE_KEY = 'organon_done';
|
|
|
|
|
const CLOSES_KEY = 'organon_tweaks_done_closes_task';
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Is this task Done? (mode-aware: closed status in close-mode, else the metadata marker)
|
|
|
|
|
*
|
|
|
|
|
* @param array $task a task array carrying 'id' and 'is_active'
|
|
|
|
|
* @return bool
|
|
|
|
|
*/
|
|
|
|
|
public function isDone(array $task)
|
|
|
|
|
{
|
|
|
|
|
if ($this->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;
|
|
|
|
|
}
|
|
|
|
|
}
|