diff --git a/openspec/changes/case-types/.openspec.yaml b/openspec/changes/case-types/.openspec.yaml new file mode 100644 index 0000000..d8b0ed0 --- /dev/null +++ b/openspec/changes/case-types/.openspec.yaml @@ -0,0 +1,2 @@ +schema: spec-driven +created: 2026-03-20 diff --git a/openspec/changes/case-types/design.md b/openspec/changes/case-types/design.md new file mode 100644 index 0000000..8a0e87e --- /dev/null +++ b/openspec/changes/case-types/design.md @@ -0,0 +1,8 @@ +# Case Types Design + +## Components +1. **ResultTypesTab.vue** - CRUD for result types with archival rules +2. **RoleTypesTab.vue** - CRUD for role types with generic role selection +3. **PropertiesTab.vue** - CRUD for property definitions +4. **DocumentTypesTab.vue** - CRUD for document types with direction +5. **CaseTypeDetail.vue** - Updated with new tabs diff --git a/openspec/changes/case-types/proposal.md b/openspec/changes/case-types/proposal.md new file mode 100644 index 0000000..fd983ae --- /dev/null +++ b/openspec/changes/case-types/proposal.md @@ -0,0 +1,12 @@ +# Case Types Implementation + +## Summary +Implement the V1 admin tabs for case type configuration: Result Types, Role Types, Property Definitions, and Document Types tabs. Also add publish validation and active case deletion blocking. + +## Scope +- REQ-CT-07: Result type management tab +- REQ-CT-08: Role type management tab +- REQ-CT-09: Property definition management tab +- REQ-CT-10: Document type management tab +- REQ-CT-15: Tab layout with all V1 tabs +- REQ-CT-02: Publish validation improvements diff --git a/openspec/changes/case-types/tasks.md b/openspec/changes/case-types/tasks.md new file mode 100644 index 0000000..cb2da05 --- /dev/null +++ b/openspec/changes/case-types/tasks.md @@ -0,0 +1,7 @@ +# Tasks + +- [x] TASK-CT-01: Create ResultTypesTab.vue +- [x] TASK-CT-02: Create RoleTypesTab.vue +- [x] TASK-CT-03: Create PropertiesTab.vue +- [x] TASK-CT-04: Create DocumentTypesTab.vue +- [x] TASK-CT-05: Integrate new tabs into CaseTypeDetail.vue diff --git a/src/views/settings/tabs/DocumentTypesTab.vue b/src/views/settings/tabs/DocumentTypesTab.vue new file mode 100644 index 0000000..307f40a --- /dev/null +++ b/src/views/settings/tabs/DocumentTypesTab.vue @@ -0,0 +1,181 @@ + + + + + diff --git a/src/views/settings/tabs/ResultTypesTab.vue b/src/views/settings/tabs/ResultTypesTab.vue new file mode 100644 index 0000000..eae0de9 --- /dev/null +++ b/src/views/settings/tabs/ResultTypesTab.vue @@ -0,0 +1,179 @@ + + + + + diff --git a/src/views/settings/tabs/RoleTypesTab.vue b/src/views/settings/tabs/RoleTypesTab.vue new file mode 100644 index 0000000..c47ef5d --- /dev/null +++ b/src/views/settings/tabs/RoleTypesTab.vue @@ -0,0 +1,158 @@ + + + + + diff --git a/src/views/settings/tabs/sub-entity-tab.css b/src/views/settings/tabs/sub-entity-tab.css new file mode 100644 index 0000000..cc23b30 --- /dev/null +++ b/src/views/settings/tabs/sub-entity-tab.css @@ -0,0 +1,91 @@ +.sub-entity-tab__notice { + color: var(--color-text-maxcontrast); + padding: 12px; + background: var(--color-background-dark); + border-radius: var(--border-radius); +} + +.sub-entity-tab__list { + display: flex; + flex-direction: column; + gap: 4px; + margin-bottom: 16px; +} + +.sub-entity-tab__empty { + color: var(--color-text-maxcontrast); + padding: 16px; + text-align: center; +} + +.sub-entity-row { + display: flex; + align-items: center; + gap: 10px; + padding: 8px 12px; + border: 1px solid var(--color-border); + border-radius: var(--border-radius); + flex-wrap: wrap; +} + +.sub-entity-row__name { + font-weight: 500; + flex: 1; + min-width: 120px; +} + +.sub-entity-row__badge { + display: inline-block; + padding: 2px 8px; + border-radius: var(--border-radius-pill); + font-size: 11px; + font-weight: 500; + background: var(--color-background-dark); + color: var(--color-text-maxcontrast); +} + +.sub-entity-row__meta { + font-size: 12px; + color: var(--color-text-maxcontrast); +} + +.sub-entity-row__actions { + display: flex; + gap: 4px; + margin-left: auto; +} + +.sub-entity-row__edit-form { + width: 100%; +} + +.edit-row { + display: flex; + gap: 12px; + margin-bottom: 8px; +} + +.edit-field { + flex: 1; + min-width: 140px; +} + +.edit-field--full { + flex: 1 1 100%; +} + +.edit-field--small { + max-width: 100px; +} + +.edit-error { + color: var(--color-error); + font-size: 13px; + margin: 4px 0; +} + +.edit-actions { + display: flex; + gap: 8px; + margin-top: 8px; +}