Commit Graph
93 Commits
Author SHA1 Message Date
ik 699a7c3857 feat: add safe moderation shortcuts 2026-09-12 21:47:49 +07:00
ik 0f078ab482 feat: prioritize risky moderation records 2026-09-12 21:45:29 +07:00
ik ba4c42f8f6 feat: streamline moderation decisions 2026-09-12 21:43:41 +07:00
ik 8e419c1832 feat: filter external moderation queue
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 21:37:10 +07:00
ik 6e18e8e565 feat: add admin operations dashboard 2026-09-12 21:35:18 +07:00
ik ff8ea40d40 security: expire admin browser sessions 2026-09-12 21:29:18 +07:00
ik ca22042d18 security: harden admin external links 2026-09-12 21:26:51 +07:00
ik 52ff29668e feat: add visual links between atlas entities 2026-09-12 15:46:36 +07:00
ik 45c7e65bc4 feat: connect atlas pages with breadcrumb line 2026-09-12 15:44:38 +07:00
ik cadd5607b8 feat: compose atlas identity for fishing pairs
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 15:37:54 +07:00
ik 2ce1e20af2 feat: add unique waterbody fingerprints 2026-09-12 15:35:57 +07:00
ik 80d534d549 feat: add semantic tackle glyphs 2026-09-12 15:30:40 +07:00
ik c3e847c249 feat: distinguish fish by visual family
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 15:28:24 +07:00
ik 966000b0b0 feat: transform catalogs into field atlas 2026-09-12 15:20:26 +07:00
ik a8b1775169 refactor: establish brand motion system
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 10:07:47 +07:00
ik 0c25cf020f refactor: unify action hierarchy 2026-09-12 10:05:49 +07:00
ik 2477543029 refactor: unify public state panels 2026-09-12 10:02:19 +07:00
ik c944db54af refactor: unify catalog page heroes
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 09:59:14 +07:00
ik 9647667ae2 refactor: unify editorial section headings 2026-09-12 09:57:56 +07:00
ik fc22795b63 refactor: clarify visual motif grammar
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 09:56:16 +07:00
ik 1fabf21935 refactor: introduce semantic brand tokens 2026-09-12 09:54:26 +07:00
ik b0dd703f72 feat: establish brand identity hierarchy 2026-09-12 09:49:19 +07:00
ik 987d9ea109 perf: establish frontend performance baseline 2026-09-12 09:46:52 +07:00
ik e7f3de1ddc fix: tighten narrow viewport behavior
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 09:42:17 +07:00
ik 4fef0e8b74 feat: add accessible queue loading states
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-11 08:08:52 +07:00
ik 8f76f70409 feat: add activity level legend to spot view 2026-09-11 07:54:16 +07:00
ik 8c94d40766 feat: add one-click coordinate copying 2026-09-11 07:52:07 +07:00
ik 2ad2bdcdff fix: mark catalog outage pages as SEO errors
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-11 07:49:58 +07:00
ik 67d81f81ff fix: keep advanced filters accessible on mobile 2026-09-11 07:45:45 +07:00
ik 486e4c4673 fix: wire report idempotency and bootstrap scheduler check 2026-09-11 07:41:55 +07:00
ik f29ec706fd R09: Add PaginatedOfficialRecordOut schema and paginated /api/v1/records endpoint 2026-09-10 20:27:45 +07:00
ik e996c6da41 A08: Pass errorPage on all pages with potential errors
Bug: Only index.astro passed errorPage={filterError}, missing:
- index.astro unavailable (503) — Dataset оставался на error page
- spots/[id].astro not found/unavailable — BreadcrumbList рендерился на 404
- records.astro unavailable (503) — no structuredData but should be explicit

Fix:
- index.astro: errorPage={filterError || unavailable}
- spots/[id].astro: errorPage={!spot || unavailable}
- records.astro: errorPage={unavailable}
- report.astro: не нужен (structuredData не передаётся)

Verification:
- Astro build: 0 errors
- Error pages (422, 503, 404) skip structuredData
- Normal pages include structuredData
- noindex still works for robots meta tag
2026-09-10 19:12:15 +07:00
ik 2a0c7b2fa5 A04: Fix pagination 'load more' condition for server-side pages
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
Bug: Condition 'items.length < totalItems' always true for partial last
page (e.g., 5 < 45 on offset=40), showing 'load more' link to empty page.

Fix: Use 'offset + items.length < totalItems' to correctly detect when
all items have been shown. Also update displayed counter to show
'offset + items.length из totalItems' for accurate progress.

Verification:
- Astro build: 0 errors
- 45 items, page 0: shows '20 из 45', next link to offset=20
- 45 items, page 20: shows '40 из 45', next link to offset=40
- 45 items, page 40: shows '45 из 45', NO next link (45 < 45 = false)
- Empty results: no next link (0 < 0 = false)
2026-09-10 18:41:35 +07:00
ik 0e592ea404 A08: Add explicit errorPage prop to skip structuredData on error pages
Bug: Layout used 'noindex && path !== ""' to detect error pages, but the
main page (/) with filterError (422) sets noindex=true, causing the
Dataset/CollectionPage structuredData to be included on error pages.

Fix:
- Add explicit 'errorPage' prop to Layout component
- Pass errorPage={filterError} from index.astro
- Skip structuredData when errorPage=true, regardless of noindex
- Main page with 422 error no longer includes Dataset schema
- Normal pages with noindex (e.g., /admin) still work correctly

Verification:
- Astro build: 0 errors
- Error pages (422, 503, 404) skip structuredData
- Normal pages include structuredData
- noindex still works for robots meta tag
2026-09-10 18:17:13 +07:00
ik 1d403883a0 A05: Add sessionStorage error handling for unavailable storage
Bug: sessionStorage operations (getItem, setItem, removeItem) could fail
if storage is unavailable (private mode, quota exceeded, etc.), causing
form draft recovery to break.

Fix: Wrap all sessionStorage operations in try/catch via safeStorage helper.
- safeStorage.getItem() - returns null on error
- safeStorage.setItem() - silently ignores errors
- safeStorage.removeItem() - silently ignores errors

This ensures:
- Draft recovery works even if storage is partially unavailable
- Form submission doesn't crash if storage is full
- Cleanup on success doesn't crash
- File input values are not saved (already handled by FormData filter)

Verification:
- Astro build: 0 errors
- All existing A05 behavior preserved
- Error handling added for read, write, and cleanup
2026-09-10 18:10:57 +07:00
ik 6183fb3417 A04: Fix filter-advanced-field CSS to preserve label/select relationship
Bug: display:contents on label breaks the implicit label-for association
with the select inside it. This causes accessibility issues and breaks
keyboard navigation on mobile.

Fix: Replace display:contents with display:flex;align-items:center;gap:6px
on desktop. This preserves the inline layout while maintaining the label
relationship with the select element.

Mobile behavior unchanged: filter-advanced-field is hidden via display:none
on screens <=720px, replaced by filter-advanced-fallback details element.

Verification:
- Astro build: 0 errors
- Label/select relationship preserved for keyboard navigation
- Desktop layout: flex row with gap
- Mobile: fallback details element shown
2026-09-10 18:10:13 +07:00
ik 5de8ea939a A04: Fix pagination offset calculation for server-side pages
Bug: load-more link used items.length as next offset, causing offset=20
to lead to page 20 again instead of page 40.

Fix: Use offset + items.length for correct next page calculation.
With 20 items per page: offset=0→20→40→...

Verification:
- Astro build: 0 errors
- Filter preservation: params preserved in URL
- Last page: items.length < totalItems check works
- Invalid offset: Number.isInteger check on line 16
2026-09-10 17:56:45 +07:00
ik b7c00dca8a A04: Fix duplicate offset parameter in pagination link
Remove existing offset parameter before adding new one to prevent
duplicate query parameters like ?offset=20&offset=40.

Fix: Use URLSearchParams.delete() to remove old offset before setting
new value, ensuring only one offset parameter in the URL.

Verified: Astro build succeeds with 0 errors
2026-09-10 06:27:51 +07:00
ik 745a5ff9fd A08: Skip misleading structuredData on error pages
- Dataset/CollectionPage not rendered on noindex error pages (422/503/404)
- WebSite schema always present for navigation
- noindex + nofollow on error/admin pages
- canonical URL consistent with trailingSlash: never policy
- Astro check: 0 errors
2026-09-10 06:12:32 +07:00
ik 9e4d7aefba A05: Restore draft on rate_limited/server_error/timeout states
- Extend draft recovery to create_error, rate_limited, server_error, timeout
- Clear draft only on success (sent/screenshot_sent)
- Focus on form-error after recovery
- Double submit protection already in place (R10)
- Astro check: 0 errors
2026-09-10 06:12:09 +07:00
ik 2ccca7350f A04: Fix selected attributes for all period options
- Add selected={hours === '6/12/72'} to all period options (was only on 24)
- Ensures correct UI state when URL has hours=6/12/72
- CSS for filter-compact-hidden already correct (display:none!important)
- Filter fallback details working for no-JS mobile
- Pagination (R09) already handles offset preservation
2026-09-10 06:11:49 +07:00
ik 3ea08fa706 S03: Consistent site origin — trailingSlash never, canonical URLs
- Add trailingSlash: 'never' to Astro config
- Normalize sitemap paths to never use trailing slash
- Ensures consistent canonical URLs across all pages
- Prevents duplicate content from / vs /path/ variants
2026-09-10 05:53:36 +07:00
ik 6e0077bd4d R10: Fix TimeoutError handling — use DOMException.TimeoutError check
- AbortSignal.timeout() throws DOMException with name='TimeoutError', not TypeError
- Check for DOMException.TimeoutError, TypeError(fetch), or Error(abort)
- Apply same fix to report.ts and report-screenshot.ts
- Timeout redirects to 'timeout' state, other errors to 'create_error'
2026-09-10 05:43:34 +07:00
ik 67681ee039 R09: Fix pagination — preserve filters and use offset from URL
- Read offset from URL search params (default 0)
- Pass offset to /api/v1/activity instead of hardcoded 0
- Append items when offset > 0 (infinite scroll behavior)
- Fix 'load more' link to not duplicate URL params
- Astro check: 0 errors, Python tests: 97 passed
2026-09-10 05:41:53 +07:00
ik 38bb871638 fix: R08 filter-compact-hidden display:none + details fallback for no-JS (#1788956171115) 2026-09-10 05:39:06 +07:00
ik d962ba2f90 fix: R02 activity API contract — PaginatedActivity + all consumers (#1788956171115) 2026-09-09 20:58:42 +07:00
ik 9ae05ef6f0 fix: S01 HTTP/SEO contract — noindex for errors, 422/503 status codes (#1788956171115) 2026-09-09 20:14:10 +07:00
ik b31042337b fix: U03 pagination + U04 form errors with retry (#1788956171115) 2026-09-09 20:08:20 +07:00
ik 63e33e1861 fix: audit P0-P1 — T03-T07, D01-D08, U01-U02 (#1788956171115) 2026-09-09 20:02:52 +07:00
ik 731eade7b3 fix: polish narrow mobile layouts 2026-09-08 16:29:03 +07:00