Skip to content

Comments

Minor improvements to search + Cloud Sync with GitHub#317

Open
zurillion wants to merge 55 commits intoRoundtableHold:mainfrom
zurillion:main
Open

Minor improvements to search + Cloud Sync with GitHub#317
zurillion wants to merge 55 commits intoRoundtableHold:mainfrom
zurillion:main

Conversation

@zurillion
Copy link
Contributor

Main changes here are:

  • more pages support DLC filtering
  • an improvement of the search logic: if when searching there are 0 items matching the whole section or subsection won't be shown (before it worked only in some cases)
  • introduced cloud sync for configurations. The selected method is via GitHub. The user will be guided to create a private Gist that will be used to sync the configuration.
    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.
  • a GitHub action was created to launch the .py file with every PR.

claude and others added 30 commits February 18, 2026 21:48
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
zurillion and others added 25 commits February 19, 2026 13:15
…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
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