Skip to content

fix: Detail page graphical fixes and proper sidebar#103

Open
rubenvdlinde wants to merge 188 commits intomainfrom
fix/detail-page-graphical-fixes
Open

fix: Detail page graphical fixes and proper sidebar#103
rubenvdlinde wants to merge 188 commits intomainfrom
fix/detail-page-graphical-fixes

Conversation

@rubenvdlinde
Copy link
Copy Markdown
Contributor

Summary

  • Fix Complaints card nested inside Contactmomenten (broken template)
  • NcEmptyContent for all empty states
  • Flush tables in CnDetailCard for full-width display
  • Proper NcAppSidebar via objectSidebarState inject pattern

Depends on ConductionNL/nextcloud-vue#32

Closes #102

- Create phpunit.xml (PHPUnit 10 format)
- Create tests/bootstrap.php with Nextcloud environment support
- Add ProspectScoringServiceTest with 9 tests covering scoring logic
Move docusaurus project files from docusaurus/ into docs/ alongside
content. Replace local documentation.yml with centralized caller.
Replace local code-quality.yml with centralized caller.
Based on analysis of 74 Dutch government tenders and 408 competitor specs:

Tender-derived (6): kcc-werkplek, klantbeeld-360,
contactmomenten-rapportage, omnichannel-registratie, kennisbank,
terugbel-taakbeheer

Competitor-derived (6): activity-timeline, email-calendar-sync,
product-catalog-quoting, public-intake-forms,
contact-relationship-mapping, crm-workflow-automation
- Pass app's objectStore to useListView in all 5 list views, fixing
  the mismatch between the app's 'object' store and the library's
  'conduction-objects' store.

- Call initializeStores() in main.js alongside mount so the retry
  logic in useListView can wait for type registration.

- Deeplink support now works automatically via useListView's URL
  sync — filter/sort/page state is persisted in URL query params.
Spec enrichment:
- All 27 base specs updated with implementation status and gap analysis
- Key findings: assignee vs assignedTo field mismatch, no currency field on leads

Bug fix:
- LeadProducts discount: (qty*price)-discount -> (qty*price)*(1-discount/100)

New specs:
- prometheus-metrics: Prometheus metrics endpoint (/api/metrics, /api/health)
- register-i18n: Multi-language register content support

Implementation:
- MetricsController: leads by status/pipeline, pipeline value, clients, contacts
- HealthController: database + OpenRegister dependency checks
- Dashboard: KPI cards migrated to CnStatsBlock with route props
Show NcEmptyContent empty state when OpenRegister is not installed,
with install button for admins. Add ESLint rule enforcing scoped
styles in Vue files, move global CSS to src/assets/app.css.
Fix webpack build by aliasing @nextcloud/dialogs.
Support: support@conduction.nl
SLA: sales@conduction.nl
…on files

- Add @nextcloud/l10n import in main.js
- Fix Dutch t() keys in widget components
- Inject IL10N into 4 controllers
- Expand l10n files from 64 to 393 translation keys (en + nl)
- Fix LessSpecificImplementedReturnType in Filter.php with typed array annotations
- Fix UnusedClosureParam in Application.php by prefixing unused params with _
- Fix MissingTemplateParam in listeners by adding @implements template annotation
- Fix UndefinedClass errors by adding OpenRegister + OC to psalm.xml suppressions
- Fix InvalidNamedArgument in apcu_store (use positional args)
- Fix InvalidNamedArgument in updateTag (description -> color)
- Suppress UnusedParam for $objectId used in string interpolation
…d deps, ignore optional OpenRegister dependency
Copied the standard PHPMD config from opencatalogi with default
thresholds (CyclomaticComplexity 10, NPath 200, MethodLength 100,
ClassLength 1000) and added the previously missing rules:
BooleanArgumentFlag, ElseExpression, StaticAccess, UnusedFormalParameter.

Resolved all 27 new warnings:
- ElseExpression: replaced if/else with ternary assignments
- StaticAccess on Util::addScript/addStyle: suppressed (Nextcloud API)
- UnusedFormalParameter: suppressed (interface contracts)
- BooleanArgumentFlag: suppressed (simple toggle params)
- CyclomaticComplexity/NPathComplexity: suppressed (orchestrator method)
Pre-existing PHPMD warning: methods returning bool should use is/has prefix.
…epository

Extract KvkResultMapper, OpenCorporatesResultMapper, IcpConfigReader,
MetricsRepository, MetricsFormatter to reduce cyclomatic complexity and
Halstead volume to zero phpmetrics violations.
Add search input to pipeline board header that filters kanban cards
and list items by title (case-insensitive). Column counts and values
update to reflect filtered results.

Add stage probability range validation (0-100) in PipelineForm.

Includes OpenSpec change artifacts.
…nnels

- Add case-insensitive duplicate name check on add and rename operations
- Display translated error message when duplicate detected
- Add en/nl translation key for duplicate error message
Validate that stage probability is between 0 and 100 in PipelineForm,
implementing REQ-PIPE-005 Scenario 24.
feat: Client management summary statistics and @type mapping
feat: Implement register-i18n locale-aware formatting
feat: Pipeline search bar and stage validation
- playwright.config.ts with global-setup auth
- 4 spec files: smoke, navigation, dashboard, pages
- Pages spec verifies all 8 real pages with form fields
- 7 test flow markdowns for LLM-based testing
- Covers: dashboard, navigation, clients, leads, pipeline,
  requests, products, my-work
The register JSON file has never been valid JSON since creation.
It had 8 missing commas in the schemas array, truncated schema
definitions (queue, intakeForm, automation, automationLog,
relationship, intakeSubmission), and duplicate entries.

Fixed by regenerating with:
- All 26 unique schemas properly defined
- Removed duplicates (contactmoment, kennisartikel, etc.)
- Removed taak (Dutch duplicate of task)
- Every schema has slug, title, icon, version, summary,
  description, required, and properties
- JSON validates with python3 json.load()
- MainMenu.vue: Fix corrupted template with escaped newlines, missing
  closing tags, and overlapping attributes. All 16 nav items now render.
- SettingsLoadService: Expand SCHEMA_SLUGS from 11 to 26 entries to
  match all schemas in pipelinq_register.json
- SettingsService: De-duplicate CONFIG_KEYS and add missing schema keys
- RequestDetail.vue: Add missing closing brace for .queue-select CSS
- KennisbankHome.vue: Add missing </style> tag before <script>

These fixes resolve all webpack build errors and the "Object type X
is not registered" console errors on every page.
- Navigation: verify all 16 sidebar items + 4 settings sub-items
- Pages: add Tasks, Contactmomenten, Complaints, Surveys, Queues,
  Kennisbank, Reporting tests
- Dashboard: refactor with beforeEach
Pass human-readable type labels to CnObjectSidebar title prop
instead of showing raw object type strings like "pipelinq_client".
Pipelinq uses Vue Router history mode, not hash mode.
Remove '#/' from URL templates so deep links navigate correctly.
…ient [#83]

Add three action-oriented dashboard widgets:
- StartRequestWidget: inline form to create service requests
- CreateLeadWidget: inline form to create leads with pipeline selection
- FindClientWidget: enhanced client search with action buttons (replaces ClientSearchWidget)

Shared ClientAutocomplete component for client type-ahead in forms.
Updated Application.php registrations and webpack entry points.
…pair

maintenance:repair fails with 'Access denied' for configuration
entities. Disabling and re-enabling the app triggers the repair step
with proper app context.
- Tasks: new task form (Subject, Description, Priority, Deadline)
- Contactmomenten: unique UI (heading, search, channel buttons, CSV export)
- Complaints: new complaint form (Title, Description, Category, Channel)
- Surveys: heading, New Survey button, form with Add Question
- Queues: heading, Add queue modal with name/description/categories
- Kennisbank: search, categories, New Article form with markdown editor
- Reporting: KPI cards, Export CSV, Channel/Agent analytics tabs
- Pipelines settings: Add pipeline, empty state prompt
#83]

- Add plan.json with all 12 tasks linked to GitHub issues #86-#97
- Add action-widgets.md feature documentation for all 3 dashboard widgets
- Update features README.md with action-widgets entry
- Fix PSR-12 PHPCS violations in all 3 widget PHP files
- router/index.js: Remove duplicate imports and routes (ContactmomentDetail,
  TaskList, TaskDetail, KennisbankHome imported twice; routes duplicated)
- store.js: Fix missing closing braces, remove task_schema registration
  (tasks use Nextcloud native system via OpenRegister bridge)
- ClientDetail.vue: Add missing </CnDetailCard> closing tag, remove
  broken orphan try/catch in onContactmomentSaved
- ContactmomentDetail.vue: Rewrite — two merged implementations caused
  SyntaxError; keep only CnDetailPage version with sidebar support
- TaskList.vue: Rewrite — old manual template merged into script block;
  keep only CnIndexPage version
- TaskDetail.vue: Rewrite — old/new implementations merged; keep only
  CnDetailPage version with sidebar and task business logic
- TaskForm.vue: Rewrite — duplicate form sections broke template closure;
  keep complete version with assignee search
feat(pipelinq): Action widgets — Start Request, Create Lead, Find Client
fix: Resolve build-breaking syntax errors across multiple views
Add proposal, design, specs (6 capabilities), and tasks for replacing
the built-in kennisbank with xWiki integration via reusable widget and
sidebar tab components. Depends on nextcloud/xwiki NC 32 compatibility.

Signed-off-by: Ruben van der Linde <rubenvdlinde@gmail.com>
Fix naming parameters, inline ternaries, missing doc comments,
line length violations, and code style issues in 25 PHP files.
- Fix unused imports/variables in Vue components (formatNumber, PhoneInTalk,
  generateUrl, axios, currentValue)
- Add formatNumber to methods blocks where used in templates
- Auto-fix ESLint formatting (object-property-newline, indent, brace-style)
- Auto-fix Stylelint issues (rule-empty-line-before, string-quotes)
- Fix PHP parse error in PublicKennisbankControllerTest (orphaned code)
Fix merge artifacts causing syntax errors:
- Remove duplicate property declarations in TaskExpiryJobTest
- Remove orphaned code after method closures in KennisbankReviewJobTest
- Fix missing doc comment opener and duplicate code in MetricsFormatterTest
- Fix Complaints nested inside Contactmomenten card (broken closing tags)
- Replace empty states with NcEmptyContent
- Add flush prop to table-containing CnDetailCards
- Add objectSidebarState to App.vue for proper NcAppSidebar on detail pages
- Dashboard: add flush to My Work and Client Overview widgets

Closes #XX
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix: Detail page graphical fixes and proper sidebar

1 participant