Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
241 commits
Select commit Hold shift + click to select a range
f50447c
docs: add i18n integration guide and customisation reference
rubenvdlinde Mar 3, 2026
d6247c2
docs: expand customisation guide with all discovered extension points
rubenvdlinde Mar 3, 2026
a86dd5a
feat: add custom tabs and default-tab control to CnIndexSidebar
rubenvdlinde Mar 3, 2026
6928a90
chore: Add css/ entry point and bump to 0.1.0-beta.3
rubenvdlinde Mar 3, 2026
6e3118d
feat: Enhance useListView and useDetailView composables with objectSt…
rubenvdlinde Mar 3, 2026
26ddadb
fixed store to use baseUrl + updated docs to show defaults
SudoThijn Mar 3, 2026
57e1b88
Merge pull request #4 from ConductionNL/feature/fix-object-store-doc-…
SudoThijn Mar 3, 2026
b143929
updated docs to use multi-type
SudoThijn Mar 3, 2026
8194320
added todos and considerations
SudoThijn Mar 3, 2026
174c453
added 2 missing features
SudoThijn Mar 4, 2026
4d973ed
feat: Add RBAC support for schema-driven facet filters
rubenvdlinde Mar 4, 2026
b648bd9
Create .gitattributes
remko48 Mar 4, 2026
fbbd37c
Merge pull request #6 from ConductionNL/Added-.gitattributes
SudoThijn Mar 4, 2026
575b567
Normalize line endings to LF
SudoThijn Mar 4, 2026
f4eb12a
fixed issues with table not being scrollable
SudoThijn Mar 4, 2026
8d6a982
WIP - advanced form
SudoThijn Mar 4, 2026
6344d26
added form to CnIndexPage under `useAdvancedFormDialog`
SudoThijn Mar 5, 2026
62e8997
WIP - basic documentation
SudoThijn Mar 5, 2026
fdc2b97
small doc update
SudoThijn Mar 6, 2026
be1c9d4
Merge pull request #7 from ConductionNL/feature/class-fixes
SudoThijn Mar 6, 2026
7f9076e
WIP - advanced form
SudoThijn Mar 4, 2026
6cfee04
added form to CnIndexPage under `useAdvancedFormDialog`
SudoThijn Mar 5, 2026
fcc252e
WIP - basic documentation
SudoThijn Mar 5, 2026
3909482
small doc update
SudoThijn Mar 6, 2026
5106e31
Merge remote-tracking branch 'origin/feature/advanced-form' into feat…
SudoThijn Mar 6, 2026
ed5acb1
improved form looks, fixed boolean and number view, added tooltip
SudoThijn Mar 6, 2026
d148232
split up files for advanced form
SudoThijn Mar 6, 2026
97429d8
added internal save ability to advanced form
SudoThijn Mar 6, 2026
9ef2291
feat: Add dashboard widget system (CnDashboardPage, CnDashboardGrid, …
rubenvdlinde Mar 9, 2026
bed28e3
seperated pagination
SudoThijn Mar 9, 2026
12a35ec
revert "seperated pagination"
SudoThijn Mar 9, 2026
47f27a9
added selection plugin
SudoThijn Mar 9, 2026
20a00aa
search plugin
SudoThijn Mar 9, 2026
fd69da3
added small update to search plugin
SudoThijn Mar 9, 2026
29b5460
add Auto-register to refetchSearchCollection
SudoThijn Mar 10, 2026
52aef1c
Merge branch 'docs/i18n-and-customization-guides' into feature/advanc…
SudoThijn Mar 10, 2026
138fb89
removed bad word from cSpell
SudoThijn Mar 10, 2026
aebe76b
fixed missing comma
SudoThijn Mar 11, 2026
06a1e4d
added refreshing to Action Bar. added showZeroCount to Stats Block
SudoThijn Mar 11, 2026
a111d02
created generic detail page
SudoThijn Mar 11, 2026
051410f
Added item Card and updated stats block colors
SudoThijn Mar 11, 2026
b300538
added cn-item-card docs
SudoThijn Mar 11, 2026
dad4811
seperator on CnActionsBar only shows when it has mass actions
SudoThijn Mar 12, 2026
db26636
added schema form dialog
SudoThijn Mar 12, 2026
74b3fc9
split up css, fixed NcNoteCard by forking it
SudoThijn Mar 13, 2026
593f8d7
split up schema form into multiple files
SudoThijn Mar 13, 2026
1d1751e
feat: Add CnAdvancedFormDialog and store plugins
rubenvdlinde Mar 15, 2026
5175c11
Merge branch 'docs/i18n-and-customization-guides' into feature/change…
SudoThijn Mar 16, 2026
a7b259a
feat: Add CnTimelineStages component for sequential stage visualization
rubenvdlinde Mar 16, 2026
78771ba
Merge branch 'docs/i18n-and-customization-guides' into feature/change…
SudoThijn Mar 16, 2026
436b9ed
finalized schema form
SudoThijn Mar 16, 2026
a6f760f
Merge pull request #9 from ConductionNL/feature/changes-for-registers…
SudoThijn Mar 16, 2026
d1215a3
Merge branch 'docs/i18n-and-customization-guides' into feature/change…
SudoThijn Mar 16, 2026
c153c1b
split noObjectsTooltip into specific tooltips for delete and publish
SudoThijn Mar 16, 2026
ab94b51
feat: Add URL deeplink sync and objectStore option to useListView
rubenvdlinde Mar 16, 2026
1138d9b
Merge pull request #13 from ConductionNL/feature/changes-for-schemas-…
SudoThijn Mar 16, 2026
3aeb123
feat: Add below-header slot to CnIndexPage and adjust header-actions …
SudoThijn Mar 17, 2026
0c20ee0
added generic tabbed form dialog
SudoThijn Mar 17, 2026
9647c90
use TabbedForm as base for SchemaForm
SudoThijn Mar 17, 2026
a31697a
Implements reusable tabbed form dialog and refactors SchemaForm (#15)
SudoThijn Mar 17, 2026
d468143
Added enum label overrides and openDeleteDialog method to CnIndexPage
SudoThijn Mar 18, 2026
e3aa7cf
Added CnCard, updated CnStatusBadge to allow solid colors
SudoThijn Mar 18, 2026
be47f9c
add showAdd prop to conditionally show create button
SudoThijn Mar 18, 2026
38c54b3
updated doc
SudoThijn Mar 18, 2026
1ab9c74
added back seperator and removed italic
SudoThijn Mar 18, 2026
3d340c2
Enhance CnCard with footer support, grid header layout, and smart tit…
SudoThijn Mar 18, 2026
dc127d8
Merge branch 'main' into docs/i18n-and-customization-guides
SudoThijn Mar 18, 2026
0745d31
upped package
SudoThijn Mar 18, 2026
c62138a
added below-tabs slot to CnTabbedFormDialog.vue
SudoThijn Mar 18, 2026
d89c2fb
Merge branch 'docs/i18n-and-customization-guides' into feature/REGIST…
SudoThijn Mar 18, 2026
dafd540
Merge branch 'feature/REGISTERS-480/changes-for-data-sources' into fe…
SudoThijn Mar 18, 2026
cc4911e
EOL change
SudoThijn Mar 18, 2026
093e1c1
Merge branch 'feature/REGISTERS-481/changes-for-entities-page' into f…
SudoThijn Mar 18, 2026
17e660d
added confirm-icon slot to tabbed form
SudoThijn Mar 18, 2026
d313f55
EOL changes (again)
SudoThijn Mar 19, 2026
84834cc
Merge origin/main into feature/timeline-stages-widget
rubenvdlinde Mar 19, 2026
b1c5dc7
updated package-lock
SudoThijn Mar 19, 2026
414ad3a
fix: Sync package-lock.json with package.json
rubenvdlinde Mar 19, 2026
d154b0b
re-did package-lock
SudoThijn Mar 19, 2026
bd8841e
Merge remote-tracking branch 'origin/docs/i18n-and-customization-guid…
SudoThijn Mar 19, 2026
b6c2414
finalized package-lock
SudoThijn Mar 19, 2026
109b1a7
fix: Resolve ESLint error in CnDetailPage — split multi-attribute tag
rubenvdlinde Mar 19, 2026
82973f2
CnRowActions disabled type can be a function, fixed CnStatsBlock colors
SudoThijn Mar 19, 2026
c5dc0e4
expanded audit trails plugin
SudoThijn Mar 19, 2026
2cb37d3
added `primary` boolean option and menuName to CnRowActions
SudoThijn Mar 19, 2026
12ed7b7
Added async query to CnFormDialog enum
SudoThijn Mar 19, 2026
fc67e71
cherry picked functional disabled code
SudoThijn Mar 19, 2026
8be5ed8
cherry picked openDeleteDialog ref function
SudoThijn Mar 19, 2026
b69cd4c
actions close after click
SudoThijn Mar 19, 2026
9108df5
Merge pull request #20 from ConductionNL/feature/REGISTERS-478/organi…
SudoThijn Mar 19, 2026
6e07072
Added CnStatsPanel component for generic stats showcase anywhere
SudoThijn Mar 19, 2026
416472c
added grid custom class support to Kpigrid
SudoThijn Mar 19, 2026
c536155
feat: Enrich all 23 nextcloud-vue component library specs with deep r…
rubenvdlinde Mar 20, 2026
33c8d55
eol
SudoThijn Mar 20, 2026
f3dca5f
Merge remote-tracking branch 'origin/docs/i18n-and-customization-guid…
SudoThijn Mar 20, 2026
e1a3a06
Merge branch 'docs/i18n-and-customization-guides' into feature/REGIST…
SudoThijn Mar 20, 2026
74da5fd
feat: Add role-based widget visibility to CnDashboardPage
rubenvdlinde Mar 20, 2026
5192d23
added CnDetailsGrid and CnJsonViewer, fixed CnRowActions remaining open
SudoThijn Mar 20, 2026
3bd4b06
added support for both light and dark mode themes
SudoThijn Mar 20, 2026
08c544d
chore: Restructure specs — add status: reviewed to all 23 specs
rubenvdlinde Mar 20, 2026
feab493
added name formatting functionality to delete modals
SudoThijn Mar 20, 2026
eaba8a8
chore: Final OpenSpec structure cleanup
rubenvdlinde Mar 20, 2026
91719fe
chore: Convert all specs to change proposals
rubenvdlinde Mar 20, 2026
b01a0f0
chore: Add library-specific rules to openspec config
rubenvdlinde Mar 21, 2026
b2e9f21
feat: Process all 24 OpenSpec changes — grid system, widgets, exports…
rubenvdlinde Mar 21, 2026
49a71cc
fix: Add null guard in gridLayout mixin and support custom store in u…
rubenvdlinde Mar 21, 2026
74da0e0
Workflow fix
remko48 Mar 24, 2026
284a5e0
fix: Widget and detail page graphical improvements
rubenvdlinde Mar 24, 2026
331c655
Eslint error fix
remko48 Mar 24, 2026
47a87e3
Updated eslint
remko48 Mar 25, 2026
6f3a113
Final check
remko48 Mar 25, 2026
d880aec
feat: Refactor CnObjectSidebar into separate tab components
rubenvdlinde Mar 25, 2026
656d187
Fixed Eslint errors
remko48 Mar 25, 2026
8878444
eslint endline fixes
remko48 Mar 25, 2026
f0818fc
Merge pull request #30 from ConductionNL/docs/i18n-and-customization-…
remko48 Mar 25, 2026
47c1fd6
Added branch protection workflow
remko48 Mar 25, 2026
f6a6d4a
Merge pull request #34 from ConductionNL/development
remko48 Mar 25, 2026
a3220d5
Fixed @semantic-release/git not found
remko48 Mar 25, 2026
771ec47
Merge pull request #35 from ConductionNL/development
remko48 Mar 25, 2026
8cac557
feat: Audit trail tab — latest first with expandable details
rubenvdlinde Mar 25, 2026
ee9e2e0
feat: Pagination, server-side filtering, checkbox toggle, overdue tasks
rubenvdlinde Mar 25, 2026
72aa849
feat: Task tab — aligned layout, edit, filter, labels
rubenvdlinde Mar 25, 2026
1b0797f
fix: Task tab layout — separate create/filter sections, no horizontal…
rubenvdlinde Mar 25, 2026
bde3f21
feat: Audit trail Action and User filters are now multi-select
rubenvdlinde Mar 25, 2026
57d511e
fix: Encode task ID in API URLs — .ics extension needs URI encoding
rubenvdlinde Mar 25, 2026
b5cd542
Updated header.js to skip empty values like an array or object
remko48 Mar 25, 2026
265cd48
Merge pull request #36 from ConductionNL/feat/update-header.js
remko48 Mar 25, 2026
5afcac7
Merge pull request #37 from ConductionNL/development
remko48 Mar 25, 2026
9f8433e
Updated package
remko48 Mar 25, 2026
efdef4e
Merge branch 'beta' into feature/REGISTERS-481/changes-for-entities-page
remko48 Mar 30, 2026
e07392a
Merge branch 'beta' into feature/REGISTERS-480/changes-for-data-sources
remko48 Mar 30, 2026
5c2abab
Merge branch 'feature/REGISTERS-481/changes-for-entities-page' into f…
remko48 Mar 30, 2026
13bef3d
Merge pull request #16 from ConductionNL/feature/REGISTERS-480/change…
SudoThijn Mar 30, 2026
0a4eeac
Merge pull request #17 from ConductionNL/feature/REGISTERS-481/change…
SudoThijn Mar 30, 2026
4ceb4dc
Merge branch 'feature/REGISTERS-482/changes-for-configuration-page' i…
remko48 Mar 30, 2026
e7a0d30
updated package.lock
remko48 Mar 30, 2026
4cd6a1d
added CnProgressBar and integrated it into CnStatsPanel
SudoThijn Mar 30, 2026
a638d95
Merge pull request #18 from ConductionNL/feature/REGISTERS-482/change…
SudoThijn Mar 30, 2026
9ef5434
Merge pull request #24 from ConductionNL/feature/REGISTERS-483/change…
SudoThijn Mar 30, 2026
314bbec
Merge pull request #38 from ConductionNL/feature/REGISTERS-484/change…
SudoThijn Mar 30, 2026
87e6b78
added check to CnFormDialog if all required fields are filled
SudoThijn Mar 30, 2026
9b025b7
Merge pull request #39 from ConductionNL/feature/REGISTERS-486/change…
SudoThijn Mar 30, 2026
23829f3
fixed bug with color map not being normalized
SudoThijn Mar 31, 2026
2c8f7ee
Merge remote-tracking branch 'origin/development' into fix/widget-det…
remko48 Mar 31, 2026
f7a0eb0
Eslint
remko48 Mar 31, 2026
f2128f8
More Eslint
remko48 Mar 31, 2026
9b88cbf
Merge pull request #32 from ConductionNL/fix/widget-detail-graphical-…
remko48 Mar 31, 2026
7b9f226
Merge remote-tracking branch 'origin/development' into feat/sidebar-t…
remko48 Mar 31, 2026
3495217
Eslint
remko48 Mar 31, 2026
fbc2f94
More Eslint
remko48 Mar 31, 2026
a43458e
Merge pull request #33 from ConductionNL/feat/sidebar-tab-components
remko48 Mar 31, 2026
f9269d8
extended support of CnJsonViewer
SudoThijn Mar 31, 2026
b42dba0
updated docs for CnJsonViewer
SudoThijn Mar 31, 2026
e80d3fc
Merge branch 'development' into feature/REGISTERS-490/changes-for-web…
SudoThijn Mar 31, 2026
e0f08c7
removed duplicate export
SudoThijn Mar 31, 2026
08f85c9
removed another duplicate export
SudoThijn Mar 31, 2026
f3edc44
Merge pull request #40 from ConductionNL/feature/REGISTERS-490/change…
SudoThijn Mar 31, 2026
6708a1b
Merge pull request #26 from ConductionNL/chore/specs-to-proposals
remko48 Mar 31, 2026
1daa2ca
Merge pull request #25 from ConductionNL/chore/final-spec-cleanup
remko48 Mar 31, 2026
e30a00c
Merge remote-tracking branch 'origin/feature/enrich-openspec-specs' i…
remko48 Mar 31, 2026
44a64bb
Merge pull request #23 from ConductionNL/chore/restructure-specs-to-c…
remko48 Mar 31, 2026
290b218
Merge pull request #21 from ConductionNL/feature/enrich-openspec-specs
remko48 Mar 31, 2026
e7bf328
Merge remote-tracking branch 'origin/development' into feature/timeli…
remko48 Mar 31, 2026
950ba44
Merge pull request #12 from ConductionNL/feature/timeline-stages-widget
remko48 Mar 31, 2026
47c000e
Merge pull request #22 from ConductionNL/feature/widget-role-visibility
remko48 Mar 31, 2026
74d3489
Merge pull request #41 from ConductionNL/development
remko48 Mar 31, 2026
5b447b9
Merge remote-tracking branch 'origin/main' into main-to-beta
remko48 Mar 31, 2026
ae90cdf
Merge pull request #44 from ConductionNL/main-to-beta
remko48 Mar 31, 2026
b1c545b
created CRUD store factory
SudoThijn Mar 31, 2026
3de78a8
Updated eslint config
remko48 Apr 1, 2026
e4d5fbd
Fixed Eslint errors
remko48 Apr 1, 2026
13a373a
Removed partial Eslint warnings and removed placeholders
remko48 Apr 1, 2026
11a8cfc
Merge remote-tracking branch 'origin/feature/REGISTERS-478/organisati…
rubenvdlinde Apr 1, 2026
6696e19
Merge remote-tracking branch 'origin/feature/REGISTERS-491/store-conv…
rubenvdlinde Apr 1, 2026
40fac67
Merge remote-tracking branch 'origin/feature/Eslint-config' into feat…
rubenvdlinde Apr 1, 2026
b0f4270
fix: Add prefixUrl to default useObjectStore and schema/register fetc…
rubenvdlinde Apr 1, 2026
0426f34
fix: Add missing sidebar props to CnDetailPage
rubenvdlinde Apr 1, 2026
0624585
fix: Use spread-and-omit instead of delete in unregisterObjectType
rubenvdlinde Apr 1, 2026
87977b6
fix: Guard OC.requestToken access in buildHeaders
rubenvdlinde Apr 1, 2026
d115258
fix: Accept custom objectStore option in useDetailView
rubenvdlinde Apr 1, 2026
bacbd34
fix: Add prefixUrl to registerMapping plugin API URLs
rubenvdlinde Apr 1, 2026
825389b
fix: Preserve cross-page selections in CnDataTable toggleSelectAll
rubenvdlinde Apr 1, 2026
90795ae
fix: Add missing :key binding to CnCardGrid v-for slot
rubenvdlinde Apr 1, 2026
2c93d58
fix: Await init() in useDashboardView onMounted hook
rubenvdlinde Apr 1, 2026
4ae10c0
fix: Use spread assignment in lifecycle plugin for Vue 2 reactivity
rubenvdlinde Apr 1, 2026
000a648
fix: Export missing components from main barrel
rubenvdlinde Apr 1, 2026
eae58ca
fix: Extract shared capitalize utility and fix search.js fallback URL
rubenvdlinde Apr 1, 2026
45ef025
Removed all Eslint warnings
remko48 Apr 1, 2026
16b7b5d
Merge pull request #46 from ConductionNL/feature/Eslint-config
remko48 Apr 1, 2026
4630b2b
added crud-store tests
SudoThijn Apr 1, 2026
26d0e80
fix: Wrap CnCardGrid v-for slot in keyed div for Vue 2 compatibility
rubenvdlinde Apr 1, 2026
2405368
fixed linting issues
SudoThijn Apr 1, 2026
d2efc25
Merge branch 'development' into feature/REGISTERS-491/store-conversion
SudoThijn Apr 1, 2026
a30221a
reverted a bunch of changes
SudoThijn Apr 1, 2026
0ec75fe
Merge pull request #45 from ConductionNL/feature/REGISTERS-491/store-…
SudoThijn Apr 1, 2026
1e93094
Merge branch 'development' into feature/open-register-code-review
SudoThijn Apr 1, 2026
fb6d1ff
Npm audit fixes
remko48 Apr 1, 2026
8dda1d6
Merge pull request #48 from ConductionNL/feature/registers-494/packag…
remko48 Apr 2, 2026
0c02642
added functionality to disable base buttons
SudoThijn Apr 2, 2026
2721a15
updated package-lock
SudoThijn Apr 2, 2026
cd8aab4
lint-fix
SudoThijn Apr 2, 2026
851ec8f
Merge remote-tracking branch 'origin/development' into feature/open-r…
remko48 Apr 2, 2026
bbeba34
Code quality fix
remko48 Apr 2, 2026
4cee5d2
Merge pull request #47 from ConductionNL/feature/open-register-code-r…
remko48 Apr 2, 2026
7199e94
Merge pull request #50 from ConductionNL/development
remko48 Apr 2, 2026
f20e768
Merge pull request #49 from ConductionNL/feature/small-fixes
SudoThijn Apr 3, 2026
58d6f55
Merge pull request #51 from ConductionNL/development
remko48 Apr 7, 2026
9902f4a
Updated package
remko48 Apr 7, 2026
eab3522
Merge pull request #52 from ConductionNL/feature/up-package
remko48 Apr 7, 2026
07c78c9
Merge pull request #53 from ConductionNL/development
remko48 Apr 7, 2026
cc01c2f
fix: Prevent action buttons from squishing in actions bar
SudoThijn Apr 7, 2026
3403877
Merge branch 'development' into feature/fix-action-buttons-width
SudoThijn Apr 7, 2026
7e20b86
Merge pull request #54 from ConductionNL/feature/fix-action-buttons-w…
SudoThijn Apr 7, 2026
2ca412f
merge: resolve CnCardGrid conflict — keep keyed div wrapper with full…
rubenvdlinde Apr 8, 2026
f83500f
feat: add CnObjectDataWidget and CnObjectMetadataWidget components
rubenvdlinde Apr 8, 2026
86dd139
fix: static apexcharts import and centralize row-click handling
rubenvdlinde Apr 9, 2026
90b6f7c
created composable
SudoThijn Apr 10, 2026
4c51e61
added context menu component
SudoThijn Apr 10, 2026
839b919
Merge pull request #64 from ConductionNL/feature/rclick-context-menu
SudoThijn Apr 13, 2026
caf136b
up version
SudoThijn Apr 13, 2026
c42cde2
Implement tri-state sorting to allow clearing table sort
SudoThijn Apr 14, 2026
8302eef
Merge pull request #65 from ConductionNL/feature/disable-table-sorting
SudoThijn Apr 16, 2026
068d09e
feat(i18n): add translation support to all shared components
rubenvdlinde Apr 16, 2026
f51142b
Merge branch 'development' into feature/i18n-complete-translations
SudoThijn Apr 16, 2026
19886ac
fix: address PR review feedback
rubenvdlinde Apr 16, 2026
355cfbb
docs: add slot conventions and missing component documentation
rubenvdlinde Apr 16, 2026
01a584a
fix: restore widget-*-actions slot passthrough on CnDashboardPage
rubenvdlinde Apr 16, 2026
fe08ba6
lint fixes
SudoThijn Apr 16, 2026
4d18117
Merge pull request #66 from ConductionNL/feature/i18n-complete-transl…
rubenvdlinde Apr 16, 2026
07f040d
refactor: standardize all header action slots to #actions
rubenvdlinde Apr 16, 2026
c195dd1
Merge branch 'development' into feature/i18n-complete-translations
remko48 Apr 17, 2026
9b76837
Updated package
remko48 Apr 17, 2026
a24df16
Added docs check for all created components
remko48 Apr 17, 2026
14e3fda
Merge pull request #67 from ConductionNL/feature/i18n-complete-transl…
remko48 Apr 17, 2026
d6cbfa0
Added missing docs
remko48 Apr 17, 2026
1bb9185
updated check-docs to handle all possible docs
SudoThijn Apr 17, 2026
803402a
added missing docs
SudoThijn Apr 17, 2026
73c97fc
Merge pull request #68 from ConductionNL/feature/docs-check
remko48 Apr 17, 2026
1b39e17
Updated package.lock
remko48 Apr 17, 2026
aa6774b
Merge pull request #69 from ConductionNL/feature/update-packagelock
remko48 Apr 17, 2026
821c177
Merge pull request #70 from ConductionNL/development
remko48 Apr 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .github/workflows/code-quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ jobs:
- name: Install dependencies
run: npm ci

- name: Documentation coverage
run: npm run check:docs

- name: ESLint
run: npm run lint

Expand Down
38 changes: 38 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
{
"overrides": [
{
"files": ["*.json"],
"options": {
"parser": "json",
"printWidth": 120,
"tabWidth": 2
}
},
{
"files": ["*.ts", "*.tsx"],
"options": {
"parser": "typescript",
"printWidth": 120,
"trailingComma": "all",
"tabWidth": 2,
"singleQuote": false
}
},
{
"files": ["*.css", "*.scss"],
"options": {
"parser": "css",
"tabWidth": 2
}
},
{
"files": ["conduction.css"],
"options": {
"parser": "css",
"trailingComma": "all",
"tabWidth": 2,
"printWidth": 150
}
}
]
}
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@
"[javascript]": {
"editor.defaultFormatter": "dbaeumer.vscode-eslint"
},
"[vue]": {
"editor.defaultFormatter": "dbaeumer.vscode-eslint"
},
"[css]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
Expand Down
75 changes: 73 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,12 @@ import '@conduction/nextcloud-vue/src/css/index.css'

**Layout & Pages**
- `CnIndexPage` — Top-level schema-driven index page (table/cards, pagination, mass actions, dialogs)
- `CnDetailPage` — Generic detail/overview page with stats table and flexible content slots (simpler alternative to CnIndexPage)
- `CnPageHeader` — Page header with icon, title, description
- `CnActionsBar` — Action bar with add button, mass actions, view toggle, search

**Data Display**
- `CnDetailGrid` — Data-driven label-value grid with grid and horizontal layout modes
- `CnDataTable` — Sortable data table with selection, loading, empty states
- `CnCardGrid` — Grid of object cards
- `CnObjectCard` — Single object card
Expand All @@ -37,23 +39,35 @@ import '@conduction/nextcloud-vue/src/css/index.css'
**Single-Object Dialogs** (emit-based, two-phase confirm → result)
- `CnDeleteDialog` — Single-item delete confirmation
- `CnCopyDialog` — Single-item copy with naming pattern selector
- `CnFormDialog` — Schema-driven create/edit form dialog (auto-generates fields, supports slot overrides)
- `CnFormDialog` — Schema-driven create/edit form dialog (auto-generates fields, supports async select via `enum` function, per-field option slot overrides)
- `CnAdvancedFormDialog` — Richer create/edit dialog with properties table (click-to-edit), Data (JSON) tab with CodeMirror, optional Metadata tab; optional useObjectStore integration; fixed large size
- `CnSchemaFormDialog` — Full-featured JSON Schema editor dialog with Properties (sortable table, inline editing), Configuration (composition, field mappings), and Security (RBAC) tabs. Accepts external data as props (availableSchemas, availableRegisters, userGroups, availableTags). Optional action buttons (extend, analyze, validate, delete objects, publish, delete) controlled via boolean props that emit events.

**Mass-Action Dialogs** (emit-based, two-phase confirm → result)
- `CnMassDeleteDialog` — Bulk delete confirmation
- `CnMassCopyDialog` — Bulk copy with naming patterns
- `CnMassExportDialog` — Bulk export with format selection
- `CnMassImportDialog` — Bulk import with file upload

**Data Viewers**
- `CnJsonViewer` — Syntax-highlighted code viewer/editor with CodeMirror (supports JSON, XML, HTML, plain text via `language` prop with `'auto'` detection; readOnly mode)

**UI Elements**
- `CnStatusBadge` — Color-coded status/priority pill badge
- `CnDetailCard` — Card container with title, icon, collapsible sections
- `CnRowActions` — Row action buttons (inline + overflow dropdown)
- `CnContextMenu` — Right-click context menu (wraps NcActions, pair with `useContextMenu` composable)
- `CnMassActionBar` — Floating bar for mass action triggers
- `CnIcon` — MDI icon by name
- `CnKpiGrid` — KPI metric cards grid
- `CnStatsPanel` — Data-driven statistics panel (sections of stat blocks, list items, and progress bars)
- `CnProgressBar` — Labeled horizontal progress bars with variant colors for distribution visualizations
- `CnIndexSidebar` — Index page sidebar

**Object Widgets**
- `CnObjectDataWidget` — Schema-driven editable data grid widget. Displays object properties in a CSS grid, supports inline editing (click-to-edit with all widget types), dirty tracking, and saves via objectStore. Configurable per-property overrides for order, grid span, visibility, editability, label, and widget type.
- `CnObjectMetadataWidget` — Read-only metadata display widget. Automatically extracts and formats system metadata from OpenRegister objects (@self block: id, uuid, uri, register, schema, created, updated, owner, etc.). Supports include/exclude filters and extra items.

**Dashboard**
- `CnDashboardPage` — Top-level dashboard page with GridStack widget grid (the dashboard equivalent of CnIndexPage)
- `CnDashboardGrid` — Low-level GridStack grid layout engine (drag/drop, resize)
Expand Down Expand Up @@ -88,6 +102,7 @@ import '@conduction/nextcloud-vue/src/css/index.css'
- `useDetailView(options)` — Load, edit, delete state management
- `useFileSelection(options)` — File upload/drop handling
- `useDashboardView(options)` — Dashboard state: widget defs, layout, NC widget loading, add/remove/persist
- `useContextMenu()` — Right-click context menu positioning and state (cursor CSS vars, open/close, action helpers)

### CnIndexPage Dialog Override System

Expand All @@ -99,6 +114,7 @@ CnIndexPage has built-in single-object dialogs (Delete, Copy, Form) that are **o
- `#form-dialog="{ item, schema, close }"` — Replace create/edit dialog (use CnFormDialog or CnAdvancedFormDialog)
2. **Form content override** — `#form-fields` replaces the form inside the built-in CnFormDialog
3. **Per-field override** — `#field-{key}` inside CnFormDialog replaces a single field
4. **Per-field option rendering** — `#field-{key}-option` and `#field-{key}-selected-option` customize dropdown option display for select/multiselect/tags fields

Key events emitted by CnIndexPage:
- `@create(formData)` — Form dialog create confirmed
Expand Down Expand Up @@ -180,17 +196,72 @@ const DEFAULT_LAYOUT = [
6. Add to `src/index.js` barrel
7. Write test in `tests/components/`
8. Use Nextcloud CSS variables only (no `--nldesign-*` references)
9. **Write a docs page** at `docs/components/cn-my-component.md` — see the next section. The `check:docs` script fails CI when any public export is undocumented.

## Documentation Coverage (enforced)

Every identifier re-exported from `src/index.js` must have corresponding documentation. This is enforced by [scripts/check-docs.js](scripts/check-docs.js), wired up as:

```bash
npm run check:docs
```

The script parses `src/index.js`, classifies each named export, and verifies that a matching doc file (or symbol mention) exists under `docs/`. It exits non-zero with a per-category breakdown when anything is missing. Run it before committing any change that adds, renames, or removes a public export.

### Export → doc location mapping

| Category | Match rule | Expected doc |
|----------|-----------|--------------|
| Components | `Cn*` PascalCase | `docs/components/<kebab>.md` |
| Composables | `use*` (not in the store factory list) | `docs/utilities/composables/<kebab>.md` |
| Store factories | `useObjectStore`, `createObjectStore`, `createCrudStore`, `createSubResourcePlugin` | `docs/store/<stem>.md` — stem strips the leading `use`/`create` verb (→ `object-store.md`, `crud-store.md`, `sub-resource-plugin.md`) |
| Store plugins | `*Plugin` suffix | `docs/store/plugins/<kebab>.md` (e.g. `auditTrailsPlugin` → `audit-trails.md`) |
| Store constants | See `STORE_MENTION_ONLY` | Mention-by-name inside an existing `docs/store/*.md` — no standalone file required |
| Utilities | Any other export | `docs/utilities/<kebab>.md` |

`<kebab>` is the camelCase/PascalCase export name converted to kebab-case by the script's `toKebab()` helper.

### Configuring the script

Three constants at the top of [scripts/check-docs.js](scripts/check-docs.js) control the edge cases — each has an inline JSDoc block explaining its purpose in detail:

- **`EXEMPT`** — Set of export names that don't need a dedicated doc page. Reserved for lifecycle/bootstrap helpers covered by another doc (currently only `registerIcons`, documented as part of the install flow). Exempt exports are skipped entirely and don't count toward any category's totals.

- **`STORE_FACTORY_STEMS`** — Map of store factory/helper identifiers to their doc filename stem under `docs/store/`. Used to override the default kebab-case rule so the docs read as `object-store.md` / `crud-store.md` instead of `use-object-store.md` / `create-crud-store.md`. Multiple identifiers may map to the same stem (e.g. `useObjectStore` and `createObjectStore` both point at `docs/store/object-store.md`).

- **`STORE_MENTION_ONLY`** — Map of export names to the `.md` file (relative to `docs/store/`) that's required to mention them by name. Used for constants and small helpers that belong with a larger API and don't warrant their own page (e.g. `SEARCH_TYPE` is checked inside `docs/store/plugins/search.md`). Coverage passes when the file exists and contains the symbol name as a substring.

When adding a new public export that doesn't fit the default rules:

- If it's one of a small set of helpers for an existing page → add it to `STORE_MENTION_ONLY` and ensure the target doc references it by name.
- If the default kebab-case → filename mapping produces an awkward stem → add an entry to `STORE_FACTORY_STEMS` (store-related) or extend `classify()` with a new category for other surfaces.
- If it's truly a non-API export (build-time helper, registration hook) → add it to `EXEMPT`. Use this sparingly.

### Running the check

```bash
# From nextcloud-vue/
npm run check:docs # exits 0 when every export is covered, 1 otherwise
```

Output is a per-category coverage summary followed by a list of missing exports with the exact file path the script expects, so the fix is always to either create that file or rename an existing one.

## Project Structure

```
src/
index.js # Main barrel export
index.js # Main barrel export — source of truth for public API
components/ # Vue SFC components (CnPrefixed)
store/ # Pinia stores
composables/ # Vue composables
css/ # Global CSS modules
utils/ # Utility functions
docs/
components/ # One .md per component (cn-<kebab>.md)
store/ # Store factories + plugins/ subdir
utilities/ # Utility functions + composables/ subdir
scripts/
check-docs.js # Enforces docs coverage for every src/index.js export
```

## Consumer Apps
Expand Down
27 changes: 27 additions & 0 deletions docs/architecture/customization.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ CnIndexPage
├── slot: #before-fields ← prepend content to auto-generated fields
├── slot: #after-fields ← append content to auto-generated fields
├── slot: #field-{key} ← replace one specific field
├── slot: #field-{key}-option ← custom dropdown option rendering for a select field
├── slot: #field-{key}-selected-option ← custom selected display for a select field
└── slot: #import-fields ← add extra fields to the import dialog
```

Expand Down Expand Up @@ -97,6 +99,7 @@ CnIndexPage
| `show-mass-copy` | Boolean | `true` | Show the built-in Copy (mass) button |
| `show-mass-delete` | Boolean | `true` | Show the built-in Delete (mass) button |
| `mass-action-name-field` | String | `'title'` | Property used to display item names inside mass-action dialogs |
| `name-formatter` | Function | `null` | Optional `(item) => string` to format item names in dialogs. Overrides `mass-action-name-field` when provided. |
| `export-formats` | Array | `[{ id:'excel', label:'Excel (.xlsx)' }, ...]` | Available formats in the export dialog |
| `import-options` | Array | `[]` | Option checkboxes shown in the import dialog |

Expand Down Expand Up @@ -482,6 +485,30 @@ The slot scope for `#field-{key}` provides:
- `error` — current validation error string (empty when valid)
- `updateField(key, value)` — call this to update the form data

### Custom option rendering for select fields

For select, multiselect, and tags fields, you can customize how dropdown options and selected values are displayed without replacing the entire field. Use `#field-{key}-option` and `#field-{key}-selected-option`:

```vue
<CnIndexPage title="Clients" :schema="schema" :objects="objects" @create="onCreate">
<!-- Custom rendering for the 'category' select dropdown options -->
<template #field-category-option="{ label, description, count }">
<div class="category-option">
<strong>{{ label }}</strong>
<span v-if="count" class="count">({{ count }})</span>
<p v-if="description">{{ description }}</p>
</div>
</template>

<!-- Simpler display when selected -->
<template #field-category-selected-option="{ label }">
{{ label }}
</template>
</CnIndexPage>
```

The slot scope receives all properties of the option object. This is especially useful with async select fields where options have rich data beyond just a label. See [CnFormDialog — Async Select](../components/cn-form-dialog.md#async-select) for details.

### Prepend or append extra fields

Add content before or after the auto-generated fields without replacing any of them:
Expand Down
2 changes: 1 addition & 1 deletion docs/architecture/schema-driven.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ const fields = fieldsFromSchema(schema)
// Result: field definitions with widget types (text, email, select, date...)
```

`CnFormDialog` renders these as a complete form with validation.
`CnFormDialog` renders these as a complete form with validation. Select fields support both static enum arrays and async functions for remote search — see [CnFormDialog — Async Select](../components/cn-form-dialog.md#async-select).

### 5. All Together in CnIndexPage

Expand Down
101 changes: 101 additions & 0 deletions docs/architecture/slots.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
# Slot naming conventions

All components follow a consistent slot naming scheme. This page documents the conventions so consumer apps use the correct slot names.

## Header action slots

All components that have a header area with action buttons use the standard `#actions` slot.

| Slot name | Used by | Purpose |
|-----------|---------|---------|
| `#actions` | All page, widget, and card components | Buttons in the component header (right side) |

### Usage

```vue
<CnIndexPage>
<template #actions>
<NcButton @click="doSomething">Extra action</NcButton>
</template>
</CnIndexPage>
```

```vue
<CnDetailPage>
<template #actions>
<NcButton @click="save">Save</NcButton>
</template>
</CnDetailPage>
```

```vue
<CnWidgetWrapper title="My widget">
<template #actions>
<NcButton @click="refresh">Refresh</NcButton>
</template>
<!-- widget content -->
</CnWidgetWrapper>
```

```vue
<CnDetailCard title="Card title">
<template #actions>
<NcButton @click="doSomething">Action</NcButton>
</template>
</CnDetailCard>
```

Components using `#actions`: `CnIndexPage`, `CnDetailPage`, `CnDashboardPage`, `CnActionsBar`, `CnWidgetWrapper`, `CnObjectDataWidget`, `CnObjectMetadataWidget`, `CnDetailCard`, `CnCard`, `CnConfigurationCard`, `CnVersionInfoCard`, `CnSettingsSection`, `CnRegisterMapping`, `CnObjectCard`, `CnItemCard`, `CnMassActionBar`

### Per-widget actions on CnDashboardPage (`#widget-{widgetId}-actions`)

`CnDashboardPage` passes per-widget action slots through to each widget's `CnWidgetWrapper#actions`:

```vue
<CnDashboardPage :widgets="widgets" :layout="layout">
<template #widget-my-work="{ item }">
<MyWorkList />
</template>
<template #widget-my-work-actions>
<NcButton @click="refreshWork">Refresh</NcButton>
</template>
</CnDashboardPage>
```

The slot name follows the pattern `widget-{widgetId}-actions` where `widgetId` matches the widget's `id` in the widgets array.

## Row action slots

| Slot name | Used by | Purpose |
|-----------|---------|---------|
| `#row-actions` | `CnDataTable`, `CnIndexPage` | Per-row action buttons |
| `#card-actions` | `CnCardGrid` | Per-card action buttons |
| `#actions-header` | `CnDataTable` | Column header for the actions column |

## Mass action slots

| Slot name | Used by | Purpose |
|-----------|---------|---------|
| `#mass-actions` | `CnActionsBar`, `CnIndexPage` | Extra mass action buttons (scoped: `count`, `selectedIds`) |
| `#action-items` | `CnActionsBar`, `CnIndexPage` | Extra items in the top action bar |

## Dialog footer slots

| Slot name | Used by | Purpose |
|-----------|---------|---------|
| `#actions-left` | `CnAdvancedFormDialog`, `CnTabbedFormDialog` | Left-side footer buttons |
| `#actions-right` | `CnAdvancedFormDialog`, `CnTabbedFormDialog` | Right-side footer buttons |

## Translation

All label props use `t()` from `@nextcloud/l10n` as defaults (sentence case). Consumer apps can override any label by passing a string prop:

```vue
<!-- Uses default translated label -->
<CnDeleteDialog :item="item" />

<!-- Override with custom label -->
<CnDeleteDialog :item="item" :cancel-label="t('myapp', 'Go back')" />
```

See [ADR-007](https://github.com/ConductionNL/hydra/blob/development/openspec/architecture/adr-007-i18n.md) for the full i18n specification.
Loading
Loading