1+ import { Controller } from "@hotwired/stimulus"
2+
3+ export default class extends Controller {
4+ static targets = [ "panel" , "list" ]
5+ static values = {
6+ contentBlockId : Number
7+ }
8+
9+ connect ( ) {
10+ this . isOpen = false
11+ }
12+
13+ async toggle ( ) {
14+ if ( this . isOpen ) {
15+ this . close ( )
16+ } else {
17+ await this . open ( )
18+ }
19+ }
20+
21+ async open ( ) {
22+ if ( ! this . contentBlockIdValue ) return
23+
24+ try {
25+ const response = await fetch (
26+ `/admin/content_blocks/${ this . contentBlockIdValue } /versions.json` ,
27+ { headers : { "Accept" : "application/json" } }
28+ )
29+ if ( ! response . ok ) throw new Error ( "Failed to fetch versions" )
30+
31+ const versions = await response . json ( )
32+ this . renderVersions ( versions )
33+ this . panelTarget . classList . remove ( "hidden" )
34+ this . isOpen = true
35+ } catch ( error ) {
36+ console . error ( "Error loading version history:" , error )
37+ }
38+ }
39+
40+ close ( ) {
41+ this . panelTarget . classList . add ( "hidden" )
42+ this . isOpen = false
43+ }
44+
45+ renderVersions ( versions ) {
46+ if ( ! versions . length ) {
47+ this . listTarget . innerHTML = '<p class="text-sm text-muted-foreground p-3">Geen versies gevonden.</p>'
48+ return
49+ }
50+
51+ this . listTarget . innerHTML = versions . map ( v => `
52+ <div class="flex items-center justify-between p-3 border-b border-border/40 last:border-0">
53+ <div>
54+ <span class="text-xs font-medium">v${ v . version_number } </span>
55+ <span class="text-xs text-muted-foreground ml-1">${ v . event } </span>
56+ <span class="text-xs text-muted-foreground ml-2">${ v . user } </span>
57+ <span class="text-xs text-muted-foreground ml-2">${ v . created_at } </span>
58+ </div>
59+ <button data-action="click->ruby-cms--content-block-history#rollback"
60+ data-version-id="${ v . id } "
61+ class="text-xs text-primary hover:underline">
62+ Herstel
63+ </button>
64+ </div>
65+ ` ) . join ( "" )
66+ }
67+
68+ async rollback ( event ) {
69+ const versionId = event . currentTarget . dataset . versionId
70+ if ( ! confirm ( "Weet je zeker dat je deze versie wilt herstellen?" ) ) return
71+
72+ try {
73+ const response = await fetch (
74+ `/admin/content_blocks/${ this . contentBlockIdValue } /versions/${ versionId } /rollback` ,
75+ {
76+ method : "POST" ,
77+ headers : {
78+ "X-CSRF-Token" : document . querySelector ( 'meta[name="csrf-token"]' ) . content ,
79+ "Accept" : "application/json"
80+ }
81+ }
82+ )
83+ if ( ! response . ok ) throw new Error ( "Rollback failed" )
84+
85+ window . location . reload ( )
86+ } catch ( error ) {
87+ console . error ( "Rollback error:" , error )
88+ alert ( "Rollback mislukt" )
89+ }
90+ }
91+ }
0 commit comments