# Dallal Worklog — 2026-07-01

> Shared cross-CLI worklog. Private.

## TL;DR — Daily Scrum

**Yesterday (2026-07-01):** Heavy shipping day — 18 PRs across FE + BE, multiple UAT promotions, and **3 production deploys**.

**✅ Done / Shipped**
- **DAL-BLOG (blogs ⨉ market-insights unification):** BE feed unification (#1537), OG share preview + EditorJS description fix (#1544/#1545), newsletter→Leadnics CRM sync (#1547), and the full FE redesign of `/blogs` (unified feed, pinned hero, topic pills, Figma card/hero/newsletter, #1828 on `sprint-11`). Mobile API-contract MD handed off.
- **Admin map pin feature (#1813 FE / #1541 BE):** draggable Google Map on admin property + building/project forms; reverse-PACI autofill; coord precision `decimal(11,8)`; Algolia keyless-env 500 guard. Backfilled tickets DAL-1216200056595897 / DAL-1216200057160056.
- **Bug fixes (all FE-verified & deployed):** admin clear-description save (#1812/#1817), Arabic dashboard title/desc clobber via `skip_auto_translate` (BE #1538), PACI Area-empty spelling-variant match (#1820), distorted PDF preview (#1821), bilingual admin category/sub-category/type forms (#1818), map "No properties" on home-page location click → recenter to area (#1836), stop admin form auto-creating a child unit on PACI (#1829), map results-count copy (#1824), child→parent map focus (FE #1838 / BE #1554), AR lister-search placeholder (#1814), map marker icon swap (#1809), PACI plot-number loading skeleton (#1827).
- **🚀 PROD deploys:** (1) 8-PR hotfix batch + BE coord precision; (2) admin Export buttons (FE #1825 / BE #1548); (3) targeted hot-fix-only promotion (#1829/#1831/#1549) after reverting a full uat→prod promote per client's "hot-fix only" clarification.
- **QA handoff:** 7 tickets moved Dev Deployment → Ready For QA (6 → Akash, 1 → Shrouk).

**🔄 In progress / carried over**
- FE blog redesign QA (worktree :4441 kept alive); blog FE share wiring still to do.
- FE child→parent map-focus (#1838) now on uat, pending UAT deploy via promote #1839.

---

## 10:20 · pr-opened · DAL-1216140053189299
- Opened PR #1809 (fe): swapped School & Work map marker icons with new designs from ~/Downloads; pin height→auto to preserve aspect ratio.
- Files: mapSchoolLocation.svg, mapWorkLocation.svg, MapLocationPinMarker.tsx. Verified render at 32px + tsc/build pass.
- Moved ticket to Dev Deployment; worktree torn down.

Links: https://github.com/Dallal-kwt/Dallal-ReactJs/pull/1809


## 10:35 · pr-opened · DAL-1216112540576997

**[Backend] DAL-BLOG — opened BE PR #1537** `[DAL-1216112540576997] Unify blogs & market-insight reports into one feed` (base dev, reviewer adeen-s, `sprint 11` label). Parent DAL-1215857550092858. BE-only PR — **FE PR deferred** (FE needs more design work per user); BE is safe to ship alone via the Mobile compat alias.

- **What shipped:** one `blog_posts` model with `kind` (blog/report) + `pinned` cross-type hero + bilingual `cta_button_text`; 4 migrations (schema + backfill reports→blog_posts callbacks-disabled/blobs-shared/old-table-kept + reclassify blogs-with-full-report→report); `/api/v1/blogs` serves both kinds + new `/topics`; `/admins/get_market_insight_reports` kept as Mobile-safe alias via new `MarketInsightReportCompatSerializer`; admin bilingual CTA write (`cta_button_text_translations` + `user_authored_translation_fields` anti-clobber). Bruno + 37 specs.
- **Client decisions baked in:** Topic Tags = reuse content_category (DRY); download = Market Reports ONLY (Gourav confirmed) → blogs lost the Full Report upload + legacy blogs-with-reports reclassified; "Content type"/"Market Report" labels; single "Blogs" settings entry.
- **Committed as Raj-kar** (BE assignee chandrashree@). `db/schema.rb` excluded per convention. Merged origin/dev (already up to date). Ticket moved to Dev Deployment.
- **Worktrees NOT torn down** — BE worktree `Dallal-BE-ROR-DAL-1216112540576997` (server :4097) kept alive because the in-progress FE (`Dallal-ReactJs-DAL-1216105013917341`, :4441) still needs the local unified endpoints until BE deploys to dev.
- **Mobile handoff MD** written: `/Users/raj/Work/DAL-BLOG-Mobile-API-Contract.md` (alias path + unified feed contract) for the Mobile team to start.

Links: https://github.com/Dallal-kwt/Dallal-BE-ROR/pull/1537

## 10:55 · deploy · DAL-1216140053189299

- Cherry-picked #1809 (611eedff3) dev→uat onto release/uat-cherry-pick-2026-07-01; clean pick, build:uat green.
- Opened + merged release PR #1810 into uat; ran Deploy-ALL-IN-ONE (env=uat) run 28495186217 → success.
- Deleted release branch. (uat had older icons via prior feat commit 46b788f82; this brings the newer designs.)

Links: https://github.com/Dallal-kwt/Dallal-ReactJs/pull/1810

## 11:05 · task-done · DAL-1216105013917341 (FE figma-redesign)

**[Web] Blog feed cards — figma-redesign of the Share control** (`/figma-redesign`, node 17395-43008). Current cards used the big blue `ShareButton` pill; Figma shows a minimal connected-dots share ICON (no pill, no text) bottom-right by the date.

- New shared `src/pages/main/ourBlogs/components/BlogShareIconButton.tsx` — icon-only MUI `Share` glyph; `$onImage` variant (translucent dark circle + white icon over the hero) vs plain muted icon on cards; hover→primary/coolGray100, active scale 0.88. Reused by BOTH BlogFeedCard + BlogHeroCard (did NOT touch the shared `ShareButton` atom — detail pages still use it).
- BlogFeedCard + BlogHeroCard: swapped pill→BlogShareIconButton; bumped CategoryBadge + Title `fontWeight 500→600` (project renders Akzidenz "Medium" as 600).
- No new i18n keys (reused `blog.share` as the icon aria-label). `tsc -b` clean. Verified on /blogs (dev-api): cards show the minimal share icon + bolder badge/title, 0 real console errors. Screenshot 09.
- Hero share (over-image dark-circle variant) is tsc-verified but not visually confirmed — dev-api has no pinned item so the hero doesn't render currently.
- FE worktree still open (`:4441` → dev-api) for continued FE design work; not committed.

Refs: parent DAL-1215857550092858 · BE already shipped (PR #1537, merged+deployed).

## 11:56 · pr-opened · DAL-1216113152076746

**[Web-reopen, fixed in BE] Arabic dashboard property save was clobbering manual EN/AR title/description with AI translation** — opened BE PR #1538 `[DAL-1216113152076746] Honor skip_auto_translate on dashboard property save`.

- **Root cause (BE, not FE):** the FE already sends `skip_auto_translate: true` once both locales are typed, but `account_user/developer_properties_controller#create/#update` never read it (unlike sibling `categories/properties_controller#update`). So `property.update` fired `AutoTranslateToArabic#enqueue_translation` and the async `Categories::ArabicTranslatorWorker` (which has **no value guard** — blindly overwrites the target locale) raced the FE's secondary-locale PUT and replaced the manual text with a machine translation. Earlier display fix (read explicit `title_en`/`title_ar`) had already shipped; this reopen was the save-side clobber.
- **Fix:** added `skip_auto_translate?` helper (`ActiveModel::Type::Boolean` cast — tolerates JSON bool + "false" string); `#update` sets `property.skip_translation`; `#create` passes new optional `skip_translation:` kwarg through `PropertyCreationService` (set on record BEFORE save so `after_create` never enqueues). Additive/Mobile-safe (callers omitting the flag unchanged).
- **API owner flagged for user:** Ujjwal Jalodiya (GitHub `ujjwalj-dev-metafic` / `ujjwal-dev-metafic`, ujjwal.j@metafic.co) built the dashboard bilingual write-path but never carried over Adeen's skip guard.
- **Verified:** 4 new specs (2 service + 2 controller, positive+negative) pass; **live e2e against dev DB** — with flag 0 translator jobs + both locales persist exactly, without flag auto-translate still fires (2 jobs). Throwaway rows cleaned up. Committed as Raj-kar; merged origin/dev clean; ticket moved to Dev Deployment; both worktrees (flat task, same id) torn down.

Links: https://github.com/Dallal-kwt/Dallal-BE-ROR/pull/1538

## 12:22 · deploy · DAL-1216113152076746

**BE UAT promotion of the skip_auto_translate fix** — cherry-picked dev→uat and deployed.

- Cherry-picked BE PR #1538 (squash commit `9af3c009`) onto `release/uat-cherry-pick-2026-07-01` off `origin/uat` — clean, no conflicts, no schema.rb. Opened release PR #1540, merged into `uat` (true merge commit).
- BE-only batch: the FE half of this ticket (display fix #1780 / `8ed586456`) was already on UAT, so no FE pick needed.
- Ran BE `All-in-one.yml` deploy `env=uat branch=uat` → run 28499236930 **success**. Deleted the release branch (remote+local).

Links: https://github.com/Dallal-kwt/Dallal-BE-ROR/pull/1540

## 11:55 · task-done · DAL-1216105013917341 (FE figma — hero + newsletter)

**[Web] Blog page — continued figma-redesign (hero pin card + newsletter, 100% match).** Uncommitted (FE design pass on `:4441` → dev-api).

- **Hero (BlogHeroCard):** restructured to Figma layout — badge+date top-left / share icon (translucent dark circle) top-right / title+subtitle+CTAs at bottom via `BottomBlock` + `justify-content: space-between` (was clustered at bottom). Subtle Figma shadow `0 4px 6px…` (was heavy `0 25px 50px`). Verified against a pinned item by TEMP-pointing FE→local BE :4097 (dev-api has none), screenshot 10, then restored .env→dev-api.
- **Newsletter (BlogNewsletter):** re-did to the Figma banner — downloaded the Kuwait-skyline illustration (`download_assets` node 17415-67929 → `src/assets/images/blogNewsletterSkyline.png`), placed inline-start bottom; content right-aligned; input is now a white PILL with an EMBEDDED blue Subscribe button (was separate input+button, centered). RTL via logical props (insetInlineStart / justify flex-end). Screenshot 11 = 100% match.
- **Page width:** `ContentArea` maxWidth 1100→**1264** (Figma container) — user approved widening; feed cards + hero + banner now full Figma width.
- No new i18n keys. `tsc -b` clean throughout, 0 real console errors.

Refs: parent DAL-1215857550092858 · BE shipped (#1537 merged+deployed).

## 13:25 · pr-opened · DAL-1216198646956041

**[Web] Admin Projects edit — clearing the description now saves.** Opened FE PR #1812 `[DAL-1216198646956041] Allow admins to clear the building/project description` (base dev, reviewer adeen-s).

- **Bug:** on `/admin/projects/:id/edit` (→ `PUT /api/admin/buildings/:id`), clearing the description and saving kept the old text. Empty value was stripped TWICE on FE: `DeveloperBuildingFormPage.tsx` `description: values.description || undefined` (→ undefined) + `useDeveloperQueries.ts` `useUpdateBuilding` `if (data.description)` truthy guard → `property[description]` never sent → BE treated it as unchanged.
- **Fix (FE-only):** page passes `values.description ?? ''`; hook appends when `data.description !== undefined`. Create path + title/internal_name truthy guards left as-is (blank there = keep existing).
- **BE verified no change needed:** `Api::Admin::BuildingsController#update` permits `:description` as plain scalar, mass-assigns it, Globalize stores `""` across all 3 write paths (normal/super-admin/consent); only blank-guard is the AR auto-translate skip which doesn't touch the source value.
- **Prod forensics (side task):** confirmed root cause live on property 903511 (saved recently, description unchanged). Also traced for client: 903511 is `parent_level` (subcat Building) auto-created by `PropertiesController#upsert_parent_building` when user 7622 "Muhammad Maree" (EmailAccount, client-side) listed an apartment under a building — so it shows under admin Projects by design, not admin-created.
- Committed as Raj-kar; merged origin/dev (up to date); ticket moved to Dev Deployment; worktree + :4141 torn down.

Links: https://github.com/Dallal-kwt/Dallal-ReactJs/pull/1812

## 13:32 · pr-opened · no-ticket (admin map lat/long)

**Admin map pin feature (flat/no-ticket) — opened FE PR #1813 + BE PR #1541, cross-linked, both `hot-fix`, base dev, reviewer adeen-s.**

- **Feature:** draggable Google Map (`EstaterMapView`) added to admin property form (`/admin/property/create`+edit), admin building/project form (`/admin/developers/:id/buildings/create`+edit + `/admin/projects/:id/edit`), and a read-only pin on the property view page. Marker drag writes lat/long into the form and reverse-geocodes to auto-fill area/governorate/block/street/avenue/PACI.
- **FE (#1813):** shared `applyResolvedLocation` (property) + `applyBuildingLocation` (building) helpers reused by forward PACI lookup AND reverse pin-drag; Avenue·Lat·Long row in building form; Area/Gov selection seeds coords. **Bug fix:** `useUpdateBuilding` never appended `property[latitude/longitude]` → editing a project's pin silently no-op'd; now sent (mirrors `useCreateBuilding`). Property form already sent coords on create+edit.
- **BE (#1541):** migration `properties.latitude/longitude` decimal(10,6)→**decimal(11,8)** (pins were rounding at 6 decimals ~11cm → now ~1mm); new admin `reverse_paci_lookup` endpoint (lat/lon→address via `KuwaitFinder::ReverseGeocoderService`, same flat shape as `paci_lookup`); **Algolia guard** `disable_indexing: -> { app_id.blank? }` on `Categories::Property` (keyless envs were 500ing every property/building save with `` `app_id` is missing. `` from algoliasearch-rails). `db/schema.rb` excluded per convention.
- **Local-test facts (for future sessions):** BE worktree `Dallal-BE-ROR-admin-map` runs on **:3200** and needs `RAILS_MASTER_KEY=$(cat config/master.key)` (copied from main repo — gitignored in worktree) for JWT AND `POSTGRES_USER=$(whoami) POSTGRES_DB=dallal_development POSTGRES_HOST=localhost POSTGRES_PASSWORD=""` so decrypted creds don't switch DB to the unreachable dev user. FE worktree `Dallal-ReactJs-admin-map` on **:4173**, `.env VITE_BASE_URL=http://localhost:3200`. Admin login `support2@dallal.com.kw`/`Test@1234` (acct id 3, super_admin — already existed). Reverse-geocode autofill only resolves on a Kuwait IP (KuwaitFinder), so returns 404 locally (~10s timeout) — works on dev/prod.
- Committed as Raj-kar (chandrashree@). Both worktrees **kept alive** (servers still running) for continued testing — NOT torn down. No Asana ticket to move.

Links: https://github.com/Dallal-kwt/Dallal-ReactJs/pull/1813 , https://github.com/Dallal-kwt/Dallal-BE-ROR/pull/1541

## 13:30 · pr-opened · DAL-1216190137218576

**[Web UAT-AR] Fixed Arabic lister-search placeholder terminology** — opened FE PR #1814 `[DAL-1216190137218576] Fix Arabic lister-search placeholder to approved terminology` (base dev, reviewer adeen-s).

- **Bug:** on `/ar/registerproperty/whos-listing` (Owner → "Assign an agent" section), the search field sub-label + placeholder read `ابحث عن سمسار مرخص أو وكالة` — outdated terms (سمسار / وكالة) inconsistent with the platform's approved وسيط / شركة (section header already used `تعيين وسيط`).
- **Fix (FE-only, one line):** `src/locales/ar.json` `common.searchLicensedBrokerOrAgency` → `ابحث عن وسيط مرخص أو شركة`. Single key renders 4× in `OwnerInlineForm.tsx` (2 sub-labels + 2 placeholders) so all occurrences fixed at once. Other `سمسار` hits (`broker_agent: "وسيط / سمسار"` role labels) left — intentional, different context.
- **Verified:** live dev server serves new value + old `سمسار` gone from loaded i18n resource; ar.json valid JSON; pre-commit build passed; i18n interpolation regression test 10/10. EN left as-is ("Search a licensed broker or agency") — ticket was AR-only; flagged EN "agency"→"company" as optional consistency follow-up.
- Section "RTL Translation", P3, flat task. Committed as Raj-kar; merged origin/dev clean; ticket moved to Dev Deployment; worktree + :4676 torn down.

Links: https://github.com/Dallal-kwt/Dallal-ReactJs/pull/1814

## 13:38 · note · DAL-1216200056595897 / DAL-1216200057160056 (backfilled tickets + amended commits/PRs + cleanup)

**Backfilled Asana tickets for the admin map-pin work (was a no-ticket task), wired them into the PRs/commits, and tore down the local env.**

- Created two P1 tickets (Planning To-Do, assignee Raj, no tag — Features): <strong>DAL-1216200056595897</strong> `[Web] [Feature] Draggable map to set property/project location on admin forms` and <strong>DAL-1216200057160056</strong> `[BE] [Feature] Store full-precision coordinates + reverse PACI lookup for admin map pin`.
- Updated both PRs: FE #1813 title→`[DAL-1216200056595897] …` + Related Ticket; BE #1541 title→`[DAL-1216200057160056] …` + Related Ticket.
- Amended both commits to add `Refs:` — recreated each branch as a clean single commit on top of latest origin/dev via `git reset --soft origin/dev` + recommit (avoided rewriting the merge commit), force-pushed with `--force-with-lease`. New SHAs: FE `63e62f80a`, BE `aa8d7ed1`.
- **Cleanup:** killed BE :3200 + FE :4173, removed both worktrees (`Dallal-ReactJs-admin-map`, `Dallal-BE-ROR-admin-map`) — clean + fully pushed; branches intact on remote. Purged session /tmp logs + PR-body temp files; backstop sweep ran (nothing stale >7d). Main BE repo clean.

Links: https://app.asana.com/1/1211966365940925/project/1212734281782902/task/1216200056595897 , https://app.asana.com/1/1211966365940925/project/1212734281782902/task/1216200057160056

## 14:05 · deploy · DAL-1216198646956041 / 1216200056595897 / 1216200057160056

**dev→uat cherry-pick batch — merged & UAT deploys green (both repos).**

- FE release PR #1815 (base uat): cherry-picked #1812 (clear description) + #1813 (draggable admin map) — clean picks, `build:uat` green. BE release PR #1543: cherry-picked #1541 (coord precision decimal(11,8) + reverse PACI + Algolia guard) — clean, migration only (no schema.rb). Cross-linked FE↔BE.
- Merged both as true merge commits into `uat`. Ran Deploy-ALL-IN-ONE `env=uat branch=uat`: FE run 28503620781 **success**, BE run 28503634003 **success**.
- Deleted both release branches (remote+local). FE main repo back on `master` (dev is checked out in worktree `dallal-amp-dev`); BE back on `dev`.

Links: https://github.com/Dallal-kwt/Dallal-ReactJs/pull/1815 , https://github.com/Dallal-kwt/Dallal-BE-ROR/pull/1543

## 14:25 · pr-opened · DAL-1216200885872108

**[Web] Bilingual for the complete admin Category flow.** Opened FE PR #1818 `[DAL-1216200885872108] Make category, sub-category & category-type forms bilingual (EN + AR)` (base dev, reviewer adeen-s, **hot-fix** label). P2 Enhancement.

- **Origin:** UAT report — admin added sub-category "Duplex" but it didn't get an Arabic name. Root cause: only the Category admin form was bilingual; Sub-Category & Category-Type dialogs had a single scalar Name/Property-Type + Description, so no way to set Arabic (SubCategory has NO auto-translate worker — globalize only). BE already accepts `translations[en|ar]` for all three entities → FE-only fix.
- **Fix:** all 3 dialogs now use the shared `AdminBilingualField` (same as Ticker modals) — EN on top (source of truth) + AR below with the AI-translate button, shown on **Add AND Edit** (previously Category AR was edit-only). Removed my first-pass custom edit-only section after user said "check other parts how we did"/"same bilingual thing across the app".
- **Hooks:** generic `appendEntityTranslations` (category/sub_category/category_type); sub/type create+update now send `translations[en|ar][...]`; new per-locale prefill hooks `useSubCategoryTranslations`/`useCategoryTypeTranslations` (list fetched per `?language=`, no single-record admin GET exists). New i18n keys propertyTypeEn/Ar, translateToArabic, translateError (en+ar).
- Prod forensics earlier: sub_cat 28 Duplex had en 07:59 + ar 08:02 (manual switch-language workaround). Committed as Raj-kar; tsc clean; ticket moved to Dev Deployment; worktree + :4190 torn down.

Links: https://github.com/Dallal-kwt/Dallal-ReactJs/pull/1818

## 12:45 · pr-opened · DAL-1216112540576997 (blog share OG)

**[Backend] Blog share OG preview — opened BE PR #1544** `[DAL-1216112540576997] Add Open Graph share preview for blog links` (base dev, reviewer adeen-s, sprint 11). Follow-up to the unification #1537.

- `ShareController#blog` (GET `/share/blogs/:slug`) — resolves blog_post by slug or numeric id via `.kept`, OG title/description(stripped content)/image(cover `:share` variant)/canonical `/blogs/:slug`; works for blog AND report. New `:share` cover variant (1200²  jpg q75) for WhatsApp cap. View + `share.blog.*` i18n (en+ar) + spec (OG/stripped/id/404). Mirrors `/share/market_insights/:id` — fills the blog + new-report share gap.
- Verified: 8 share specs green; live curl on local BE (blog + report render correct OG tags w/ :share variant; unknown→404). Committed as Raj-kar. `db/schema.rb` excluded (model-only `:share` variant, no migration). Ticket → Dev Deployment.
- **Worktree KEPT** (`Dallal-BE-ROR-DAL-1216112540576997` :4097) so the pending FE share wiring can test `/share/blogs` locally before this deploys. FE wiring (ShareResource "blogs" + useBlogShare) still to do.
- Branch off latest dev — merge pulled unrelated dev migrations (barters, coordinate precision); ran them on shared local DB.

Links: https://github.com/Dallal-kwt/Dallal-BE-ROR/pull/1544

## 14:55 · deploy · DAL-1216198646956041 / 1216200885872108

**Second dev→uat cherry-pick batch — merged & UAT deploy green (FE only).**

- Release PR #1819 (base uat): cherry-picked FE #1817 (clear property description — 2 commits: fix + comment cleanup) + #1818 (bilingual category/sub-category/type forms). Clean picks, `build:uat` green.
- #1817/#1818 were rebase-merged to dev, so cherry-picked the on-dev SHAs (c3f7cbdaa, 8be863c12, 9494094cd), not the stale branch SHAs.
- Merged as true merge commit into uat; Deploy-ALL-IN-ONE env=uat run 28507098058 **success**. Deleted release branch. No BE in this batch.
- Note: #1817 fixed the admin PROPERTY-form clear-description bug (sibling of #1812's building/project fix); verified live on dev (bug repro + fixed-payload replay → BE clears both locales).

Links: https://github.com/Dallal-kwt/Dallal-ReactJs/pull/1819

## 13:20 · pr-opened · DAL-1216112540576997 (blog share OG desc fix)

**[Backend] Blog share OG description fix — opened BE PR #1545** (base dev, reviewer adeen-s, sprint 11). Follow-up to #1544 after checking it live on dev-api.

- **Bug found on deployed dev-api:** `/share/blogs/:slug` og:description leaked RAW EditorJS JSON (`{"time":...,"blocks":[...]}`) for BLOGS. Root cause: blogs store `content` as EditorJS JSON, not HTML → `strip_html` no-op'd. Reports were fine (HTML content). My #1544 spec used HTML content so it missed it.
- **Fix:** `blog_content_plain_text` detects EditorJS (leading `{`) and extracts text per block (`data.text`/`caption`/string `items`, inline HTML stripped); falls back to `strip_html` for HTML/plain. + `editorjs_block_text` helper. Spec: added EditorJS case (asserts plain text + no `&quot;blocks&quot;` leak).
- **Verified via live curl** on local BE (fix branch) against a real EditorJS blog → og:description now clean plain text ("Searching for a property in Kuwait can be overwhelming…"). Committed as Raj-kar, schema.rb excluded. Ticket → Dev Deployment.
- **Test-DB gotcha:** local `dallal_test` got wedged — I ran `db:schema:load` which reset it to the STALE schema.rb (BE PRs exclude schema.rb, so migration files are source-of-truth, not schema.rb). `db:migrate` partially reapplied but maintain_test_schema! still flagged pending (dev's barter + coordinate migrations). Spec runs in CI; verified locally by curl instead. Lesson: for BE specs, `db:migrate` the test DB, never `db:schema:load` (stale schema.rb).

Links: https://github.com/Dallal-kwt/Dallal-BE-ROR/pull/1545

## 15:55 · pr-opened · DAL-1216202641341002

**[Web] Admin PACI lookup left Area empty.** Opened FE PR #1820 `[DAL-1216202641341002] Fix admin PACI lookup leaving Area empty (spelling-variant match)` (base dev, reviewer adeen-s, **hot-fix** label). P2 Bug.

- **UAT repro:** admin /admin/property/create → PACI 90327401 → Lookup fills Gov/Block/Street/Building/coords but Area blank; client register flow fills Area=Mishref fine.
- **Root cause (verified on UAT rails):** for the same PACI, KuwaitFinder GeocoderService returns `neigh_name="Mishrif"`, Estater returns `"Mishref"`. Admin paci_lookup uses KuwaitFinder-first → "Mishrif". FE `resolveAreaValue` (src/api/countryApiCall.ts) only matched exact + prefix (`fuzzyMatch` = startsWith), so the e/i one-letter diff fell through to raw passthrough. Admin Area is a strict MUI `<Select>` (dashboard variant) → unmatched value renders blank; customer Area is free-text so it showed.
- **Fix (FE-only, shared resolver):** added bounded Levenshtein `editDistance` + `nearMatch` (distance ≤1, len ≥4) and a `near` tier in resolveAreaValue after exact/fuzzy (in-gov first, then global last). "Mishrif"→"Mishref". Unit-checked: mishref↔mishrif & jabriya↔jabriye match; salmiya/salwa don't. Benefits admin + customer.
- Committed as Raj-kar; tsc clean (only unrelated fresh-worktree prerender-data.json); ticket moved to Dev Deployment; worktree + :4201 torn down.

Links: https://github.com/Dallal-kwt/Dallal-ReactJs/pull/1820

## 13:45 · pr-opened · DAL-1216190301656478

**[Web UAT] Fixed distorted PDF document preview across listing screens** — opened FE PR #1821 `[DAL-1216190301656478] Fix distorted PDF document preview across listing screens` (base dev, reviewer adeen-s).

- **Bug:** uploaded PDF previews rendered with stretched text ("Sam p le PD F") on register-property photos/review, portfolio create/edit, admin forms, agent verification, preview doc list. `PdfThumbnail.tsx` drew page 1 to a `<canvas>` at natural portrait aspect (~200×259 for Letter), then CSS forced `width/height:100%` inside the square `MediaCardThumb` (`aspectRatio:1`), relying on `object-fit:cover` — which **does NOT apply to `<canvas>`** → non-uniform horizontal stretch.
- **Fix (FE-only, 1 file):** canvas keeps its aspect via `max-width/height:100%` (flex-centred) instead of forced 100%×100%+object-fit → whole first page shown undistorted. Render at 400px width for crispness. Also converted inline `style`/`sx` → styled-components (ThumbWrapper/ThumbCanvas/FallbackIcon) + hardcoded `#F4F6F8` → `theme.colors.whiteSmoke`.
- **Verified:** A/B repro in-browser using the app's real pdf.js pipeline (`loadPdfDocument` + a generated Letter PDF): before=stretched, after=correct proportions (screenshot 01). `tsc -b` + pre-commit build pass. Single shared component so all listed screens fixed at once. QA to run their test doc on the real upload screens.
- Section "Planning (To-Do)", flat task. Committed as Raj-kar; merged origin/dev clean; ticket moved to Dev Deployment; worktree + :4578 torn down.

Links: https://github.com/Dallal-kwt/Dallal-ReactJs/pull/1821

## 16:30 · deploy · uat→prod cherry-pick

**uat→prod cherry-pick batch 2026-07-01** — opened release PRs (not merged/deployed yet).

- **FE release PR #1823** (base master): 7 commits — today's hotfixes #1812 (clear building desc), #1817 (clear property desc), #1818 (bilingual categories), #1820 (PACI area spelling fix), #1813 (admin draggable map) + **prerequisites #1603/#1653** (avenue-dedup; #1813 needs `dedupeAvenueFromStreet` from #1653→#1603, on uat but not prod).
- **BE release PR #1546** (base main): #1541 (coord precision + reverse PACI + Algolia guard, migration only no schema.rb). Paired with FE #1813; cross-linked both PR bodies.
- **Why the chain:** prod is **366 FE / 241 BE commits behind uat** (+21 prod-only each side). Map #1813 couldn't ship alone — pulled its 2 predecessors (already uat-tested). User confirmed "all today's hotfix PRs must reach prod, include predecessors as needed."
- **Conflicts:** #1603 auto-clean; #1653 clean once #1603 in place; #1813 auto-clean once chain present; #1817 PropertyFormPage.tsx desc-clear hunks resolved take-incoming (send blank to clear); #1818/#1820 clean. **Clean prod build (tsc -b + vite build) passed.**
- All picks originate from dev merge commits → already on dev, no drift back-port needed. NOT merged/deployed — awaiting review; use /deploy-prod to ship.

Links: https://github.com/Dallal-kwt/Dallal-ReactJs/pull/1823 · https://github.com/Dallal-kwt/Dallal-BE-ROR/pull/1546

## 16:20 · pr-opened · DAL-1216140053189287

**[Web] Removed "within the selected area" from map results count.** Opened FE PR #1824 (base dev, reviewer adeen-s), committed as Raj-kar.

- Map results header on `/properties` (`MapResultsPanel.tsx`) read `estaterMap.propertiesWithinSelectedArea` = "{{total}} properties within the selected area" — client wanted the qualifier gone. Changed EN → "{{total}} properties", AR → "{{total}} عقار". Single key, single consumer; {{total}} intact.
- Finding the key was non-obvious: main repo working tree was parked on a conflicted `release/prod-cherry-pick-2026-07-01` (unrelated prod pick I left untouched), so local greps missed it — resolved via `git show origin/dev:` + live-DOM inspection ("18 properties within the selected area").
- Verified rendered both locales on :4387 (EN "18 properties", AR "18 عقار"). tsc + pre-commit build pass. Ticket moved to Dev Deployment. Worktree torn down.
- Complements prior merged PR #1803 (illustrated empty-state / hide count on ZERO results); this fixes the non-zero label. Left the prior session's stale merged worktree `Dallal-ReactJs-DAL-1216140053189287` intact (didn't create it).

Links: https://github.com/Dallal-kwt/Dallal-ReactJs/pull/1824

## 16:55 · deploy · PROD FE+BE

**Deployed to PRODUCTION — FE + BE (Mode B, cherry-pick release already merged).**

- **FE #1823 → master:** ff-pull to release tip (#1820 `resolve PACI area`), prod `npm run build` BUILD_EXIT=0 (~8min prerender), `app.service` restarted, dist fresh (14:19), **https://dallal.com.kw/ → 200**. No package.json change; allowedHosts preserved.
- **BE #1546 → main:** ff-pull to #1541, ran migration `20260701090000_increase_property_coordinate_precision` (latitude/longitude → decimal 11,8, ~30s), puma+sidekiq restarted, **api-v2 developers 200 / properties 401**. prod-local api-v2 config preserved (3 lines), no Gemfile/assets change.
- **8 PRs now live on prod:** today's hotfixes #1812 (clear building desc), #1817 (clear property desc), #1818 (bilingual categories), #1820 (PACI area fix), #1813 (admin draggable map) + prereqs #1603/#1653 (avenue-dedup) + BE #1541 (coord precision/reverse PACI).
- Discord notified; both `release/prod-cherry-pick-2026-07-01` branches deleted; bastion shells cleared.

Links: https://github.com/Dallal-kwt/Dallal-ReactJs/pull/1823 · https://github.com/Dallal-kwt/Dallal-BE-ROR/pull/1546

## 17:19 · pr-opened · DAL-1216112540576997 (newsletter→Leadnics CRM)

**[Backend] Newsletter subscribe now mirrors into the Leadnics CRM** — opened BE PR #1547 `[DAL-1216112540576997] Sync newsletter subscribers to Leadnics CRM (lead_source=newsletter)` (base dev, reviewer adeen-s, sprint 11). Part of DAL-BLOG; follow-up after #1537/#1544/#1545.

- **What shipped:** `/admins/subscribe_newsletter` now also pushes the subscriber into the Leadnics CRM (`crm.dallal.com.kw/api/v2/contacts`) via new `Leadnics::ContactService` + best-effort `Leadnics::NewsletterContactWorker` (queue low, retry 3), off the request path (enqueue wrapped in rescue so Redis-down can't 500 the subscribe). Local `NewsletterSubscriber` row unchanged; FE/Mobile contract unchanged (transparent, additive).
- **KEY gotcha (live-verified):** the CRM create endpoint IGNORES the `source` enum column (stores null even for a valid enum) → newsletter origin carried by free-text `lead_source="newsletter"` + `newsletter` tag + `utm_source`. Auth = workspace-scoped Bearer key (no X-Workspace-Id). Requires ≥1 name (email-only 400s) → first_name derived from email local-part.
- **Keys:** `LEADNICS_API_KEY` minted per-env in the CRM dashboard (same workspace) → stored on dev/uat (`/etc/property-app/variable.env`) + prod (`/home/deploy/property-app/.env`, ownership-safe append), all 3 set today. Prod = a fresh v2 key (old prod key's secret unrecoverable + wasn't on the box). `.env.example` placeholders only.
- **Verified:** 17 service+worker specs green; live-tested the actual service via `rails runner` against the real CRM → 201, contact persists `lead_source=newsletter`; test contacts deleted (204). Committed as Raj-kar; branch cut clean off origin/dev (stashed the uncommitted changes off the blog-share-editorjs branch). Ticket → Dev Deployment.
- **Worktree KEPT** (`Dallal-BE-ROR-DAL-1216112540576997` :4097) for local end-to-end testing before deploy. Mobile API-contract MD updated with the newsletter section.

Links: https://github.com/Dallal-kwt/Dallal-BE-ROR/pull/1547

## 17:20 · deploy · PROD admin Export buttons

**Deployed admin Export-buttons feature to PRODUCTION (FE + BE).**

- **FE #1825 → master** (cherry-pick of export feature #1594): fresh prod build (bundle `index-B85qrmt8.js`, export symbols confirmed in dist/assets), app.service restarted, **dallal.com.kw 200**.
- **BE #1548 → main** (#1393): Gemfile changed → `bundle install` (caxlsx), 2 migrations applied (`create_admin_data_exports` + `grant_export_permissions_to_existing_roles`; older RBAC-seed migration already applied), puma+sidekiq restarted, **api-v2 developers 200 / properties 401**.
- **Live now:** Export button on **Users, Properties, Companies(=Developers), Agents** admin lists (Users async→email; others xlsx download). Contact-us/Projects have no export (not in scope). Client wanted User/Properties/Companies — all covered.
- **Flow:** user checked locally first on `check/export-buttons-prod` (FE port 4300) → approved → cherry-pick release PRs → merged → deployed.
- **GOTCHA (recorded):** detached FE prod-build launches via nested-ssh + local `timeout` **silently never spawned** — dist stayed stale (morning 14:19) while an old log showed `BUILD_EXIT=0`. Fix: run the build in the FOREGROUND (or verify a real `vite build` PID, not `vite preview`); confirm deploy by **dist/index.html mtime freshness + grepping export symbols in dist/assets/*.js**, never trust a stale BUILD_EXIT. `pgrep -f vite` also matches `vite preview` (app server) → false "BUILDING".
- Discord notified; both `release/prod-cherry-pick-2026-07-01-export` branches deleted.

Links: https://github.com/Dallal-kwt/Dallal-ReactJs/pull/1825 · https://github.com/Dallal-kwt/Dallal-BE-ROR/pull/1548

## 18:15 · pr-opened · DAL-1216205468004153

**[Web] PACI plot-number loading skeleton on the full map** — opened FE PR #1827 `[DAL-1216205468004153] Show loading skeleton for PACI plot numbers on full map` (base dev, reviewer adeen-s). P2 Enhancement, ticket created this session.

- **Problem:** on `/properties`, zoom-in (z≥17) fires a slow `paci_query` civil-id fetch that renders a number pill per plot via `usePaciLayer`; no feedback while in flight — plots sit empty then pop in.
- **Fix (FE-only):** new `PaciSkeletonOverlay.tsx` renders shimmering placeholder pills (matching `PaciLabel` footprint) at plot centres; new `parcelCentroids()` in `parcelCentroid.ts` reuses the pole-of-inaccessibility maths so skeleton ↔ real chip land on the same point; `estaterFullMap/index.tsx` computes centroids while loading + `visible.length===0` (gated so pans don't double up) and renders above `PaciOverlay`. Boundary polygons come from a separate faster query so centroids are available first.
- **UX note:** explored 3 approaches with the user — dense skeleton (shipped), sparse skeleton (rejected as ugly), and a Google/Zillow-style top progress-bar + chip fade-in (saved as a patch at `screenshots/DAL-paci-skeleton/APPROACH-A-progressbar-fadein.patch` for future reference). User chose skeleton.
- Worktree used a temp slug (`Dallal-ReactJs-DAL-paci-skeleton`, :4199) since the ticket was created after implementation; branch renamed to the real DAL id before PR. Committed as Raj-kar; merged origin/dev clean (locale auto-merge); ticket moved to Dev Deployment. **Worktree KEPT ALIVE** (:4199) — user still recording a demo video; NOT torn down.

Links: https://github.com/Dallal-kwt/Dallal-ReactJs/pull/1827

## 18:47 · pr-opened · DAL-1216105013917341 (blog FE → sprint-11)

**[Web] Unify Blogs & Market Insights into one /blogs page** — opened FE PR #1828 `[DAL-1216105013917341] Unify Blogs & Market Insights into one /blogs page (redesign + CMS)` (base **sprint-11** per user, reviewer adeen-s, `sprint 11` label). Parent DAL-BLOG.

- **What shipped (31 files, +2019/-409):** unified /blogs (combined feed, pinned hero, topic filter pills, infinite scroll, always-on share, Figma card/hero/newsletter redesign); `/ourblogs`→`/blogs`; single "Blogs" settings entry (Market Insights folded in); `shareNative` "blogs" resource → BE OG `/share/blogs/:slug`; ShareButton bg→primary; admin CMS kind/pin/bilingual-CTA; `getBlogTopics`; blog theme tokens + i18n.
- **Base = sprint-11 (NOT dev)** per user: sprint-11 diverged from dev (55 behind, 4 ahead), so cut a FRESH branch off origin/sprint-11 and applied ONLY the blog work (stash → `checkout -B origin/sprint-11` → pop; clean, no conflicts). Verified blog work is tsc-clean + pre-commit-build-passed ON sprint-11 (no dev-only deps missing). Excluded 3 stray non-blog map files (MapResultsPanel + 2 mapNoResults SVGs that had leaked into the worktree).
- **Fixes folded in:** removed the "link copied" share toast (silent clipboard fallback, error toast kept); filter-bar left-aligned pills + content-width divider (Playwright-measured vs Figma: All@x=32, divider 32→1248); converted one inline `style` to a transient-prop styled component.
- **⚠️ Token gotcha:** raj's team-CLI GitHub token (`dallal-team-cli/config.json`) is now EXPIRED — `gh` GraphQL returns "Bad credentials" (it worked for BE #1547 earlier THIS session). Worked around with the ambient `gh` keyring login (account `Raj-kar`, scopes repo+read:org+workflow) for `pr create` + label REST. **Rotate the config.json token for future /create-pr.**
- Committed as Raj-kar; ticket → Dev Deployment. **FE worktree KEPT** (:4441) for continued blog QA. BE already on dev (#1537/#1544/#1545/#1547).

Links: https://github.com/Dallal-kwt/Dallal-ReactJs/pull/1828

## 19:34 · pr-opened · DAL-1216207654114536

**[Web] Stop admin property form auto-creating a child unit on PACI entry** — opened FE PR #1829 `[DAL-1216207654114536] Stop admin property form from auto-creating a child unit on PACI entry` (base dev, reviewer adeen-s, **hot-fix** label). P1 Bug, ticket created this session (client/Gourav request).

- **Client report (UAT):** admin created a property with PACI `92752903` and got an unwanted parent+child pair. Investigated on UAT rails: PACI `92752903` = a single **standalone villa** per Estater (Villa/House, Independent Villa, `no_of_subunit=0`, estater record #45272). The form still made parent `#904910` (paci 92752903) + child `#904911` (a DIFFERENT unit-level paci `16408481`, coords from the estater plot). Journal logs confirmed 3 sequential FE calls: POST parent → PUT parent AR → POST child_level.
- **Root cause = FE-only** in `src/pages/admin/pages/property/PropertyFormPage.tsx`: `handlePaciLookup` calls `child_units_lookup` to discover sub-units → `setDiscoveredChildUnits`, then the create `onSuccess` loops one `POST /api/admin/properties` per unit with `property_level:'child_level'`+`parent_id`. NOT driven by the PACI being multi-unit — driven by the discover+loop.
- **Fix:** commented out BOTH the `child_units_lookup` fetch and the child-creation loop (left in place w/ re-enable note); `childUnits` kept as empty `const`. Since `discoveredChildUnits` is only written by that fetch, the auto-child is doubly dead.
- **Verified on dev:** reproduced the bug source (`child_units_lookup?paci_number=92752903` → child paci 16408481); then ran local FE→dev-api, admin login → Create Property → PACI 92752903 → Lookup fires `paci_lookup` (200) ONLY, `child_units_lookup` no longer called; location fields still auto-fill (block 11, street 70, lat/lng), no crash. `tsc -b` exit 0. Pre-existing eslint const-truthiness error at ~line 4615 is not mine (pre-commit runs build only).
- **Admin-panel proof for client:** `/admin/estater-properties` is searchable by PACI → record #45272 shows Villa/House · Independent Villa · standalone · 0 sub-units.
- Committed as Raj-kar (branched fresh off origin/dev since main working tree was on release/prod-cherry-pick). Dropped accidentally-staged `screenshots/DAL-paci-skeleton/` scratch from the commit. Ticket moved to Dev Deployment. Not a worktree (main repo) → no teardown. **Team-CLI GitHub token still expired** (gh GraphQL 401) — used ambient `gh` keyring auth for pr create + label, per earlier note.

Links: https://github.com/Dallal-kwt/Dallal-ReactJs/pull/1829 , https://app.asana.com/1/1211966365940925/project/1212734281782902/task/1216207654114536

## 21:40 · pr-opened · DAL-1216212226692821

**[Web] Map showed "No properties" when opening a location filter from the home page** — opened FE PR #1836 `[DAL-1216212226692821] Recenter map to filtered area so home-page location clicks show results` (base dev, reviewer adeen-s). P1 Bug, ticket created this session.

- **Root cause (FE-only):** `/properties` map (`estaterFullMap`) `map_search` is **viewport-bounded** — it sends the live Google-map bbox (`sw/ne_lat/lng`) AND the filters (`useMapSearch.ts` → `getMapSearch` in `apiCall.ts`). Clicking a location on the home page routes via `location.state.filtersData` → applied by `getNavStateFilters`→`setUrlFilters` (`index.tsx:1086`) but **never pans/zooms** the map to the area, so it stays at `DEFAULT_CENTER` (Kuwait City, 29.3759/47.9774). The bbox never overlaps Siddiq/Hawalli → 0 results despite a matching "Farm in Siddiq" listing. `area`+`governance_region` AND is self-consistent (not the over-constraint).
- **NOT a Day-1 bug:** the viewport-bounded full-map v2 landed 2025-11-20 (`6d6a79602` "Working on map ui", `/properties`→EstaterMap); the exact nav-state auto-apply-without-recenter came in the **latest** commit `1a1de1086` (2026-06-28 "card detail clicks now auto-apply filters on map view"). Old `/properties` list was location-only (not viewport-bounded) so never hit it.
- **Fix:** new pure `resolveAreaCentroid(cities, area, governorate)` in `logic.ts` (prefers exact area+gov since KW area names repeat across governorates; bundled KW data via `getAllCities("KW")`). New `focusOnArea()` in `index.tsx` pans/zooms to the centroid (`AREA_FOCUS_ZOOM=12`, mirrors `handleGuidedAreaSelect`), deferring to `onLoad` first idle via `pendingAreaFocusRef` when map not ready. Wired into the nav-state path (home click) AND a deep-link/refresh path (bare `?filters=` URL with default/absent viewport recenters once; a deliberate shared viewport is respected, not overridden).
- 6 unit tests for `resolveAreaCentroid` pass; `tsc -b` clean on changed files (only pre-existing generated `prerender-data.json` error). Branch was generic during impl (no ticket), renamed to DAL id at PR time. Committed as Raj-kar; ticket → Dev Deployment; worktree (`Dallal-ReactJs-map-no-results-viewport`, :4791) torn down.

Links: https://github.com/Dallal-kwt/Dallal-ReactJs/pull/1836 · https://app.asana.com/1/1211966365940925/project/1212734281782902/task/1216212226692821

## 21:52 · deploy · PROD hot-fix promotion (targeted)

**Deployed to PRODUCTION — only today's hot-fix-labeled PRs that were still missing from prod (FE+BE).**

- **FE release #1835 → master `dc7fc1b6a`:** #1829 (stop admin form auto-creating child unit on PACI) + #1831 (keep PACI area/governorate consistent so dropdown fills). ff-pull (no dep change), prod `npm run build` 7m16s `BUILD_EXIT=0`, bundle `index-C_UqDNB9.js`, `app.service` active, served==dist, **dallal.com.kw 200**.
- **BE release #1553 → main `61e1ae54`:** #1549 (canonicalize admin PACI area/governorate via Estater). Only controller+spec — no migrations/gems, ff-pull, api-v2 config preserved (3 lines), puma+sidekiq active, **api-v2 developers 200 / properties 401**.
- **IMPORTANT SEQUENCE (why the churn):** earlier this session I ran a FULL uat→prod promote (#1833 FE / #1551 BE) and MERGED it (never deployed); client then clarified they want ONLY hot-fix-labeled PRs in prod → **reverted the full promote** (#1834 FE / #1552 BE, prod back to `c7120bc74`/`da03defc`) → then did this targeted hot-fix-only cherry-pick. Net prod change = just the 3 hot-fix PRs.
- **GOTCHA 1 — don't trust ticket-text grep for "missing from prod":** grepping commit messages by DAL id gave FALSE "missing" verdicts. Content-verify each candidate via a **cherry-pick empty test** (`git cherry-pick -m1`; "now empty" ⇒ already on prod). That correctly dropped FE #1813 (draggable map), #1820/#1817/#1812 and BE #1541 as already-present, leaving only #1829/#1831/#1549.
- **GOTCHA 2 — BE puma `is-active` lies right after restart:** `systemctl is-active` reported `inactive` for ~10s while the puma process was already up + `Listening on :3000` + Redis-connected. Verify via `systemctl show -p ActiveState,SubState` (active/running) + an api-v2 curl, NOT `is-active`.
- Discord notified (204); bastion shells cleaned. Release branches left (skill only deletes after deploy on merge-owned flow — fine to leave).

Links: https://github.com/Dallal-kwt/Dallal-ReactJs/pull/1835 · https://github.com/Dallal-kwt/Dallal-BE-ROR/pull/1553

## 21:47 · deploy · DAL-1216212226692821

**dev→uat cherry-pick + deploy — map location-filter recenter fix (FE-only).**

- Cherry-picked FE PR #1836 (merge commit `0f04ddc62`) onto `release/uat-cherry-pick-2026-07-01` off `origin/uat` — clean, no conflicts. Verified predecessors present on uat (nav-state `getNavStateFilters` + full-map v2 helpers `handleGuidedAreaSelect`/`DEFAULT_CENTER`/`pendingFocusRef`; commit `1a1de1086` already on uat). Clean `build:uat` (cache wiped) passed.
- No BE counterpart (FE-only ticket). Opened release PR #1837, merged into `uat` as a true merge commit (merge commit `6e667ceb`).
- Ran Deploy-ALL-IN-ONE `env=uat branch=uat` → run 28531675247 **success**. Deleted release branch (remote+local); FE repo back on master.

Links: https://github.com/Dallal-kwt/Dallal-ReactJs/pull/1837

## 21:55 · note · ready-for-qa (7 tickets)

Moved 7 tickets Dev Deployment → **Ready For QA (Deployed, to be tested)** and reassigned per user: tasks reassigned to **Akash Sharma** (1212734286910721) EXCEPT the AR-placeholder ticket which went to its creator **Shrouk**.
- Akash: DAL-1216212226692821 (map no-results viewport), DAL-1216207654114536 (stop auto-create child unit), DAL-1216205468004153 (PACI plot skeleton), DAL-1216200056595897 (admin draggable map), DAL-1216202641341002 (PACI area empty), DAL-1216198646956041 (clear description).
- Shrouk: DAL-1216190137218576 (AR lister-search placeholder).
- Note: default was "reassign to creator" but user overrode → Akash for all Raj-created ones.

## 23:12 · pr-opened · DAL-1216215304240108 (BE parent coords)

**[Backend] Expose parent building coordinates on child property listings** — opened BE PR #1554 `[DAL-1216215304240108] Expose parent building coordinates on child property listings` (base dev, reviewer adeen-s). P2 Enhancement, ticket created this session (pairs with FE DAL-1216202052574189).

- **Why:** child units have no coords of their own → the web full map can't centre on / select a child when opened from its card. FE needs the PARENT's coords to focus the parent marker (float to top + highlight).
- **Change (additive, 2 files):** `filter_property_serializer` + `property_serializer` gain nullable `parent_latitude` / `parent_longitude` from the existing `belongs_to :parent` (`object.parent&.latitude/longitude`). Null for root/standalone. No existing field/param/status changed → Mobile/Admin safe.
- **Verified via `rails runner`** on dev DB: child 902675 (parent 903273) → `parent_latitude=29.390373 parent_longitude=47.998389`; standalone → null. Noted a bounded per-page N+1 (children only; mirrors existing `parent_property` access) as a possible preload follow-up.
- Committed as Raj-kar; `db/schema.rb` N/A (no migration); merged origin/dev (up to date); ticket → Dev Deployment. **BE worktree KEPT ALIVE** (`Dallal-BE-ROR-DAL-parent-coords`, server :3289) because the FE worktree (`Dallal-ReactJs-DAL-1216202052574189`, :4289) is pointed at it for manual testing and the **FE PR is still pending** (user will raise it later). BE ticket lives in project management project; FE ticket lives in the QA-stage project 1214388950902741.

Links: https://github.com/Dallal-kwt/Dallal-BE-ROR/pull/1554 · https://app.asana.com/1/1211966365940925/project/1212734281782902/task/1216215304240108

## 23:20 · deploy · DAL-1216215304240108 (BE parent coords → uat)

**dev→uat cherry-pick + deploy — BE parent coords on child listings (BE-only).**

- Cherry-picked BE PR #1554 (merge commit `2b61d79f`) onto `release/uat-cherry-pick-2026-07-01` off `origin/uat` — clean auto-merge, no conflicts, no schema.rb (no migration). No FE pair yet (FE PR still pending).
- Opened release PR #1555, merged into `uat` as a true merge commit (`c3d8ffb6`). Ran BE All-In-One deploy `env=uat branch=uat` → run 28536976018 **success**. Deleted release branch; BE repo back on dev.
- UAT now returns `parent_latitude`/`parent_longitude` on child listings — so the pending FE child→parent map-focus work can be tested against uat-api once the FE PR ships.

Links: https://github.com/Dallal-kwt/Dallal-BE-ROR/pull/1555

## 23:50 · pr-opened · DAL-1216202052574189 (FE map focus)

**[Web] Focus the clicked property (or its parent) at the top of the map list** — opened FE PR #1838 `[DAL-1216202052574189] Focus the clicked property (or its parent) at the top of the map list` (base dev, reviewer adeen-s, sprint 11 label). Flat FE ticket, Sprint 11, project 1214388950902741 (QA-stage board).

- **What:** clicking a card's address / any spec cell (beds, baths, area, land, price, sub-category) opens `/properties` centred on that property, floated to top of the results list + highlighted — restoring property-focus that commit 1a1de1086 had replaced with a plain area filter. Extracted one `openMapFocused(filters)` helper (killed 7 duplicated navigate blocks per card) + `focusTarget` memo.
- **Child→parent:** a child unit (the map plots the parent, not units) now ALWAYS focuses the PARENT — by parent id + parent coords (falling back to child's own), because a child id never matches the parent card (root cause of "shows at top but not selected"). Needs the paired BE fields.
- **Also:** area-recenter (from #1836) skipped when a focusProperty is present so property-centering wins; address is a link whenever a focus target exists (child units were plain text before); fixed stale getLocalizedStreet/getNameByLanguage mocks that were failing both card test files on dev. V2 18/18, V3 7/7, tsc clean.
- **Paired BE:** PR #1554 (DAL-1216215304240108, parent coords) — already merged to dev + deployed to UAT; cross-linked both PR bodies. **Ticket NOT moved** to Dev Deployment (its QA-stage project has no such section — left for user). Both worktrees torn down (FE :4289, BE :3289), branches deleted, artifacts wiped.

Links: https://github.com/Dallal-kwt/Dallal-ReactJs/pull/1838 · https://app.asana.com/1/1211966365940925/project/1214388950902741/task/1216202052574189

## 00:00 · deploy · Promote to UAT (PR #1839) conflict resolved

**Resolved the "Promote to UAT" (dev→uat) PR #1839 conflict in `estaterFullMap/index.tsx` and merged.**

- Conflict = the recurring cherry-pick-twin pattern: uat had the #1836 recenter WITHOUT the guard (via cherry-pick #1837), dev had the newer version WITH the `hasFocusProperty` guard (from #1838 which had landed on dev). Resolved by **taking dev's newer version** (guard kept) — the correct promote direction.
- Completed as a **true merge commit** of origin/dev into uat (`e9af3edb1`, parents 6e667ceb uat + 391d057f dev) per the promote rule; clean `build:uat` passed before push; pushed HEAD→uat. PR #1839 auto-marked MERGED.
- Side effect (good): this promote carried the FE focus work #1838 onto uat too — so the full child→parent map-focus FE+BE is now on `uat` (pending UAT deploy). Committed as Raj-kar; main repo back on master.

Links: https://github.com/Dallal-kwt/Dallal-ReactJs/pull/1839