Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
d397cd9
Add openspec structure files from template
WilcoLouwerse Mar 24, 2026
af75cbd
Update docs and openspec specs — tasks, time-tracking, features, desi…
WilcoLouwerse Mar 26, 2026
9c330ea
Extend Nextcloud compatibility to v34, update openspec config
WilcoLouwerse Mar 26, 2026
f9426a9
feat(openspec): expand specs with ADRs and detailed feature documenta…
WilcoLouwerse Mar 26, 2026
1ea3671
docs: expand app description with positioning vs Nextcloud Deck and Jira
WilcoLouwerse Mar 26, 2026
9517ed1
feat(openspec): add 8 MVP change artifacts and resolve architecture q…
WilcoLouwerse Apr 2, 2026
6744c7c
feat: implement MVP register schemas, seed data, and deep links
WilcoLouwerse Apr 2, 2026
be85672
feat: implement register-schemas — 5 schemas with seed data for Plani…
WilcoLouwerse Apr 3, 2026
825931b
Merge pull request #3 from ConductionNL/feature/2/register-schemas
WilcoLouwerse Apr 3, 2026
1c5e983
feat(projects): scaffold projects feature — views, store, router, nav…
WilcoLouwerse Apr 3, 2026
c424e61
feat: implement project management UI (projects change)
WilcoLouwerse Apr 3, 2026
a1a58a6
test: add reusable test scenarios TS-001 through TS-014 for projects …
WilcoLouwerse Apr 3, 2026
8c9e9ac
Merge pull request #5 from ConductionNL/feature/4/projects
WilcoLouwerse Apr 3, 2026
05fe4c0
docs: add feature documentation for tasks, kanban, dashboard, time tr…
WilcoLouwerse Apr 3, 2026
6c7c432
docs: add bug tasks from test-app results (2026-04-04)
WilcoLouwerse Apr 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/code-quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@ jobs:
app-name: planix
php-version: "8.3"
php-test-versions: '["8.3", "8.4"]'
nextcloud-test-refs: '["stable31", "stable32"]'
nextcloud-test-refs: '["stable31", "stable32", "stable33"]'
enable-psalm: true
enable-phpstan: true
enable-phpmetrics: true
enable-frontend: true
enable-eslint: true
enable-phpunit: true
enable-newman: true
enable-newman: false
additional-apps: '[{"repo":"ConductionNL/openregister","app":"openregister","ref":"main"}]'
enable-sbom: true
56 changes: 56 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.2.1] - 2026-04-03

### Added
- Project list view with search (debounced 300 ms) and status filter chips (Active / Archived / Completed)
- Project list item shows color swatch, icon, title, member count badge, and status badge
- Empty state with "No projects yet" prompt and separate "No results" state for filtered lists
- Project creation modal dialog with title, description, color, and icon fields
- Inline form validation: submit disabled until title is provided; "Title is required" message on blur
- Loading spinner on submit button during project creation; dialog locked while saving
- Automatic creation of 4 default kanban columns on new project (configurable via admin settings)
- Project board shell view at `/projects/:id` with header, gear icon, and "View Backlog" link
- Project backlog placeholder view at `/projects/:id/backlog` with breadcrumb navigation
- Project settings sidebar with three sections: Details, Members, and Danger Zone
- Immediate metadata reflection: title/color/icon changes appear in page header without reload
- Member management: add members via Nextcloud user search; remove with assigned-task warning
- Leave project flow with last-member protection dialog
- Archive project action with inline confirmation in Danger Zone
- Project deletion cascade: removes columns, tasks, and time entries in dependency order
- Delete confirmation dialog showing task count before destructive action
- Access control: project list filtered to current user's memberships; non-member direct URL shows access-denied state
- Projects navigation entry in sidebar (NcAppNavigationItem, positioned first)
- Routes for `/projects`, `/projects/:id`, and `/projects/:id/backlog`
- Full Dutch (nl) translations for all project-related strings

### Fixed
- Webpack `output.publicPath` overridden to `/apps-extra/planix/js/` — chunks were loading from wrong path (`/apps/planix/js/`) causing 404 on all code-split bundles
- Settings sidebar save now includes `members` field in PATCH request, preventing member list from being cleared on title/description updates
- `NcChip` import fixed to use component path directly (`@nextcloud/vue/dist/Components/NcChip.js`) — not exported from main index in v8.16.0
- OpenRegister register updated to `publicWrite: true` / `publicRead: true` on app upgrade via repair step

## [0.2.0] - 2026-04-03

### Added
- Define task schema with all properties (title, description, status, priority, project, etc.)
- Define project schema with all properties (title, description, status, color, icon, members, etc.)
- Define column schema for kanban boards (title, project, order, wipLimit, color, type)
- Define timeEntry schema for time tracking (task, user, duration, date, description)
- Define label schema for categorization (title, color, description)
- Add seed data: 5 labels (Bug, Feature, Docs, Design, Infrastructure)
- Add seed data: 3 projects (Client Portal v2, Infrastructure Migration, Onboarding Automation)
- Add seed data: 12 columns (4 per project: To Do, In Progress, Review, Done)
- Add seed data: 5 tasks with realistic assignments and priorities
- Add seed data: 3 time entries referencing task seeds
- Register repair step for automatic schema import on app install/upgrade
- Bump register version to 0.2.0

### Changed
- Remove placeholder example schema from planix_register.json
- Remove example schema references from DeepLinkRegistrationListener
43 changes: 30 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

---

Planix is a Kanban-based project and task management app for Nextcloud, built as a thin client on OpenRegister. It manages projects, tasks, kanban boards with WIP limits, backlogs, and time entries for internal dev and IT teams.
Planix is a Kanban-based project and task management app for Nextcloud, built as a thin client on OpenRegister. It manages projects, tasks, kanban boards with WIP limits, backlogs, and time entries — giving internal dev and IT teams a focused workflow tool built directly into their Nextcloud environment. Unlike Nextcloud Deck (which lacks backlog management, time tracking, and WIP limits), Planix closes the gap between Deck's simplicity and Jira's complexity.

> **Pre-wired for [OpenRegister](https://github.com/ConductionNL/openregister)** — all data is stored as OpenRegister objects. If your app needs OpenRegister, install it first. If not, remove the dependency from `appinfo/info.xml` and `openspec/app-config.json`.

Expand All @@ -26,14 +26,27 @@ _Add screenshots here once the app has a UI._

## Features

Features are defined in [`openspec/specs/`](openspec/specs/). See the [roadmap](openspec/ROADMAP.md) for planned work.
Features are defined in [`openspec/specs/`](openspec/specs/). See the [roadmap](openspec/ROADMAP.md) for planned work. Full feature documentation is in [`docs/features/`](docs/features/).

### Core
- **Dashboard** — Personal overview page with key information at a glance
- **Admin Settings** — Configurable settings panel for administrators
### Task & Project Management
- **Projects** — Create and manage project containers with team members, colors, and kanban boards
- **Tasks** — Full task lifecycle with priorities, labels, assignees, due dates, and status tracking (open → in progress → done)
- **Backlog** — Task queue for unscheduled work with sorting and filtering; tasks promote to the board via drag-and-drop
- **Kanban Board** — Visual board per project with configurable columns, drag-and-drop cards, and WIP limits

### Personal Productivity
- **Dashboard & My Work** — Personal landing page with KPI cards (open, overdue, in progress, done today), recent projects, and tasks due this week; My Work groups all assigned tasks by urgency
- **Time Tracking** — Estimate effort per task, log multiple time entries (duration + date + description), and review logged time in a personal timesheet view

### Integration
- **Procest Integration** — Link tasks and projects to Procest cases via `caseReference` (project) and `zaakUuid` (task) fields; case badges appear in the project list and task detail

### Admin & Configuration
- **Admin Settings** — Configurable admin panel for default columns, label management, and OpenRegister initialization; uses `CnVersionInfoCard` and `CnSettingsSection` components
- **User Settings** — Per-user notification preferences and default view selection via `NcAppSettingsDialog`

### Supporting
- **OpenRegister Integration** — Pre-wired data layer using OpenRegister objects
- **OpenRegister Integration** — All data stored as OpenRegister objects; no custom database tables
- **Quality Pipeline** — PHPCS, PHPMD, Psalm, PHPStan, ESLint, Stylelint

## Architecture
Expand All @@ -46,15 +59,19 @@ graph TD
A --> E[Nextcloud Search]
```

_Update this diagram during `/app-explore` sessions as the architecture evolves._
See [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) for the full architecture breakdown.

### Data Model

| Object | Description |
|--------|-------------|
| _(define your data objects here)_ | — |
| Object | Schema.org Type | Description |
|--------|----------------|-------------|
| Task | `schema:Action` / `schema:PlanAction` | Core unit of work — title, description, assignee, due date, priority, status, estimates |
| Project | `schema:CreativeWork` | Container for tasks and kanban board — teams, members, metadata |
| Column | `schema:DefinedTerm` | Kanban board column — configurable stages with WIP limits |
| TimeEntry | `schema:QuantitativeValue` | Effort log — task, user, duration (minutes), date, description |
| Label | `schema:DefinedTerm` | Cross-project tag — name, color, description |

_Data model is defined using OpenRegister schemas. See [`openspec/specs/`](openspec/specs/) for feature-level design decisions and [`openspec/architecture/`](openspec/architecture/) for architectural decisions._
Data model is defined using OpenRegister schemas. See [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md) for full entity definitions and standards mapping, [`openspec/specs/`](openspec/specs/) for feature-level requirements, and [`openspec/architecture/`](openspec/architecture/) for architectural decisions.

### Directory Structure

Expand Down Expand Up @@ -94,8 +111,8 @@ planix/

| Dependency | Version |
|-----------|---------|
| Nextcloud | 28 – 33 |
| PHP | 8.1+ |
| Nextcloud | 31 – 33 |
| PHP | 8.3+ |
| Node.js | 20+ |
| [OpenRegister](https://github.com/ConductionNL/openregister) | latest |

Expand Down
17 changes: 13 additions & 4 deletions appinfo/info.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<name lang="nl">Planix</name>
<summary lang="en">Flow-based kanban project and task management for Nextcloud dev and IT teams</summary>
<summary lang="nl">Flow-gebaseerd kanban project- en taakbeheer voor Nextcloud dev- en IT-teams</summary>
<description lang="en"><![CDATA[Planix is a Kanban-based project and task management app for Nextcloud, built as a thin client on OpenRegister. It manages projects, tasks, kanban boards with WIP limits, backlogs, and time entries for internal dev and IT teams.
<description lang="en"><![CDATA[Planix is a Kanban-based project and task management app for Nextcloud, built as a thin client on OpenRegister. It manages projects, tasks, kanban boards with WIP limits, backlogs, and time entries — giving internal dev and IT teams a focused workflow tool built directly into their Nextcloud environment. Unlike Nextcloud Deck (which lacks backlog management, time tracking, and WIP limits), Planix closes the gap between Deck's simplicity and Jira's complexity.

**Key Features**

Expand Down Expand Up @@ -34,8 +34,8 @@ Vrij en open source onder de EUPL-1.2-licentie.

**Ondersteuning:** Voor ondersteuning, neem contact op via support@conduction.nl.
]]></description>
<version>0.1.0</version>
<licence>agpl</licence>
<version>0.2.1</version>
<licence>eupl</licence>
<author mail="info@conduction.nl" homepage="https://www.conduction.nl/">Conduction</author>
<namespace>Planix</namespace>
<documentation>
Expand All @@ -52,7 +52,7 @@ Vrij en open source onder de EUPL-1.2-licentie.
<screenshot>https://raw.githubusercontent.com/ConductionNL/planix/main/img/app-store.svg</screenshot>

<dependencies>
<nextcloud min-version="28" max-version="33"/>
<nextcloud min-version="28" max-version="34"/>
<php min-version="8.1"/>
</dependencies>

Expand All @@ -69,4 +69,13 @@ Vrij en open source onder de EUPL-1.2-licentie.
<admin>OCA\Planix\Settings\AdminSettings</admin>
<admin-section>OCA\Planix\Sections\SettingsSection</admin-section>
</settings>

<repair-steps>
<install>
<step>OCA\Planix\Repair\InitializeSettings</step>
</install>
<post-migration>
<step>OCA\Planix\Repair\InitializeSettings</step>
</post-migration>
</repair-steps>
</info>
19 changes: 11 additions & 8 deletions docs/ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,8 @@ A task is the core unit of work in Planix. Tasks belong to a project, can be pla
| `description` | string | `DESCRIPTION` | `schema:description` | — | No | — |
| `status` | enum | `STATUS` | `schema:actionStatus` | `status` | Yes | `open` |
| `priority` | enum: low, normal, high, urgent | `PRIORITY` (1-9) | — | — | No | `normal` |
| `project` | reference | `RELATED-TO` (parent project) | — | `zaakUuid` (optional) | No | — |
| `project` | reference | `RELATED-TO` (parent project) | — | — | No | — |
| `zaakUuid` | string (UUID) | — | — | Procest case UUID (cross-app bridge) | No | null |
| `column` | reference | — | — | — | No | null (backlog) |
| `columnOrder` | integer | — | `schema:position` | — | No | 0 |
| `assignedTo` | string (user UID) | `ATTENDEE` | `schema:agent` | `toegewezenAanGebruikersnaam` | No | — |
Expand Down Expand Up @@ -404,19 +405,21 @@ Schemas MUST be defined in `lib/Settings/planix_register.json` using OpenAPI 3.0

The configuration is imported via `ConfigurationService::importFromApp()` in the repair step.

## 5. Open Research Questions
## 5. Resolved Research Questions

1. **CalDAV VTODO sync** — Should Planix offer two-way sync with the Nextcloud Tasks app (CalDAV)? The Tasks app already supports VTODO. A sync would let tasks appear in mobile Calendar apps. Current decision: store `calendarEventUid` field and implement one-way export in V1.
All research questions below have been resolved. Decisions are recorded in the app-specific ADRs under [`openspec/architecture/`](../openspec/architecture/).

2. **Sub-task depth** — OpenProject supports unlimited hierarchy; GitHub Issues has no hierarchy. One level of sub-tasks (task → sub-task) is planned. Should we support epic → task → sub-task (three levels)? Current decision: one level only in MVP.
1. **CalDAV VTODO sync** — **One-way export to Nextcloud Tasks app in V1.** The `calendarEventUid` field on Task stores the VTODO UID. Planix writes tasks to CalDAV; changes made in the Tasks app are not synced back. Two-way sync was rejected due to data model mismatch (Tasks app has no concept of projects, columns, or WIP limits).

3. **Procest task bridge** — When a Procest case creates tasks in Planix, who owns the project? Does each case get its own Planix project, or do case tasks appear in an existing project? Current decision: a dedicated Planix project per case (with `caseReference` linking back).
2. **Sub-task depth** — **One level only (task → sub-task), all tiers.** Projects serve the "epic" grouping role. No formal Epic entity. This matches Linear and Plane (1 level + containers) and avoids Jira's 3-level complexity.

4. **Time tracking scope** — Should time entries be per-task only, or also per-project (overhead, meetings)? Current decision: per-task only in MVP. Overhead tracking in V1.
3. **Procest task bridge** — **Configurable — Procest UI decides.** Procest's UI presents a project picker when creating tasks for a case. It may create a new project (with `caseReference`) or add tasks to an existing project (with `zaakUuid` on each task). Planix has no routing mechanism — it reads whatever Procest wrote to OpenRegister. See ADR-003.

5. **GitHub/GitLab sync** — Dev teams want tasks linked to commits and PRs. Should Planix natively sync with GitHub Issues or GitLab Issues? Current decision: out of scope for MVP; targeted for V1 via OpenConnector.
4. **Time tracking scope** — **Per-task only, forever.** `TimeEntry.task` is always required. Overhead work (meetings, planning) is tracked as tasks — not as project-level time entries. This keeps the data model simple and queryable. No special cases needed. See ADR-004.

6. **WIP limit enforcement** — Should WIP limits be hard (block task drag) or soft (visual warning only)? Current decision: soft limits with prominent visual warning (industry consensus: hard limits cause friction).
5. **GitHub/GitLab sync** — **Via OpenConnector in V1.** Planix owns no GitHub/GitLab API code. OpenConnector handles the external API mapping (GitHub Issues ↔ Planix tasks). This avoids duplicating integration logic across Conduction apps.

6. **WIP limit enforcement** — **Soft limits with visual warning.** Column header turns orange/red when over the WIP limit; counter shows e.g. `4/3`. Drag is never blocked. Industry consensus: hard limits cause friction and workarounds (Jira, Kanboard both use soft limits).

## 6. References

Expand Down
Loading
Loading