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 { const EMPHASIZE_KEY = 'organon_tweaks_emphasize_duedate'; 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). * * @return bool */ public function isEmphasizeDueDate() { $project_id = $this->request->getIntegerParam('project_id'); if ($project_id <= 0) { return false; } $value = $this->projectMetadataModel->get($project_id, self::EMPHASIZE_KEY, 'default'); if ($value === 'on') { return true; } if ($value === 'off') { return false; } // 'default' (or absent) -> follow the live global default. 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(); } }