ramadanproject/specs/001-public-grid-viewer/tasks.md
Ahmed Darrazi 45a147253c
Some checks failed
tests / ci (push) Failing after 6m13s
linter / quality (pull_request) Failing after 58s
linter / quality (push) Failing after 1m19s
tests / ci (pull_request) Failing after 5m28s
feat(public-grid): add QA, quickstart, decision docs; scheduler docs; ignore files; tasks updates; run pint
2026-01-03 04:56:12 +01:00

113 lines
7.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
description: "Task list for Public Grid Viewer (vertical slice)"
---
# Tasks: Public Grid Viewer + Live Selection
**Input**: Design docs from `specs/001-public-grid-viewer/` (spec.md, plan.md)
## Phase 1: Setup (Shared Infrastructure)
- [ ] T001 [P] Create config/pixel_grid.php in config/pixel_grid.php (defines `cell_size`, `price_per_cell`, `master_path`)
- [ ] T002 [P] Add sample master image to storage/app/public/master/master.png and ensure `php artisan storage:link` (path: storage/app/public/master/master.png)
- [ ] T003 [P] Create lightweight `MasterImage` model at app/Models/MasterImage.php and optional migration at database/migrations/*_create_master_images_table.php
- [ ] T004 [P] Add `PublicGridController` skeleton at app/Http/Controllers/PublicGridController.php and route placeholder in routes/web.php
- [X] T001 [P] Create config/pixel_grid.php in config/pixel_grid.php (defines `cell_size`, `price_per_cell`, `master_path`)
- [X] T002 [P] Add sample master image to storage/app/public/master/master.png and ensure `php artisan storage:link` (path: storage/app/public/master/master.png)
- [X] T003 [P] Create lightweight `MasterImage` model at app/Models/MasterImage.php and optional migration at database/migrations/*_create_master_images_table.php
- [X] T004 [P] Add `PublicGridController` skeleton at app/Http/Controllers/PublicGridController.php and route placeholder in routes/web.php
---
## Phase 2: Foundational API (Blocking prerequisites)
- [ ] T005 [P] [US1] Implement `GET /api/grid/meta` in app/Http/Controllers/PublicGridController.php; route in routes/web.php — returns `{ master_image_url, master_version, cell_size }`
- [ ] T006 [P] [US1] Implement `GET /api/grid/price` in app/Http/Controllers/PublicGridController.php — returns `{ price_per_cell }` (read from config/pixel_grid.php)
- [ ] T007 [P] [US1] Implement `GET /api/grid/availability` in app/Http/Controllers/PublicGridController.php — returns list of occupied `{cell_x,cell_y}` (MVP: empty array)
- [ ] T008 [P] Add rate-limiting middleware to sensitive endpoints (routes/web.php or RouteServiceProvider)
- [ ] T009 [P] [US1] Add Pest tests: tests/Feature/PublicGridMetaTest.php and tests/Feature/PriceCalculationTest.php verifying endpoints and JSON schema
- [X] T005 [P] [US1] Implement `GET /api/grid/meta` in app/Http/Controllers/PublicGridController.php; route in routes/web.php — returns `{ master_image_url, master_version, cell_size }`
- [X] T006 [P] [US1] Implement `GET /api/grid/price` in app/Http/Controllers/PublicGridController.php — returns `{ price_per_cell }` (read from config/pixel_grid.php)
- [X] T007 [P] [US1] Implement `GET /api/grid/availability` in app/Http/Controllers/PublicGridController.php — returns list of occupied `{cell_x,cell_y}` (MVP: empty array)
- [X] T008 [P] Add rate-limiting middleware to sensitive endpoints (routes/web.php or RouteServiceProvider)
- [X] T009 [P] [US1] Add Pest tests: tests/Feature/PublicGridMetaTest.php and tests/Feature/PriceCalculationTest.php verifying endpoints and JSON schema
---
## Phase 3: User Story 1 - Public viewer + Live selection (Priority: P1) 🎯 MVP
**Goal**: Interactive public page with pan/zoom, canvas grid, rectangle selection, sidebar price preview, and upload preview modal (no persistence)
**Independent Test**: Load the Inertia page, make selections on desktop and mobile; verify cell count and `cell_count × price_per_cell` displayed equals expected value from `config/pixel_grid.php`.
- [ ] T010 [US1] Create Inertia page at resources/js/Pages/PublicGrid/Index.vue and wire route to `PublicGridController@show`
- [ ] T011 [US1] Implement `resources/js/components/GridCanvas.vue` using Konva or Canvas API (pan/zoom, grid draw, hit-testing mapped to cell units)
- [ ] T012 [US1] Implement `resources/js/components/SelectionSidebar.vue` (shows cell count, queries `/api/grid/price`, shows total price, CTA opens modal)
- [ ] T013 [US1] Implement `resources/js/components/UploadModal.vue` with client-side image selection and preview composited into selection rectangle
- [ ] T014 [US1] Wire mobile touch handlers in `GridCanvas.vue` (pinch to zoom, drag to pan, touch selection) and test on iPhone viewport
- [ ] T015 [P] [US1] Add client-side clamp/validation: selection clamped to image bounds and max selection size enforced in GridCanvas.vue
- [X] T010 [US1] Create Inertia page at resources/js/Pages/PublicGrid/Index.vue and wire route to `PublicGridController@show`
- [X] T011 [US1] Implement `resources/js/components/GridCanvas.vue` using Konva or Canvas API (pan/zoom, grid draw, hit-testing mapped to cell units)
- [X] T012 [US1] Implement `resources/js/components/SelectionSidebar.vue` (shows cell count, queries `/api/grid/price`, shows total price, CTA opens modal)
- [X] T013 [US1] Implement `resources/js/components/UploadModal.vue` with client-side image selection and preview composited into selection rectangle
- [X] T014 [US1] Wire mobile touch handlers in `GridCanvas.vue` (pinch to zoom, drag to pan, touch selection) and test on iPhone viewport
- [X] T015 [P] [US1] Add client-side clamp/validation: selection clamped to image bounds and max selection size enforced in GridCanvas.vue
---
## Phase 4: Tests & QA
- [ ] T016 [US1] Add selection math feature test at tests/Feature/SelectionMathTest.php verifying client/server cell mapping (can be unit or integration with mocked cell_size)
- [ ] T017 [P] Create manual QA checklist at specs/001-public-grid-viewer/checklists/qa.md (mobile interactions, selection precision, upload preview)
- [X] T016 [US1] Add selection math feature test at tests/Feature/SelectionMathTest.php verifying client/server cell mapping (can be unit or integration with mocked cell_size)
- [ ] T017 [P] Create manual QA checklist at specs/001-public-grid-viewer/checklists/qa.md (mobile interactions, selection precision, upload preview)
---
## Phase 5: Polish & Cross-Cutting Concerns
- [ ] T018 [P] Add quickstart file specs/001-public-grid-viewer/quickstart.md with local dev steps
- [ ] T019 [P] Add design decision doc at docs/decisions/001-public-grid-viewer.md explaining canvas choice and DB-locking deferral
- [ ] T020 [P] Run `vendor/bin/pint` / code style checks and ensure tests pass locally
- [ ] T018 [P] Add quickstart file specs/001-public-grid-viewer/quickstart.md with local dev steps
- [ ] T019 [P] Add design decision doc at docs/decisions/001-public-grid-viewer.md explaining canvas choice and DB-locking deferral
- [ ] T020 [P] Run `vendor/bin/pint` / code style checks and ensure tests pass locally
---
## Dependencies & Execution Order
- Setup (Phase 1) must complete before Foundational (Phase 2) — Phase 1 tasks can be parallelized.
- Foundational (Phase 2) blocks User Story implementation — once T005..T009 pass, frontend work can begin.
- User Story tasks (Phase 3) depend on Foundational APIs (T005/T006) but UI components T011/T012 can be scaffolded in parallel and stub the API during development.
## User Story Task Counts
- Total tasks: 20
- Tasks for US1: 9 (T005-T007, T009, T010-T015, T016)
## Parallel Opportunities
- Phase 1 tasks T001-T004 are parallelizable ([P]).
- Endpoint implementations T005-T007 and T008 rate-limiting can be parallelized across backend devs.
- Frontend components T011-T013 can be implemented in parallel by different developers.
## Independent Test Criteria (per story)
- US1: Selection precision verified by tests/Feature/SelectionMathTest.php and manual mobile QA; price display uses server `price_per_cell` (T006) — independent of payments.
## Suggested MVP scope
- Deliver Phases 13 for an internal demo: `PublicGrid` page with working selection and price preview (no persistence). This is the recommended MVP.
## Implementation Strategy
1. Implement Phase 1 & Phase 2 backend endpoints and tests (T001-T009).
2. Scaffold frontend pages and components (T010-T013) using mocked API responses.
3. Replace mocks with real endpoints and complete mobile handlers (T014-T015).
4. Run tests, perform QA, and add docs (T016-T019).
***
*** End File