diff --git a/docs/POAM-Design.md b/docs/POAM-Design.md new file mode 100644 index 00000000..31427830 --- /dev/null +++ b/docs/POAM-Design.md @@ -0,0 +1,38 @@ +Title: POAM Phase 1 – UI Design + +Goals + +- Provide a basic POAM Items list page to exercise the API filters end-to-end. +- Keep UX simple for Phase 1; extend with create/edit flows in Phase 2. + +Routing + +- New authenticated route: /poam-items +- Router entry added under app routes; guard via existing auth store. + +Data Access + +- Uses existing composables (useFetch/useApi) to call /api/poam-items +- Query params supported: status, sspId, riskId, deadlineBefore (RFC3339) + +View: CCFPoamItemsListView + +- Filters + - Dropdown: status (open|in-progress|completed|overdue) + - Inputs: sspId UUID, riskId UUID, deadlineBefore RFC3339 + - Apply triggers a reload with current params +- Table Columns + - Title, Status, Deadline, POC (name/email), Updated + +Future Enhancements + +- Create/Edit forms for POAM items and milestones +- Mark milestone completed, auto-set completed_at +- Link POAM item to risks from the UI +- Pagination and sorting + +Verification + +- API is reachable at /api/poam-items +- UI config.json provides API_URL +- Manual test by applying filters and verifying table updates diff --git a/src/router/index.ts b/src/router/index.ts index a732e793..27e73026 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -92,6 +92,11 @@ const authenticatedRoutes = [ }, ], }, + { + path: 'components/dashboards/:componentId', + name: 'system-component-dashboards', + component: () => import('../views/system/ComponentsView.vue'), + }, { path: 'authorizations', name: 'system:authorizations', @@ -110,6 +115,14 @@ const authenticatedRoutes = [ requiresAuth: true, }, }, + { + path: 'poam-items', + name: 'poam-items:index', + component: () => import('../views/poam/CCFPoamItemsListView.vue'), + meta: { + requiresAuth: true, + }, + }, { path: 'risks/:riskId', name: 'risks:detail', @@ -194,6 +207,14 @@ const authenticatedRoutes = [ requiresAuth: true, }, }, + { + path: '/profiles/build-props', + name: 'profile-build-props', + component: () => import('../views/profile/ProfileBuildPropsView.vue'), + meta: { + requiresAuth: true, + }, + }, { path: '/profiles/:id', name: 'profile:view', diff --git a/src/views/LeftSideNav.vue b/src/views/LeftSideNav.vue index dd324479..c2f8e196 100644 --- a/src/views/LeftSideNav.vue +++ b/src/views/LeftSideNav.vue @@ -119,11 +119,6 @@ const links = ref>([ name: 'users-list', title: 'System Users', }, - { - name: 'admin-import', - title: 'Import', - abbr: 'IMP', - }, ], }, ]); diff --git a/src/views/catalog/CatalogControl.vue b/src/views/catalog/CatalogControl.vue index c46a359e..647443b6 100644 --- a/src/views/catalog/CatalogControl.vue +++ b/src/views/catalog/CatalogControl.vue @@ -41,11 +41,25 @@ >
- Add Statement - Add Statement + Edit Statement + Add Objective - Add Guidance @@ -100,6 +114,27 @@ :parent-control="props.control" v-model="showControlForm" /> + + + (false); const showEdit = ref(false); +const showEditStatement = ref(false); +const showEditObjective = ref(false); +const showEditGuidance = ref(false); function controlCreated(control: Control) { controls.value?.push(control); diff --git a/src/views/catalog/CatalogView.vue b/src/views/catalog/CatalogView.vue index 3b369fe1..6a48087b 100644 --- a/src/views/catalog/CatalogView.vue +++ b/src/views/catalog/CatalogView.vue @@ -138,7 +138,6 @@ async function deleteCatalog(uuid: string, title: string) { function deleteCurrentCatalog() { deleteCatalog(catalogId.value, catalog.value?.metadata?.title || ''); } - function reloadLists() { groupExecute(`/api/oscal/catalogs/${catalogId.value}/groups`); catalogExecute(`/api/oscal/catalogs/${catalogId.value}/controls`); diff --git a/src/views/poam/CCFPoamItemsListView.vue b/src/views/poam/CCFPoamItemsListView.vue new file mode 100644 index 00000000..57407fe5 --- /dev/null +++ b/src/views/poam/CCFPoamItemsListView.vue @@ -0,0 +1,137 @@ + + + + + diff --git a/src/views/profile/ProfileBuildPropsView.vue b/src/views/profile/ProfileBuildPropsView.vue new file mode 100644 index 00000000..41aacbc8 --- /dev/null +++ b/src/views/profile/ProfileBuildPropsView.vue @@ -0,0 +1,283 @@ + + + diff --git a/src/views/profile/ProfileList.vue b/src/views/profile/ProfileList.vue index c7179ad9..2625fc89 100644 --- a/src/views/profile/ProfileList.vue +++ b/src/views/profile/ProfileList.vue @@ -1,5 +1,10 @@