10 Commits

12 changed files with 124 additions and 64 deletions

View File

@@ -0,0 +1,32 @@
/*
* ShrinkVertically -- keep the board's horizontal scrollbar visible when columns
* are vertically collapsed (gear menu "collapse vertically" / shortcut, which sets
* localStorage vertical_scroll=0 and adds the class .board-task-list-compact).
*
* Kanboard core sets: .board-task-list-compact { max-height: 90vh; }
* That 90vh is measured from the top of the viewport and ignores the page header
* above the board, so column + header together exceed the viewport and push the
* horizontal scrollbar below the fold.
*
* We instead reserve a fixed pixel budget for the chrome above and below the task
* list (page header + board column header + the horizontal scrollbar + a little
* breathing room). A fixed-px budget is more reliable than a proportional vh value
* because that chrome is a fixed height regardless of screen size.
*
* Tune the single number below (240px) if the scrollbar is still clipped or if you
* want the columns taller.
*
* The selector is intentionally more specific than core's single-class rule, and
* uses !important, so this override wins even alongside a theme (e.g. Essential).
*
* The min-height override is essential: Kanboard's drag-and-drop sets an INLINE
* min-height on each column equal to its full content height
* (BoardDragAndDrop.js: css("min-height", parent().height())). In CSS, min-height
* beats max-height, so that inline value keeps tall columns from shrinking and our
* max-height alone does nothing. A stylesheet !important overrides the inline
* (non-important) min-height, so we reset it to 0 and let max-height win.
*/
#board td .board-task-list.board-task-list-compact {
max-height: calc(100vh - 240px) !important;
min-height: 0 !important;
}

View File

@@ -1 +0,0 @@
/* Skeleton plugin styles -- add CSS here. Loaded via template:layout:css. */

View File

@@ -0,0 +1,34 @@
/*
* ShrinkVertically -- mark the two vertical-collapse menu items so it is obvious the
* behaviour comes from this plugin and not from Kanboard core.
*
* Core renders these labels in app/Template/project_header/dropdown.php:
* .filter-vert-collapse .filter-vert-toggle-collapse -> "Collapse vertically"
* .filter-vert-expand .filter-vert-toggle-collapse -> "Expand vertically"
*
* We append a "+" to each so they read "Collapse vertically+" / "Expand vertically+".
* This is locale-independent (it edits the rendered text, not the translation table).
*/
(function () {
"use strict";
function addPlus() {
var links = document.querySelectorAll(
".filter-vert-collapse .filter-vert-toggle-collapse, " +
".filter-vert-expand .filter-vert-toggle-collapse"
);
for (var i = 0; i < links.length; i++) {
var text = links[i].textContent;
if (text.charAt(text.length - 1) !== "+") {
links[i].textContent = text + "+";
}
}
}
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", addPlus);
} else {
addPlus();
}
})();

View File

@@ -1 +0,0 @@
// Skeleton plugin script -- add JS here. Loaded via template:layout:js.

View File

View File

View File

View File

@@ -1,6 +1,6 @@
<?php <?php
namespace Kanboard\Plugin\Skeleton; namespace Kanboard\Plugin\ShrinkVertically;
use Kanboard\Core\Plugin\Base; use Kanboard\Core\Plugin\Base;
@@ -8,28 +8,27 @@ class Plugin extends Base
{ {
public function initialize() public function initialize()
{ {
// 1. Render a visible word at the top of every page (the demo output). // Inject a small CSS override that reduces the height of vertically
$this->template->hook->attach('template:layout:top', 'skeleton:layout/header'); // collapsed board columns so the horizontal scrollbar stays visible.
// 2. Load the plugin stylesheet (currently empty -- proves the CSS hook fires).
$this->hook->on('template:layout:css', array( $this->hook->on('template:layout:css', array(
'template' => 'plugins/Skeleton/Asset/css/skeleton.css', 'template' => 'plugins/ShrinkVertically/Asset/css/shrink-vertically.css',
)); ));
// 3. Load the plugin script (currently empty -- proves the JS hook fires). // Append a "+" to the two vertical-collapse menu labels so it is visible
// that the behaviour is modified by this plugin.
$this->hook->on('template:layout:js', array( $this->hook->on('template:layout:js', array(
'template' => 'plugins/Skeleton/Asset/js/skeleton.js', 'template' => 'plugins/ShrinkVertically/Asset/js/shrink-vertically.js',
)); ));
} }
public function getPluginName() public function getPluginName()
{ {
return 'Skeleton'; return 'ShrinkVertically';
} }
public function getPluginDescription() public function getPluginDescription()
{ {
return t('Reusable skeleton/template for building Kanboard plugins.'); return t('Shrink vertically-collapsed board columns so the horizontal scrollbar stays visible.');
} }
public function getPluginAuthor() public function getPluginAuthor()
@@ -44,7 +43,7 @@ class Plugin extends Base
public function getPluginHomepage() public function getPluginHomepage()
{ {
return 'https://code.beco.cc/beco/kanboard-plugin-skeleton'; return 'https://code.beco.cc/beco/shrink-vertically';
} }
public function getCompatibleVersion() public function getCompatibleVersion()

View File

@@ -1,19 +1,47 @@
# Skeleton -- a Kanboard plugin template # ShrinkVertically -- keep the board horizontal scrollbar visible
A minimal, working Kanboard plugin that you copy and rename as the starting point for a A tiny Kanboard plugin that fixes the vertically-collapsed board view so the bottom
real plugin. By itself it does only one trivial thing: it renders the word "Skeleton" at horizontal scrollbar stays on screen.
the top of every page. It changes no data and runs no database migration.
## What it demonstrates ## The problem
- A complete `Plugin.php` registration class with all the metadata Kanboard shows in Kanboard's board gear menu has an "expand vertically / collapse vertically" toggle. When
Settings -> Plugins (name, description, author, version, homepage, compatible version). collapsed, each column gets a limited height so the horizontal scrollbar sits closer.
- A template hook (`template:layout:top`) that injects a template into the page. Core implements this with a single rule:
- Asset hooks (`template:layout:css` and `template:layout:js`) that load a stylesheet and
a script. They are empty for now but prove the injection path works -- handy when a real ```css
plugin needs custom CSS or JS. .board-task-list-compact { max-height: 90vh; }
- The standard plugin directory layout, with stub folders (`Controller/`, `Model/`, ```
`Schema/`, `Locale/`, `Test/`) ready to grow into.
That `90vh` is measured from the top of the viewport and does not account for the page
header above the board. So even when collapsed, the column plus the header together
exceed the viewport height and the horizontal scrollbar is pushed below the fold.
## The fix
This plugin injects one CSS rule (via the `template:layout:css` hook) that replaces the
proportional `90vh` with a fixed-pixel budget for the chrome above and below the task
list:
```css
#board td .board-task-list.board-task-list-compact {
max-height: calc(100vh - 240px) !important;
}
```
The `240px` reserves room for the page header, the board column header, the horizontal
scrollbar, and a little breathing space. A fixed-pixel budget is more reliable than a
proportional value because that chrome is a fixed height regardless of screen size.
The override only applies while columns are collapsed (when core adds the
`board-task-list-compact` class). It changes no data and runs no database migration.
## Menu labels
So it is obvious the collapsed behaviour comes from this plugin and not from core, a
small script (via `template:layout:js`) appends a `+` to the two gear-menu items, so they
read "Collapse vertically+" and "Expand vertically+". It only edits the rendered link
text, so it works in any locale.
## Requirements ## Requirements
@@ -21,45 +49,15 @@ the top of every page. It changes no data and runs no database migration.
## Installation ## Installation
No build step and no dependencies. Copy this folder into your Kanboard installation as `plugins/ShrinkVertically/`. The
directory name must be exactly `ShrinkVertically` (Kanboard derives the plugin namespace
from the folder name). Reload the board; no build step, no configuration.
1. Copy this folder into your Kanboard installation as `plugins/Skeleton/`. ## Tuning
2. Reload any page. The word "Skeleton" appears at the top.
3. Confirm it under Settings -> Plugins.
To uninstall, delete `plugins/Skeleton/`. Nothing else is left behind. Edit the single `240px` value in `Asset/css/shrink-vertically.css`. Increase it if the
scrollbar is still clipped (for example with a taller theme header); decrease it to make
## Directory layout the collapsed columns taller.
```
Skeleton/
Plugin.php Registration and hook wiring (the only required file).
README.md
LICENSE AGPL-3.0.
Template/
layout/header.php The visible "Skeleton" word.
Asset/
css/skeleton.css Loaded via template:layout:css.
js/skeleton.js Loaded via template:layout:js.
Controller/ Stub for future request handlers.
Model/ Stub for future business logic / DB access.
Schema/ Stub for future database migrations.
Locale/ Stub for future translations (e.g. pt_BR/, fr_FR/).
Test/ Stub for future unit tests.
```
## How to fork this into a new plugin
1. Copy the folder and rename it, e.g. `plugins/MyPlugin/`. The folder name must match the
namespace and start with a capital letter.
2. In `Plugin.php`, change the namespace from `Kanboard\Plugin\Skeleton` to
`Kanboard\Plugin\MyPlugin`.
3. Update the metadata methods (`getPluginName`, `getPluginDescription`, `getPluginAuthor`,
`getPluginVersion`, `getPluginHomepage`, `getCompatibleVersion`).
4. Update the hook target paths: the lowercase prefix in `'skeleton:layout/header'` and the
`plugins/Skeleton/Asset/...` asset paths must match the new plugin name.
5. Replace `Template/layout/header.php` with your real template, or attach to a different
hook. See the Kanboard plugin hooks documentation for the full list of hook points.
## License ## License

View File

View File

@@ -1 +0,0 @@
<div class="skeleton-plugin-marker">Skeleton</div>

View File