The content of this document is related to TYPO3,
a GNU/GPL CMS/Framework available from www.typo3.org.
---
Attention
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.
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.
The Kanban Workspaces extension brings a modern, intuitive Kanban board interface to TYPO3's workspace management
system. It provides content editors and managers with a visual, drag-and-drop workflow for managing content through
different publishing stages.
Stage-based Workflow - Organize content items across customizable workflow stages
Multi-language Support - Filter and manage content across multiple site languages
Hierarchical Depth Control - View content at different page tree depths (single page to infinite levels)
TYPO3 v13 Compatibility - Built with modern TYPO3 v13 architecture and best practices
Backend Module Integration - Seamlessly integrated into TYPO3's web module navigation
Workspace Integration - Full integration with TYPO3's native workspace functionality
Dynamic Stage Configuration - Automatically builds the board from the workspace's custom stages
Assign User to Card - Assign a backend user to a workspace record (card) with optional title/description;
assignee is shown on the card (with avatar); email notification is sent to the assignee when applicable
Responsive Design - Works on desktop and tablet interfaces
What is Kanban Workflow?
Kanban is a lean workflow management methodology that visualizes work as cards moving across different stages.
In TYPO3 context:
Stages - Different states in your publishing workflow (e.g., "Draft", "Review", "Approved", "Published")
Cards - Individual content items (pages, content elements) that move through stages
Workflow - Visual representation of your content approval and publishing process
Transparency - Everyone can see what's in each stage at a glance
The Kanban approach helps teams:
Visualize content workflow and bottlenecks
Manage content review and approval processes
Coordinate between editors and approvers
Track content publication status
Improve editorial workflow efficiency
Use Cases
Editorial Teams
Manage article publishing workflows with clear stages for draft, review, editing, and publication.
Content Approval Systems
Implement multi-stage approval workflows where content moves through different approval levels before publication.
Multi-language Websites
Manage content translations across different languages with stage-based workflows for each language variant.
Large Content Operations
Organize hundreds or thousands of content items into manageable workflow stages with filtering by depth and language.
Agile Content Management
Apply agile principles to content management with visual workflow boards and iterative publishing processes.
System Requirements
TYPO3 v13.4.0 or higher or v14.3.0 and higher - Requires TYPO3 v13.4 LTS, v14.3 LTS or compatible versions
PHP 8.2.0 or higher - PHP 8.2 up to 8.5 with standard TYPO3 extensions
Backend Workspace Access - Users must have workspace access enabled
Automatic stage configuration from workspace settings
Custom stage color coding
Edit and delete permissions per stage
Assign backend user to card with email notification and cleanup on publish
Administrator
Installation
The extension can be installed using Composer (recommended). Legacy mode is not supported.
Composer Installation
composer require web-vision/kanban-workspaces
Copied!
After installation, activate the extension in the Extension Manager or verify it's enabled in your configuration.
Prerequisites
Before installing Kanban Workspaces, ensure you have:
TYPO3 v13.4 or higher - The extension is designed for TYPO3 v13 LTS
PHP 8.2 or higher - Required for modern PHP features
Workspaces Extension - Must be installed and active (core TYPO3 feature)
Backend Users with Workspace Access - Users must have workspace permissions configured
Installation Steps
Install via Composer
composer require web-vision/kanban-workspaces
Copied!
Activate the Extension
The extension will be automatically activated. You can verify this in the TYPO3 Extension Manager under "Installed Extensions".
Clear Caches
vendor/bin/typo3 cache:flush
Copied!
Verify Installation
Log in to the TYPO3 backend and navigate to the "Web" module. You should see a new "Kanban Workspaces" menu item.
Backend Module Access
After installation, a new backend module becomes available:
Location - Web > Kanban Workspaces (appears in the left navigation under the "Web" menu)
Access - Available to all backend users with workspace access
Permissions - Users can only see workspaces they have access to
To access the Kanban Workspaces module:
Log in to the TYPO3 backend
Click "Web" in the left sidebar
Select "Kanban Workspaces" from the submenu
Select a page from the page tree to view its workspace items
Configuration
The extension works out of the box with sensible defaults. It provides a single
Extension Manager option; the kanban board always shows the workspace's default
"Editing" stage (stage 0) alongside all custom stages.
Extension Manager Settings
You can configure the extension under Admin Tools > Settings >
Extension Configuration > kanban_workspaces:
Disable reset to editing stage (disableResetToEditingStage) - By
default disabled. When enabled, it prevents TYPO3's DataHandler from resetting
a workspace record's stage back to the editing stage (stage 0) after a field
update, so the record keeps its current workflow stage.
Custom titles for default stages (customStageEditTitle,
customStageReadyToPublishTitle, customStagePublishTitle) - Optional
custom titles for the default "Editing" (stage 0), "Ready to publish"
(stage -10) and "Publish" (stage -20) stages. Each accepts a plain
string or a LLL:EXT:... translation reference; an empty value keeps the
original TYPO3 title.
To access these settings:
Go to Admin Tools > Settings in the backend
Open Extension Configuration and select "kanban_workspaces"
Adjust the settings as needed and save
Stage Checklist (Workspace Stages)
You can add optional checklist items to each custom workspace stage. When editors move a card to that stage on the kanban board, the "Send to Stage" modal shows the checklist at the top (informational only; no checkboxes or submission).
Where to configure: Admin Tools > Workspaces. Edit a workspace that has custom stages (Internal Stages / Custom Stages).
Steps:
Expand a custom stage (e.g. "Review", "Publish").
In the stage form, find the Checklist items (or "Stage checklist") inline section.
Add, reorder, or remove entries (each has a Title). Save the workspace/stage.
Only custom workspace stages (with a database record) can have checklist items. Internal/system stages (e.g. default "Editing") have no checklist configuration.
Site Configuration
The extension automatically uses your site's configuration. No manual site configuration is required.
Static TypoScript
A static TypoScript template is registered automatically:
Click Uninstall (or use Composer: composer remove web-vision/kanban-workspaces)
Clear caches
Database tables remain (optional: manually clean up if needed)
Editor
Working with Kanban Workspaces
As an editor, the Kanban Workspaces module provides a visual, intuitive way to manage content through your publication workflow using a kanban board interface.
Accessing the Kanban Board
Log in to the TYPO3 backend
Click Web in the left sidebar
Select Kanban Workspaces from the submenu
Select a page from the page tree on the left to load its workspace items
The kanban board will display all content items in the selected page and its child pages, organized by workflow stage.
Understanding the Kanban Board
The kanban board displays your workflow stages as columns:
Columns - Each column represents a workflow stage (e.g., "Draft", "In Review", "Approved", "Published")
Cards - Each card represents a content item (page or content element) currently in that stage
Visual Organization - Items are grouped by stage, making it easy to see where everything is in the workflow
Color Coding - Different stages may have different colors to help distinguish them visually
Working with Items on the Board
Moving Items Between Stages
To move a content item to a different stage:
Click and Hold the card you want to move
Drag the card to another column (stage)
Release the mouse button to drop the item in the new stage
The item will automatically transition to the new stage, and the change will be reflected in TYPO3's workspace system.
When you drag a card to another column (or use Approve or Revert on a card), the Send to Stage modal opens. If the target stage has checklist items configured by an administrator, a Checklist section appears at the top of the modal (below the blue info banner). Each item is shown as a list row with a checklist icon and the item title. The list is informational only (no checkboxes, no submission of state). Complete recipients/comments as needed and confirm to perform the stage transition.
Viewing Item Details
To see more information about an item:
Click on a card to select it
The item's details will be displayed
You can view the item's title, current stage, and other metadata
Some implementations may allow inline editing of item properties
Editing Items
To edit a content item's actual content:
Click on a card to view item details
Look for an Edit button or link
Click to open the item in the record editor
Make your changes in the editor interface
Save your changes
The changes will be applied in your current workspace, not the live website.
Using Filters
The kanban board provides several filters to help you focus on specific items:
Depth Filter
Controls how many page tree levels are shown:
This Page - Only items directly on the selected page (depth 0)
1 Level - Selected page plus first level of child pages (depth 1)
2 Levels - Selected page plus two levels of children (depth 2)
3 Levels - Selected page plus three levels of children (depth 3)
4 Levels - Selected page plus four levels of children (depth 4)
Infinite - All pages below the selected page, regardless of depth
Use the depth filter to focus on a specific section or show more items at once.
Language Filter
For multi-language websites, filter by language:
All - Show items from all languages
English - Show only English language items
Deutsch (German) - Show only German language items
[Other languages] - Show items from specific languages configured on your site
This is helpful when managing content in multiple languages separately.
Stage Filter
Show items from specific workflow stages only:
All Stages - Show items in all stages
Draft - Show only items in draft stage
In Review - Show only items awaiting review
[Custom Stages] - Show items in other custom stages defined for your workflow
Use the stage filter to focus on items that need your attention in specific stages.
Best Practices
Content Organization
Use Clear Page Titles
Page titles appear on kanban cards, so clear, descriptive titles help everyone understand what content each card represents.
Organize Your Page Tree Logically
The depth filter shows multiple page tree levels, so a well-organized hierarchy makes the kanban board easier to use.
Set Appropriate Initial Stage
When creating new content, verify it starts in the correct initial stage for your workflow.
Workflow Management
Move Items in Sequence
Follow your workflow stages in order. For example: Draft → Review → Approved → Published.
Use Consistent Staging
Ensure all editors follow the same workflow stages to maintain consistency.
Complete Stages Promptly
Don't leave items stuck in intermediate stages. Move them along the workflow as soon as they're ready.
Communication
Check Before Publishing
Review item details before moving to final stages to ensure content quality.
Document Your Process
If your workflow includes stages like "In Review", ensure reviewers know to check the kanban board.
Use Comments and Stages
Some workflow implementations may include comment or note stages—use these for team communication.
Performance Tips
Use Depth Filter for Large Trees
If you have many pages, use the depth filter to show only 1-2 levels at a time for better performance.
Filter by Single Language
On multi-language sites, showing one language at a time reduces the number of items displayed.
Focus on Specific Stages
Use the stage filter to show only items that need your attention.
Avoid Infinite Depth
Don't use "Infinite" depth for large page trees—it can be slow to load and hard to navigate.
Keyboard Shortcuts
Depending on your configuration, these shortcuts may be available:
Tab - Navigate between cards on the kanban board
Enter - Open selected card for editing
Escape - Deselect current card
Drag - Click and drag cards to move them between stages
Common Tasks
Publishing Content
Typical publishing workflow:
Select the page from the page tree
Verify the item is in the "Ready to Publish" or "Approved" stage
Drag the item to the "Published" stage
Confirm the transition in any prompts that appear
The content is now marked for publication
Reviewing Content
For content review workflow:
Select a page with items in "In Review" stage
Check the review stage column
Click on items that need review
Edit if needed, or move to "Approved" if content is ready
Reject items back to "Draft" if changes are needed
Managing Translations
For multi-language sites:
Select the page to manage translations for
Use the language filter to show items from one language
Manage that language's items through the workflow
Switch to another language in the filter
Repeat the process for each language
Troubleshooting
Items don't move when I drag them
Ensure you have permission to edit items in the workspace
Check that you're not in the "Live" workspace (you must be in an active workspace)
Try refreshing the page (F5) and dragging again
I can't see the kanban board
Verify you're in an active workspace (not Live)
Select a page from the page tree on the left
Clear your browser cache
Filters don't work
Verify the correct page is selected
Try refreshing the kanban board
Check that content items exist in the selected page tree depth
Stage transitions fail
Verify you have permission to edit items in the workspace
Check that the target stage allows item transition
Verify your TYPO3 user has sufficient workspace permissions
Assigning a User to a Card
You can assign a backend user to a content element (card) and optionally add a title and description. The assignee is shown on the card (with avatar when available). If you assign a different user (not yourself), that user receives an email notification. Assignments are cleaned up when the record is published.
How to assign: Open the card context menu (⋯) → Assign → fill in Title (optional), Description (optional), Assignee (required; select from dropdown) → OK.
For a full description of the flow, email notification, and how to test it, see Assign User to Content.
Getting Help
If you encounter issues:
Check with your Administrator - May need permission or configuration adjustments
Review Your Permissions - Verify your backend user has workspace and page access
Additional Resources
TYPO3 Backend User Manual - Learn more about the TYPO3 backend
Workspace Documentation - TYPO3's official workspace documentation
Your Organization's Workflow Guide - Ask your administrator for your organization's specific workflow guidelines
Assign User to Content
This document describes how the Assign feature works in Kanban Workspaces and how to test it.
How It Works
Overview
The Assign feature lets you assign a backend user to a workspace content element (a card on the kanban board). You can add an optional title and description for the assignment. The assignment is stored in the extension’s own table and is shown on the card (including assignee avatar when available). When you assign a different user (not yourself), that user receives an email notification. When the record is published, assignment data for that record is cleaned up automatically.
Flow
Assign You open the card context menu (⋯) and choose **Assign**.
A modal opens with:
**Title** (optional)
Description (optional)
**Assignee** (required) – select a backend user from the dropdown (populated from ``be_users``).
You click OK.
The extension sends the data to its own Ajax endpoint and saves one row in the table `sys_workspaces_assignee` (per record/workspace/assignee).
If the assignee is not the current user and has a valid email, an assignment notification email is sent (subject and body from Fluid templates).
The modal closes, a success message is shown, and the board refreshes.
After refresh, the card shows the assignee (avatar image or initial) in the card footer, using data enriched from sys_workspaces_assignee and be_users.
Display When the board loads (or refreshes), workspace data is enriched with assignee info from `sys_workspaces_assignee` and `be_users` (including avatar URL from FAL when the backend user has an avatar).
Each card that has an assignee shows it in the footer (avatar image if available, otherwise user initial).
Email notification When you assign another backend user (with a valid email), the extension sends one email per assignment using TYPO3’s mailer and Fluid email templates.
The email uses the SystemEmail layout and the extension’s templates under EXT:kanban_workspaces/Resources/Private/Templates/Email/ (e.g. AssignmentNotification).
* Sender and format can be overridden via Page TSconfig tx_workspaces.emails.*; otherwise global MAIL defaults (e.g. defaultMailFromAddress) apply.
Publish When a record is **published** (via TYPO3 workspace publish), the extension listens to the core event `AfterRecordPublishedEvent`.
It then deletes all rows in sys_workspaces_assignee for that table, record UID, and workspace.
* So assignments are only kept for draft/workspace content; they are not kept after publish.
Technical Summary
Storage: Table sys_workspaces_assignee (extension-owned). Optional TCA column t3ver_assignee on versioned tables points to the assignee mapping row; no core schema is changed beyond that.
UI: Assign is in the card context menu (⋯ → Assign). Assign modal uses TYPO3 backend Modal with assignee dropdown; assignee is shown on the card with .card-assignees / .user-avatar (avatar image or initial).
Backend: Ajax route kanban_workspace_assign (path /kanban-workspace/assign) → AssignAjaxController::assignAction; service AssigneeMappingService for persist and cleanup; AssignmentNotificationService for sending the assignee email; AssigneeCleanupAfterPublishListener for cleanup on publish; AssigneeEnrichmentListener to add assignee (and assignee avatar URL) to workspace data for display.
Email:AssignmentNotificationService uses MailerInterface, FluidEmail, and templates AssignmentNotification.html / AssignmentNotification.txt; fallback MAIL template/layout paths ensure the SystemEmail layout is found even when global MAIL config overwrites defaults.
How to Test
Prerequisites
TYPO3 with EXT:workspaces and EXT:kanban_workspaces installed and the database schema applied (so sys_workspaces_assignee exists).
Backend user logged in, with access to the Kanban Workspaces module.
Non-Live workspace – e.g. create or switch to a workspace (not “Live”).
Content in workspace – at least one page or content element that has a version in that workspace (so it appears as a card on the board).
Apply Database Schema (if needed)
If the table does not exist yet:
Option A: Install Tool → Compare database → apply changes so that sys_workspaces_assignee is created from ext_tables.sql.
Option B: If you use CLI: run your project’s database compare/sync command so that the extension’s schema is applied.
Get a Backend User UID
You need a valid backend user UID for the “Assignee” field:
In the TYPO3 backend, go to Admin Tools → Backend Users (or your user list), open a user and note the UID (e.g. 1, 2, 3).
Or query the database: SELECT uid, username FROM be_users WHERE uid > 0;
Test 1: Assign a user to a card
Switch to a non-Live workspace.
In the backend, go to Web → Kanban Workspaces.
Select a page in the page tree that has workspace content (so at least one card is visible).
Find a card on the board.
Open the card context menu (click the ⋯ “more” button on the card).
Click Assign.
In the modal:
**Title:** e.g. “Review requested”
Description: e.g. “Please check by Friday”
* Assignee (Backend user UID): enter a valid backend user UID (e.g. 1).
Click OK.
Expected: Modal closes.
A success notification (e.g. “Assignment saved”) appears.
* The board refreshes; the card shows the assignee in the footer (e.g. avatar with initial or “U1”).
Optional: Open the same module again (or refresh the page). The same card should still show the assignee (data comes from sys_workspaces_assignee + enrichment).
Test 2: Change assignee / title / description
On the same card, open the context menu again and choose Assign.
Change:
**Assignee** to another backend user UID, or
Title or Description.
Click OK.
Expected: Success message, board refresh, and the card shows the new assignee (and the stored title/description are updated in sys_workspaces_assignee).
Test 3: Validation (invalid assignee)
Open Assign on any card.
Leave Assignee empty or enter 0 or a non-existent UID.
Click OK.
Expected: Either validation prevents submit, or you see an error message and the modal may close without saving. No new/updated row in sys_workspaces_assignee for invalid data.
Test 4: Cleanup on publish
Note a card that has an assignee (e.g. table, UID, workspace).
Publish that record using TYPO3’s normal workspace publish (e.g. from the Workspaces list module or the action that publishes that version).
Expected: The record is published as usual.
Rows in sys_workspaces_assignee for that table, record_uid, and workspace_id are removed by the extension’s listener.
Verify: In the database, run:
SELECT * FROM sys_workspaces_assignee
WHERE table_name = '<table>' AND record_uid = <uid> AND workspace_id = <workspace_id>;
Copied!
There should be no rows for that combination after publish.
Test 5: Assignee visible after full reload
Assign a user to a card (Test 1).
Reload the Kanban Workspaces page (F5) or close and reopen Web → Kanban Workspaces.
Select the same page in the page tree.
Expected: The card still shows the assignee in the footer (enrichment from sys_workspaces_assignee + be_users).
Troubleshooting
“Assign URL not configured”
The Ajax route for assign is not available. Clear backend cache (Admin Tools → Flush TYPO3 and PHP cache). Ensure the extension is active and that no other extension overrides or disables the route.
Assignee not shown on card after assign
Board should refresh automatically. If not, reload the page. If assignee still does not appear, check that AssigneeEnrichmentListener is registered for AfterDataGeneratedForWorkspaceEvent and that sys_workspaces_assignee has a row for that record/workspace/assignee.
Assign modal does not open
Check the browser console for JavaScript errors. Ensure no other script overrides the card menu or modal behavior.
Table sys_workspaces_assignee does not exist
Run database compare from the Install Tool (or your schema sync) so that the extension’s ext_tables.sql is applied.
Cleanup on publish does not run
Ensure AssigneeCleanupAfterPublishListener is registered for AfterRecordPublishedEvent. Clear caches and try publishing again.
Email not sent after assign
Ensure the assignee is not the current user and has a valid email in the backend user record.
Configure MAIL in your TYPO3 config (e.g. defaultMailFromAddress, transport). See Configuration (MAIL configuration).
Check TYPO3 logs (e.g. var/log/typo3_*.log) for transport or template errors; the extension logs when email is skipped or fails.
The Kanban Workspaces extension is a backend-only module for TYPO3 that provides a kanban board interface
for managing workspace stages. It is designed to work with minimal configuration. Most settings are handled
automatically through TYPO3's core workspace functionality. However, administrators can customize behavior
through Extension Manager settings.
Extension Manager Configuration
The extension provides configuration options in the TYPO3 Extension Manager
(Admin Tools > Settings > Extension Configuration > kanban_workspaces).
By default the kanban board displays the workspace's default "Editing" stage
(stage 0) together with all custom stages.
Disable reset to editing stage
Setting name:disableResetToEditingStage
Type: Boolean (checkbox)
Default: Disabled (0)
Description:
When enabled, this option prevents TYPO3's DataHandler from resetting a
workspace record's stage back to the editing stage (stage 0) after one of the
record's fields is updated. With the option disabled (default), TYPO3's standard
behavior applies and an edited record may fall back to the "Editing" stage.
The option is read via the EmConfiguration accessor and evaluated by the
PreventResetToEditingStageDataHandlerHook DataHandler hook, which adjusts the
stage before the record is persisted.
Description:
These options override the titles of the three default TYPO3 workspace stages on
the kanban board and in the workspace module:
Setting
Stage (id)
Overrides
customStageEditTitle
Editing (0)
Title of the default "Editing" stage
customStageReadyToPublishTitle
Ready to publish (-10)
Title of the default "Ready to publish" stage
customStagePublishTitle
Publish (-20)
Title of the default "Publish" stage
Each value accepts either a hard-coded string (e.g. In review) or a
translation reference using the LLL:EXT:... syntax (e.g.
LLL:EXT:my_ext/Resources/Private/Language/locallang.xlf:stage.review). When a
value is empty (default), the original TYPO3 stage title is kept.
The titles are applied by extending TYPO3's
\TYPO3\CMS\Workspaces\Service\StagesService and overriding getStageTitle();
the extended service is registered in place of the core one via Symfony
dependency injection.
Backend Module Configuration Details
The backend module is registered and configured automatically. No additional TypoScript or template configuration is required for this backend-only extension.
Backend Module Configuration
Module Registration
The backend module is configured in Configuration/Backend/Modules.php:
inheritNavigationComponentFromMainModule: true - Uses main web module's navigation
access: 'user' - Available to regular backend users (not just admins)
workspaces: '*' - Available in all workspaces
icon - Icon displayed in the module menu
path - URL path for accessing the module
labels - Language file for localization
extensionName - Extension key for identifying the module
controllerActions - Maps controllers to available actions
Customizing Module Position
To change where the module appears in the Web menu, modify the position configuration:
// Position before Web > Info'position' => ['before' => 'web_info'],
// Position at the end of Web menu'position' => ['bottom'],
// Position at the top of Web menu'position' => ['top'],
Copied!
Service Configuration
Dependency Injection
The extension uses TYPO3's service container for dependency injection. Services are configured in Configuration/Services.yaml:
This configuration automatically registers classes in Classes/ and enables autowiring. The listed services are explicitly public so they can be resolved when the Assign Ajax controller is instantiated by the backend dispatcher.
Assignment Feature (Ajax Route and MAIL)
Ajax Route for Assign
The Assign feature uses a backend Ajax route so the kanban board can save assignments without leaving the module.
target – Controller class and action handling the request.
inheritAccessFromModule – Access is inherited from the Kanban Workspaces module (web_kanbanworkspaces).
No additional configuration is required; the route is registered when the extension is active. Clear backend cache if the route does not appear.
MAIL Configuration for Assignment Emails
When you assign a different backend user (not yourself) to a card, the extension can send an assignment notification email. TYPO3’s global MAIL configuration is used.
Recommended in your project config (e.g. ``config/system/settings.php``):
You can override sender and format per page using the workspaces email config:
tx_workspaces.emails {
senderEmail = no-reply@example.com
senderName = My Site
format = both
}
Copied!
The extension uses the same pattern as EXT:workspaces for email (FluidEmail, SystemEmail layout). Template/layout paths fall back to TYPO3 core/backend defaults when the global MAIL config does not define templateRootPaths / layoutRootPaths.
Troubleshooting: If assignment emails are not sent, ensure the assignee has a valid email in the backend user record, check MAIL.transport and defaultMailFromAddress, and review TYPO3 logs (e.g. var/log/typo3_*.log) for transport or template errors.
JavaScript Module Configuration
Backend JavaScript Modules
The extension loads backend JavaScript modules for the kanban board interface:
// Main kanban board application$this->pageRenderer->loadJavaScriptModule('@web-vision/kanban-workspaces/App.js');
// TYPO3 workspaces send-to-stage form component$this->pageRenderer->loadJavaScriptModule('@typo3/workspaces/renderable/send-to-stage-form.js');
These modules are loaded exclusively in the backend module interface. No frontend JavaScript is loaded by this extension.
Environment-Specific Configuration
Development Environment
For development, you may want to enable additional backend debugging:
// In your project's configuration
$GLOBALS['TYPO3_CONF_VARS']['BE']['debug'] = true;
Copied!
Production Environment
For production, ensure optimal performance by using TYPO3's standard caching configuration. The extension respects the default caching settings configured in your TYPO3 instance.
Multi-Site Configuration
Working with Multiple Sites
If your TYPO3 instance has multiple sites, the Kanban Workspaces module will work independently for each site:
Each site can have its own workspace configuration
Stages are workspace-specific, not site-specific
Users see workspaces based on their access permissions
The module respects site-specific language configurations
No site-specific configuration is needed—the extension automatically uses the active site's settings.
Workspace Configuration
Workspace Stages
Workspace stages are configured in the TYPO3 workspace settings, not in this extension. To configure stages:
Go to Admin Tools > Workspaces
Select a workspace to edit
Configure available stages for that workspace
Save the workspace configuration
The Kanban Workspaces extension will automatically display the configured stages on its board.
Custom Stages
To create custom stages:
In Workspace configuration, add new stages with custom titles
Set appropriate permissions for each stage
The kanban board will display all configured stages
Users can move items between stages based on their permissions
Accessing Content at Different Stages
The kanban board shows all content items at different stages in the workspace:
Stage 0 (Editing) - Default editing stage
Custom Stages - Any custom stages created for your workflow
Published - Items ready for publication
Each stage can have different permissions for editing, deletion, and stage transitions.
Event Listener Configuration
AfterDataGeneratedForWorkspaceEvent
The extension includes an event listener for workspace data generation. It is
registered via a PHP attribute (no manual Services.yaml entry required):
Purpose: Processes workspace data when it is generated (for example, enriching records with assignment information).
Configuration: No manual configuration needed—automatically registered by TYPO3's service container.
Performance Configuration
Caching
The extension respects TYPO3's caching strategy. Workspace data is typically not cached (to always show current status), but you can configure caching if needed:
Verify settings were actually saved in Extension Manager
Restart your web server if running locally
Module Position Wrong
If the module appears in the wrong location:
Check the position configuration in Configuration/Backend/Modules.php
Verify the referenced module (e.g., 'web_info') exists
Clear all caches and reload the backend
Check for module position conflicts with other extensions
Developer
Architecture Overview
The Kanban Workspaces extension follows modern TYPO3 v13 development practices, emphasizing clean architecture, dependency injection, and separation of concerns.
Key Principles:
TYPO3 v13 Compatibility - Built using TYPO3 v13 features and APIs
Dependency Injection - All services use constructor injection
Event Listeners - Hooks into TYPO3 workspace events
Service Container - Automatic service registration and autowiring
Modern PHP - Requires PHP 8.2+ with type declarations
PSR-4 Autoloading - Organized class structure following PSR-4 standard
Extension Manager settings are read through the
WebVision\KanbanWorkspaces\Configuration\EmConfiguration accessor. It is
instantiated by the static create() factory, wired via the
#[Autoconfigure(constructor: 'create')] attribute. The factory receives the
ExtensionConfiguration service, reads the raw values and type-casts them, so
the immutable value object only exposes properly typed settings:
#[Autoconfigure(constructor: 'create')]final readonly classEmConfiguration{
publicfunction__construct(
private bool $disableResetToEditingStage = false,
){}
publicstaticfunctioncreate(ExtensionConfiguration $extensionConfiguration): self{
// read + cast the raw extension configuration values here
}
}
Copied!
getDisableResetToEditingStage(): bool
Returns whether resetting a workspace record to the editing stage (stage 0)
after a field update should be prevented.
getCustomStageEditTitle(): string
getCustomStageReadyToPublishTitle(): string
getCustomStagePublishTitle(): string
Return the configured custom titles for the default "Editing", "Ready to
publish" and "Publish" stages. Each value is either a plain string, a
LLL:EXT:... reference, or empty (use the TYPO3 default).
Custom Stage Titles (StagesService override)
WebVision\KanbanWorkspaces\Service\StagesService extends the core
TYPO3\CMS\Workspaces\Service\StagesService and overrides getStageTitle()
to apply the customStage*Title options for the three default stages
(STAGE_EDIT_ID, STAGE_PUBLISH_ID, STAGE_PUBLISH_EXECUTE_ID). When the
matching option is empty, the parent implementation is called; a LLL:EXT:...
value is resolved through the language service, any other non-empty value is used
verbatim.
The core service is replaced through Symfony DI using the #[AsAlias]
attribute, so all consumers (and GeneralUtility::makeInstance()) receive the
extended service. The constructor is intentionally not overridden, so the parent
dependencies keep being autowired through the inherited constructor. The
EmConfiguration value object (a public service) is fetched on demand via
GeneralUtility::makeInstance() inside getStageTitle():
#[AsAlias(id: \TYPO3\CMS\Workspaces\Service\StagesService::class, public: true)]final readonly classStagesServiceextends \TYPO3\CMS\Workspaces\Service\StagesService{
publicfunctiongetStageTitle(int $stageId): string{
$emConfiguration = GeneralUtility::makeInstance(EmConfiguration::class);
// return the configured title (resolving LLL:) or fall back to parent
}
}
Copied!
DataHandler Hook
WebVision\KanbanWorkspaces\Hooks\PreventResetToEditingStageDataHandlerHook is
registered on the processDatamapClass hook in ext_localconf.php and
implements processDatamap_postProcessFieldArray. It only acts when the
operation is an update, the affected table has a workspace-aware TCA schema
(checked via TcaSchemaFactory), and disableResetToEditingStage is enabled.
It then removes t3ver_stage from the field array so TYPO3 does not reset the
record to the editing stage when the record is persisted.
Event Listeners
The extension registers its event listeners via PHP attributes
(#[AsEventListener]) in Classes/EventListener/:
AssigneeEnrichmentListener – listens to
TYPO3\CMS\Workspaces\Event\AfterDataGeneratedForWorkspaceEvent and enriches
the generated workspace records with their assignment information.
AssigneeCleanupAfterPublishListener – removes assignment rows for a record
and workspace after the record is published.
WorkspaceLanguageFallbackListener – applies language fallback handling for
workspace records.
Frontend JavaScript Architecture
The frontend is delivered as ES6 modules under Resources/Public/JavaScript/, import-mapped to
@web-vision/kanban-workspaces/ (see Configuration/JavaScriptModules.php). What used to be a single
Workspace.js file is now a central orchestrator with focused, single-responsibility collaborators.
Entry point and orchestrator
App.js – entry point loaded as the module trigger. It enables horizontal drag-to-scroll
(core/HorizontalScroll.js), instantiates WorkspaceBoard with the runtime options (API URLs,
feature flags such as enableDragDrop / enableFilters / enableSearch, mockData), and
registers the application-level event handlers — most importantly card:moved, which POSTs the move
to the workspace dispatch endpoint.
WorkspaceBoard.js – the WorkspaceBoard class. It owns the shared state (cards, stages, filters,
selection, undo/redo history, current workspace, search query) and the lifecycle wiring, and delegates
the real work to its collaborators. Collaborators are constructed with a back-reference to the board and
reach shared state and each other through it (e.g. this.board.data, this.board.renderer.renderBoard()).
Collaborators
Collaborator
File
Responsibility
WorkspaceApi
data/WorkspaceApi.js
Thin AJAX transport over the workspace dispatch endpoint; hands raw responses to the transformer. Does not touch the DOM.
DataTransformer
data/DataTransformer.js
Stateless conversion of raw TYPO3 workspace payloads into the card / comment / history / diff shapes consumed by the UI.
BoardRenderer
ui/BoardRenderer.js
Generates all board markup (columns, cards, filter sidebar) and re-attaches drag-and-drop after a render.
DragController
ui/DragController.js
Card drag-and-drop and column drop targets, drop placeholders, and starting the stage-transition workflow on drop.
ModalController
ui/ModalController.js
Preview modal (summary / comments / history tabs) and the custom Send-to-Stage modal, including the revert / approve workflow. Holds the transient send-to-stage form state.
FilterController
ui/FilterController.js
Search and filter interaction: keeps active filters and search query in sync, persists selections and triggers reloads / re-renders.
CardActions
ui/CardActions.js
Per-card context-menu actions: preview, edit, open page version, assign a backend user, discard the version, and the move / revert primitives.
EventEmitter
core/EventEmitter.js
Minimal pub/sub used for the board's custom events.
initHorizontalScroll
core/HorizontalScroll.js
Drag-to-scroll panning of the horizontal board (ignores drags starting on a card or column).
comment:added – a comment was added in the preview modal.
Stage Checklist Feature (Implementation)
The Stage Checklist feature adds optional checklist items per workspace stage. When editors move a card to a stage (drag or Approve/Revert), the "Send to Stage" modal shows that stage's checklist at the top. The checklist is display-only (no checkboxes or submission).
Database and TCA
Table:tx_kanbanworkspaces_stage_checklist (see ext_tables.sql). Columns: uid, pid, tstamp, crdate, deleted, sorting, stage (FK to sys_workspace_stage.uid), title.
TCA:Configuration/TCA/tx_kanbanworkspaces_stage_checklist.php defines the checklist table (label, sorting, delete, columns stage, title; record icon kanban-workspaces-stage-checklist).
TCA override:Configuration/TCA/Overrides/sys_workspace_stage.php adds checklist_items inline field to sys_workspace_stage (after responsible_persons). Inline: sortable, expandSingle, no sync/localization links.
Icons
File:Configuration/Icons.php registers kanban-workspaces-stage-checklist with SvgIconProvider, source EXT:kanban_workspaces/Resources/Public/Icons/checklist.svg. Used for TCA record icons and for each checklist row in the Send to Stage modal.
Controller
In KanbanWorkspacesController::indexAction(), each stage in the config is enriched with a checklist array. For each stage with uid >= 1, getChecklistForStage($stageUid) is called.
getChecklistForStage(int $stageUid): array – queries tx_kanbanworkspaces_stage_checklist for the given stage, deleted = 0, ordered by sorting. Deduplicates by uid and by title. Returns [ ['id' => uid, 'title' => title], ... ]. The array is part of WorkspaceConfig (JSON) passed to the frontend.
Frontend (Template, JavaScript, CSS)
Template: Send to Stage modal (#sendToStageModal) body order: #stageInfoBanner, then #stageChecklistSection / #stageChecklistList, then recipients, additional recipients, comments.
JavaScript:openSendToStageModal(formData, context) in ui/ModalController.js reads context.targetStage?.checklist, deduplicates by id/title, renders <ul> of <li class="stage-checklist-item"> with <span class="stage-checklist-item-icon"></span> and title; injects icon via Icons.getIcon('kanban-workspaces-stage-checklist', Icons.sizes.small) into each icon span. When modal is opened via Approve/Revert, handleNextStage / handleRevertStage (also in ui/ModalController.js) compute target stage and pass targetStage in context.
The Assign feature allows editors to assign a backend user to a workspace record (card). It consists of an Ajax controller, persistence service, notification service, two event listeners, a dedicated database table, and TCA enrichment.
Responsibility: Handles the Ajax request for saving an assignment (assignee, title, description) and triggers persistence and email notification.
Route:kanban_workspace_assign, path /kanban-workspace/assign (see Configuration/Backend/AjaxRoutes.php). Access is inherited from module web_kanbanworkspaces.
Note: The controller is instantiated by the backend dispatcher via GeneralUtility::makeInstance() (no constructor args). It resolves AssigneeMappingService and AssignmentNotificationService from the container inside the action; both services are registered as public in Configuration/Services.yaml.
Responsibility: Persists assignment data to sys_workspaces_assignee (insert or update per record/workspace), sets t3ver_assignee on the versioned record, and cleans up assignee rows when a record is published.
Key methods:
persistAssignmentWithMeta(beUserId, tableName, recordUid, workspaceId, stageId, title, description) – upserts one row in sys_workspaces_assignee and updates the record’s t3ver_assignee column.
cleanupForPublished(table, recordId, workspaceId) – deletes rows in sys_workspaces_assignee for the given table/record/workspace (called by AssigneeCleanupAfterPublishListener).
Responsibility: Sends an email to the assignee when they are assigned to a record (unless the assignee is the current user or has no valid email). Uses TYPO3’s MailerInterface and FluidEmail with the extension’s templates and the core SystemEmail layout.
Templates:Resources/Private/Templates/Email/AssignmentNotification.html and AssignmentNotification.txt. Fallback MAIL template/layout/partial paths (EXT:core, EXT:backend) are used when global MAIL config does not define them.
Configuration: Sender/format can be overridden via Page TSconfig tx_workspaces.emails.*; otherwise MAIL.defaultMailFromAddress / defaultMailFromName and transport apply.
Identifier:kanban-workspaces/assignee-enrichment (runs after kanban-workspaces/after-data-generated-for-workspace).
Responsibility: Enriches each workspace item in the event data with assignee info from sys_workspaces_assignee and be_users: assignee_uid, assignee_username, assignee_avatar_url (from FAL avatar when available). The frontend uses these to display the assignee on the card.
Responsibility: After a record is published, calls AssigneeMappingService::cleanupForPublished() to remove assignee rows for that table/record/workspace.
Database and TCA
Table:sys_workspaces_assignee (defined in ext_tables.sql). Columns include uid, pid, tstamp, crdate, title, description, be_user, table_name, record_uid, workspace_id, stage_id. One row per record/workspace (last assignee wins on update).
TCA:Configuration/TCA/Overrides/t3ver_assignee.php adds a read-only t3ver_assignee column (select on sys_workspaces_assignee) to all tables with versioningWS, so the versioned record can reference the assignee mapping row.
Services and Ajax Route
Services.yaml:AssigneeMappingService and AssignmentNotificationService are explicitly public so they can be resolved from the container when AssignAjaxController is created by makeInstance. KanbanWorkspacesController and EmConfiguration remain public for module and config access.
Ajax route:Configuration/Backend/AjaxRoutes.php registers route kanban_workspace_assign with path /kanban-workspace/assign and target AssignAjaxController::assignAction.
API Reference
Controller Interface
The KanbanWorkspacesController extends ActionController and provides the backend module interface:
Clear browser cache completely:
- Press Ctrl+Shift+Del
- Clear all browsing data
- Hard-refresh page (Ctrl+Shift+R)
Check browser compatibility:
- Use modern browsers: Chrome 90+, Firefox 88+, Safari 14+, Edge 90+
- Ensure JavaScript is enabled
- Try different browser to isolate issue
Check TYPO3 cache:
- Admin Tools > Maintenance > Flush all caches
- Then reload kanban board module
Verify extension assets are loaded:
- Open browser DevTools (F12)
- Network tab
- Check CSS and JS files load with 200 status
- Check console for loading errors
---
Stage Transitions Not Working
Issue: Dragging items between stages doesn't work or shows errors.
Possible Causes:
User lacks permission to edit items
User lacks permission in target stage
Workspace doesn't allow stage transitions
JavaScript initialization failed
Solutions:
Check workspace permissions:
- Admin Tools > Workspaces > [Select Workspace]
- Verify user has edit rights in all stages
- Verify target stage allows transitions
Check page/item access:
- Users can only move items they can edit
- Verify page access control list allows editing
- Check field restrictions don't prevent stage field updates
Test with admin user:
- If admin can move items but regular user can't, it's a permissions issue
- Adjust workspace/page/field permissions
Check browser console:
- F12 > Console tab
- Look for error messages
- Check Network tab for failed API requests
---
Performance Issues
Issue: Kanban board loads slowly or becomes unresponsive with many items.
Causes:
Large number of items in workspace (hundreds or thousands)
Deep page tree being displayed
All languages shown at once
Insufficient server resources
Solutions:
Use depth filter:
- Select "This Page" or "1 Level" instead of "Infinite"
- Reduces displayed items significantly
Filter by language:
- Show one language at a time instead of "All"
- Reduces items by language count factor
Filter by stage:
- Show specific stages instead of all stages
- Helps focus on relevant items
Consider workspace size:
- Regularly publish items to keep workspace manageable
- Split large workspaces if needed
- Archive completed versions
Server resources:
- Check server CPU and memory usage
- Ensure database has proper indexes
- Consider database optimization
---
Multi-Language Issues
Issue: Language filter shows unexpected language combinations.
Behavior: Language filter shows all configured site languages, not just active translations.
Reason: TYPO3 can have language definitions that don't have actual content.
Solutions:
Use language filter to show only languages with actual content
Verify language configuration in Site Settings
Check translation status of pages
---
Issue: Items from default language shown even with non-default language selected.
Reason: Some TYPO3 pages fallback to default language content if translation doesn't exist.
Solutions:
Ensure page translations exist before filtering
Check fallback language configuration in site settings
Create translations for all needed languages
---
Workspace-Related Issues
Issue: Changes made in kanban board don't save to workspace.
Disable reset to editing stage – New extension configuration option disableResetToEditingStage; when enabled
it prevents TYPO3's DataHandler from resetting a workspace record's stage back to the editing stage (stage 0) after
a field update.
Custom titles for default stages – New extension configuration options customStageEditTitle,
customStageReadyToPublishTitle and customStagePublishTitle to override the titles of the default TYPO3
workspace stages (Editing, Ready to publish, Publish). Each accepts a plain string or a LLL:EXT:... translation
reference; empty keeps the TYPO3 default. Implemented by extending StagesService::getStageTitle().
Breaking / Removed
Disable default stage and Default StageId - Disabling default stage (editing) and configure a default custom
stage id to use has been removed; Removing default stage editing is not reasonable and the Default Custom Stage Id
needs to be done on workspace level because multiple workspaces does not have the same custom stage at all. Removed
for now and postponed to be added in more workable stage at a later point.
Version 0.0.1
Initial Release
This is the first stable release of the Kanban Workspaces extension for TYPO3 as preview/experimental alpha version.
Supported Versions
TYPO3: 13.4.0+ (v13 LTS) && 14.3.0+ (v14 LTS)
PHP: 8.2.0 to 8.5.99
Browsers: TYPO3 Backend policy, last two supported versions of (Chrome, Firefix, Safari)
New Features
Checklist items per stage – In Admin Tools > Workspaces, edit a workspace and expand a custom stage; add, reorder, or remove checklist entries in the "Checklist items" inline section.
Checklist in Send to Stage modal – When moving a card to a stage, the modal shows that stage's checklist (list with icon per item) below the info banner; empty stages show no checklist section.
Assign user to card – Card context menu (⋯) → Assign opens a modal to set Title (optional), Description (optional), and Assignee (required; select from backend user list).
Assignee on card – Each card shows the assignee in the footer (avatar image from FAL when available, otherwise user initial).
Assignment notification email – When you assign a different user (not yourself) with a valid email, that user receives an email (Fluid templates, SystemEmail layout).
Cleanup on publish – When a record is published via TYPO3 workspace publish, assignment rows for that record/workspace are removed automatically.
Multi-stage Workflow Support - Support for custom workspace stages with drag-and-drop transitions
Depth-based Content Filtering - Filter displayed content by page tree depth (0-4 levels or infinite)
Multi-language Support - Filter content by system languages (all languages, specific languages)
Stage-based Filtering - Show items from specific workflow stages
Backend Module Integration - Integrated into TYPO3 Web module with proper navigation
Dynamic Stage Configuration - Auto-configuration from workspace settings
TYPO3 v13 Compatibility - Full support for TYPO3 v13.4.0+ LTS
Persistent Filter State Per User - User filter preferences are automatically saved and restored on subsequent visits
Bulk Stage Transitions - Drag-and-drop functionality for moving multiple items between workflow stages simultaneously
Technical Details
Framework: TYPO3 v13.4.0+ && TYPO3 v14.3.0+
PHP: PHP 8.2.0+
Architecture: Modern TYPO3 service container, dependency injection
Code Quality: PSR-12 compliant, full type declarations, TYPO3 coding standards
Documentation: Comprehensive documentation for administrators, editors, and developers
Table:tx_kanbanworkspaces_stage_checklist – stores stage (FK to sys_workspace_stage), title, sorting (see ext_tables.sql).
TCA:Configuration/TCA/tx_kanbanworkspaces_stage_checklist.php; Configuration/TCA/Overrides/sys_workspace_stage.php adds checklist_items inline to workspace stage form.
Icons:Configuration/Icons.php registers kanban-workspaces-stage-checklist (Resources/Public/Icons/checklist.svg) for TCA and modal list items.
Controller:KanbanWorkspacesController::getChecklistForStage() loads and deduplicates items; stage config passed to frontend includes checklist array per stage.
Frontend:ui/ModalController.js renders checklist in openSendToStageModal; targetStage passed from approve/revert handlers so checklist and banner show for the correct stage.
TCA:t3ver_assignee column added to all versioned tables (references sys_workspaces_assignee); see Configuration/TCA/Overrides/t3ver_assignee.php.
Ajax route:kanban_workspace_assign (path /kanban-workspace/assign) → AssignAjaxController::assignAction; see Configuration/Backend/AjaxRoutes.php.
Services:AssigneeMappingService (persist/cleanup), AssignmentNotificationService (email); both public in Configuration/Services.yaml.
Event listeners:AssigneeEnrichmentListener (AfterDataGeneratedForWorkspaceEvent – enriches workspace data with assignee/avatar); AssigneeCleanupAfterPublishListener (AfterRecordPublishedEvent – cleanup).
Email templates:Resources/Private/Templates/Email/AssignmentNotification.html and AssignmentNotification.txt; MAIL config (e.g. defaultMailFromAddress, transport) required for sending.
Documentation
Administrator: Stage Checklist (Workspace Stages) – where and how to configure checklist items; see Administrator.
Administrator Guide - Installation, configuration, access control, troubleshooting; see Administrator.
Configuration: MAIL and Ajax route configuration for assignment emails; see Configuration.
Configuration Guide - All configuration options, TypoScript, service configuration
Editor: Stage checklist in the Send to Stage modal – when it appears and what you see; see Editor.