Skip to content

Issue 259 migrate nextcloud native UI#263

Open
Martin-1997 wants to merge 12 commits into
masterfrom
issue-259-migrate-nextcloud-native-ui
Open

Issue 259 migrate nextcloud native UI#263
Martin-1997 wants to merge 12 commits into
masterfrom
issue-259-migrate-nextcloud-native-ui

Conversation

@Martin-1997

Copy link
Copy Markdown
Collaborator

No description provided.

Martin-1997 and others added 12 commits July 3, 2026 22:42
Replaces the abandoned christophwurst/nextcloud dev stub with
nextcloud/ocp so PHPUnit and PHPStan can resolve OCP types without a
live Nextcloud install. Modernizes tests/Unit/Controller/PageControllerTest.php
to PHPUnit\Framework\TestCase / setUp(): void and fixes it to match
PageController's actual constructor (IUserSession, not a raw user id
string) — it was silently stale. tests/bootstrap.php now just loads
Composer's autoloader; the old full-server bootstrap moves to
tests/bootstrap.integration.php for the (still server-dependent)
integration suite, which gets its own `make test-integration` target
since `make test` previously installed deps with --no-dev and would
have stripped PHPUnit itself.

Adds a PHPStan config (level 3) with a baseline freezing the 237
pre-existing findings (missing Doctrine DBAL stub types, plus a
runtime class_alias() static analysis can't see through — mirrored
in tests/phpstan-bootstrap.php) so analysis starts green and only
flags newly introduced issues.

Verified: make test, composer run lint, composer run phpstan, and
composer run test:unit all pass on PHP 8.2, 8.3, and 8.5.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
.travis.yml was pinned to PHP 5.6-7.1 and long dead. Adds three free
GitHub Actions workflows (unlimited minutes on public repos), each a
simplified adaptation of Nextcloud's reusable workflow templates
(nextcloud/.github):

- lint-php.yml: composer validate + php -l, matrix over PHP 8.2/8.3
- static-analysis.yml: PHPStan against the baseline added in the
  previous commit
- phpunit.yml: the unit suite only (no live server/DB needed, so no
  external services to boot); the server-backed integration suite is
  intentionally deferred to the multi-database CI follow-up from the
  linked issue

Closes #257 (steps 1 and 2 only; unit tests for
mappers/report queries and multi-database CI remain as follow-up).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Deletes unused js/src/kingtable.js and css/kingtable.css (~203 KB),
plus the FontAwesome stylesheet and webfonts/ directory (~2.7 MB),
replacing the 4 FontAwesome icon classes still in use with their
native Nextcloud equivalents across 9 usage sites in templates and
JS formatters.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Scaffolds the Single Page Application shell described in the frontend
migration epic: Vue 3 + vue-router + @nextcloud/vue, mounted at a new
/spa route with NcAppNavigation and placeholder routes for all 9
existing views. Existing jQuery pages and templates are untouched;
the new shell is reachable via an additive "SPA Preview (WIP)" nav
link for review before any view is actually migrated in a later stage.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Completes the jQuery-to-Vue migration started in Stage 1: every view
(timer, dashboard, goals, reports, timelines, timelines-admin,
projects, clients, tags) is now a Vue component backed by the same
unchanged AjaxController endpoints. All 9 controllers now render the
single SPA shell, so the classic per-view PHP templates and their
dedicated webpack bundles are gone.

Also drops the now-unused legacy stack: jquery, jquery-migrate,
jqueryui, select2, daterangepicker, tabulator-tables, moment,
piklor.js, and chart.js v2 (replaced by chart.js v4 + vue-chartjs for
the dashboard's time/cost breakdown charts), along with their CSS and
font assets.

Bumps the app version so Nextcloud's asset cache-busting URL changes
and browsers pick up the new bundle instead of serving a stale cached
copy under the old unchanged URL.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The date pickers were rendered inline within the modal's own scroll
area, so opening either calendar pushed content down and required
scrolling to see it. Set the modal to NcModal's "normal" size and let
both pickers teleport their calendar to <body> (append-to-body) so it
floats above the modal instead of being clipped by it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The old daterangepicker library bundled preset shortcuts (Today, Last
7/30/90/365 days, This/Last Month, This/Last Year); replacing it with
plain from/to NcDateTimePicker fields during the Vue migration dropped
that shortcut entirely rather than reimplementing it. Adds a shared
dateRangePresets.js helper and a "Quick range..." select on all four
views that had a date range, restoring the jump-to-range behavior.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
PageController::index() now renders the 'spa' template (Stage 4 of
the frontend migration) instead of 'index'; the test still asserted
the old template name and was failing in CI as a result.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The legacy UI let you click an entry's duration to open an inline
date-range picker and adjust its start/end time directly, posting to
the same update-work-interval endpoint used for manual entries. This
was dropped during the Vue migration along with the rest of that
row's inline editors. Adds an "Edit time" modal (two NcDateTimePicker
fields) triggered by clicking the Duration cell, reusing the same
date-formatting helper as the manual entry form.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Follow-up audit against the legacy jQuery implementation found three
more gaps beyond the manual-entry and date-preset fixes already made:

- Timer: the per-row cost field posted to the backend on every
  keystroke instead of on blur, and lost the success/error visual
  feedback the old jQuery version had. Now uses a local draft value
  committed on blur, with NcTextField's native success/error state.
- Timer: the per-row tag picker lost the "type a new tag name inline"
  behavior (select2's tags:true). Restored via NcSelect's
  taggable/push-tags, matching updateWorkInterval's existing support
  for creating a tag on the fly from a non-numeric value. (Checked
  Projects' "Allowed tags" picker for the same gap, but its backend
  path, TagMapper::allowedTags(), has no such tag-creation logic — so
  enabling taggable there would insert a broken/orphaned row rather
  than restore a working feature. Left as-is.)
- Dashboard: the two charts silently dropped the client dimension,
  showing only project-level totals even though the backend groups by
  client+project. Chart labels are now "Client / Project" so nothing
  is collapsed together.

Also added the "Ended" column to Reports' CSV export (present in the
original, computed from time+totalDuration or '*' when grouped) and
fixed the CSV's "When" column to use the same formatted value as the
on-screen table instead of a raw unix timestamp.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
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.

1 participant