1+ /**
2+ * Advanced Auto-save Draft Implementation with Enhanced Features
3+ * This version adds multi-draft support and advanced error handling
4+ */
5+
6+ function onLoad ( ) {
7+ var autosaveInterval = 60000 ; // 1 minute
8+ var maxDrafts = 3 ; // Maximum number of drafts to keep
9+
10+ // Initialize draft manager
11+ initializeDraftManager ( ) ;
12+
13+ // Try to restore previous draft
14+ restoreLastDraft ( ) ;
15+
16+ // Set up auto-save interval
17+ setInterval ( function ( ) {
18+ if ( g_form . isModified ( ) ) {
19+ saveAdvancedDraft ( ) ;
20+ }
21+ } , autosaveInterval ) ;
22+ }
23+
24+ function initializeDraftManager ( ) {
25+ window . draftManager = {
26+ maxDrafts : 3 ,
27+ draftPrefix : 'catalogDraft_' + g_form . getUniqueValue ( ) + '_' ,
28+
29+ getAllDrafts : function ( ) {
30+ var drafts = [ ] ;
31+ for ( var i = 0 ; i < sessionStorage . length ; i ++ ) {
32+ var key = sessionStorage . key ( i ) ;
33+ if ( key . startsWith ( this . draftPrefix ) ) {
34+ drafts . push ( {
35+ key : key ,
36+ data : JSON . parse ( sessionStorage . getItem ( key ) )
37+ } ) ;
38+ }
39+ }
40+ return drafts . sort ( ( a , b ) => b . data . timestamp - a . data . timestamp ) ;
41+ } ,
42+
43+ cleanup : function ( ) {
44+ var drafts = this . getAllDrafts ( ) ;
45+ if ( drafts . length > this . maxDrafts ) {
46+ drafts . slice ( this . maxDrafts ) . forEach ( function ( draft ) {
47+ sessionStorage . removeItem ( draft . key ) ;
48+ } ) ;
49+ }
50+ }
51+ } ;
52+ }
53+
54+ function saveAdvancedDraft ( ) {
55+ try {
56+ var draftData = { } ;
57+ g_form . serialize ( draftData ) ;
58+
59+ // Add metadata
60+ var draftKey = window . draftManager . draftPrefix + new Date ( ) . getTime ( ) ;
61+ var draftInfo = {
62+ timestamp : new Date ( ) . getTime ( ) ,
63+ data : draftData ,
64+ user : g_user . userName ,
65+ catalog_item : g_form . getTableName ( ) ,
66+ fields_modified : g_form . getModifiedFields ( )
67+ } ;
68+
69+ sessionStorage . setItem ( draftKey , JSON . stringify ( draftInfo ) ) ;
70+ window . draftManager . cleanup ( ) ;
71+
72+ // Show success message with draft count
73+ var remainingDrafts = window . draftManager . getAllDrafts ( ) . length ;
74+ g_form . addInfoMessage ( 'Draft saved. You have ' + remainingDrafts + ' saved draft(s).' ) ;
75+
76+ } catch ( e ) {
77+ console . error ( 'Error saving draft: ' + e ) ;
78+ g_form . addErrorMessage ( 'Failed to save draft: ' + e . message ) ;
79+ }
80+ }
81+
82+ function restoreLastDraft ( ) {
83+ try {
84+ var drafts = window . draftManager . getAllDrafts ( ) ;
85+
86+ if ( drafts . length > 0 ) {
87+ // If multiple drafts exist, show selection dialog
88+ if ( drafts . length > 1 ) {
89+ showDraftSelectionDialog ( drafts ) ;
90+ } else {
91+ promptToRestoreDraft ( drafts [ 0 ] . data ) ;
92+ }
93+ }
94+ } catch ( e ) {
95+ console . error ( 'Error restoring draft: ' + e ) ;
96+ g_form . addErrorMessage ( 'Failed to restore draft: ' + e . message ) ;
97+ }
98+ }
99+
100+ function showDraftSelectionDialog ( drafts ) {
101+ var dialog = new GlideModal ( 'select_draft_dialog' ) ;
102+ dialog . setTitle ( 'Available Drafts' ) ;
103+
104+ var html = '<div class="draft-list">' ;
105+ drafts . forEach ( function ( draft , index ) {
106+ var date = new Date ( draft . data . timestamp ) . toLocaleString ( ) ;
107+ html += '<div class="draft-item" onclick="selectDraft(' + index + ')">' ;
108+ html += '<strong>Draft ' + ( index + 1 ) + '</strong> - ' + date ;
109+ html += '<br>Modified fields: ' + draft . data . fields_modified . join ( ', ' ) ;
110+ html += '</div>' ;
111+ } ) ;
112+ html += '</div>' ;
113+
114+ dialog . renderWithContent ( html ) ;
115+ }
116+
117+ function promptToRestoreDraft ( draftInfo ) {
118+ var timestamp = new Date ( draftInfo . timestamp ) ;
119+ if ( confirm ( 'A draft from ' + timestamp . toLocaleString ( ) + ' was found. Would you like to restore it?' ) ) {
120+ Object . keys ( draftInfo . data ) . forEach ( function ( field ) {
121+ g_form . setValue ( field , draftInfo . data [ field ] ) ;
122+ } ) ;
123+ g_form . addInfoMessage ( 'Draft restored from ' + timestamp . toLocaleString ( ) ) ;
124+ }
125+ }
0 commit comments