Minor improvements to search + Cloud Sync with GitHub#317
Open
zurillion wants to merge 55 commits intoRoundtableHold:mainfrom
Open
Minor improvements to search + Cloud Sync with GitHub#317zurillion wants to merge 55 commits intoRoundtableHold:mainfrom
zurillion wants to merge 55 commits intoRoundtableHold:mainfrom
Conversation
Adds a workflow that runs on every PR and push to main. It installs dependencies, re-runs generate.py, and fails with a clear message if the committed HTML in docs/ differs from what the generator would produce — preventing drift between the YAML source files and the checked-in HTML. https://claude.ai/code/session_01N58bvEvfg7jhcnDJaCpnD5
Instead of failing the PR when HTML is out of sync with YAML, the workflow now runs generate.py and pushes the result back to the PR branch automatically. This makes the workflow safe for agent-authored PRs (Codex, Claude) that may only edit YAML without regenerating the HTML. https://claude.ai/code/session_01N58bvEvfg7jhcnDJaCpnD5
The file was misnamed .gitatttributes (3 t's) so git was never reading it. Renamed to .gitattributes and added linguist-generated attribute for docs/checklists/*.html so GitHub collapses those diffs by default in pull requests. https://claude.ai/code/session_01N58bvEvfg7jhcnDJaCpnD5
…bfkyl2-R7tG0 Claude/review changes mlsgga5of9bfkyl2 r7t g0
Tag the 13 Shadow of the Erdtree cookbook categories with dlc: true at section level (Forager Brood, Igon's, Finger-Weaver's, Greater Potentate's, Ancient Dragon Knight's, Mad Craftsman's, St. Trina Disciple's, Fire Knight's, Loyal Knight's, Battlefield Priest's, Grave Keeper's, Antiquity Scholar's, Tibia's). Add 'cookbooks' to the DLC-aware page set in generate.py so the Show/Base Game/DLC selector is rendered and data-dlc attributes are emitted for every item on the page. Result: 45 DLC items, 59 base game items, all sections are homogeneous so the filter never produces an empty category. https://claude.ai/code/session_01N58bvEvfg7jhcnDJaCpnD5
…bfkyl2-R7tG0 Add DLC filter to Cookbooks page
- New docs/js/sync.js: CloudProvider interface, SyncManager (debounced 5s + periodic 2min + beforeunload), GoogleDriveProvider (appDataFolder, token-based GIS auth), field-level merge with per-item timestamps, local version history (last 10 snapshots), navbar sync indicator injected dynamically on every page. - docs/js/common.js: initialise checklistTimestamps dict in every profile so field-level merge has timestamps from day one. - docs/options.html: new "Cloud Sync & Backup" section with inactive / active states, provider picker modal (Google Drive active; iCloud and GitHub Gist greyed-out "coming soon"), deactivate confirm modal, version history panel, sync.js script tag. - docs/css/main.css: sync-spin keyframe animation + sync-nav-indicator styles for the navbar cloud icon. - generate.py: sync.js added to make_footer() so all regenerated checklist pages load the sync module automatically. To enable Google Drive sync, replace GOOGLE_CLIENT_ID in sync.js with a real OAuth 2.0 Client ID from Google Cloud Console (see setup instructions at the top of that file). https://claude.ai/code/session_01N58bvEvfg7jhcnDJaCpnD5
…bfkyl2-R7tG0 Claude/review changes mlsgga5of9bfkyl2 r7t g0
Move Cloud Sync & Backup HTML (section + syncProviderModal + syncDeactivateModal) from the static options.html into make_options() in generate.py so CI regeneration never wipes it again. https://claude.ai/code/session_01N58bvEvfg7jhcnDJaCpnD5
…bfkyl2-R7tG0 Fix Cloud Sync section lost on CI regeneration
Implements GitHubGistProvider using a Personal Access Token (gist scope) as an alternative to Google Drive, avoiding OAuth consent screen issues. User pastes their PAT once; data is stored in a private Gist they own. https://claude.ai/code/session_01N58bvEvfg7jhcnDJaCpnD5
iCloud via CloudKit JS requires a paid Apple Developer account and has the same OAuth complexity as Google Drive. Not worth implementing. https://claude.ai/code/session_01N58bvEvfg7jhcnDJaCpnD5
…bfkyl2-R7tG0 Add GitHub Gist as a sync provider; remove iCloud placeholder
The generator was still rendering GitHub Gist as "Coming soon" (disabled) and including iCloud, while sync.js had a full PAT-based implementation. - Remove iCloud provider button - Enable GitHub Gist button (id=btnConnectGitHub, active, not disabled) - Add syncGithubPATModal with PAT input and connect flow - Regenerate docs/options.html from updated generator https://claude.ai/code/session_01N58bvEvfg7jhcnDJaCpnD5
…9bfkyl2-R7tG0 Fix generate.py to produce active GitHub Gist sync button
doPullAndMerge sets currentState='syncing' before calling the provider,
then calls doSync() when no remote data exists yet (first-time connect).
doSync() immediately returns because of its guard:
if (!activeProvider || currentState === 'syncing') return;
leaving the UI permanently stuck in the Syncing… state.
Fix: reset currentState to 'pending' before the doSync() call so the
guard is satisfied and the initial push actually runs.
https://claude.ai/code/session_01N58bvEvfg7jhcnDJaCpnD5
The history panel said "Drive also keeps its own revision history" regardless of which provider was active. GitHub Gist has its own Revisions tab too, so the text should reflect that. - Remove hardcoded Drive text from the static HTML - Populate #syncVersionDesc dynamically in renderVersionHistory() based on syncConfig.provider (Drive vs GitHub Gist wording) - Regenerate docs/options.html https://claude.ai/code/session_01N58bvEvfg7jhcnDJaCpnD5
HTML should only be generated by the CI pipeline, not committed manually. Restoring docs/options.html to the last CI-generated state (966ee9d). The correct generate.py will produce the right output on next CI run. https://claude.ai/code/session_01N58bvEvfg7jhcnDJaCpnD5
Fixed bug on GitHub first sync remaining stuck forever
Wraps the theme, profile, and import/export rows in a Bootstrap collapse panel (#optionsBody) with a chevron toggle button next to the Options heading. Since sync now handles persistence, the detailed config is tucked away until needed. https://claude.ai/code/session_01N58bvEvfg7jhcnDJaCpnD5
…estamps Three bugs fixed: 1. mergeProfiles: items written before per-item timestamp tracking (rt=0, lt=0) were silently dropped. Now falls back to the overall _syncMeta lastSyncAt to decide which side wins — so a fresh device connecting to an existing sync correctly inherits the remote checked state. 2. doPullAndMerge: always pushed even when local and remote were identical, creating spurious Gist revisions. Now skips the push when dataChanged is false and there are no pendingChanges. 3. startPeriodicSync: was push-only (doSync) and only fired when pendingChanges was true, so devices never pulled each other's updates. Changed to doPullAndMerge every cycle so each device periodically discovers and applies changes made on other devices. Also changed the "Sync Now" button from doSync (push-only) to doPullAndMerge so it performs a true two-way sync. https://claude.ai/code/session_01N58bvEvfg7jhcnDJaCpnD5
…9bfkyl2-R7tG0 Make Options sections collapsible + fixed bugs in sync
Remove the section-level collapse added previously. The Options headings (theme, profile, import/export buttons) stay always visible. Only the raw-JSON textarea is now collapsible, with a small "Detailed configuration" chevron toggle above it (collapsed by default). https://claude.ai/code/session_01N58bvEvfg7jhcnDJaCpnD5
…9bfkyl2-R7tG0 Scope Options collapse to textarea only, not the whole section
sync.js: the non-mergeable fields block (style, journey, etc.) was comparing lp.syncMeta / rp.syncMeta which never exist per-profile, so the condition was always 0 > 0 and theme was never synced. Switched to the already-computed remoteIsNewer flag. Also added dlc_filter to the non-mergeable fields list. common.js: add dlc_filter: 'both' as a default profile field so it is included in sync payloads from the first push. checklists.js: read the saved dlc_filter from the current profile on page load and restore the selector + apply the filter; save the new value back to the profile on every change so it survives navigation and syncs to other devices. https://claude.ai/code/session_01N58bvEvfg7jhcnDJaCpnD5
…9bfkyl2-R7tG0 Fix theme sync and persist DLC filter to profile
Keep the code in place for future use, but hide the button with d-none so only GitHub Gist is shown to users. https://claude.ai/code/session_01N58bvEvfg7jhcnDJaCpnD5
Previous commit incorrectly edited the generated HTML directly. This applies the d-none class in the source template instead. https://claude.ai/code/session_01N58bvEvfg7jhcnDJaCpnD5
…9bfkyl2-R7tG0 Removed Google Sync as an option in the popup
Two bugs fixed in didSearch callback: 1. hasResults now uses .searchable:not(.d-none) so DLC-filtered items are excluded from the match count, preventing their sections from appearing empty when a search term matches a DLC item's text. 2. When search is cleared, re-trigger the DLC filter change so DLC sections that were un-hidden by the clear are correctly re-hidden according to the active filter mode. https://claude.ai/code/session_01N58bvEvfg7jhcnDJaCpnD5
…9bfkyl2-R7tG0 Fixed an issue in which categories for matching DLC items showed in search even if hidden
generate.py: extend DLC filter set to include talismans, sorceries, spirit_ashes, bosses, crystal_tears, bell_bearings, and ancient_dragon_smithing_stones (3 occurrences updated). Data files: - talismans, sorceries, spirit_ashes, crystal_tears: dlc:true at section level on their 'Realm of Shadow' section - bell_bearings: dlc:true on both 'Real of Shadow' sections - ancient_dragon_smithing_stones: dlc:true on each individual item after the 'Realm of Shadow' subheading (items 51-58 and 71-76), since DLC items are mixed within sections rather than isolated in their own section bosses: filter enabled in generate.py; no DLC section exists in bosses.yaml yet so no items are tagged. https://claude.ai/code/session_01N58bvEvfg7jhcnDJaCpnD5
…9bfkyl2-R7tG0 Add DLC filter to 7 more tabs and tag their DLC items
The ancient dragon smithing stones tab uses h5+ul pairs as subsections. applyDlcFilter already hides empty top-level section cards; extend it to also hide each h5 and its adjacent ul when no visible items remain.
…9bfkyl2-R7tG0 Hide empty subsection headings (h5) under DLC filter
The didSearch callback now iterates over h5+ul subsection pairs and hides any whose ul has no search-matching visible items. On clear it unhides them all before re-triggering the DLC filter, which then re-applies its own subsection-hiding logic.
…9bfkyl2-R7tG0 Hide empty subsections during search (mirrors DLC filter behaviour)
…-in-generate.py Fix subsection filtering when checklist search has no matches
Merge pull request RoundtableHold#311 from zurillion/main
…-in-generate.py-srf7s6 Translate armor data_it link labels to Italian while preserving href URLs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Main changes here are:
Code is also present to sync with Google Drive but it's deactivated at the moment because of issues yet to troubleshoot and because the google cloud account of the coder is required.