BoardController
MMO\admin\controllers · 1 symbol · generated 27 Oct 2026
BoardController
BoardController.php:43The kanban boards a release follows: each one a <mmo-kanban>'s data, and its tickets' discussions, kept in a JSON file of its own, {folder}/{board}.json (KanbanBoard for the file). {MMO\admin}/templates/board.phtml shows one; a release checklist (ChecklistController) follows one, and labels its verified tickets.
- Namespace
MMO\admin\controllers- Extends
- aDataController
- Implements
- iRoutable
Index
| META | what a board says of itself besides its data, kept at the top of its file | |
| NAME | a board's name: what its file is called, nothing that leaves the folder | |
| STATUSES | ||
| anonymous | ||
| author | ||
| default | ||
| folder | ||
| readonly | ||
| scope | ||
| syncUsers | ||
| writeScope | ||
| allows($scopes) | ||
| answer($route, $b) | ||
| canSync() | ||
| checklistOf($b) | ||
| checklistsFolder() | ||
| comment($c) | ||
| ConnectRoutes($routes, $config) static | ||
| createChecklist($name, $board, $title, $from, $refPrefix) | Make a new board's checklist, following it, with the recipe of the checklist $from's follows: nothing when the application has no checklists (ChecklistController not declared) or the checklist ex… | |
| defaultBoard() | ||
| edit($route, $action, $write) | Run $action on the route's board, locked (the lock the release checklists take too): what it changes is written back when $write, unless it answers an error. | |
| fail($route, $status, $error) | ||
| filename($board) | ||
| folder() | ||
| getAuthor() | ||
| guard($route, $write) | ||
| meta($b, $name) | ||
| moveRefusals($b, $board, $ticket, $role) | What keeps a ticket from a column: À faire (ready) wants its prompt (a fenced block of an agent, mmo.client's KanbanPrompts); Recette (verify) a ``` `check ``` block (its description or i… | |
| routeComment($route) | ||
| routeComments($route) | ||
| routeCreate($route) | Make a new board and its checklist: the board's columns are STATUSES (or from's), its labels, categories and people from's; its checklist (checklist, the board's name by default) follows… | |
| routeCurrent($route) | The board the user works on, and its checklist: the one they picked (BoardSelection), else $default, else the developer layer's, else the first. | |
| routeDeleteComment($route) | ||
| routeList($route) | ||
| routeLoad($route) | ||
| routeLoadPlan($route) | ||
| routeMove($route) | Move a ticket the way its life goes, refused when it is not ready for that column (MoveRefusals): an agent moves tickets so -- the board's page drops them where the user wants. | |
| routePlan($route) | The plan of the tickets to do: which of the À faire tickets, grouped how, in what order, and what is left out. | |
| routePrompts($route) | ||
| routeSave($route) | ||
| routeSetCurrent($route) | Pick the board the user works on; the developer layer then files its tickets there. | |
| routeSync($route) | Sync the board with GitHub (mmo.git's BoardSync, the kanbanSync profile of the board): what changed on each side since the last sync is written on the other. | |
| routeSyncInfo($route) | Whether the board can be synced with GitHub from its page, by whom is asking. | |
| routeSyncJob($route) | Start the sync of the board with GitHub as a long job (mmo.git's BoardSyncJob, in its own process, with no time limit): the page follows it with <mmo-job> (mmo.core's JobController, which dec… | |
| routeUpdateComment($route) | ||
| setStatus($route, $status) | ||
| syncJob() | ||
| syncProfile($board) | ||
| text($route) |
Constants3
META
what a board says of itself besides its data, kept at the top of its file
NAME
a board's name: what its file is called, nothing that leaves the folder
STATUSES
Properties8
anonymous
- Type
- bool
author
default
folder
readonly
- Type
- bool
scope
syncUsers
- Type
- array
writeScope
Methods38
allows($scopes)
BoardController.php:688answer($route, $b)
BoardController.php:649| $route | Route | |
| $b | KanbanBoard | |
| returns | array | the board as the page wants it: its tickets saying how many comments they have |
canSync()
BoardController.php:470| returns | bool | whether the logged in user is one of $syncUsers |
checklistOf($b)
BoardController.php:318| $b | KanbanBoard | |
| returns | null | Checklist | the checklist the board names (checklist), null when it names none or it is not there |
checklistsFolder()
BoardController.php:583comment($c)
BoardController.php:660ConnectRoutes($routes, $config)
staticBoardController.php:104- See
$anonymous: every route is mmo.oauth'sanonymouswhen the configuration says so
createChecklist($name, $board, $title, $from, $refPrefix)
BoardController.php:597Make a new board's checklist, following it, with the recipe of the checklist $from's follows: nothing when the application has no checklists (ChecklistController not declared) or the checklist exists.
defaultBoard()
BoardController.php:571edit($route, $action, $write)
BoardController.php:627Run $action on the route's board, locked (the lock the release checklists take too): what it changes is written back when $write, unless it answers an error.
fail($route, $status, $error)
BoardController.php:702filename($board)
BoardController.php:560folder()
BoardController.php:555| returns | string | the boards' folder, as a filename |
getAuthor()
BoardController.php:546guard($route, $write)
BoardController.php:673meta($b, $name)
BoardController.php:565| $b | KanbanBoard | |
| $name | string | |
| returns | array | string, description: ?string, checklist: ?string} what a board says of itself (META) |
moveRefusals($b, $board, $ticket, $role)
BoardController.php:297What keeps a ticket from a column: À faire (ready) wants its prompt (a fenced block of an agent, mmo.client's KanbanPrompts); Recette (verify) a ``` `check `` block (its description or its discussion) and, when the board names its checklist, items of it naming the ticket; Terminé (done`) every one of those items checked.
| $b | KanbanBoard | |
| $board | string | |
| $ticket | string | |
| $role | string | the column's role (KanbanBoard::roles), '' for none: anything goes there |
| returns | array | why it may not go, empty when it may |
routeComment($route)
BoardController.php:497routeComments($route)
BoardController.php:488routeCreate($route)
BoardController.php:194Make a new board and its checklist: the board's columns are STATUSES (or from's), its labels, categories and people from's; its checklist (checklist, the board's name by default) follows it, with the recipe of from's checklist, when the application declares ChecklistController and the checklist does not exist yet.
| $route | Route | a JSON body {title, description, checklist, from, refPrefix}, every key optional: from a board to copy, refPrefix what the checklist's refs start with |
| returns | array | as routeLoad, and createdChecklist: the checklist made, null when none was; 409 when the board exists |
routeCurrent($route)
BoardController.php:225The board the user works on, and its checklist: the one they picked (BoardSelection), else $default, else the developer layer's, else the first.
routeDeleteComment($route)
BoardController.php:532routeList($route)
BoardController.php:117routeLoad($route)
BoardController.php:143routeLoadPlan($route)
BoardController.php:373routeMove($route)
BoardController.php:262Move a ticket the way its life goes, refused when it is not ready for that column (MoveRefusals): an agent moves tickets so -- the board's page drops them where the user wants.
| $route | Route | a JSON body {status, comment}: the column (its id, or a role: ready, verify...), and a comment saying why, added to the ticket's discussion |
| returns | array | {ticket, from, to, role}; 409 with reasons when the ticket may not go there |
routePlan($route)
BoardController.php:333The plan of the tickets to do: which of the À faire tickets, grouped how, in what order, and what is left out. Kept in the board (plan, the last one), shown on its page; each ticket planned gets a comment saying its group and rank.
| $route | Route | a JSON body {title, groups: [{title, tickets, note}], left: [{ticket, why}], note}: the tickets in the order they are done, every one of them in the board's À faire column |
| returns | array | the plan as kept: {title, groups, left, note, at, by}; 400 naming the tickets that are not to do |
routePrompts($route)
BoardController.php:382routeSave($route)
BoardController.php:154| $route | Route | a JSON body {version, data}: the version the page was given, and the board's data now; title, description, checklist change what the board says of itself (META), null forgets one; roles the column of each step of a ticket's life (KanbanBoard::roles) |
| returns | array | as routeLoad; 409 with the board as it is when it was saved meanwhile |
routeSetCurrent($route)
BoardController.php:239Pick the board the user works on; the developer layer then files its tickets there.
| $route | Route | a JSON body {board}: an existing board, or null to forget the choice |
| returns | array | as routeCurrent |
routeSync($route)
BoardController.php:450Sync the board with GitHub (mmo.git's BoardSync, the kanbanSync profile of the board): what changed on each side since the last sync is written on the other. {dryRun: true} only says what would be.
| $route | Route | its body: {dryRun} |
| returns | array | {report, board}: the sync's report (BoardSync::run) and the board as it is now |
routeSyncInfo($route)
BoardController.php:396Whether the board can be synced with GitHub from its page, by whom is asking.
| $route | Route | |
| returns | array | {available, profile, syncedAt, job}: available when a kanbanSync profile syncs the board and the user is one of $syncUsers; syncedAt the end of the last sync, from its state file; job the name mmo.core's JobController gives mmo.git's BoardSyncJob (routeSyncJob), null when it does not declare it |
routeSyncJob($route)
BoardController.php:414Start the sync of the board with GitHub as a long job (mmo.git's BoardSyncJob, in its own process, with no time limit): the page follows it with <mmo-job> (mmo.core's JobController, which declares it start: false: only this route, which checks $syncUsers, starts it). {dryRun: true} only says what would be.
routeUpdateComment($route)
BoardController.php:513setStatus($route, $status)
BoardController.php:707syncJob()
BoardController.php:433syncProfile($board)
BoardController.php:476text($route)
BoardController.php:666Inherited members (62)
| Constants | Declared by | Description | |
|---|---|---|---|
ALERT | iLogLevel | Alert: Action must be taken immediately. | |
ALL | iLogLevel | Mask for all | |
ALL_PLUS | iLogLevel | debug everything | |
BACKTRACE | iLogLevel | ||
COLORS | aDataController | Named color palettes for chart/report endpoints, e.g. | |
CRITICAL | iLogLevel | Critical: Critical conditions. | |
DEBUG | iLogLevel | Debug: Detailed debug information. | |
DEEP | iLogLevel | debug everything with arguments | |
EMERGENCY | iLogLevel | Emergency: System is unusable. | |
ERROR | iLogLevel | Error: Runtime errors that do not require immediate action but should typically be logged and monitored. | |
ERROR_PLUS | iLogLevel | Mask for all error | |
FATAL | iLogLevel | Mask for all fatal error | |
INFO | iLogLevel | Info: Interesting events. | |
INFO_PLUS | iLogLevel | Mask for all errors/warning/notices/info | |
MEMORY | iLogLevel | include backtrace object | |
NOTICE | iLogLevel | Notice: Normal but significant events. | |
NOTICE_PLUS | iLogLevel | Mask for all errors/warning/notices/info | |
TRACE | iLogLevel | include backtrace as origins | |
WARNING | iLogLevel | Warning: Exceptional occurrences that are not errors. | |
WARNING_PLUS | iLogLevel | Mask for all errors and warnings |
| Properties | Declared by | Description | |
|---|---|---|---|
repositories | aDataController | ||
verbosity | aModule |
| Methods | Declared by | Description | |
|---|---|---|---|
alert($message, $context) | aModule | Action must be taken immediately. | |
backtraces($message, $context) | aModule | Force-log a message at INFO level together with a full stack trace/memory snapshot (iLogLevel::BACKTRACE), bypassing the verbosity mask entirely (any non-zero verbosity is enough to trigger it). | |
Configure($config) | aModule | Merge $config into this module's configuration in the shared Configuration. | |
critical($message, $context) | aModule | Critical conditions. No-op if CRITICAL is currently filtered out by the verbosity mask. | |
debug($message, $context) | aModule | Detailed debug information. | |
debugName() | aModule | Human-readable identifier used as the default {origin} in this instance's log messages. | |
DefaultConfig() | aModule | The config a module starts from before anything loaded via Configuration is merged in. | |
emergency($message, $context) | aModule | System is unusable. No-op if EMERGENCY is currently filtered out by the verbosity mask. | |
error($message, $context) | aModule | Runtime errors that do not require immediate action but should typically be logged and monitored. | |
ExtractRoutes($config) | aController | Extract all the APIRoute from this class, regardless of the fact they are registered in the application | |
getMainRepository() | aDataController | ||
getRepositories() | aDataController | ||
getRepository($repo) | aDataController | ||
getVerbosity() | aModule | ||
HasRoutes() | aController | Tells if any APIRoute are registered in the application | |
info($message, $context) | aModule | Interesting events. No-op if INFO is currently filtered out by the verbosity mask. | |
Instantiate($config) | aModule | (Re)create the shared instance immediately, configured with $config merged into the class's existing config. | |
IsShared() | aModule | ||
Link($method, $data) | aController | Build a Link (URL + label/icon/description/title, taken from the route's APIRoute metadata) for a registered route. | |
log($level, $message, $context) | aModule | Logs with an arbitrary level. | |
notice($message, $context) | aModule | Normal but significant events. | |
offsetExists($key) | aModule | \ArrayAccess::offsetExists -- tells whether $key is a declared property at all, regardless of whether it is currently readable/writable through array access. | |
offsetGet($key) | aModule | \ArrayAccess::offsetGet -- reads a property directly, unless it has a #[Serialize(serialize: 'methodName')] attribute, in which case that zero-argument method is called instead (e.g. | |
offsetSet($key, $value) | aModule | \ArrayAccess::offsetSet -- sets a property directly, unless it has a #[Serialize(unserialize: 'methodName')] attribute, in which case that method is called with $value instead (e.g. | |
offsetUnset($key) | aModule | \ArrayAccess::offsetUnset -- equivalent to $module[$key] = null. | |
onRoute($route) | aDataController | Same as aController::onRoute, plus forcing the response to JSON (Response::Json) for every route this controller claims. | |
Route($method) | aController | Get a registered APIRoute WARNING: if this class was not registered in the application, it will return null. | |
Routes() | aController | Get a list of registered APIRoutes (from this class) in the application WARNING: if this class was not registered in the application, it will return an empty array. | |
serialize($path, $serializer) | aModule | \MMO\core\interfaces\iSerializable::serialize -- exports every property (via | |
setRepositories($repositories) | aDataController | Register the repositories this controller can query, keyed by name (e.g. | |
setVerbosity($verb) | aModule | Set the current verbosity mask, replacing whatever it was before. | |
Shared() | aModule | Get the shared instance, creating (and configuring) it on first call. | |
testVerbosity($level) | aModule | Test whether a given level (or set of levels) is currently enabled by this instance's verbosity mask. | |
traitUnshare($serialize) | aModule | Remove the shared instance, so the next Shared() call creates a fresh one. | |
unserialize($data, $path, $instances) | aModule | \MMO\core\interfaces\iSerializable::unserialize -- merges $data onto DefaultConfig, runs it through the (possibly overridden) constructor, then applies each resulting value to its property (via | |
Unshare($serialize) | aModule | Like tSingleton::Unshare, but also disconnects this module's instance from every event it was listening to (via Event::DisconnectListeners) before dropping it. | |
Url($method, $data) | aController | Build the URL for a registered route, filling in any {placeholder} from $data. | |
warning($message, $context) | aModule | Exceptional occurrences that are not errors. | |
__construct($config) | aModule | protected constructor, so it is not possible to do new Module(...) called by the serialization process just before being injected with data. | |
__wakeup() | aController | Called automatically right after the controller's shared instance is built (aModule::unserialize): registers onRoute as a Route listener with a low priority (-10), so it… |