make it possible to multi select history of slides #9
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Implementation Spec for Issue #9
Objective
Add multi-selection and batch deletion to the Slide Version History panel in the hero_slides_ui web dashboard. Users must be able to select one or more version cards (via checkbox), then delete the selected versions — removing their
.pngimage and.mdcontent files fromoutput/.versions/<slide_name>/on disk. The current version must be protected from deletion.Requirements
slide.deleteVersionsRPC methodslide.deleteVersionsRPC method acceptsdeck_path,slide_name, andversions: string[]and removes the specified version files from diskslide_delete_versions(deck_path, slide_name, &[version])removes only the.pngand.mdfiles for each given version tag; does NOT renumber surviving versionsslide.deleteVersionsFiles to Modify/Create
crates/hero_slides_lib/src/deck.rsslide_delete_versions()public functioncrates/hero_slides_lib/src/lib.rsslide_delete_versionscrates/hero_slides_server/src/rpc.rs"slide.deleteVersions"match arm + handlercrates/hero_slides_server/openrpc.jsonslide.deleteVersionsmethod entrycrates/hero_slides_server/openrpc.client.generated.rsslide_delete_versionscrates/hero_slides_ui/static/js/dashboard.jsdeleteSelectedVersions(), updaterenderVersions()crates/hero_slides_ui/templates/index.htmlcrates/hero_slides_ui/static/css/dashboard.css.version-card.selected,.version-card-cb,.version-panel-toolbarstylesImplementation Plan
Step 1: Add
slide_delete_versionsto hero_slides_libFiles:
crates/hero_slides_lib/src/deck.rs,crates/hero_slides_lib/src/lib.rsAdd a new public function
slide_delete_versions(deck_path: &Path, slide_name: &str, versions: &[&str]) -> Result<(), HeroSlidesError>that, for each version tag, removesoutput/.versions/<slide_name>/<tag>.pngandoutput/.versions/<slide_name>/<tag>.mdif they exist. Silently skips missing files. Re-export inlib.rs.Dependencies: none
Step 2: Add
slide.deleteVersionsRPC handlerFiles:
crates/hero_slides_server/src/rpc.rsAdd
"slide.deleteVersions" => handle_slide_delete_versions(&req.params).await,to the match block alongside otherslide.*methods. Add thehandle_slide_delete_versionsasync function that parsesdeck_path,slide_name,versionsfrom params, callshero_slides_lib::slide_delete_versionsin aspawn_blockingblock, and returns{"deleted": N}.Dependencies: Step 1
Step 3: Update OpenRPC spec and generated client stub
Files:
crates/hero_slides_server/openrpc.json,crates/hero_slides_server/openrpc.client.generated.rsAdd
slide.deleteVersionsmethod toopenrpc.jsonwith paramsdeck_path(string),slide_name(string),versions(array of strings) and result{"deleted": integer}. Add correspondingSlideDeleteVersionsInput,SlideDeleteVersionsOutputstructs andslide_delete_versionsmethod to the generated client file.Dependencies: Step 2
Step 4: Add CSS for selected version cards
Files:
crates/hero_slides_ui/static/css/dashboard.cssAdd
.version-card.selected(blue border + tinted background),.version-card-cb(checkbox sizing), and.version-panel-toolbar(flex bar) styles after the existing.version-card.currentrule.Dependencies: none
Step 5: Update HTML version panel markup
Files:
crates/hero_slides_ui/templates/index.htmlAdd a
version-panel-toolbardiv inside the version panel (between the slide strip and the version list), containing a "Select All" checkbox and a "Delete (N)" button (initially hidden).Dependencies: Step 4
Step 6: Add JavaScript multi-select and deletion logic
Files:
crates/hero_slides_ui/static/js/dashboard.jsversionSelectedVersions = new Set()state variablerenderVersions(data)to: show toolbar, adddata-versionattribute and checkbox to each card, wire.version-cardclick totoggleVersionSelection, apply.selectedclasstoggleVersionSelection(tag, event)— toggles tag in the Set, updates card class and checkboxtoggleSelectAllVersions(checked)— selects/deselects all non-current cards usingdata-versionupdateVersionSelectionUI()— syncs delete button visibility, count span, and select-all indeterminate statedeleteSelectedVersions()— shows confirm modal, callsrpc('slide.deleteVersions', {...}), then callsloadVersionHistory(versionSlideName)on successDependencies: Steps 4, 5
Acceptance Criteria
slide.deleteVersionsRPC and the files are removed from diskslide_delete_versionsin hero_slides_lib silently skips nonexistent version tagsopenrpc.jsonandopenrpc.client.generated.rscontain theslide.deleteVersionsentryNotes
openrpc.client.generated.rsfile appears to be manually maintained (not auto-generated by build.rs) — edit it directlyvNNNhas up to two files:<tag>.pngand<tag>.md— both must be removedoutput/.versions/<slide_name>/vNNN.{png,md}Test Results
Breakdown by crate
hero_slides_lib (unit tests): 42 passed, 0 failed, 0 ignored
hero_slides_lib (integration tests): 12 passed, 0 failed, 1 ignored
test_generate_single_slide_ai(requires live AI service)hero_slides_lib (doc-tests): 2 passed, 0 failed, 0 ignored
hero_slides_rhai (doc-tests): 1 passed, 0 failed, 0 ignored
hero_slides, hero_slides_sdk, hero_slides_server, hero_slides_ui: 0 tests each (binaries/UI crates)
Compilation
All crates compiled cleanly. One minor warning in examples:
crates/hero_slides_examples/examples/basic_usage.rs:18-- unused variablespec(suggestion: prefix with_spec)Status: PASS
All 56 runnable tests passed in ~38 seconds.
Implementation Summary
The multi-select and batch deletion feature for the Slide Version History panel has been implemented.
Changes Made
crates/hero_slides_lib/src/deck.rsslide_delete_versions(deck_path, slide_name, versions)— removes.pngand.mdfiles for each specified version tag fromoutput/.versions/<slide_name>/. Silently skips missing files. Does not renumber surviving versions.crates/hero_slides_lib/src/lib.rsslide_delete_versionsalongside other slide operations.crates/hero_slides_server/src/rpc.rs"slide.deleteVersions"match arm andhandle_slide_delete_versionsasync handler. Acceptsdeck_path,slide_name, andversionsarray. Returns{"deleted": N}.crates/hero_slides_server/openrpc.jsonslide.deleteVersionsmethod entry with full parameter and result schema.crates/hero_slides_server/openrpc.client.generated.rsSlideDeleteVersionsInput,SlideDeleteVersionsOutputstructs andslide_delete_versionsclient method.crates/hero_slides_ui/static/css/dashboard.css.version-card.selected(blue highlight),.version-card-cb(checkbox sizing),.version-panel-toolbar(flex toolbar strip), and.version-panel-toolbar .version-select-all-labelstyles.crates/hero_slides_ui/templates/index.htmlversion-panel-toolbardiv inside the version panel containing a "Select All" checkbox and "Delete (N)" button (hidden by default).crates/hero_slides_ui/static/js/dashboard.jsversionSelectedVersionsSet state variable.renderVersions()to adddata-versionattributes, checkboxes per card, and toolbar show/hide logic.toggleVersionSelection(tag, event)— toggles individual card selection.toggleSelectAllVersions(checked)— bulk select/deselect all non-current versions.updateVersionSelectionUI()— syncs delete button visibility, count, and select-all indeterminate state.deleteSelectedVersions()— shows confirm modal, callsslide.deleteVersionsRPC, reloads version history on success.Test Results
Pull request opened: #11
This PR implements the changes discussed in this issue.