diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml index db6aef8..c1e0b49 100644 --- a/.github/workflows/code-quality.yml +++ b/.github/workflows/code-quality.yml @@ -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 diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..3dfdd09 --- /dev/null +++ b/CHANGELOG.md @@ -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 diff --git a/README.md b/README.md index 2b20572..5292514 100644 --- a/README.md +++ b/README.md @@ -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`. @@ -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 @@ -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 @@ -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 | diff --git a/appinfo/info.xml b/appinfo/info.xml index e8b09ed..ccce0fd 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -6,7 +6,7 @@ Planix Flow-based kanban project and task management for Nextcloud dev and IT teams Flow-gebaseerd kanban project- en taakbeheer voor Nextcloud dev- en IT-teams - - 0.1.0 - agpl + 0.2.1 + eupl Conduction Planix @@ -52,7 +52,7 @@ Vrij en open source onder de EUPL-1.2-licentie. https://raw.githubusercontent.com/ConductionNL/planix/main/img/app-store.svg - + @@ -69,4 +69,13 @@ Vrij en open source onder de EUPL-1.2-licentie. OCA\Planix\Settings\AdminSettings OCA\Planix\Sections\SettingsSection + + + + OCA\Planix\Repair\InitializeSettings + + + OCA\Planix\Repair\InitializeSettings + + diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index f54daee..049c944 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -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 | — | @@ -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 diff --git a/docs/DESIGN-REFERENCES.md b/docs/DESIGN-REFERENCES.md index c986ff6..2d02c1d 100644 --- a/docs/DESIGN-REFERENCES.md +++ b/docs/DESIGN-REFERENCES.md @@ -389,6 +389,59 @@ CnSettingsSection (name="OpenRegister Setup", ...) **Note**: Uses `NcAppSettingsDialog` (NOT `NcDialog`). Triggered from the `?` / gear icon in the Planix top navigation bar. See `openspec/specs/nextcloud-app/spec.md` for the authoritative pattern. +### 3.9 Timesheet View + +``` +┌────────────────────────────────────────────────────────────────────┐ +│ PLANIX › My Timesheet │ +├────────────────────────────────────────────────────────────────────┤ +│ [This week ▾] Mar 24 – Mar 30, 2026 Total: 14h 30m │ +├────────────────────────────────────────────────────────────────────┤ +│ │ +│ 📅 Monday, Mar 24 2h 45m │ +│ ──────────────────────────────────────────────────────────────── │ +│ Fix auth token expiry bug API Gateway 0h 45m [✎] [✕] │ +│ Write deployment checklist Infra Migration 2h 00m [✎] [✕] │ +│ │ +│ 📅 Tuesday, Mar 25 4h 00m │ +│ ──────────────────────────────────────────────────────────────── │ +│ Fix auth token expiry bug API Gateway 1h 30m [✎] [✕] │ +│ Migrate to PostgreSQL pool API Gateway 2h 30m [✎] [✕] │ +│ │ +│ 📅 Wednesday, Mar 26 3h 45m │ +│ ──────────────────────────────────────────────────────────────── │ +│ Review PR #42 — rate limiting API Gateway 0h 45m [✎] [✕] │ +│ Add CSRF token validation API Gateway 3h 00m [✎] [✕] │ +│ │ +│ 📅 Thursday, Mar 27 · 2h 30m │ 📅 Friday, Mar 28 · 1h 30m │ +│ ──────────────────────────────┤──────────────────────────────── │ +│ Pagination for /list 1h 00m │ Write OpenAPI 3.0 spec 1h 30m │ +│ Update error format 1h 30m │ │ +│ │ +├────────────────────────────────────────────────────────────────────┤ +│ Week total: 14h 30m [+ Log time] │ +└────────────────────────────────────────────────────────────────────┘ +``` + +**Component hierarchy**: +``` +CnListViewLayout (title="My Timesheet") +├─ date range selector (This week / Last week / This month / Custom) +├─ week total badge +├─ CnDataTable (grouped by date) +│ ├─ date group header (date label + daily total) +│ └─ rows: task title (link) | project badge | duration | [edit] [delete] +└─ week total footer + [+ Log time] CTA +``` + +**Key UX patterns** (sourced from Leantime, OpenProject, Harvest): +- Date grouped rows with daily subtotals — scan work patterns at a glance +- Inline edit and delete per row — correct mistakes without navigating away +- Task title is a clickable link → task detail view (back returns to timesheet) +- Week view with mini day columns for at-a-glance density when days are sparse +- Weekly total prominently displayed in header and footer +- "Log time" CTA always visible — encourages consistent logging + --- ## 4. Updated Feature Counts (after design review) diff --git a/docs/FEATURES.md b/docs/FEATURES.md index d845788..d826b3d 100644 --- a/docs/FEATURES.md +++ b/docs/FEATURES.md @@ -12,7 +12,7 @@ Nextcloud Deck is the only native Nextcloud kanban app — and it is fundamental | Name | Status | Key Features | Gaps | |------|--------|-------------|------| -| **Nextcloud Deck** | Bundled, active (v1.17, Feb 2026) | Kanban boards, cards, labels, file attachment, mobile apps, Circles sharing | No backlog, no time tracking, no GitHub sync, no WIP limits, 6500+ DB queries per board, no multi-view | +| **Nextcloud Deck** | Bundled, active | Kanban boards, cards, labels, file attachment, mobile apps, Circles sharing | No backlog, no time tracking, no GitHub sync, no WIP limits, 6500+ DB queries per board, no multi-view | | **Nextcloud Tasks** | Bundled, active | CalDAV/VTODO task sync, due dates, priorities, sub-tasks | No project grouping, no kanban board, no time tracking, no team collaboration | | **Nextcloud Deck Extended** | Community, low activity | Minor Deck extensions | Unmaintained, Deck fork approach | @@ -22,9 +22,9 @@ Nextcloud Deck is the only native Nextcloud kanban app — and it is fundamental | Name | GitHub ★ | Positioning | Key Features | Weaknesses | |------|----------|------------|-------------|------------| -| **Plane** | 38.6k | Linear alternative, GitHub-native | Kanban, list, calendar views; cycles (sprints); GitHub/GitLab sync; modules/epics; issue templates | No time tracking, no Gantt, no backlog management, SaaS-first | +| **Plane** | 40k+ | Linear alternative, GitHub-native | Kanban, list, calendar views; cycles (sprints); GitHub/GitLab sync; epics (archivable); project subscribers; workspace-level kanban/calendar; Plane AI (web search, chart generation); Slack routing; Jira import | No time tracking, no Gantt, SaaS-first | | **Taiga** | ~10k | Agile teams, Scrum+Kanban | Scrum boards, backlog, burndown charts, epics, user stories, wiki, swimlanes, WIP limits | No GitHub PR integration, complex UI, no time tracking | -| **Vikunja** | 3.6k | Self-hosted flexible | Kanban, list, Gantt, table views; recurring tasks; email notifications | No sprint/cycle, no GitHub integration, no time tracking, smaller community | +| **Vikunja** | 5k+ (1.0 stable Jan 2026) | Self-hosted flexible | Kanban, list, Gantt (overhauled v2.2), table views; recurring tasks; task duplication; email notifications | No sprint/cycle, no GitHub integration, no time tracking | | **WeKan** | 14.6k | Trello alternative | Kanban boards, automation rules, swimlanes, 70+ languages, Trello import | Kanban-only, no agile features, no time tracking, Meteor stack | | **Kanboard** | 9.5k | Minimalist kanban | WIP limits, query language, LDAP, GitHub webhooks | Kanban-only, minimal by design, no time tracking, no backlog | | **Leantime** | — | Goal-driven PM | Kanban, Gantt, time tracking, time blocking, whiteboard, sprints, neuro-inclusive | Limited GitHub integration, smaller community, complex for small teams | @@ -89,6 +89,10 @@ No dedicated Dutch government task management tools were identified. OpenProject | Column color coding | **MVP** | Visual workflow clarity | | Swimlanes (group cards by assignee or priority) | **V1** | Workload visibility | | Board filter (by assignee, label, priority) | **MVP** | Focus on relevant work | +| View toggle on board (kanban ↔ list) | **MVP** | Users need a dense list view alongside kanban for large projects (Linear, Plane, Jira pattern) | +| Task card hover quick-actions (assign, set due date, change status) | **MVP** | Assign/update without opening detail — Jira, Asana, Trello pattern | +| Task count per column (shown in column header) | **MVP** | Instant awareness of column load; present in every kanban tool | +| Overdue task highlight (red border/badge on card) | **MVP** | Urgency signal visible without opening task — Jira, Linear, Asana pattern | | Collapsed columns | **V1** | Space management | | Blocked task indicators | **V1** | Dependency visibility | | Card quick-edit (inline title/status change) | **V1** | Speed of use | @@ -304,14 +308,14 @@ No dedicated Dutch government task management tools were identified. OpenProject | Risk | Severity | Mitigation | |------|---------|------------| | Nextcloud Deck owns the kanban mindshare in the NC ecosystem | High | Differentiate on time tracking + backlog + dev integration — Deck explicitly excludes these | -| Plane (38.6k ★) moves faster than we can | Medium | Focus on Nextcloud-native features that Plane will never build; don't compete on Plane's turf | +| Plane (40k+ ★) moves faster than we can | Medium | Focus on Nextcloud-native features that Plane will never build; don't compete on Plane's turf | | Small initial team → scope creep | Medium | MVP is strictly kanban + backlog + time tracking; defer everything else | | Drag-and-drop kanban is UX-complex in Vue 2 | Medium | Use a proven drag library (vue-draggable/SortableJS); budget time for polish | | OpenRegister performance at scale (many tasks) | Medium | Lean on OpenRegister's pagination and indexing; document pagination patterns early | ## 6. Recommended Feature Set Summary -### MVP (40 features) +### MVP (44 features) Flow-based kanban with backlog and time tracking for dev/IT teams on Nextcloud. Covers the gap left by Nextcloud Deck. 1. Task CRUD (title, description, status, priority) @@ -338,64 +342,68 @@ Flow-based kanban with backlog and time tracking for dev/IT teams on Nextcloud. 22. Task card anatomy (title, assignee, due date, labels, priority) 23. Column color coding 24. Board filter (by assignee, label, priority) -25. Backlog view (tasks without a column) -26. Drag task from backlog to board column -27. Backlog sorting (by priority, due date, created date) -28. Backlog search and filter -29. Personal dashboard (landing page with KPI cards) -30. My Work view (tasks assigned to me, across all projects) -31. Overdue task list -32. Tasks due this week -33. Recently updated tasks -34. Notes/comments on tasks (ICommentsManager) -35. File attachments on tasks (CnObjectSidebar) -36. Activity stream on task (Audit Trail tab) -37. Shared project access (multi-user) -38. Project progress (tasks done / total) -39. Procest bridge (case → project/task) -40. NcAppSettingsDialog (notify_assigned, notify_due_reminder, default_view) - -### V1 (25 additional features, continuing from 40) +25. View toggle on board (kanban ↔ list) +26. Task card hover quick-actions (assign, due date, status) +27. Task count in column header +28. Overdue task highlight (red border) on card +29. Backlog view (tasks without a column) +30. Drag task from backlog to board column +31. Backlog sorting (by priority, due date, created date) +32. Backlog search and filter +33. Personal dashboard (landing page with KPI cards) +34. My Work view (tasks assigned to me, across all projects) +35. Overdue task list +36. Tasks due this week +37. Recently updated tasks +38. Notes/comments on tasks (ICommentsManager) +39. File attachments on tasks (CnObjectSidebar) +40. Activity stream on task (Audit Trail tab) +41. Shared project access (multi-user) +42. Project progress (tasks done / total) +43. Procest bridge (case → project/task) +44. NcAppSettingsDialog (notify_assigned, notify_due_reminder, default_view) + +### V1 (25 additional features, continuing from 44) More collaboration, reporting, dev integrations, and advanced kanban. -41. Sub-tasks (one level deep) -42. Task dependencies (blocks / is-blocked-by) -43. Recurring tasks -44. Project milestones -45. Project templates -46. Swimlanes (group by assignee or priority) -47. Collapsed columns -48. Blocked task indicators -49. Card quick-edit (inline title/status change) -50. Bulk select and move tasks from backlog -51. Backlog item ordering (manual drag-and-drop rank) -52. Backlog statistics (count, overdue, unassigned) -53. Project time report (estimated vs logged) -54. Team timesheet (admin, all users, export CSV) -55. Timer (start/stop, auto-log) -56. Time tracking export (CSV) -57. Cumulative flow diagram -58. Team workload report (tasks per user) -59. Throughput chart (tasks/week) -60. @mention users in comments -61. Talk integration (per-task conversation) -62. Activity feed on dashboard -63. CalDAV/VTODO export (sync to Nextcloud Tasks) -64. GitHub/GitLab sync (via OpenConnector) -65. Import from Nextcloud Deck - -### Enterprise (10 additional features, continuing from 65) +45. Sub-tasks (one level deep) +46. Task dependencies (blocks / is-blocked-by) +47. Recurring tasks +48. Project milestones +49. Project templates +50. Swimlanes (group by assignee or priority) +51. Collapsed columns +52. Blocked task indicators +53. Card quick-edit (inline title/status change) +54. Bulk select and move tasks from backlog +55. Backlog item ordering (manual drag-and-drop rank) +56. Backlog statistics (count, overdue, unassigned) +57. Project time report (estimated vs logged) +58. Team timesheet (admin, all users, export CSV) +59. Timer (start/stop, auto-log) +60. Time tracking export (CSV) +61. Cumulative flow diagram +62. Team workload report (tasks per user) +63. Throughput chart (tasks/week) +64. @mention users in comments +65. Talk integration (per-task conversation) +66. Activity feed on dashboard +67. CalDAV/VTODO export (sync to Nextcloud Tasks) +68. GitHub/GitLab sync (via OpenConnector) +69. Import from Nextcloud Deck + +### Enterprise (10 additional features, continuing from 69) Governance, advanced analytics, and custom workflows. -66. Task templates -67. Custom task fields -68. Project portfolios (cross-project grouping) -69. Role-based project permissions (viewer/editor/admin) -70. Cycle time tracking (column entry to exit) -71. Overtime / budget alerts -72. Task completion gamification -73. Webhook outgoing (on task events) -74. Import from CSV -75. Advanced admin controls (max projects per user, role restrictions) +70. Task templates +71. Custom task fields +72. Project portfolios (cross-project grouping) +73. Role-based project permissions (viewer/editor/admin) +74. Cycle time tracking (column entry to exit) +75. Overtime / budget alerts +76. Task completion gamification +77. Webhook outgoing (on task events) +78. Import from CSV +79. Advanced admin controls (max projects per user, role restrictions) diff --git a/docs/features/README.md b/docs/features/README.md new file mode 100644 index 0000000..f7608d2 --- /dev/null +++ b/docs/features/README.md @@ -0,0 +1,16 @@ +# Planix — Features + +Planix is a project management app for Nextcloud, providing kanban boards, task management, time tracking, and project organization. + +## Features + +| Feature | Summary | Standards | Doc | +|---------|---------|-----------|-----| +| Register Schemas | 5 schemas (task, project, column, timeEntry, label) with seed data for project management | OpenRegister v0.2.10+ | [register-schemas.md](register-schemas.md) | +| Projects | Full project management UI: list, create, settings sidebar, member management, archive/delete | Schema.org CreativeWork | [projects.md](projects.md) | +| Tasks | Task lifecycle management: CRUD, priorities, labels, assignees, due dates, subtasks, status workflow | iCalendar VTODO (RFC 5545), Schema.org Action/PlanAction, VNG InterneTaak | [tasks.md](tasks.md) | +| Kanban Board | Visual board per project: configurable columns, drag-and-drop cards, WIP limits, board filters, view toggle | Schema.org ItemList, DefinedTerm, Kanban Guide | [kanban-board.md](kanban-board.md) | +| Dashboard & My Work | Personal landing page with KPI cards, recent projects, tasks due this week, and My Work task list grouped by urgency | Schema.org Action/PlanAction, Nextcloud Dashboard API | [dashboard.md](dashboard.md) | +| Time Tracking | Per-task time estimates and manual time log entries; personal timesheet view with date grouping and range filters | Schema.org QuantitativeValue, iCalendar ESTIMATED-DURATION (RFC 7986) | [time-tracking.md](time-tracking.md) | +| Admin & User Settings | Admin settings panel for default columns and label management; user settings dialog for notification preferences and default view | Nextcloud OCP\IAppConfig, OCP\IConfig, NcAppSettingsDialog | [admin-settings.md](admin-settings.md) | +| Procest Integration | Link tasks and projects to Procest cases via caseReference and zaakUuid fields; case badges and links in the UI | VNG ZGW InterneTaak, Schema.org Action | [procest-integration.md](procest-integration.md) | diff --git a/docs/features/admin-settings.md b/docs/features/admin-settings.md new file mode 100644 index 0000000..18f1372 --- /dev/null +++ b/docs/features/admin-settings.md @@ -0,0 +1,51 @@ +# Admin & User Settings + +Configure Planix at the app level (admin) or customize personal preferences (user). + +## Admin Settings + +Accessible to Nextcloud administrators at **Administration → Planix**. + +### Sections + +**App version info** — `CnVersionInfoCard` shows the installed version, connection status to OpenRegister, and an "Update available" indicator with a link to the Nextcloud App Store when a newer version exists. + +**Default Project Configuration** — configure the column set that is applied when a new project is created. Columns can be added, renamed, reordered, and deleted. New projects created after saving the change will use the updated column set. + +**Label Management** — create, edit, and delete app-wide labels that are available across all projects. Each label has a title and a hex color. + +**OpenRegister Setup** — shows whether the Planix register and schemas are initialized in OpenRegister. An "Initialize register" button triggers the import if the register is not yet set up. + +### Access Control + +Only Nextcloud administrators can access the admin settings page. Non-admin users receive a 403 response if they navigate to the settings URL directly, and the section does not appear in their Settings navigation. + +## User Settings + +Accessible from the gear icon in the Planix navigation bar, the user settings dialog (`NcAppSettingsDialog`) lets each user configure their own preferences. + +### Notification Preferences + +| Setting | Default | Description | +|---------|---------|-------------| +| Notify when a task is assigned to me | On | Nextcloud notification on task assignment | +| Remind me 1 day before a task's due date | On | Due-date reminder notification | + +### Display Preferences + +| Setting | Default | Description | +|---------|---------|-------------| +| Default view when opening a project | My Work | Chooses whether to open a project in My Work, Kanban, or Backlog view | + +All settings persist across browser sessions. + +## Standards + +- Nextcloud OCP\IAppConfig — admin settings storage +- Nextcloud OCP\IConfig — user settings storage +- NcAppSettingsDialog — user settings dialog component (NOT NcDialog) +- CnVersionInfoCard, CnSettingsSection — admin settings layout components + +## Spec + +- [admin-user-settings spec](../../openspec/specs/admin-user-settings.md) diff --git a/docs/features/dashboard.md b/docs/features/dashboard.md new file mode 100644 index 0000000..bae9c13 --- /dev/null +++ b/docs/features/dashboard.md @@ -0,0 +1,38 @@ +# Dashboard & My Work + +The personal landing page of Planix — an overview of your work state and tasks assigned to you across all projects. + +## Overview + +When you open Planix, you land on the Dashboard. It shows KPI cards for your task counts, the five most recently active projects you are a member of, and tasks due within the next seven days. The My Work view provides a prioritized list of all tasks assigned to you, grouped by urgency. + +## Dashboard + +- **KPI cards** — four cards showing counts for Open tasks (open or in_progress), Overdue tasks (past due date, not done), In Progress, and Completed Today; each card is clickable and navigates to My Work with the corresponding filter applied +- **Recent projects** — the five most recently active projects you belong to, each showing title, color/icon, task count, and a progress bar (done/total tasks) +- **Due this week** — tasks assigned to you with a due date within the next seven days, sorted by due date; today's and tomorrow's due dates are highlighted + +**Empty states**: New users with no projects see a "No projects yet" empty state with a "Create project" button. KPI cards always show (set to 0 when no tasks exist). + +## My Work + +My Work shows all tasks assigned to you across all projects, grouped into three sections: + +| Group | Criteria | +|-------|----------| +| **Overdue** | Due date is in the past, status is not done (highlighted in red) | +| **Due this week** | Due date is within the next 7 days, status is not done | +| **Everything else** | Open tasks with no due date or a due date more than 7 days away | + +Within each group, tasks are sorted by priority (urgent → high → normal → low). + +From My Work you can update a task's status via an inline dropdown, or click the task title to navigate to the task detail view. The browser back button returns to My Work. + +## Standards + +- Schema.org Action / PlanAction — task aggregation query pattern +- Nextcloud Dashboard API (OCP\Dashboard\IWidget) — optional widget integration (V1) + +## Spec + +- [dashboard-my-work spec](../../openspec/specs/dashboard-my-work.md) diff --git a/docs/features/img/projects-create.png b/docs/features/img/projects-create.png new file mode 100644 index 0000000..ff172a5 Binary files /dev/null and b/docs/features/img/projects-create.png differ diff --git a/docs/features/img/projects-list.png b/docs/features/img/projects-list.png new file mode 100644 index 0000000..37cdb6f Binary files /dev/null and b/docs/features/img/projects-list.png differ diff --git a/docs/features/img/projects-settings.png b/docs/features/img/projects-settings.png new file mode 100644 index 0000000..e216519 Binary files /dev/null and b/docs/features/img/projects-settings.png differ diff --git a/docs/features/kanban-board.md b/docs/features/kanban-board.md new file mode 100644 index 0000000..fe7b645 --- /dev/null +++ b/docs/features/kanban-board.md @@ -0,0 +1,30 @@ +# Kanban Board + +The primary visual interface for a project — tasks as cards organized into configurable columns. + +## Overview + +Each project has exactly one kanban board. Columns represent stages in the workflow (e.g., To Do, In Progress, Review, Done). Users drag task cards between columns to update their status. WIP limits on columns provide visual warnings when a stage is overloaded. The board can be filtered by assignee, label, or priority to focus on relevant work. + +## Key Capabilities + +- **Columns** — create, rename, reorder, and delete columns per project; column order is configurable +- **Default columns** — new projects are initialized with four columns (To Do, In Progress, Review, Done); defaults are configurable by admins +- **WIP limits** — set a work-in-progress limit per column; column header shows a warning indicator when the limit is exceeded (soft limit — cards are never blocked) +- **Task cards** — each card shows title, assignee avatar, due date, priority indicator, and label chips +- **Overdue highlight** — tasks with a past due date show a red border/badge on the card +- **Drag-and-drop** — drag a card to another column to update its column assignment and position +- **Column task count** — column header shows the current task count alongside the WIP limit +- **Board filter** — filter visible cards by assignee, label, or priority +- **View toggle** — switch between kanban (card grid) and list view for the same project tasks +- **Backlog access** — tasks without a column are in the backlog; a "View Backlog" link is available from the board view + +## Standards + +- Schema.org ItemList — kanban board (ordered list of columns) +- Schema.org DefinedTerm — column (controlled vocabulary term within the board) +- Kanban Guide (kanban.university) — WIP limit and flow practices + +## Spec + +- [kanban-board spec](../../openspec/specs/kanban-board.md) diff --git a/docs/features/procest-integration.md b/docs/features/procest-integration.md new file mode 100644 index 0000000..028444c --- /dev/null +++ b/docs/features/procest-integration.md @@ -0,0 +1,49 @@ +# Procest Integration + +Link Planix tasks and projects to Procest cases for cross-app case-to-task workflows. + +## Overview + +Planix is a sister app to Procest (case management). When a Procest case requires task tracking on a kanban board, Planix provides the board. The integration is built on optional metadata fields — no direct API calls between apps are required in the MVP. Tasks and projects carry optional case reference fields that Procest can populate, and Planix displays them as read-only metadata. + +## Key Capabilities + +### Case Reference on Project + +- A project can carry a `caseReference` field containing a Procest case UUID +- Projects with a case reference show a **"Case: {caseNumber}"** badge in the project list and project detail +- The case reference can be set manually via the project edit form by entering a Procest case UUID + +### Task Case Link + +- A task can carry a `zaakUuid` field containing a Procest case UUID +- Task detail shows a read-only **"Case"** field with a link to the Procest case when `zaakUuid` is set +- The `zaakUuid` can be set manually via the task edit form + +### When the Bridge is Disabled + +If the Procest bridge toggle is disabled in admin settings, or Procest is not installed: +- `caseReference` and `zaakUuid` fields are still stored and displayed as read-only metadata +- No requests are sent to Procest +- All Planix functionality remains fully available + +## VNG InterneTaak Mapping + +Tasks bridged from Procest follow the VNG InterneTaak field mapping: + +| Planix Task field | VNG InterneTaak field | +|-------------------|-----------------------| +| `title` | `gevraagdeHandeling` | +| `assignedTo` | `toegewezenAanGebruikersnaam` | +| `dueDate` | `gevraagdeDatum` | +| `status` (done) | triggers `afhandelingsdatum` | +| `completedAt` | `afhandelingsdatum` | + +## Standards + +- VNG ZGW InterneTaak (Klantinteracties) — case-task field mapping +- Schema.org Action — task type annotation + +## Spec + +- [procest-integration spec](../../openspec/specs/procest-integration.md) diff --git a/docs/features/projects.md b/docs/features/projects.md new file mode 100644 index 0000000..e61c39a --- /dev/null +++ b/docs/features/projects.md @@ -0,0 +1,35 @@ +# Projects + +Full project management surface for Planix — create, browse, configure, and delete projects. + +## Overview + +Projects are the top-level container in Planix. Each project groups a set of tasks on a kanban board, has a defined team (members), and optionally links to a Procest case. The `projects` change implements the complete project management UI on top of the OpenRegister data layer established by `register-schemas`. + +## Screenshots + +![Project list](img/projects-list.png) +*Project list — browse and filter projects you are a member of* + +![Create project dialog](img/projects-create.png) +*Create project — title, description, color, and icon fields* + +![Project settings sidebar](img/projects-settings.png) +*Project settings sidebar — Details, Members, and Danger Zone tabs* + +## Key Capabilities + +- **Project list** — browse all projects you are a member of; search (debounced 300 ms, client-side) and filter by status (Active / Archived / Completed) +- **Create project** — modal dialog with title, description, color, icon fields; automatically creates 4 default columns (To Do / In Progress / Review / Done) on creation +- **Project board shell** — detail view with header, gear icon, and "View Backlog" link; board view placeholder until kanban-board change is implemented +- **Project settings sidebar** — three-tab sidebar: Details (title, description, color, icon), Members (add/remove/leave), Danger Zone (archive, delete) +- **Member management** — search Nextcloud users, add to project, remove with assigned-task warning, leave with last-member protection +- **Access control** — project list filtered to current user's memberships; direct URL navigation to non-member projects shows access-denied state +- **Archive and delete** — archive hides from default list; delete cascades to columns, tasks, and time entries with confirmation dialog showing task count +- **i18n** — full Dutch (nl) translation; all strings in `l10n/en.json` and `l10n/nl.json` +- **Immediate metadata reflection** — sidebar saves update page header and project list without full reload + +## Standards + +- Schema.org CreativeWork (project as a creative work container) +- iCalendar VTODO parent container reference diff --git a/docs/features/register-schemas.md b/docs/features/register-schemas.md new file mode 100644 index 0000000..f2f2f74 --- /dev/null +++ b/docs/features/register-schemas.md @@ -0,0 +1,36 @@ +# Register Schemas + +Defines and registers the complete Planix data model in OpenRegister. + +## Overview + +Planix uses OpenRegister to store its data model. The `planix_register.json` file defines 5 schemas and seed data that are automatically imported when the app is installed or upgraded. + +## Schemas + +- **task** — A work item with title, description, status, priority, assignee, dates, and labels +- **project** — A container for tasks with members, colors, and case references +- **column** — A kanban board column with WIP limits and ordering +- **timeEntry** — A time tracking record linked to a task +- **label** — A categorization tag with color coding + +## Seed Data + +Fresh installs include demo data: +- 5 labels: Bug, Feature, Docs, Design, Infrastructure +- 3 projects: Client Portal v2, Infrastructure Migration, Onboarding Automation +- 12 columns: 4 per project (To Do, In Progress, Review, Done) +- 5 tasks with realistic assignments +- 3 time entries + +## Technical Details + +- Schemas are defined in `lib/Settings/planix_register.json` +- Import is triggered by the `InitializeSettings` repair step (declared in `appinfo/info.xml`) +- `SettingsService::loadConfiguration()` reads the JSON, parses it, and calls `ConfigurationService::importFromApp()` +- Import is idempotent — re-running does not create duplicates +- Required fields are validated by OpenRegister (e.g., task requires `title` and `status`) + +## Specs + +- [register-schemas spec](../../openspec/specs/register-schemas/spec.md) diff --git a/docs/features/tasks.md b/docs/features/tasks.md new file mode 100644 index 0000000..d2d6784 --- /dev/null +++ b/docs/features/tasks.md @@ -0,0 +1,30 @@ +# Tasks + +The core unit of work in Planix — create, assign, prioritize, and track tasks across projects. + +## Overview + +A task represents a piece of work within a project. Tasks carry a title, description, status, priority, assignee, due date, labels, and time estimate. They can be placed on the kanban board (assigned to a column) or held in the backlog (no column). The task detail view provides a full edit form, time tracking panel, and a sidebar with files, notes, tags, and an audit trail. + +## Key Capabilities + +- **Task CRUD** — create, view, edit, and delete tasks; required fields are title and status +- **Status lifecycle** — open → in_progress → blocked → done → cancelled (aligned with iCalendar VTODO STATUS) +- **Priority** — four levels: low, normal, high, urgent; displayed as colored dots on task cards +- **Assignee** — assign to any Nextcloud user; avatar shown on kanban cards and task detail +- **Due date** — set a due date; overdue tasks are highlighted on the board and in My Work +- **Labels** — apply one or more app-wide labels (color-coded) for cross-project categorization +- **Task detail view** — `CnDetailPage` with a core info card, time tracking panel, and `CnObjectSidebar` (Files, Notes, Tags, Audit Trail tabs) +- **Kanban placement** — assign a task to a board column to move it from the backlog onto the board +- **Procest link** — optional `zaakUuid` field links a task to a Procest case (see [Procest Integration](procest-integration.md)) +- **Notifications** — task assignment and due-date reminders sent via Nextcloud Notifications (configurable in user settings) + +## Standards + +- iCalendar VTODO (RFC 5545) — primary field reference for task properties +- Schema.org Action / PlanAction — semantic type annotations +- VNG InterneTaak (Klantinteracties) — API mapping layer for Procest bridge + +## Spec + +- [tasks spec](../../openspec/specs/tasks.md) diff --git a/docs/features/time-tracking.md b/docs/features/time-tracking.md new file mode 100644 index 0000000..89514e1 --- /dev/null +++ b/docs/features/time-tracking.md @@ -0,0 +1,47 @@ +# Time Tracking + +Estimate task effort and log actual time spent — then review your work in a personal timesheet. + +## Overview + +Time tracking in Planix operates at the task level. Each task carries an optional time estimate (how long it should take). Actual time is logged as separate time entries — one per work session — linked to the task. A personal timesheet shows all your logged entries grouped by date, with daily and weekly totals. + +## Key Capabilities + +### Time Estimate + +- Set an estimate on any task in the task detail view +- Accepted input formats: `2h 30m`, `150m`, `1.5h`, `90` (minutes), `2h` +- Stored as an integer number of minutes; displayed in human-readable format (e.g., 90 → "1h 30m") +- Task card on the kanban board shows the estimate +- Invalid input (e.g., zero, negative, unparseable) shows an inline validation error + +### Log Time + +- Click **Log time** in the task detail view to create a time entry +- A time entry requires: duration and date (description is optional) +- Multiple entries can be added to the same task across different sessions or days +- Task detail shows the total logged time (sum of all entries for the task) +- A progress indicator shows logged vs estimated: "1h 30m / 3h"; turns red when logged time exceeds the estimate + +### Timesheet + +- The Timesheet view shows all your time entries grouped by date (newest first) +- Each row shows: task title (clickable link to task detail), project, duration, description, and edit/delete controls +- Daily totals are shown for each date group +- Filter by date range: "This week", "Last week", or a custom range; the total for the range is shown +- Clicking a task title navigates to the task detail view; the browser back button returns to the timesheet at the same scroll position and date filter + +### Access Control + +- Users can only edit or delete their own time entries +- Attempting to edit another user's entry via the API returns 403 Forbidden + +## Standards + +- Schema.org QuantitativeValue — time entry (value with unit code MIN) +- iCalendar ESTIMATED-DURATION (RFC 7986) — estimated task duration field + +## Spec + +- [time-tracking spec](../../openspec/specs/time-tracking.md) diff --git a/l10n/en.json b/l10n/en.json index 5f6174e..96cb532 100644 --- a/l10n/en.json +++ b/l10n/en.json @@ -28,7 +28,86 @@ "Settings saved successfully": "Settings saved successfully", "Saving...": "Saving...", "This app needs OpenRegister to store and manage data. Please install OpenRegister from the app store to get started.": "This app needs OpenRegister to store and manage data. Please install OpenRegister from the app store to get started.", - "User settings will appear here in a future update.": "User settings will appear here in a future update." + "User settings will appear here in a future update.": "User settings will appear here in a future update.", + "Projects": "Projects", + "New project": "New project", + "All": "All", + "Active": "Active", + "Archived": "Archived", + "Search projects": "Search projects", + "Search by title or description\u2026": "Search by title or description\u2026", + "Could not load projects": "Could not load projects", + "Retry": "Retry", + "No projects yet": "No projects yet", + "Create your first project to get started.": "Create your first project to get started.", + "Create your first project": "Create your first project", + "No projects match your search": "No projects match your search", + "Try different search terms or clear the filter.": "Try different search terms or clear the filter.", + "Project color: {color}": "Project color: {color}", + "{count} members": "{count} members", + "members": "members", + "Project title": "Project title", + "Enter project title\u2026": "Enter project title\u2026", + "Title is required": "Title is required", + "Description": "Description", + "Optional description\u2026": "Optional description\u2026", + "Color": "Color", + "Project color picker": "Project color picker", + "Icon (emoji)": "Icon (emoji)", + "e.g. \ud83d\udcc1 \ud83d\ude80 \u2705": "e.g. \ud83d\udcc1 \ud83d\ude80 \u2705", + "e.g. \ud83d\udcc1 \ud83d\ude80": "e.g. \ud83d\udcc1 \ud83d\ude80", + "Creating\u2026": "Creating\u2026", + "Create project": "Create project", + "Cancel": "Cancel", + "Could not create project. Please try again.": "Could not create project. Please try again.", + "You do not have access to this project": "You do not have access to this project", + "You are not a member of this project.": "You are not a member of this project.", + "Back to projects": "Back to projects", + "View backlog": "View backlog", + "Project settings": "Project settings", + "Backlog": "Backlog", + "Board view coming soon": "Board view coming soon", + "The Kanban board is being built. Use the Backlog view in the meantime.": "The Kanban board is being built. Use the Backlog view in the meantime.", + "View Backlog": "View Backlog", + "Backlog view coming soon": "Backlog view coming soon", + "Task management will be available in a future update.": "Task management will be available in a future update.", + "Details": "Details", + "Members": "Members", + "Danger zone": "Danger zone", + "Title": "Title", + "Project color": "Project color", + "Case reference": "Case reference", + "Project saved": "Project saved", + "Could not save project": "Could not save project", + "Add member": "Add member", + "Search for a user\u2026": "Search for a user\u2026", + "Leave project": "Leave project", + "Remove {name}": "Remove {name}", + "{name} has {count} assigned tasks in this project": "{name} has {count} assigned tasks in this project", + "Remove anyway": "Remove anyway", + "Archive project": "Archive project", + "Archive this project. It will no longer appear in the active list.": "Archive this project. It will no longer appear in the active list.", + "Are you sure?": "Are you sure?", + "Yes, archive": "Yes, archive", + "Delete project": "Delete project", + "Permanently delete this project and all its tasks.": "Permanently delete this project and all its tasks.", + "No users found for \"{query}\"": "No users found for \"{query}\"", + "Could not add member": "Could not add member", + "You are the last member. Leaving will make this project inaccessible to all users.": "You are the last member. Leaving will make this project inaccessible to all users.", + "Are you sure you want to leave this project? You will lose access.": "Are you sure you want to leave this project? You will lose access.", + "Could not leave project": "Could not leave project", + "This will permanently delete {count} tasks and all their time entries. This cannot be undone.": "This will permanently delete {count} tasks and all their time entries. This cannot be undone.", + "Project created": "Project created", + "Project deleted": "Project deleted", + "Could not delete project": "Could not delete project", + "Some columns could not be created: {columns}": "Some columns could not be created: {columns}", + "Failed to delete time entry \u2014 deletion stopped": "Failed to delete time entry \u2014 deletion stopped", + "Failed to delete task \u2014 deletion stopped": "Failed to delete task \u2014 deletion stopped", + "Failed to delete column \u2014 deletion stopped": "Failed to delete column \u2014 deletion stopped", + "Failed to delete project": "Failed to delete project", + "An error occurred during project deletion": "An error occurred during project deletion", + "Saving\u2026": "Saving\u2026", + "User search results": "User search results" }, "plurals": "" } diff --git a/l10n/nl.json b/l10n/nl.json index 8ed9c0f..32f338e 100644 --- a/l10n/nl.json +++ b/l10n/nl.json @@ -28,7 +28,86 @@ "Settings saved successfully": "Instellingen succesvol opgeslagen", "Saving...": "Opslaan...", "This app needs OpenRegister to store and manage data. Please install OpenRegister from the app store to get started.": "Deze app heeft OpenRegister nodig om gegevens op te slaan en te beheren. Installeer OpenRegister via de app store om te beginnen.", - "User settings will appear here in a future update.": "Gebruikersinstellingen verschijnen hier in een toekomstige update." + "User settings will appear here in a future update.": "Gebruikersinstellingen verschijnen hier in een toekomstige update.", + "Projects": "Projecten", + "New project": "Nieuw project", + "All": "Alle", + "Active": "Actief", + "Archived": "Gearchiveerd", + "Search projects": "Projecten zoeken", + "Search by title or description\u2026": "Zoek op titel of beschrijving\u2026", + "Could not load projects": "Kon projecten niet laden", + "Retry": "Opnieuw proberen", + "No projects yet": "Nog geen projecten", + "Create your first project to get started.": "Maak uw eerste project aan om te beginnen.", + "Create your first project": "Maak uw eerste project aan", + "No projects match your search": "Geen projecten gevonden voor uw zoekopdracht", + "Try different search terms or clear the filter.": "Probeer andere zoektermen of verwijder het filter.", + "Project color: {color}": "Projectkleur: {color}", + "{count} members": "{count} leden", + "members": "leden", + "Project title": "Projecttitel", + "Enter project title\u2026": "Voer een projecttitel in\u2026", + "Title is required": "Titel is verplicht", + "Description": "Beschrijving", + "Optional description\u2026": "Optionele beschrijving\u2026", + "Color": "Kleur", + "Project color picker": "Kleurkiezer voor project", + "Icon (emoji)": "Pictogram (emoji)", + "e.g. \ud83d\udcc1 \ud83d\ude80 \u2705": "bijv. \ud83d\udcc1 \ud83d\ude80 \u2705", + "e.g. \ud83d\udcc1 \ud83d\ude80": "bijv. \ud83d\udcc1 \ud83d\ude80", + "Creating\u2026": "Aanmaken\u2026", + "Create project": "Project aanmaken", + "Cancel": "Annuleren", + "Could not create project. Please try again.": "Kon project niet aanmaken. Probeer het