Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
928ce75
feat(web): add metadata sidebar panel
Jun 14, 2026
9b48ab9
feat(web): immutable UI - indicators + context menu actions
Jun 14, 2026
fc6c7a7
feat(web): complete immutable state integration via WebDAV PROPFIND
Jun 14, 2026
a853bc6
feat: shielded state + icon fixes
Jun 15, 2026
516de70
feat: parent-lookup for unprotect + batch protect/unprotect
Jun 15, 2026
931357e
fix: parent-lookup via currentFolder for unprotect shielded state
Jun 16, 2026
00dcb35
feat: port immutable actions to web-app-files + special folder view
Jun 16, 2026
e04e17e
docs: add TASK for typed folder views (Aktenplan)
Jun 16, 2026
973f7d7
feat: typed folder view groundwork
Jun 17, 2026
f5b2ade
docs: FolderViewPlus architecture + TASK update
Jun 17, 2026
d2e4ad0
docs: clarify FolderViewPlus is UI-only, no server enforcement
Jun 17, 2026
3014125
docs: Aktenplan type hierarchy, Aktencode syntax, schema definitions
Jun 17, 2026
4e11baf
fix: aktenschrank is shielded leaf of aktenplan, not protected
Jun 17, 2026
1c589cf
fix: aktenplan is one type, aktenschrank is its shielded leaf
Jun 17, 2026
d71c443
feat: detect .type_* from PROPFIND listing, show typed folder bar
Jun 17, 2026
b1b6ca7
fix: use _type_ prefix instead of .type_ (dotfiles filtered by OpenCl…
Jun 17, 2026
d03c4ec
feat: typed folder header with icon, name and badge
Jun 17, 2026
7506ac2
feat: show Aktenzeichen (oy.fileReference) in typed folder header
Jun 17, 2026
4125441
feat: typed folder header replaces space header, space-style layout
Jun 17, 2026
063b6cf
fix: typed folder header clean style — icon without background
Jun 17, 2026
b53b53a
feat: Aktencode prefix in header title and resource list rows
Jun 17, 2026
4487a91
fix: use   for space between Aktencode and title (Vue trims whit…
Jun 18, 2026
6fe8085
refactor: remove useFileReferences — Aktencode lives in folder name
Jun 18, 2026
db5603f
fix: load schemas from .views/ (dotfile dir, filtered from listing bu…
Jun 18, 2026
ccb55e5
fix: show error icon when typed view schema not found
Jun 18, 2026
51e1217
feat: filter _type_* markers from display in typed folders
Jun 18, 2026
4c99b79
feat: add Tree view and Metro tiles view as folder view extensions
Jun 18, 2026
8f3c1c8
fix: Tree and Metro views — working clicks, proper styling
Jun 18, 2026
4cd51a9
fix: metro tiles with dark backgrounds and white text
Jun 18, 2026
750414a
fix: Metro 4:3 tiles + clickable, Tree with expand arrows + columns
Jun 18, 2026
a62b97f
fix: Metro uses theme colors, Tree has header + aligned columns
Jun 18, 2026
320cc38
refactor: Tree view wraps real ResourceTable in condensed mode
Jun 18, 2026
7ea41e9
fix: Tree view uses #image slot for expand toggle + indentation
Jun 18, 2026
966c518
fix: Tree view re-adds resource icon in #image slot (slot hides default)
Jun 18, 2026
6ac1078
fix: use ResourceIcon component (not oc-resource-icon tag)
Jun 18, 2026
0ffb2b4
fix: Metro uses ResourceIcon, flat structure, pointer-events on children
Jun 18, 2026
3504afd
fix: hide expand arrow on empty folders (treesize=0)
Jun 18, 2026
a2cef50
revert: show expand arrow on all folders (treesize unreliable)
Jun 18, 2026
8ad2438
fix: upsert lazy-loaded children into resourcesStore for batch actions
Jun 18, 2026
500abb1
fix: use separate depthMap for indentation (ResourceTable strips cust…
Jun 18, 2026
d82feb7
fix: tree indentation via paddingLeft + minWidth on image slot
Jun 18, 2026
3c78a8a
fix: reactive depthMap via watch instead of computed side-effect
Jun 18, 2026
a49cae0
refactor: Tree view uses own table instead of wrapping ResourceTable
Jun 18, 2026
604f74c
fix: Metro/Tree navigate directly via router.push (emit unreliable)
Jun 18, 2026
1ac84aa
fix: remove async await import that broke Tree view rendering
Jun 18, 2026
58b2497
revert: Tree view back to ResourceTable wrapper with condensed mode
Jun 18, 2026
80877b4
fix: pass through #quickActions slot to ResourceTable
Jun 18, 2026
8ab1517
feat: Metro view with 3-dot context menu button per tile
Jun 18, 2026
fb5a655
fix: use plain Map for depths (synchronous, no reactivity delay)
Jun 18, 2026
05d6313
fix: derive tree depth from resource.path segments (no Map needed)
Jun 18, 2026
f4fee83
fix: Metro click works in space listing + dashboard icon
Jun 18, 2026
6f6bb4e
fix: Metro detects SpaceResource via getDriveAliasAndItem for space n…
Jun 18, 2026
a0a70fd
fix: Metro context menu selects resource and dispatches native contex…
Jun 18, 2026
39356a0
fix: Metro 3-dot opens sidebar with actions (via eventBus)
Jun 18, 2026
1a31f26
feat: Metro uses ContextMenuQuickAction for proper context menu
Jun 18, 2026
8617cf9
simplify: Metro back to plain emit('fileClick') for all clicks
Jun 18, 2026
24f6b85
fix: Metro handles SpaceResource click via router.push (Projects.vue …
Jun 18, 2026
5984978
fix: detect SpaceResource via driveType property instead of method check
Jun 18, 2026
22b8044
simplify: Metro uses <a> links with router.push — always clickable
Jun 18, 2026
cc98444
fix: Metro with links, 3-dot menu, right-click opens sidebar actions
Jun 18, 2026
72f4ea7
refactor: Metro wraps ResourceTiles with metro-style CSS overrides
Jun 18, 2026
4b973b8
fix: Metro style — primary bg, white bold centered text, fixed checkb…
Jun 18, 2026
965223d
fix: Metro uses theme surface colors, title centered with on-surface …
Jun 18, 2026
1d852bc
fix: Metro uses primary-container bg with on-primary-container text
Jun 18, 2026
b085373
rewrite: Metro — minimal ResourceTiles wrapper, outline-variant fill,…
Jun 18, 2026
35fa720
fix: Metro name absolutely positioned center over tile, outline-varia…
Jun 18, 2026
92be97a
revert: Metro minimal CSS — only hide preview, fill tile, bold center…
Jun 18, 2026
4fcde31
fix: Metro name in preview area via #image slot, bottom bar hidden
Jun 18, 2026
38c3a88
fix: hide only name-wrapper in bottom bar, keep indicators + context …
Jun 18, 2026
b80b426
fix: Metro bottom bar icons right-aligned
Jun 18, 2026
4c1b09d
docs: update AKTENPLAN.md
Jun 18, 2026
3e27ed6
refactor: remove Tree + Metro views from core (moved to extension)
Jun 18, 2026
5dd5828
feat: support checkbox type for extension preferences
Jun 19, 2026
72c5612
fix: include registered extra props in PROPFIND request body
Jun 19, 2026
b05822c
refactor: remove typedFolder from web core — lives in folderviews ext…
Jun 21, 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
233 changes: 233 additions & 0 deletions AKTENPLAN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,233 @@
# Aktenplan — Typen, Schutz und FolderViews

## Hierarchie

```
Space (Typ: aktenplan)
└── Aktenplan-Ebenen (protected, beliebig tief verschachtelt)
└── Aktenschrank (shielded = letztes Blatt des Aktenplans)
└── Akte (der "Leitzordner")
├── Variante leer: Dokumente direkt in der Akte
├── Variante thematisiert: Vorgang → Dokumente
└── Variante voll: Vorgang → Register → Dokumente
```

## Typen (4 Stück, je ein FolderView)

| Typ | `.type_` | FolderView | Kinder | Schutz |
|-----|----------|-----------|--------|--------|
| **Aktenplan** | `.type_aktenplan` | Sachgruppen-Listing | Bei protected: aktenplan. Bei shielded: akte | protected / shielded |
| **Akte** | `.type_akte` | Akten-Ansicht | vorgang, dokument | — |
| **Vorgang** | `.type_vorgang` | Vorgangs-Ansicht | register, dokument | — |
| **Register** | `.type_register` | Register-Ansicht | dokument | — |

### Aktenplan: Zwei Modi über immutableState

Gleicher Typ `.type_aktenplan`, unterschiedliches Verhalten je nach Schutzstatus:

| immutableState | Bedeutung | Erlaubte Kinder | Actions |
|---------------|-----------|----------------|---------|
| `protected` | Sachgruppe (Struktur fixiert) | aktenplan (nur Manager) | "Neue Sachgruppe" (Manager) |
| `shielded` | Aktenschrank (letztes Blatt) | akte | "Neue Akte" (Editor+) |
| keiner | Ungeschützter Aktenplan-Ordner | aktenplan, akte | "Neue Sachgruppe", "Neue Akte" |

## Aktencode-Syntax

Jeder Ordnername: **`<Aktencode> <Titel>`**

```
Ebene Code Trennzeichen Beispiel
─────────────────────────────────────────────────────────────
Sachgruppe 1 11 (Startcode) 11 Innere Verwaltung
Sachgruppe 2 11.12 . (Punkt) 11.12 Kommunalverwaltung
Sachgruppe n 11.12.01 . (Punkt) 11.12.01 Organisationsang.
Aktenschrank 11.12.01.03 . (Punkt) 11.12.01.03 Satzungen
Akte 11.12.01.03-01 - (Bindestrich) 11.12.01.03-01 Entschädigungssatzung
Vorgang 11.12.01.03-01/1 / (Schrägstrich) 11.12.01.03-01/1 Fassung 2016
Register 11.12.01.03-01/1#1 # (Raute) 11.12.01.03-01/1#1 Vorlagen
```

## FolderViews und Schema-Dateien

Jeder Typ hat eine Schema-Datei unter `.space/views/` und einen zugehörigen FolderView.

### .space/views/aktenplan.json
```json
{
"label": "Aktenplan",
"icon": "archive",
"children": {
"protected": ["aktenplan"],
"shielded": ["akte"],
"default": ["aktenplan", "akte"]
},
"columns": ["name", "aktencode", "typ", "anzahl"],
"namePattern": "{parentCode}.{seq:2} {title}",
"metadata": {
"aktencode": { "label": "Aktencode", "type": "string", "auto": true }
}
}
```

**FolderView Aktenplan** zeigt:
- Spalten: Name, Aktencode, Untertyp (Sachgruppe/Aktenschrank), Anzahl Kinder
- Action-Button: "Neue Sachgruppe" (wenn protected, nur Manager) oder "Neue Akte" (wenn shielded)
- Icon: Ordner mit Schild (protected) oder offener Ordner (shielded)

### .space/views/akte.json
```json
{
"label": "Akte",
"icon": "folder-open",
"children": ["vorgang"],
"columns": ["name", "aktencode", "status", "abgelegt-von", "abgelegt-am"],
"namePattern": "{parentCode}-{seq:2} {title}",
"metadata": {
"aktencode": { "label": "Aktenzeichen", "type": "string", "auto": true },
"status": {
"label": "Status", "type": "enum",
"values": ["offen", "gespeichert", "geschlossen"],
"default": "offen"
}
}
}
```

**FolderView Akte** zeigt:
- Spalten: Name, Aktenzeichen, Status, abgelegt von/am
- Action-Button: "Neuer Vorgang", "Dokument hinzufügen"
- Status-Badge (offen/gespeichert/geschlossen)

### .space/views/vorgang.json
```json
{
"label": "Vorgang",
"icon": "file-list",
"children": ["register"],
"columns": ["name", "aktencode", "version", "abgelegt-von", "abgelegt-am"],
"namePattern": "{parentCode}/{seq} {title}",
"metadata": {
"aktencode": { "label": "Aktenzeichen", "type": "string", "auto": true },
"version": { "label": "Version", "type": "string" }
}
}
```

**FolderView Vorgang** zeigt:
- Spalten: Name, Aktenzeichen, Version, abgelegt von/am
- Action-Button: "Neues Register", "Dokument hinzufügen"

### .space/views/register.json
```json
{
"label": "Register",
"icon": "bookmark",
"children": [],
"columns": ["name", "aktencode", "abgelegt-von", "abgelegt-am"],
"namePattern": "{parentCode}#{seq} {title}",
"metadata": {
"aktencode": { "label": "Aktenzeichen", "type": "string", "auto": true }
}
}
```

**FolderView Register** zeigt:
- Spalten: Name, Aktenzeichen, abgelegt von/am
- Action-Button: "Dokument hinzufügen" (kein weiterer Ordner-Typ)

## Action-Buttons

Jeder FolderView hat typ-spezifische Action-Buttons im AppBar:

```
┌─────────────────────────────────────────────────────────┐
│ ← 11.12.01.03 Satzungen │
│ │
│ [+ Neue Akte] Filter Ansicht │
│ │
│ Name Aktenzeichen Status Datum │
│ ─────────────────────────────────────────────────────── │
│ 📁 11.12.01.03-01 Entschädigungssatzung offen ... │
│ 📁 11.12.01.03-02 Feuerwehrsatzung gesp. ... │
└─────────────────────────────────────────────────────────┘
```

### Action-Button Logik

1. FolderView liest `children` aus Schema
2. Für jeden erlaubten Kind-Typ: lade dessen Schema (Label, Icon)
3. Zeige Action-Button: "Neue(r/s) {label}"
4. Click → Dialog: Titel eingeben → Aktencode wird automatisch generiert
5. Erstellt: Ordner + `.type_<kind>` + initiale Metadaten

### Aktencode-Generierung im Dialog

```
┌─────────────────────────────────────────┐
│ Neue Akte anlegen │
│ │
│ Aktenzeichen: 11.12.01.03-03 │
│ (automatisch, nächste freie Nummer) │
│ │
│ Titel: [Brandverhütungsschauordnung ] │
│ │
│ Ordnername: 11.12.01.03-03 Brandver... │
│ │
│ [Abbrechen] [Anlegen] │
└─────────────────────────────────────────┘
```

## Beispiel: Komplette Struktur

```
Archikart DMS/ .type_aktenplan
├── .space/views/{aktenplan,akte,vorgang,register}.json
├── 11 Innere Verwaltung/ .type_aktenplan protected
│ ├── 11.12 Kommunalverwaltung/ .type_aktenplan protected
│ │ ├── 11.12.01 Organisationsangelegenheiten/ .type_aktenplan protected
│ │ │ ├── 11.12.01.03 Satzungen/ .type_aktenplan shielded (Aktenschrank)
│ │ │ │ ├── 11.12.01.03-01 Entschädigungssatzung/ .type_akte
│ │ │ │ │ ├── 11.12.01.03-01/1 Fassung 2016/ .type_vorgang
│ │ │ │ │ │ ├── 11.12.01.03-01/1#1 Vorlagen/ .type_register
│ │ │ │ │ │ │ ├── Vergleich_A.pdf
│ │ │ │ │ │ │ └── Arbeitshilfe.docx
│ │ │ │ │ │ └── Beschluss.pdf
│ │ │ │ │ └── 11.12.01.03-01/2 Fassung 2026/ .type_vorgang
│ │ │ │ └── 11.12.01.03-02 Feuerwehrsatzung/ .type_akte
│ │ │ └── 11.12.01.05 Landratsamt/ .type_aktenplan shielded
│ │ └── 11.12.02 Personalangelegenheiten/ .type_aktenplan protected
│ └── 11.13 Finanzverwaltung/ .type_aktenplan protected
├── 12 Sicherheit und Ordnung/ .type_aktenplan protected
└── 21 Schulträgeraufgaben/ .type_aktenplan protected
```

## Implementierung

### Pro Typ ein FolderView

Jeder der 4 Typen bekommt eine eigene Vue-Komponente:

```
packages/web-app-files/src/components/TypedViews/
AktenplanView.vue ← Sachgruppen/Aktenschrank-Listing
AkteView.vue ← Akten-Ansicht mit Status
VorgangView.vue ← Vorgangs-Listing mit Version
RegisterView.vue ← Register-Listing (Blatt-Ebene)
TypedNewDialog.vue ← "Neuer [Typ]" Dialog mit Aktencode-Generator
```

### Integration in GenericSpace.vue

```
PROPFIND → Kinder-Liste
├── .type_* gefunden?
│ ├── Nein → Standard FolderView
│ └── Ja → Typ erkennen
│ ├── immutableState prüfen (protected/shielded)
│ ├── Schema laden (.space/views/<typ>.json)
│ └── Typed FolderView rendern
│ ├── Typ-spezifische Spalten
│ ├── Typ-spezifische Action-Buttons
│ └── Typ-spezifisches Icon/Styling
```
Loading