@@ -2,7 +2,7 @@ var metadata = {}
22
33var search_string = "" ;
44
5- var objects = [ ]
5+ var objects = { } ;
66
77var editing = false ;
88var name_backup = "" ;
@@ -63,6 +63,7 @@ class Item
6363 Toggle ( )
6464 {
6565 metadata [ this . name ] . active = ! metadata [ this . name ] . active ;
66+ metadata [ this . name ] . timestamp = Date . now ( ) ;
6667 this . Update ( ) ;
6768 save_metadata ( ) ;
6869 }
@@ -111,14 +112,15 @@ class Item
111112 {
112113 old_toast . remove ( ) ;
113114 }
114- var undo_element = metadata [ name ] ;
115+ const undo_element = structuredClone ( metadata [ name ] ) ;
115116 traero_toast ( translate ( "toast_undo" ) , 3000 , true , ( ) => {
116117 metadata [ name ] = undo_element ;
118+ metadata [ name ] . timestamp = Date . now ( ) ;
117119 save_metadata ( ) ;
118120 } ) ;
119121 }
120- delete metadata [ name ] ;
121- objects . splice ( objects . indexOf ( obj ) , 1 ) ;
122+ metadata [ name ] . active = null ;
123+ metadata [ name ] . timestamp = Date . now ( ) ;
122124 save_metadata ( ) ;
123125 }
124126 clearInterval ( delete_timer ) ;
@@ -145,11 +147,12 @@ function add_item(name)
145147 if ( ! ( name in metadata ) )
146148 {
147149 var content = name . split ( "," ) . map ( i => i . trim ( ) )
148- metadata [ name ] = { "active" : true , "title" : content [ 0 ] , "meta" : content . slice ( 1 ) . join ( ", " ) } ;
150+ metadata [ name ] = { "active" : true , "title" : content [ 0 ] , "meta" : content . slice ( 1 ) . join ( ", " ) , "timestamp" : Date . now ( ) } ;
149151 }
150152 else
151153 {
152154 metadata [ name ] . active = true ;
155+ metadata . timestamp = Date . now ( ) ;
153156 }
154157 save_metadata ( ) ;
155158}
@@ -213,57 +216,82 @@ function input_clear()
213216 update_search ( ) ;
214217}
215218
219+ function cleanup_metadata ( )
220+ {
221+ for ( const name in metadata )
222+ {
223+ if ( metadata [ name ] . active == null )
224+ {
225+ delete metadata [ name ] ;
226+ }
227+ }
228+ }
229+
216230function import_metadata ( )
217231{
218232 window . webxdc . importFiles ( {
219233 mimeTypes : [ "applcation/json" ] ,
220234 extensions : [ ".json" ] ,
221235 } ) . then ( ( files ) => {
222236 files [ 0 ] . text ( ) . then ( text => {
223- Object . assign ( metadata , JSON . parse ( text ) ) ;
237+ var timestamp = Date . now ( ) ;
238+ for ( const [ name , data ] of Object . entries ( JSON . parse ( text ) ) )
239+ {
240+ data . timestamp = timestamp ;
241+ metadata [ name ] = data ;
242+ }
224243 save_metadata ( ) ;
225244 } ) ;
226245 } ) ;
227246}
228247
229248function export_metadata ( )
230249{
250+ cleanup_metadata ( ) ;
251+ var file = { } ;
252+ for ( const [ name , data ] of Object . entries ( metadata ) )
253+ {
254+ file [ name ] = { active : data . active , title : data . title , meta : data . meta }
255+ }
231256 window . webxdc . sendToChat ( {
232- file : { plainText : JSON . stringify ( metadata ) , name : "Traero.json" } ,
257+ file : { plainText : JSON . stringify ( file ) , name : "Traero.json" } ,
233258 text : translate ( "export_message" )
234259 } ) ;
235260}
236261
237262function update_list ( )
238263{
239- var existing = Object . fromEntries ( objects . map ( i => [ i . name , i ] ) ) ;
240- for ( var i in metadata )
264+ for ( const name in metadata )
241265 {
242- if ( ! ( i in existing ) )
266+ if ( ! ( name in objects ) )
243267 {
244- var obj = new Item ( i , metadata [ i ] . title , metadata [ i ] . meta ) ;
245- objects . push ( obj ) ;
246- obj . Update ( ) ;
268+ if ( metadata [ name ] . active != null )
269+ {
270+ var obj = new Item ( name , metadata [ name ] . title , metadata [ name ] . meta ) ;
271+ objects [ name ] = obj ;
272+ obj . Update ( ) ;
273+ }
274+ else
275+ {
276+ delete metadata [ name ] ;
277+ }
247278 }
248279 else
249280 {
250- if ( metadata [ i ] . active )
281+ if ( metadata [ name ] . active == true )
251282 {
252- existing [ i ] . toActive ( ) ;
283+ objects [ name ] . toActive ( ) ;
284+ }
285+ else if ( metadata [ name ] . active == false )
286+ {
287+ objects [ name ] . toLast ( ) ;
253288 }
254289 else
255290 {
256- existing [ i ] . toLast ( ) ;
291+ objects [ name ] . remove ( ) ;
292+ delete metadata [ name ] ;
257293 }
258294 }
259295 }
260- for ( var i in objects )
261- {
262- if ( ! ( objects [ i ] . name in metadata ) )
263- {
264- objects [ i ] . remove ( ) ;
265- objects . splice ( i , 1 ) ;
266- }
267- }
268296 update_search ( ) ;
269297}
0 commit comments