@@ -69,7 +69,6 @@ const thePanes = {
6969
7070let cleanEditToken = 0 ;
7171let cleanEditText = '' ;
72- let isCollapsed = false ;
7372
7473/******************************************************************************/
7574
@@ -104,7 +103,6 @@ let isCollapsed = false;
104103 qs$ ( '.CodeMirror-merge-copybuttons-left' ) ,
105104 { attributes : true , attributeFilter : [ 'title' ] , subtree : true }
106105 ) ;
107-
108106}
109107
110108/******************************************************************************/
@@ -142,14 +140,34 @@ const updateOverlay = (( ) => {
142140 stream . skipToEnd ( ) ;
143141 }
144142 } ;
145- return function ( filter ) {
146- reFilter = typeof filter === 'string' && filter !== '' ?
147- new RegExp ( filter . replace ( / [ . * + ? ^ $ { } ( ) | [ \] \\ ] / g, '\\$&' ) , 'gi' ) :
148- undefined ;
143+ return function ( ) {
144+ const f = presentationState . filter ;
145+ reFilter = typeof f === 'string' && f !== ''
146+ ? new RegExp ( f . replace ( / [ . * + ? ^ $ { } ( ) | [ \] \\ ] / g, '\\$&' ) , 'gi' )
147+ : undefined ;
149148 return mode ;
150149 } ;
151150} ) ( ) ;
152151
152+ const toggleOverlay = ( ( ) => {
153+ let overlay = null ;
154+
155+ return function ( ) {
156+ if ( overlay !== null ) {
157+ mergeView . leftOriginal ( ) . removeOverlay ( overlay ) ;
158+ mergeView . editor ( ) . removeOverlay ( overlay ) ;
159+ overlay = null ;
160+ }
161+ if ( presentationState . filter !== '' ) {
162+ overlay = updateOverlay ( ) ;
163+ mergeView . leftOriginal ( ) . addOverlay ( overlay ) ;
164+ mergeView . editor ( ) . addOverlay ( overlay ) ;
165+ }
166+ rulesToDoc ( true ) ;
167+ savePresentationState ( ) ;
168+ } ;
169+ } ) ( ) ;
170+
153171/******************************************************************************/
154172
155173// Incrementally update text in a CodeMirror editor for best user experience:
@@ -210,7 +228,7 @@ const rulesToDoc = function(clearHistory) {
210228 if ( mark . uboEllipsis !== true ) { continue ; }
211229 mark . clear ( ) ;
212230 }
213- if ( isCollapsed ) {
231+ if ( presentationState . isCollapsed ) {
214232 for ( let iline = 0 , n = edit . lineCount ( ) ; iline < n ; iline ++ ) {
215233 if ( edit . getLine ( iline ) !== '...' ) { continue ; }
216234 const mark = edit . markText (
@@ -353,41 +371,25 @@ function exportUserRulesToFile() {
353371
354372/******************************************************************************/
355373
356- const onFilterChanged = ( ( ) => {
374+ {
357375 let timer ;
358- let overlay = null ;
359- let last = '' ;
360376
361- const process = function ( ) {
362- timer = undefined ;
363- if ( mergeView . editor ( ) . isClean ( cleanEditToken ) === false ) { return ; }
364- const filter = qs$ ( '#ruleFilter input' ) . value ;
365- if ( filter === last ) { return ; }
366- last = filter ;
367- if ( overlay !== null ) {
368- mergeView . leftOriginal ( ) . removeOverlay ( overlay ) ;
369- mergeView . editor ( ) . removeOverlay ( overlay ) ;
370- overlay = null ;
371- }
372- if ( filter !== '' ) {
373- overlay = updateOverlay ( filter ) ;
374- mergeView . leftOriginal ( ) . addOverlay ( overlay ) ;
375- mergeView . editor ( ) . addOverlay ( overlay ) ;
376- }
377- rulesToDoc ( true ) ;
378- } ;
379-
380- return function ( ) {
377+ dom . on ( '#ruleFilter input' , 'input' , ( ) => {
381378 if ( timer !== undefined ) { self . cancelIdleCallback ( timer ) ; }
382- timer = self . requestIdleCallback ( process , { timeout : 773 } ) ;
383- } ;
384- } ) ( ) ;
379+ timer = self . requestIdleCallback ( ( ) => {
380+ timer = undefined ;
381+ if ( mergeView . editor ( ) . isClean ( cleanEditToken ) === false ) { return ; }
382+ const filter = qs$ ( '#ruleFilter input' ) . value ;
383+ if ( filter === presentationState . filter ) { return ; }
384+ presentationState . filter = filter ;
385+ toggleOverlay ( ) ;
386+ } , { timeout : 773 } ) ;
387+ } ) ;
388+ }
385389
386390/******************************************************************************/
387391
388392const onPresentationChanged = ( ( ) => {
389- let sortType = 1 ;
390-
391393 const reSwRule = / ^ ( [ ^ / ] + ) : ( [ ^ / ] + ) ( [ ^ ] + ) / ;
392394 const reRule = / ^ ( [ ^ ] + ) ( [ ^ / ] + ) ( [ ^ ] + [ ^ ] + ) / ;
393395 const reUrlRule = / ^ ( [ ^ ] + ) ( [ ^ ] + ) ( [ ^ ] + [ ^ ] + ) / ;
@@ -431,10 +433,10 @@ const onPresentationChanged = (( ) => {
431433 desHn = sortNormalizeHn ( hostnameFromURI ( match [ 2 ] ) ) ;
432434 extra = match [ 3 ] ;
433435 }
434- if ( sortType === 0 ) {
436+ if ( presentationState . sortType === 0 ) {
435437 return { rule, token : `${ type } ${ srcHn } ${ desHn } ${ extra } ` } ;
436438 }
437- if ( sortType === 1 ) {
439+ if ( presentationState . sortType === 1 ) {
438440 return { rule, token : `${ srcHn } ${ type } ${ desHn } ${ extra } ` } ;
439441 }
440442 return { rule, token : `${ desHn } ${ type } ${ srcHn } ${ extra } ` } ;
@@ -452,7 +454,7 @@ const onPresentationChanged = (( ) => {
452454 } ;
453455
454456 const collapse = ( ) => {
455- if ( isCollapsed !== true ) { return ; }
457+ if ( presentationState . isCollapsed !== true ) { return ; }
456458 const diffs = getDiffer ( ) . diff_main (
457459 thePanes . orig . modified . join ( '\n' ) ,
458460 thePanes . edit . modified . join ( '\n' )
@@ -491,23 +493,31 @@ const onPresentationChanged = (( ) => {
491493 thePanes . edit . modified = rr ;
492494 } ;
493495
494- return function ( clearHistory ) {
496+ dom . on ( '#ruleFilter select' , 'input' , ev => {
497+ presentationState . sortType = parseInt ( ev . target . value , 10 ) || 0 ;
498+ savePresentationState ( ) ;
499+ onPresentationChanged ( true ) ;
500+ } ) ;
501+ dom . on ( '#ruleFilter #diffCollapse' , 'click' , ev => {
502+ presentationState . isCollapsed = dom . cl . toggle ( ev . target , 'active' ) ;
503+ savePresentationState ( ) ;
504+ onPresentationChanged ( true ) ;
505+ } ) ;
506+
507+ return function onPresentationChanged ( clearHistory ) {
495508 const origPane = thePanes . orig ;
496509 const editPane = thePanes . edit ;
497510 origPane . modified = origPane . original . slice ( ) ;
498511 editPane . modified = editPane . original . slice ( ) ;
499- const select = qs$ ( '#ruleFilter select' ) ;
500- sortType = parseInt ( select . value , 10 ) ;
501- if ( isNaN ( sortType ) ) { sortType = 1 ; }
502512 {
503513 const mode = origPane . doc . getMode ( ) ;
504- mode . sortType = sortType ;
514+ mode . sortType = presentationState . sortType ;
505515 mode . setHostnameToDomainMap ( hostnameToDomainMap ) ;
506516 mode . setPSL ( publicSuffixList ) ;
507517 }
508518 {
509519 const mode = editPane . doc . getMode ( ) ;
510- mode . sortType = sortType ;
520+ mode . sortType = presentationState . sortType ;
511521 mode . setHostnameToDomainMap ( hostnameToDomainMap ) ;
512522 mode . setPSL ( publicSuffixList ) ;
513523 }
@@ -644,6 +654,35 @@ self.hasUnsavedData = function() {
644654
645655/******************************************************************************/
646656
657+ const presentationState = {
658+ sortType : 0 ,
659+ isCollapsed : false ,
660+ filter : '' ,
661+ } ;
662+
663+ const savePresentationState = ( ) => {
664+ vAPI . localStorage . setItem ( 'dynaRulesPresentationState' , presentationState ) ;
665+ } ;
666+
667+ vAPI . localStorage . getItemAsync ( 'dynaRulesPresentationState' ) . then ( details => {
668+ if ( details instanceof Object === false ) { return ; }
669+ if ( typeof details . sortType === 'number' ) {
670+ presentationState . sortType = details . sortType ;
671+ qs$ ( '#ruleFilter select' ) . value = `${ details . sortType } ` ;
672+ }
673+ if ( typeof details . isCollapsed === 'boolean' ) {
674+ presentationState . isCollapsed = details . isCollapsed ;
675+ dom . cl . toggle ( '#ruleFilter #diffCollapse' , 'active' , details . isCollapsed ) ;
676+ }
677+ if ( typeof details . filter === 'string' ) {
678+ presentationState . filter = details . filter ;
679+ qs$ ( '#ruleFilter input' ) . value = details . filter ;
680+ toggleOverlay ( ) ;
681+ }
682+ } ) ;
683+
684+ /******************************************************************************/
685+
647686vAPI . messaging . send ( 'dashboard' , {
648687 what : 'getRules' ,
649688} ) . then ( details => {
@@ -660,14 +699,6 @@ dom.on('#exportButton', 'click', exportUserRulesToFile);
660699dom . on ( '#revertButton' , 'click' , revertAllHandler ) ;
661700dom . on ( '#commitButton' , 'click' , commitAllHandler ) ;
662701dom . on ( '#editSaveButton' , 'click' , editSaveHandler ) ;
663- dom . on ( '#ruleFilter input' , 'input' , onFilterChanged ) ;
664- dom . on ( '#ruleFilter select' , 'input' , ( ) => {
665- onPresentationChanged ( true ) ;
666- } ) ;
667- dom . on ( '#ruleFilter #diffCollapse' , 'click' , ev => {
668- isCollapsed = dom . cl . toggle ( ev . target , 'active' ) ;
669- onPresentationChanged ( true ) ;
670- } ) ;
671702
672703// https://groups.google.com/forum/#!topic/codemirror/UQkTrt078Vs
673704mergeView . editor ( ) . on ( 'updateDiff' , ( ) => {
0 commit comments