PHPackages                             web-vision/kanban-workspaces - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. web-vision/kanban-workspaces

ActiveTypo3-cms-extension[Utility &amp; Helpers](/categories/utility)

web-vision/kanban-workspaces
============================

Kanban Workspaces - Kanban Board Extension for TYPO3: Manage tasks and projects with an intuitive kanban interface

0.0.2(1mo ago)350[6 issues](https://github.com/web-vision/kanban-workspaces/issues)[1 PRs](https://github.com/web-vision/kanban-workspaces/pulls)GPL-2.0-or-laterPHPPHP ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0

Since Jun 30Pushed 2w agoCompare

[ Source](https://github.com/web-vision/kanban-workspaces)[ Packagist](https://packagist.org/packages/web-vision/kanban-workspaces)[ RSS](/packages/web-vision-kanban-workspaces/feed)WikiDiscussions main Synced 2w ago

READMEChangelog (2)Dependencies (26)Versions (4)Used By (0)

[![TYPO3](https://camo.githubusercontent.com/bc6cede28f1d4c27c294b44db8268ad65a2df941a6d29d205a43919b47d4312a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5459504f332d31342e332e782d6f72616e67652e737667)](https://typo3.org/)[![TYPO3](https://camo.githubusercontent.com/3e8ed116aa59a4f10ea169b01a216d046c65ac61c4023db911071989cfad94f4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5459504f332d31332e342e782d6f72616e67652e737667)](https://typo3.org/)[![PHP](https://camo.githubusercontent.com/c2588b5670f2c910b8cc849ace22a22efda8956b7c2f797d11d2096bbfc7b1f5/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e322532422d3737374242342e737667)](https://www.php.net/)[![PHP](https://camo.githubusercontent.com/278621fc49c71cdc38414030199af0284d7323979cad78496bfafbf7050ee4bc/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e332532422d3737374242342e737667)](https://www.php.net/)[![PHP](https://camo.githubusercontent.com/e7fb02d4dba7ebc18300495e44eda0d0f1e5e176b17b0ad8542e31cf06735e73/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e342532422d3737374242342e737667)](https://www.php.net/)[![PHP](https://camo.githubusercontent.com/2371eeb1a98f81a6894947d4d7b429326ee7f4dbeb3d8940776b4ae7b8442725/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e352532422d3737374242342e737667)](https://www.php.net/)[![License](https://camo.githubusercontent.com/43a510dd0989747b1c3997cb691eaef0adc0f48c2ba392da31b012ef9030bf23/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d47504c2d2d322e302d2d6f722d2d6c617465722d626c75652e737667)](https://www.gnu.org/licenses/gpl-2.0.html)[![State](https://camo.githubusercontent.com/15eaa0ef5df905b2fa525d57cdfea36cc4eaa4eeb0cbb6498bf93f06d69c6d8c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f73746174652d616c7068612d677265656e2e737667)](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ExtensionArchitecture/DeclarationFile/Index.html)

TYPO3 Extension `Kanban Workspaces`
===================================

[](#typo3-extension-kanban-workspaces)

Important

The extension is in an early experimental state and considered as `Proof-of-Concept (POC)`implementation and not everything is possible acting as smooth as expected or is finished.

URL**Repository:****Read online:****TER:**[https://extensions.typo3.org/extension/kanban\_workspaces/](https://extensions.typo3.org/extension/kanban_workspaces/)Description
-----------

[](#description)

Kanban board backend module for TYPO3 CMS workspace management.

This extension provides a Kanban-style UI in the TYPO3 backend to manage workspace content (pages, `tt_content`) via drag-and-drop, filters, and TYPO3 workspace APIs. Columns represent workspace stages; cards represent workspace records. You can move items between stages, filter by depth/language/stage, search, and use the integrated “Send to stage” workflow.

Features
--------

[](#features)

- **Kanban board**: Columns = workspace stages; cards = workspace records (pages, content elements).
- **Drag-and-drop**: Move cards between stages; persists via `Actions::sendToSpecificStageExecute`.
- **Filters**: Depth (this page / 1–4 levels / infinite), language (system languages + “all”), stage. Filters are stored in module data and applied to the workspace API request.
- **Global search**: Search input in header; filters the card list.
- **Preview modal**: Card detail with “Summary of changes”, “Activity”, and “History” tabs; Revert / Approve actions. Uses TYPO3 diff data where available.
- **Send to stage**: Integration with `@typo3/workspaces/renderable/send-to-stage-form.js` for stage transitions (including optional recipients and comments).
- **Workspace-aware**: Requires a non-Live workspace and a selected page (`id`); shows an infobox when on Live or no page is selected.
- **Stage configuration**: Stages come from `WorkspaceStageRepository`; optional Extension Manager setting to hide default TYPO3 stages and use only custom ones.

Compatibility
-------------

[](#compatibility)

BranchVersionTYPO3PHPmain0.0.x-devv13, v148.2, 8.3, 8.4, 8.5Installation
------------

[](#installation)

### Composer

[](#composer)

```
composer require web-vision/kanban-workspaces
```

### TypoScript

[](#typoscript)

Include the static template **“Kanban Workspaces Backend Module”** (`Configuration/TypoScript` via `ext_tables.php`) in the Install Tool or Template module.

### DDEV

[](#ddev)

If the project uses [DDEV](https://ddev.com/), run Composer and TYPO3 CLI commands inside the DDEV container (e.g. `ddev composer install`, `ddev exec typo3 …`).

Configuration
-------------

[](#configuration)

### Extension Manager

[](#extension-manager)

Configure in **Admin Tools → Extension Manager → kanban\_workspaces** (or `ext_conf_template.txt`):

SettingTypeDefaultDescription`disableResetToEditingStage`boolean`0`When enabled, prevents TYPO3's DataHandler from resetting a workspace record's stage back to the editing stage (stage 0) after a field update, keeping its current stage.`customStageEditTitle`string*(empty)*Custom title for the default "Editing" stage (stage `0`). Plain string or `LLL:EXT:...` reference; empty keeps the TYPO3 default.`customStageReadyToPublishTitle`string*(empty)*Custom title for the default "Ready to publish" stage (stage `-10`). Plain string or `LLL:EXT:...` reference; empty keeps the TYPO3 default.`customStagePublishTitle`string*(empty)*Custom title for the default "Publish" stage (stage `-20`). Plain string or `LLL:EXT:...` reference; empty keeps the TYPO3 default.Custom stage titles are applied by extending TYPO3's `StagesService::getStageTitle()`; an empty value falls back to the core title.

### TypoScript

[](#typoscript-1)

Optional overrides for template/partial/layout paths and `storagePid` are available in [Configuration/TypoScript/constants.typoscript](Configuration/TypoScript/constants.typoscript).

---

Usage
-----

[](#usage)

- **Location**: Backend → **Web** → **Kanban Workspaces** (module `web_kanbanworkspaces`, after *Web → Info*).
- **Access**: User-level (`access: user`), all workspaces (`workspaces: '*'`).

**Steps:**

1. Switch to a **non-Live** workspace (e.g. via the workspace selector in the backend).
2. Select a **page** in the page tree (the module receives the page `id`).
3. Open **Web → Kanban Workspaces**. The board loads workspace records for that page (depth, language, and stage from filters).
4. Use filters, search, drag-and-drop, card preview, and “Send to stage” as needed.

Architecture
------------

[](#architecture)

### Backend

[](#backend)

- [KanbanWorkspacesController](Classes/Controller/KanbanWorkspacesController.php) `index` action renders the module.
- It builds stage config from `WorkspaceStageRepository`, system languages, and depth options.
- It injects `WorkspaceConfig` (JSON) and loads `@web-vision/kanban-workspaces/App.js`, the workspace send-to-stage form, and CSS.

### Frontend

[](#frontend)

The frontend is built as ES6 modules under `Resources/Public/JavaScript/`, import-mapped to `@web-vision/kanban-workspaces/` (see [Configuration/JavaScriptModules.php](Configuration/JavaScriptModules.php)). The former single-file `Workspace.js` has been split into a central orchestrator and focused collaborators:

- [App.js](Resources/Public/JavaScript/App.js): entrypoint. Enables horizontal drag-to-scroll, instantiates `WorkspaceBoard`, and wires application-level events (e.g. `card:moved` → POST to the workspace dispatch API).
- [WorkspaceBoard.js](Resources/Public/JavaScript/WorkspaceBoard.js): `WorkspaceBoard` class — the orchestrator. Owns the shared state (cards, stages, filters, selection, history) and the lifecycle wiring, and delegates the actual work to its collaborators, which reach shared state and each other through their `board` reference.

ModulePathResponsibility`WorkspaceApi`[data/WorkspaceApi.js](Resources/Public/JavaScript/data/WorkspaceApi.js)AJAX transport over the workspace dispatch endpoint.`DataTransformer`[data/DataTransformer.js](Resources/Public/JavaScript/data/DataTransformer.js)Stateless transform of API payloads into card / comment / history / diff view models.`BoardRenderer`[ui/BoardRenderer.js](Resources/Public/JavaScript/ui/BoardRenderer.js)Columns, cards and filter-sidebar markup.`DragController`[ui/DragController.js](Resources/Public/JavaScript/ui/DragController.js)Drag-and-drop, drop placeholders, stage-transition start.`ModalController`[ui/ModalController.js](Resources/Public/JavaScript/ui/ModalController.js)Preview and Send-to-Stage modals; revert / approve workflow.`FilterController`[ui/FilterController.js](Resources/Public/JavaScript/ui/FilterController.js)Search and filter handling, persistence and reloads.`CardActions`[ui/CardActions.js](Resources/Public/JavaScript/ui/CardActions.js)Card context-menu actions (preview, edit, assign, discard, move/revert).`EventEmitter`[core/EventEmitter.js](Resources/Public/JavaScript/core/EventEmitter.js)Minimal pub/sub used for the board's custom events.`initHorizontalScroll`[core/HorizontalScroll.js](Resources/Public/JavaScript/core/HorizontalScroll.js)Drag-to-scroll behaviour for the board.utilities[core/utils.js](Resources/Public/JavaScript/core/utils.js)Stateless helpers (HTML escaping, dates, icons, toasts, debounce).### APIs

[](#apis)

- **Fetch**: `ajax/workspace` dispatch, `RemoteServer::getWorkspaceInfos` with `id`, `depth`, `language`, `stage`, etc.
- **Move**: `Actions::sendToSpecificStageExecute` with `affects.elements` and `nextStage`.

### Data flow

[](#data-flow)

 ```
flowchart LR
    User --> KanbanUI[Kanban UI]
    KanbanUI --> WorkspaceBoard[WorkspaceBoard JS]
    WorkspaceBoard  AJAX[TYPO3 workspace AJAX]
    AJAX  GridData[Workspace / GridDataService]
```

      Loading ---

API integration
---------------

[](#api-integration)

**Summary:**

- **getWorkspaceInfos**: Request fields include `id`, `depth`, `language`, `stage`, etc.; response in `result.data`.
- **sendToSpecificStageExecute**: Payload with `affects.elements` (table, uid, t3ver\_oid) and `nextStage`.
- **Language fallback**: A PSR-14 `WorkspaceLanguageFallbackListener` substitutes `"all"` for any empty/null `language.title` in the workspace grid, so records whose `sys_language_uid` is no longer present in the site configuration still render with a label.

---

Development and testing
-----------------------

[](#development-and-testing)

### JavaScript

[](#javascript)

- Entrypoint: [App.js](Resources/Public/JavaScript/App.js); orchestrator: [WorkspaceBoard.js](Resources/Public/JavaScript/WorkspaceBoard.js); collaborators under `core/`, `data/` and `ui/` (see the [Frontend](#frontend) architecture table).
- All modules live under `Resources/Public/JavaScript/`; import map `@web-vision/kanban-workspaces/` is defined in [Configuration/JavaScriptModules.php](Configuration/JavaScriptModules.php).

### Debug / events

[](#debug--events)

The board communicates through the `EventEmitter` ([core/EventEmitter.js](Resources/Public/JavaScript/core/EventEmitter.js)). Subscribe via `workspaceBoard.on('', handler)` to observe its lifecycle and interactions, e.g.:

- `board:initialized`, `board:rendered`, `board:destroyed` – board lifecycle.
- `data:loaded` – workspace records fetched and transformed.
- `card:moved`, `card:drop`, `card:dragstart`, `card:dragend`, `card:click` – card interactions.
- `filter:change`, `filter:clear`, `search:change`, `search:clear` – filter / search changes.

Set the `mockData` option (in [App.js](Resources/Public/JavaScript/App.js)) to `true` to render the board from `window.WorkspaceConfig.mockData` instead of the live API. These require the Kanban board to be initialised on the current page.

---

Project structure
-----------------

[](#project-structure)

```
Classes/
├── Controller/KanbanWorkspacesController.php
├── Configuration/EmConfiguration.php
└── EventListener/   (AfterDataGeneratedForWorkspaceEvent, publish cleanup, language fallback)
Configuration/
├── Backend/Modules.php
├── JavaScriptModules.php
├── Services.yaml
└── TypoScript/
    ├── constants.typoscript
    └── setup.typoscript
Resources/
├── Private/   (Templates, Layouts, Language)
└── Public/    (JavaScript, Css, Icons, Documentation)
ext_emconf.php, ext_localconf.php, ext_tables.php, ext_conf_template.txt

```

---

Troubleshooting
---------------

[](#troubleshooting)

IssueWhat to check“You’re on live workspace” / “Please select workspace”Switch to a non-Live workspace in the backend.Board empty or no dataEnsure a page is selected in the page tree (`id` is set).Module not visibleInclude the “Kanban Workspaces Backend Module” TypoScript template. Check user/group permissions and `workspaces` access.JS errors / API failuresVerify `workspace_dispatch` (and related) AJAX URLs. Check browser console and network tab; ensure `EXT:workspaces` is installed and workspace APIs are available.---

Funding Partner
---------------

[](#funding-partner)

The following companies have already pledged funding for the Kanban Workspace module for TYPO3.

  [![Web Vision](Resources/Public/Images/Partners/readme/wv.card.svg)](Resources/Public/Images/Partners/readme/wv.card.svg) [![dkd](Resources/Public/Images/Partners/readme/dkd.card.svg)](Resources/Public/Images/Partners/readme/dkd.card.svg)   [![eCentral](Resources/Public/Images/Partners/readme/ecentral.card.svg)](Resources/Public/Images/Partners/readme/ecentral.card.svg) [![Webconsulting](Resources/Public/Images/Partners/readme/webconsulting.card.svg)](Resources/Public/Images/Partners/readme/webconsulting.card.svg)   [![KM2](Resources/Public/Images/Partners/readme/km2.card.svg)](Resources/Public/Images/Partners/readme/km2.card.svg) [![Sutor Bank](Resources/Public/Images/Partners/readme/sutor.card.svg)](Resources/Public/Images/Partners/readme/sutor.card.svg)   [![Devzspace](Resources/Public/Images/Partners/readme/devzspace.card.svg)](Resources/Public/Images/Partners/readme/devzspace.card.svg)  ---

Create a release (maintainers only)
-----------------------------------

[](#create-a-release-maintainers-only)

Prerequisites:

- git binary
- ssh key allowed to push new branches to the repository
- GitHub command line tool `gh` installed and configured with user having permission to create pull requests.

**Prepare release locally**

> Set `RELEASE_BRANCH` to branch release should happen, for example: 'main'. Set `RELEASE_VERSION` to release version working on, for example: '1.0.0'.

```
echo '>> Create release based on configuration' ; \
  RELEASE_BRANCH='main' ; \
  RELEASE_VERSION="0.0.2" ; \
  DEV_VERSION="0.0.3" ; \
  echo ">> Checkout branches" && \
  git checkout main && \
  git fetch --all && \
  git pull --rebase && \
  git checkout ${RELEASE_BRANCH} && \
  git pull --rebase && \
  echo ">> Create release ${RELEASE_VERSION}" && \
  git checkout -b release-${RELEASE_VERSION} && \
  sed -i "s/^COMPOSER_ROOT_VERSION.*/COMPOSER_ROOT_VERSION=\"${RELEASE_VERSION}\"/" Build/Scripts/runTests.sh && \
  sed -i "s/^  RELEASE_VERSION.*/  RELEASE_VERSION=\"${RELEASE_VERSION}\" ; \\\\/" README.md && \
  sed -i "s/^  DEV_VERSION.*/  DEV_VERSION=\"${DEV_VERSION}\" ; \\\\/" README.md && \
  tailor set-version ${RELEASE_VERSION} && \
  composer config "extra"."typo3/cms"."version" "${RELEASE_VERSION}" && \
  echo "${RELEASE_VERSION}" > VERSION && \
  git add . && \
  git commit -m "[RELEASE] ${RELEASE_VERSION}" && \
  git push --set-upstream origin release-${RELEASE_VERSION} && \
  gh pr create --fill --base ${RELEASE_BRANCH} --title "[RELEASE] ${RELEASE_VERSION}" && \
  sleep 10 && \
  gh pr checks --watch --interval 2 && \
  sleep 10 && \
  gh pr merge -rd --admin && \
  git remote prune origin && \
  git tag ${RELEASE_VERSION} && \
  git push origin ${RELEASE_VERSION} && \
  echo ">> Post-release - set dev version: ${DEV_VERSION}-dev" && \
  git checkout -b set-version-${DEV_VERSION} && \
  sed -i "s/^COMPOSER_ROOT_VERSION.*/COMPOSER_ROOT_VERSION=\"${DEV_VERSION}-dev\"/" Build/Scripts/runTests.sh && \
  tailor set-version ${DEV_VERSION} && \
  composer config "extra"."typo3/cms"."version" "${DEV_VERSION}-dev" && \
  echo "${DEV_VERSION}-dev" > VERSION && \
  git add . && \
  git commit -m "[TASK] Set dev version ${DEV_VERSION}" && \
  git push --set-upstream origin set-version-${DEV_VERSION} && \
  gh pr create --fill --base ${RELEASE_BRANCH} --title "[TASK] Set dev version \"${DEV_VERSION}-dev\"" && \
  sleep 10 && \
  gh pr checks --watch --interval 2 && \
  sleep 10 && \
  gh pr merge -rd --admin && \
  git remote prune origin
```

###  Health Score

37

—

LowBetter than 81% of packages

Maintenance74

Regular maintenance activity

Popularity15

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity43

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 63.4% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~2 days

Total

2

Last Release

43d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/1453466?v=4)[Stefan Bürk](/maintainers/sbuerk)[@sbuerk](https://github.com/sbuerk)

---

Top Contributors

[![sbuerk](https://avatars.githubusercontent.com/u/1453466?v=4)](https://github.com/sbuerk "sbuerk (64 commits)")[![gnb-devzspace](https://avatars.githubusercontent.com/u/96369029?v=4)](https://github.com/gnb-devzspace "gnb-devzspace (36 commits)")[![GhanshyamBhava](https://avatars.githubusercontent.com/u/23184123?v=4)](https://github.com/GhanshyamBhava "GhanshyamBhava (1 commits)")

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/web-vision-kanban-workspaces/health.svg)

```
[![Health](https://phpackages.com/badges/web-vision-kanban-workspaces/health.svg)](https://phpackages.com/packages/web-vision-kanban-workspaces)
```

###  Alternatives

[friendsoftypo3/content-blocks

TYPO3 CMS Content Blocks - Content Types API | Define reusable components via YAML

103574.3k68](/packages/friendsoftypo3-content-blocks)[eliashaeussler/typo3-form-consent

Extension for TYPO3 CMS that adds double opt-in functionality to EXT:form

15100.9k](/packages/eliashaeussler-typo3-form-consent)[yoast-seo-for-typo3/yoast_seo

Yoast SEO for TYPO3

571.8M9](/packages/yoast-seo-for-typo3-yoast-seo)[web-vision/wv_deepltranslate

DeepL Translate (CORE) - This extension provides option to translate content element, and TCA record texts to DeepL supported languages.

34311.2k](/packages/web-vision-wv-deepltranslate)[web-vision/deepltranslate-core

DeepL Translate (CORE) - This extension provides option to translate content element, and TCA record texts to DeepL supported languages.

34162.0k10](/packages/web-vision-deepltranslate-core)[eliashaeussler/typo3-warming

Warming - Warms up Frontend caches based on an XML sitemap. Cache warmup can be triggered via TYPO3 backend or using a console command. Supports multiple languages and custom crawler implementations.

22272.4k](/packages/eliashaeussler-typo3-warming)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
