Skip to content

Display place websites and reservation links#117

Merged
michaelmwu merged 8 commits into
mainfrom
michaelmwu/find-table-website-links
Jun 11, 2026
Merged

Display place websites and reservation links#117
michaelmwu merged 8 commits into
mainfrom
michaelmwu/find-table-website-links

Conversation

@michaelmwu

@michaelmwu michaelmwu commented Jun 11, 2026

Copy link
Copy Markdown
Member

Summary

  • pull in latest origin/main, including cached trust signals
  • vendor the scraper changes from Scrape place reservation provider links gmaps-scraper#45 for website/reservation extraction
  • carry website and reservation_links through enrichment, normalized place JSON, provenance, search text, and TypeScript types
  • display website and reservation action buttons on place cards

Enrichment note

Existing enrichment cache entries need a place-page refresh before they will contain newly scraped reservation_links. This checkout only has the tracked site.example fallback, so I did not mutate a private site pack cache. Run with the real site pack, for example:

FAVORITE_PLACES_SITE_DIR=/path/to/site bun run refresh:enrichment

If you want to avoid raw list refreshes during that pass, run the underlying command with --skip-enrichment-source-refresh.

Validation

  • uv run python3 -m unittest vendor.gmaps-scraper.tests.test_place_scraper.PlaceScraperTests.test_collect_reservation_dialog_snapshot_clicks_and_reads_provider_links vendor.gmaps-scraper.tests.test_place_scraper.PlaceScraperTests.test_merge_reservation_links_dedupes_overview_and_dialog_links vendor.gmaps-scraper.tests.test_place_scraper.PlaceScraperTests.test_build_place_details_preserves_reservation_links vendor.gmaps-scraper.tests.test_place_scraper.PlaceScraperTests.test_normalize_reservation_links_cleans_google_dialog_labels
  • uv run python3 -m unittest discover -s tests/python -p 'test_*.py'
  • bun run check
  • bun run build
  • bun run build:data
  • vendor/gmaps-scraper/scripts/lint.sh
  • vendor/gmaps-scraper/scripts/typecheck.sh
  • live scrape: Mark's Tokyo -> website http://markstokyo.com/, reservation TableCheck
  • live scrape: Sushi Tokyo Ten -> website http://sushitokyo-ten.com/, reservations Ikyu, AutoReserve, TableCheck

Summary by CodeRabbit

Release Notes

  • New Features

    • Places now display website links and reservation links with provider information.
    • Added dedicated action buttons to access place websites and booking platforms.
  • Style

    • Refactored action link styling to support website and reservation button states.
  • Tests

    • Updated test coverage and assertions for new place card functionality.

Copilot AI review requested due to automatic review settings June 11, 2026 02:31
@coderabbitai

coderabbitai Bot commented Jun 11, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@michaelmwu, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 32 minutes and 34 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more credits in the billing tab to continue.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 898970db-464d-4f53-a20b-1cd3d3b113ad

📥 Commits

Reviewing files that changed from the base of the PR and between 7b6cb29 and f26055f.

📒 Files selected for processing (9)
  • scripts/build_data.py
  • site.example/data/cache/places.sqlite
  • src/components/GuideMap.astro
  • src/components/PlaceCard.astro
  • src/styles/global.css
  • tests/frontend/guideMapInteractions.test.mjs
  • tests/python/test_build_data.py
  • vendor/gmaps-scraper/src/gmaps_scraper/place_scraper.py
  • vendor/gmaps-scraper/tests/test_place_scraper.py
📝 Walkthrough

Walkthrough

This PR adds first-class support for place websites and reservation links across the full data pipeline: from Google Maps scraping and API integration, through data normalization and enrichment, to frontend UI rendering. New data models, scraper logic, backend normalization, and component updates work together to expose website URLs and reservation provider links to users.

Changes

Website and Reservation Links Support

Layer / File(s) Summary
Data model contracts
scripts/pipeline_models.py, src/lib/types.ts, vendor/gmaps-scraper/src/gmaps_scraper/models.py
PlaceReservationLink model introduced with label and url fields. EnrichmentPlace, PlaceProvenance, and NormalizedPlace extended with website and reservation_links fields across Python and TypeScript layers.
Scraper reservation link extraction
vendor/gmaps-scraper/src/gmaps_scraper/place_scraper.py, vendor/gmaps-scraper/tests/test_place_scraper.py
Browser automation clicks reservation dialogs, collects provider links, merges and deduplicates across overview and dialog sources, normalizes into typed PlaceReservationLink objects with human-readable provider labels. Tests validate dialog interaction, link collection, merging, and filtering of unsafe URLs.
Backend pipeline normalization and integration
scripts/build_data.py, tests/python/test_build_data.py
Google Places field mask extended to request websiteUri. New helpers as_http_url and coerce_place_reservation_links validate/normalize URLs and coerce link inputs. Enrichment pipeline canonicalizes website to HTTP, merges page data into API data when API lacks these fields, tracks provenance, updates identity mismatch suppression, and populates normalized place output. Tests verify website/reservation propagation through pipeline and filtering of unsafe links.
Frontend UI rendering and styling
src/components/PlaceCard.astro, src/styles/global.css, tests/frontend/guideMapInteractions.test.mjs, tests/e2e/guide-filters.spec.ts
PlaceCard computes safe HTTP URLs and selects first valid reservation link, includes website and reservation labels in search data. Renders conditional website and reservation action links. CSS refactored from .place-card-map-link to generic .place-card-action-link with --maps and --reservation modifiers; .place-card-marker element removed. Tests updated for new markup and styling structure.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • 508-dev/favorite-places#28: Extends existing per-field provenance framework (PlaceProvenance in scripts/build_data.py and scripts/pipeline_models.py) with new website and reservation_links provenance fields
  • 508-dev/favorite-places#116: Modifies src/components/PlaceCard.astro to refactor map-related UI element rendering and styling
  • 508-dev/favorite-places#73: Updates Google Maps place enrichment pipeline in scripts/build_data.py (e.g., canonicalize_enrichment_place and normalize_place_page_enrichment functions)

Poem

🐰 A rabbit bounces through the browser DOM,
Clicking reservation buttons with glee—
Labels and links hop into the pipeline,
Safe HTTPS URLs spring through the schema,
Now users find websites and dining with ease! ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 5.45% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title "Display place websites and reservation links" directly and clearly summarizes the main change across the pull request, which adds support for extracting, storing, and displaying place websites and reservation links throughout the data pipeline and UI.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch michaelmwu/find-table-website-links

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the place data pipeline end-to-end to extract, normalize, persist, and display place websites and reservation-provider links (including updates to the vendored Google Maps scraper and the UI place cards).

Changes:

  • Vendored scraper: extract website + reservation_links from the place panel and reservation dialogs, and normalize/dedupe them.
  • Data pipeline + models: carry website and reservation_links through enrichment, normalized JSON, provenance, and API merge logic.
  • UI: add “Website” and “Find a table” action buttons on place cards; update CSS and TypeScript types accordingly.

Reviewed changes

Copilot reviewed 6 out of 9 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
vendor/gmaps-scraper/tests/test_place_scraper.py Adds unit tests covering reservation dialog scraping, dedupe/merge, and normalization behavior.
vendor/gmaps-scraper/src/gmaps_scraper/place_scraper.py Implements reservation link extraction (panel + dialog), merging, and normalization into PlaceDetails.
vendor/gmaps-scraper/src/gmaps_scraper/models.py Introduces PlaceReservationLink model and adds it to PlaceDetails serialization.
tests/python/test_build_data.py Adds tests ensuring website/reservation links flow through guide normalization and enrichment normalization.
scripts/pipeline_models.py Adds pipeline model types for PlaceReservationLink and wires them into enrichment/provenance/normalized models.
scripts/build_data.py Carries website/reservation links through normalization, canonicalization, provenance, and API merge/backfill.
src/lib/types.ts Updates frontend types for Place.website, Place.reservation_links, and provenance fields.
src/components/PlaceCard.astro Adds website + reservation action links with URL sanitization and search text inclusion.
src/styles/global.css Refactors place-card action link styling to support new buttons and hover/focus states.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/components/PlaceCard.astro
Comment thread src/components/PlaceCard.astro Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 3a5e924ada

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +4796 to +4798
normalized_url = _normalize_preview_website(url) if "google.com" in parsed.netloc else url
if normalized_url is None:
normalized_url = url if parsed.netloc.endswith("google.com") else None

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Handle regional Google reservation URLs

When Maps emits booking URLs on a regional Google host such as www.google.co.jp/maps/reserve/... or a regional /url?q=... redirect, this branch treats the URL as a normal provider link because it only recognizes the literal google.com substring. _reservation_link_is_google_reserve below also only filters google.com, so if the dialog contains both a Google Reserve intermediary and a real provider URL, the generated card can keep and prefer the Google wrapper instead of the direct reservation provider. Please normalize/filter all Google Maps domains consistently before dedupe.

Useful? React with 👍 / 👎.

Copilot AI review requested due to automatic review settings June 11, 2026 07:50

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 8 out of 12 changed files in this pull request and generated no new comments.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7b6cb297b6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread scripts/build_data.py Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
scripts/build_data.py (2)

6866-6875: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Preserve previously scraped reservation links across partial refreshes.

preserve_existing_enrichment() already keeps page-only fields like reviews and about sections when the refreshed result is weaker. reservation_links follow the same failure mode, so a transient dialog/open failure on a later refresh will currently delete working booking links from the cache.

Proposed fix
     if can_preserve_previous_identity:
+        if not refreshed_place.reservation_links and previous_place.reservation_links:
+            refreshed_place.reservation_links = [
+                link.model_copy()
+                for link in previous_place.reservation_links
+            ]
+            append_unique_reason(preserved_fields, "reservation_links")
         if not refreshed_place.review_topics and previous_place.review_topics:
             refreshed_place.review_topics = previous_place.review_topics[:]
             append_unique_reason(preserved_fields, "review_topics")
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/build_data.py` around lines 6866 - 6875, The code currently preserves
review_topics, reviews, and about_sections when a refreshed_place is weaker, but
misses reservation_links; add the same preservation logic for reservation_links
within the can_preserve_previous_identity block: if not
refreshed_place.reservation_links and previous_place.reservation_links then set
refreshed_place.reservation_links = previous_place.reservation_links[:] and call
append_unique_reason(preserved_fields, "reservation_links"); use the same
variables and helper (preserved_fields, append_unique_reason) so behavior
matches the existing fields.

8825-8831: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Try the raw Maps candidate before the synthesized locality-biased search URL.

In this branch, localized_maps_url can still carry the strongest identity signal from the saved list. Putting the synthesized search_url first means fetch_place_page_enrichment() can accept a same-named place before the original Maps URL is ever tried, which risks caching the wrong enrichment for addressless entries.

Proposed fix
     if should_replace_raw_search_candidates_with_locality_bias(
         place,
         localized_maps_url=localized_maps_url,
         search_url=search_url,
     ):
-        candidates = [search_url, localized_maps_url, cid_url]
+        candidates = [localized_maps_url, search_url, cid_url]
         return dedupe_urls([*priority_candidates, *[url for url in candidates if url is not None]])
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/build_data.py` around lines 8825 - 8831, The current branch builds
candidates as [search_url, localized_maps_url, cid_url] which tries the
synthesized search_url before the original localized_maps_url; change the
candidates ordering so the raw Maps URL (localized_maps_url) is tried before the
synthesized search_url to avoid accepting a same-named place from search before
the original Maps URL is fetched — i.e., inside the
should_replace_raw_search_candidates_with_locality_bias branch, build candidates
with localized_maps_url before search_url (keeping cid_url and
priority_candidates same) and return dedupe_urls([*priority_candidates, *[url
for url in candidates if url is not None]]) so fetch_place_page_enrichment will
attempt localized_maps_url first.
🧹 Nitpick comments (1)
src/components/PlaceCard.astro (1)

43-53: ⚡ Quick win

Consider consolidating duplicate URL validation logic.

The new safeHttpUrl helper (lines 43-53) and the existing isSafeExternalUrl type guard (lines 117-127) contain nearly identical validation logic for checking http/https protocols. While they serve slightly different purposes (one returns the URL string, the other is a type guard), the core validation is duplicated.

♻️ Refactor to share validation logic
+function isValidHttpUrl(value: string | null | undefined): boolean {
+  if (!value) {
+    return false;
+  }
+  try {
+    const parsed = new URL(value);
+    return parsed.protocol === "https:" || parsed.protocol === "http:";
+  } catch {
+    return false;
+  }
+}
+
 function safeHttpUrl(value: string | null | undefined): string | null {
-  if (!value) {
-    return null;
-  }
-  try {
-    const url = new URL(value);
-    return url.protocol === "https:" || url.protocol === "http:" ? url.toString() : null;
-  } catch {
-    return null;
-  }
+  return isValidHttpUrl(value) ? value : null;
 }

 const isSafeExternalUrl = (value: string | null | undefined): value is string => {
-  if (!value) {
-    return false;
-  }
-  try {
-    const parsed = new URL(value);
-    return parsed.protocol === "https:" || parsed.protocol === "http:";
-  } catch {
-    return false;
-  }
+  return isValidHttpUrl(value);
 };

Also applies to: 117-127

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/components/PlaceCard.astro` around lines 43 - 53, There is duplicated
HTTP/HTTPS URL validation between safeHttpUrl and the type guard
isSafeExternalUrl; extract the shared protocol-checking logic into a single
helper (e.g., validateHttpUrl or hasHttpProtocol) that attempts new URL(value)
and returns either a boolean or the normalized URL string, then reimplement
safeHttpUrl to call that helper to return the string/null and reimplement
isSafeExternalUrl to call the same helper (or a thin wrapper) to perform the
type check; update references to safeHttpUrl and isSafeExternalUrl accordingly
so all URL validation uses the shared function.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@scripts/build_data.py`:
- Around line 3328-3332: reservation_links are being wrapped with
google_places_field regardless of origin, causing page-sourced links to be
marked as API-derived after merge; update the block that assigns
provenance.reservation_links (which currently uses normalized.reservation_links
and google_places_field) to first detect the true origin of those links (e.g.,
check normalized.source or whatever flag set by merge_page_place_into_api_entry
that indicates page-sourced vs google_places_api) and: if the links are
page-sourced assign them directly (serialize with model_dump but do not call
google_places_field) so they remain page-sourced in provenance, otherwise keep
the existing google_places_field wrapping for API-derived links; ensure you
reference normalized.reservation_links and provenance.reservation_links in your
change.

In `@vendor/gmaps-scraper/src/gmaps_scraper/place_scraper.py`:
- Around line 1378-1393: The dialog-close detection in the dialogs loop
(variables dialogs, button, cleanLine and the button.click() call that returns
links) is too narrow and can miss reservation/modals; update the matcher to
perform case-insensitive partial/substring matches and include additional
keywords and variants (e.g., close, dismiss, cancel, reservation, reserve, 閉じ,
關閉, 关闭, 닫, ×, × close, modal-close, dismiss) across
aria-label/title/innerText/textContent instead of exact full-string equality,
and also attempt class/name-based heuristics (e.g., classes like close,
modal-close, dismiss) before returning links; after clicking the close
candidate, verify the dialog is gone (poll/check visibility or
isConnected/offsetParent) and retry a few times with short delays before
proceeding so downstream review/about extraction is not blocked.

---

Outside diff comments:
In `@scripts/build_data.py`:
- Around line 6866-6875: The code currently preserves review_topics, reviews,
and about_sections when a refreshed_place is weaker, but misses
reservation_links; add the same preservation logic for reservation_links within
the can_preserve_previous_identity block: if not
refreshed_place.reservation_links and previous_place.reservation_links then set
refreshed_place.reservation_links = previous_place.reservation_links[:] and call
append_unique_reason(preserved_fields, "reservation_links"); use the same
variables and helper (preserved_fields, append_unique_reason) so behavior
matches the existing fields.
- Around line 8825-8831: The current branch builds candidates as [search_url,
localized_maps_url, cid_url] which tries the synthesized search_url before the
original localized_maps_url; change the candidates ordering so the raw Maps URL
(localized_maps_url) is tried before the synthesized search_url to avoid
accepting a same-named place from search before the original Maps URL is fetched
— i.e., inside the should_replace_raw_search_candidates_with_locality_bias
branch, build candidates with localized_maps_url before search_url (keeping
cid_url and priority_candidates same) and return
dedupe_urls([*priority_candidates, *[url for url in candidates if url is not
None]]) so fetch_place_page_enrichment will attempt localized_maps_url first.

---

Nitpick comments:
In `@src/components/PlaceCard.astro`:
- Around line 43-53: There is duplicated HTTP/HTTPS URL validation between
safeHttpUrl and the type guard isSafeExternalUrl; extract the shared
protocol-checking logic into a single helper (e.g., validateHttpUrl or
hasHttpProtocol) that attempts new URL(value) and returns either a boolean or
the normalized URL string, then reimplement safeHttpUrl to call that helper to
return the string/null and reimplement isSafeExternalUrl to call the same helper
(or a thin wrapper) to perform the type check; update references to safeHttpUrl
and isSafeExternalUrl accordingly so all URL validation uses the shared
function.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 99b1cc16-5daf-47bc-a1bc-4453c450b564

📥 Commits

Reviewing files that changed from the base of the PR and between b5b44fd and 7b6cb29.

📒 Files selected for processing (12)
  • scripts/build_data.py
  • scripts/pipeline_models.py
  • site.example/data/cache/places.sqlite
  • src/components/PlaceCard.astro
  • src/lib/types.ts
  • src/styles/global.css
  • tests/e2e/guide-filters.spec.ts
  • tests/frontend/guideMapInteractions.test.mjs
  • tests/python/test_build_data.py
  • vendor/gmaps-scraper/src/gmaps_scraper/models.py
  • vendor/gmaps-scraper/src/gmaps_scraper/place_scraper.py
  • vendor/gmaps-scraper/tests/test_place_scraper.py

Comment thread scripts/build_data.py Outdated
Comment thread vendor/gmaps-scraper/src/gmaps_scraper/place_scraper.py Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: cdf02b907e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread vendor/gmaps-scraper/src/gmaps_scraper/place_scraper.py Outdated
Copilot AI review requested due to automatic review settings June 11, 2026 10:15

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 13 changed files in this pull request and generated no new comments.

Comments suppressed due to low confidence (1)

src/components/GuideMap.astro:1746

  • Clicking the new reservation <summary> control inside a place card will currently also trigger the card-level click handler (because the guard only excludes a, button, …, [role='button']). This can cause unexpected map selection/scroll when users open the reservation menu. Include summary (or add role="button" on the summary) in the exclusion selector.
      card.addEventListener("click", (event) => {
        const target = event.target instanceof Element ? event.target : null;
        if (target?.closest("a, button, input, select, textarea, [role='button']")) return;
        selectPlace(placeId, { expandCollapsed: true });

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 42c4c12bce

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/components/PlaceCard.astro

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 93a0112895

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread vendor/gmaps-scraper/src/gmaps_scraper/place_scraper.py
Copilot AI review requested due to automatic review settings June 11, 2026 14:00

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7306446c05

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread scripts/build_data.py

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 13 changed files in this pull request and generated 2 comments.

Comment thread scripts/build_data.py
Comment thread src/components/PlaceCard.astro
@michaelmwu michaelmwu merged commit 3b7d229 into main Jun 11, 2026
6 checks passed
@michaelmwu michaelmwu deleted the michaelmwu/find-table-website-links branch June 11, 2026 15:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants