11import { isLoggedIn , onAuthChange } from './auth.js' ;
2+ import { trackOpenDiagram } from './analytics.js' ;
23import { listDiagrams , duplicateDiagram , deleteDiagram } from './api.js' ;
34import { getCurrentShortCode } from './persistence.js' ;
45
@@ -94,6 +95,9 @@ function renderDiagramsList(list) {
9495 btn . addEventListener ( 'click' , ( e ) => {
9596 e . stopPropagation ( ) ;
9697 const code = btn . dataset . code ;
98+ const card = btn . closest ( '.diagram-card' ) ;
99+ const title = card ?. querySelector ( '.diagram-card-title' ) ?. textContent || 'Untitled Diagram' ;
100+ trackOpenDiagram ( title ) ;
97101 window . location . href = `${ window . location . pathname } ?d=${ code } ` ;
98102 } ) ;
99103 } ) ;
@@ -102,14 +106,18 @@ function renderDiagramsList(list) {
102106 btn . addEventListener ( 'click' , async ( e ) => {
103107 e . stopPropagation ( ) ;
104108 const code = btn . dataset . code ;
105- if ( ! confirm ( 'Delete this diagram? This cannot be undone.' ) ) return ;
109+ const confirmed = await showConfirmDialog (
110+ 'Delete diagram?' ,
111+ 'This diagram will be permanently deleted. This cannot be undone.'
112+ ) ;
113+ if ( ! confirmed ) return ;
106114 try {
107115 btn . disabled = true ;
108116 btn . textContent = 'Deleting...' ;
109117 await deleteDiagram ( code ) ;
110118 await refreshDiagramsList ( ) ;
111119 } catch ( err ) {
112- alert ( 'Failed to delete diagram' ) ;
120+ showConfirmDialog ( 'Delete failed' , 'Could not delete this diagram. Please try again.' , true ) ;
113121 btn . disabled = false ;
114122 btn . textContent = 'Delete' ;
115123 }
@@ -134,6 +142,44 @@ function renderDiagramsList(list) {
134142 } ) ;
135143}
136144
145+ function showConfirmDialog ( title , message , infoOnly = false ) {
146+ return new Promise ( ( resolve ) => {
147+ const dialog = document . getElementById ( 'confirm-dialog' ) ;
148+ const titleEl = document . getElementById ( 'confirm-dialog-title' ) ;
149+ const messageEl = document . getElementById ( 'confirm-dialog-message' ) ;
150+ const cancelBtn = document . getElementById ( 'confirm-dialog-cancel' ) ;
151+ const confirmBtn = document . getElementById ( 'confirm-dialog-confirm' ) ;
152+ if ( ! dialog ) { resolve ( ! infoOnly && confirm ( message ) ) ; return ; }
153+
154+ titleEl . textContent = title ;
155+ messageEl . textContent = message ;
156+
157+ if ( infoOnly ) {
158+ cancelBtn . style . display = 'none' ;
159+ confirmBtn . textContent = 'OK' ;
160+ confirmBtn . className = 'confirm-dialog__btn confirm-dialog__btn--cancel' ;
161+ } else {
162+ cancelBtn . style . display = '' ;
163+ confirmBtn . textContent = 'Delete' ;
164+ confirmBtn . className = 'confirm-dialog__btn confirm-dialog__btn--confirm' ;
165+ }
166+
167+ dialog . hidden = false ;
168+
169+ function cleanup ( result ) {
170+ dialog . hidden = true ;
171+ cancelBtn . removeEventListener ( 'click' , onCancel ) ;
172+ confirmBtn . removeEventListener ( 'click' , onConfirm ) ;
173+ resolve ( result ) ;
174+ }
175+ function onCancel ( ) { cleanup ( false ) ; }
176+ function onConfirm ( ) { cleanup ( true ) ; }
177+
178+ cancelBtn . addEventListener ( 'click' , onCancel ) ;
179+ confirmBtn . addEventListener ( 'click' , onConfirm ) ;
180+ } ) ;
181+ }
182+
137183function escapeHtml ( str ) {
138184 const div = document . createElement ( 'div' ) ;
139185 div . textContent = str ;
0 commit comments