Commit Graph

20 Commits

Author SHA1 Message Date
Pit Friedrich a996269aff test: add Playwright end-to-end example for FormView (#16)
CI / build-and-test (pull_request) Successful in 2m16s
Adds the first browser-driven test to the project: PlaywrightTestBase starts
the app on a random port and drives a headless Chromium against it, and
FormViewPlaywrightTest covers the form's rendering, binder validation and the
save/reset buttons.

The tests skip themselves via a JUnit assumption when no browser can be
launched, so runners without Playwright browsers stay green.

Closes #16

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ue9ZtWUBQF4SuSHpzZ3zwq
2026-07-26 20:38:34 +02:00
Pit Friedrich 7d23eef81b fix: make dashboard widgets closable (#14)
CI / build-and-test (pull_request) Successful in 1m27s
Every GridStackItem now renders a close button next to its drag grip,
mirroring the grip's hover affordance. Closing detaches the item
server-side; grid-stack.ts already unregisters widgets via its
MutationObserver, so the layout is persisted without an extra protocol.

Closable is on by default and can be turned off per item with
setClosable(false); GridStackItem.CloseEvent lets views react.

The GridStackView "remove last" toolbar button is dropped — per-widget
close replaces it, so the view no longer tracks a widget stack. Its
counter now only grows, keeping a closed widget's id from being handed
to a new widget (which would inherit the saved position).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ue9ZtWUBQF4SuSHpzZ3zwq
2026-07-26 20:17:05 +02:00
Pit Friedrich 2e2c9aec3b added playwright to dev dependencies 2026-07-26 20:10:08 +02:00
Pit Friedrich 85bb0c8c0b fix: restore saved gridstack layout faithfully (#13)
CI / build-and-test (pull_request) Successful in 1m17s
The layout was saved to localStorage, but restoring it did not reliably
reproduce it:

- restore() applied the saved nodes one by one via grid.update(). A later
  item could collide with one already put back and push it off its saved
  spot, and nothing moved it back — so the restored layout was not the one
  the user left. Use grid.load(nodes, false) instead: it sorts the nodes,
  removes them from the engine before re-placing them, and runs in a single
  batch. addRemove is off because Flow owns which children exist.
- gridstack's save() omits w/h when they are 1. The manual restore passed
  them through as undefined, and the server read them as 0 and wrote a
  zero-sized widget back onto the item. load() re-applies gridstack's own
  defaults; onLayoutChange now reads a missing w/h as 1.
- A drag followed immediately by navigating to another route detached the
  element inside the 150ms persist debounce, dropping the pending save.
  disconnectedCallback now flushes it to localStorage first.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ue9ZtWUBQF4SuSHpzZ3zwq
2026-07-26 20:00:16 +02:00
Pit Friedrich 9311d494bd Fixes #11
CI / build-and-test (pull_request) Successful in 1m15s
- Fix dashboard draggin: introduced sophistaced drag handle
- Fix disappearing of charts when dragged inside a dashboard widget
2026-07-26 14:05:11 +02:00
Pit Friedrich 17396466a9 fix: add GridStackLayout showcase view (#7)
CI / build-and-test (pull_request) Successful in 1m13s
Adds a /gridstack route demonstrating GridStackLayout: four default
widgets (line/bar/pie chart cards plus a usage hint), buttons to add and
remove widgets at runtime, a reset-layout button and a layout-change
status line. Layout is persisted per browser via the existing
localStorage support. The view gets its own SideNavItem in MainLayout
and full de/en/es translations.

Fixes an infinite recursion in GridStackLayout.add(Component): a
single-argument add(item) resolves to that overload rather than the
varargs one, so its delegation to add(item) called itself. It now
appends through the element API and passes a GridStackItem through
unwrapped.

Adds the first test sources (browserless UI tests) covering the view's
widget count and the add/remove buttons.

Closes #7

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PYAcKoXKPN3rJ7nBroKZkc
2026-07-25 22:12:05 +02:00
Pit Friedrich e3342d0f53 fix: add i18n for TimePicker matching DatePicker (#8)
CI / build-and-test (pull_request) Successful in 1m9s
Set German locale on TimePicker in FormView and wire TimePickerI18n
error messages (bad input, required, min, max) through the existing
vaadin-i18n translation bundles, mirroring the DatePicker.DatePickerI18n
setup already present in FormView.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PYAcKoXKPN3rJ7nBroKZkc
2026-07-25 22:00:24 +02:00
Pit Friedrich bcf604b7c5 added gridstack 2026-07-25 21:56:47 +02:00
Pit Friedrich c2d29f0635 added gridstack 2026-07-25 20:51:53 +02:00
Pit Friedrich aca411ca9e [FEATURE] FontAwesome Icons
CI / build-and-test (pull_request) Successful in 1m9s
2026-07-19 23:39:10 +02:00
Pit Friedrich 9114ea9800 [FEATURE] i18n
CI / build-and-test (pull_request) Successful in 1m14s
2026-07-19 21:15:23 +02:00
Pit Friedrich 9316b83f82 chore(i18n): scaffold translation bundles 2026-07-19 20:48:03 +02:00
Pit Friedrich acb2f5964f [FEATURE] PWA + Showcase Grid
CI / build-and-test (pull_request) Successful in 10m36s
2026-07-12 18:10:26 +02:00
Pit Friedrich 9df764d065 [FEATURE] Dark Theme 2026-07-11 22:31:08 +02:00
Pit Friedrich aa8fbb4838 [FEATURE] Custom Theme (Part II) 2026-07-11 17:38:32 +02:00
Pit Friedrich d947833214 [FEATURE] Customn Theme
CI / build-and-test (pull_request) Successful in 10m26s
2026-07-07 19:55:42 +02:00
Pit Friedrich af79286cb0 Different types of charts 2026-07-06 07:33:15 +02:00
Pit Friedrich 9ffba461fe Initial commit 2026-07-05 17:27:02 +02:00
Pit Friedrich 23b392a19b Initial commit 2026-07-05 17:06:59 +02:00
start.vaadin.com 0935b7a98a Generated project 2026-07-04 06:04:51 +00:00