You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: AGENTS.md
+3-1Lines changed: 3 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# PhotoPrism® Repository Guidelines
2
2
3
-
**Last Updated:** November 11, 2025
3
+
**Last Updated:** November 12, 2025
4
4
5
5
## Purpose
6
6
@@ -224,6 +224,8 @@ Note: Across our public documentation, official images, and in production, the c
224
224
225
225
- Dialogs must follow the shared focus pattern documented in `frontend/src/common/README.md`.
226
226
- Always expose `ref="dialog"` on `<v-dialog>` overlays, call `$view.enter/leave` in `@after-enter` / `@after-leave`, and avoid positive `tabindex` values.
227
+
- Persistent dialogs (those with the `persistent` prop) must handle Escape via `@keydown.esc.exact` so Vuetify’s default rejection animation is suppressed; keep other shortcuts on `@keyup` so inner inputs can cancel them first.
228
+
- Global shortcuts run through `onShortCut(ev)` in `common/view.js`; it only forwards Escape and `ctrl`/`meta` combinations, so do not rely on it for arbitrary keys.
227
229
- When a dialog opens nested menus (for example, combobox suggestion lists), ensure they work with the global trap; see the README for troubleshooting tips.
Copy file name to clipboardExpand all lines: frontend/CODEMAP.md
+5-1Lines changed: 5 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
PhotoPrism — Frontend CODEMAP
2
2
3
-
**Last Updated:**October 13, 2025
3
+
**Last Updated:**November 12, 2025
4
4
5
5
Purpose
6
6
- Help agents and contributors navigate the Vue 3 + Vuetify 3 app quickly and make safe changes.
@@ -107,6 +107,10 @@ Common How‑Tos
107
107
- Compute `key` from route + filter params and cap eager loads with `Rest.restoreCap(Model.batchSize())` (defaults to 10× the batch size).
108
108
- Check `$view.wasBackwardNavigation()` when deciding whether to reuse stored state; `src/app.js` wires the router guards that keep the history direction in sync so no globals like `window.backwardsNavigationDetected` are needed.
109
109
110
+
- Handle dialog shortcuts
111
+
- Persistent dialogs (`persistent` prop) must listen for Escape on `@keydown.esc.exact` to override Vuetify’s rejection animation; keep Enter and other actions on `@keyup` so child inputs can intercept them first.
112
+
- Global shortcuts go through `onShortCut(ev)` in `common/view.js`. It only forwards Escape and `ctrl`/`meta` combinations, so do not depend on it for plain character keys.
113
+
110
114
Conventions & Safety
111
115
- Avoid `v-html`; use `v-sanitize` or `$util.sanitizeHtml()` (build enforces this)
112
116
- Keep big components lazy if needed; split views logically under `src/page`
0 commit comments