@@ -629,6 +629,12 @@ document.addEventListener("DOMContentLoaded", function () {
629629 // Initialize filters
630630 initializeFilters ( ) ;
631631
632+ // Add listener to game filter to save changes
633+ const gameFilter = document . getElementById ( "game-filter" ) ;
634+ if ( gameFilter ) {
635+ gameFilter . addEventListener ( "change" , saveFilters ) ;
636+ }
637+
632638 // Close model dropdown when clicking outside
633639 document . addEventListener ( "click" , ( event ) => {
634640 const dropdown = document . getElementById ( "model-filter-dropdown" ) ;
@@ -921,6 +927,7 @@ let allGameRows = [];
921927let uniqueGames = new Set ( ) ;
922928let uniqueModels = new Set ( ) ;
923929let selectedModels = new Set ( ) ;
930+ let selectedDate = null ;
924931
925932function shouldRowBeVisible ( row ) {
926933 const gameFilter =
@@ -952,6 +959,22 @@ function shouldRowBeVisible(row) {
952959 }
953960 }
954961
962+ // Check date filter - if a date is selected, row must match that date
963+ if ( selectedDate ) {
964+ const dateElement = row . querySelector ( ".date-text" ) ;
965+ if ( dateElement ) {
966+ const dateText = dateElement . textContent . trim ( ) ;
967+ // Extract just the YYYY-MM-DD part
968+ const rowDate = dateText . split ( " " ) [ 0 ] ;
969+ if ( rowDate !== selectedDate ) {
970+ return false ;
971+ }
972+ } else {
973+ // Row has no date, so it doesn't match
974+ return false ;
975+ }
976+ }
977+
955978 return true ;
956979 } else {
957980 // For intermediate folders, check if any child game folders should be visible
@@ -988,6 +1011,13 @@ function initializeFilters() {
9881011 // Populate filter dropdowns
9891012 populateGameFilter ( ) ;
9901013 populateModelFilter ( ) ;
1014+
1015+ // Load saved filters from localStorage
1016+ const hasFilters = loadFilters ( ) ;
1017+ if ( hasFilters ) {
1018+ // Apply the loaded filters
1019+ applyFilters ( ) ;
1020+ }
9911021}
9921022
9931023function populateGameFilter ( ) {
@@ -1070,7 +1100,10 @@ function applyFilters() {
10701100function clearFilters ( ) {
10711101 document . getElementById ( "game-filter" ) . value = "" ;
10721102 selectedModels . clear ( ) ;
1103+ selectedDate = null ;
10731104 updateModelFilterDisplay ( ) ;
1105+ updateDateFilterDisplay ( ) ;
1106+ saveFilters ( ) ;
10741107
10751108 // Reapply the current folder states without any filters
10761109 applyFilters ( ) ;
@@ -1080,6 +1113,7 @@ function setGameFilter(gameName) {
10801113 const gameFilter = document . getElementById ( "game-filter" ) ;
10811114 if ( gameFilter ) {
10821115 gameFilter . value = gameName ;
1116+ saveFilters ( ) ;
10831117 applyFilters ( ) ;
10841118 }
10851119}
@@ -1094,13 +1128,15 @@ function toggleModelSelection(event, modelName) {
10941128 }
10951129
10961130 updateModelFilterDisplay ( ) ;
1131+ saveFilters ( ) ;
10971132 applyFilters ( ) ;
10981133}
10991134
11001135function clearModelSelection ( event ) {
11011136 event . stopPropagation ( ) ;
11021137 selectedModels . clear ( ) ;
11031138 updateModelFilterDisplay ( ) ;
1139+ saveFilters ( ) ;
11041140 applyFilters ( ) ;
11051141}
11061142
@@ -1154,6 +1190,120 @@ function handleModelTagClick(event, modelName) {
11541190 toggleModelSelection ( event , modelName ) ;
11551191}
11561192
1193+ function handleDateClick ( event , dateText ) {
1194+ event . stopPropagation ( ) ;
1195+ // Extract just the YYYY-MM-DD part
1196+ const date = dateText . trim ( ) . split ( " " ) [ 0 ] ;
1197+
1198+ // Toggle date filter - if already selected, clear it
1199+ if ( selectedDate === date ) {
1200+ selectedDate = null ;
1201+ } else {
1202+ selectedDate = date ;
1203+ }
1204+
1205+ updateDateFilterDisplay ( ) ;
1206+ saveFilters ( ) ;
1207+ applyFilters ( ) ;
1208+ }
1209+
1210+ function updateDateFilterDisplay ( ) {
1211+ // Find all date cells and update their styling
1212+ const dateCells = document . querySelectorAll ( ".date-text" ) ;
1213+ dateCells . forEach ( ( cell ) => {
1214+ const cellDate = cell . textContent . trim ( ) . split ( " " ) [ 0 ] ;
1215+ if ( selectedDate && cellDate === selectedDate ) {
1216+ cell . classList . add ( "date-selected" ) ;
1217+ } else {
1218+ cell . classList . remove ( "date-selected" ) ;
1219+ }
1220+ } ) ;
1221+
1222+ // Update the filter badge
1223+ const badge = document . getElementById ( "date-filter-badge" ) ;
1224+ const badgeText = document . getElementById ( "date-filter-text" ) ;
1225+ const container = document . getElementById ( "active-filters-container" ) ;
1226+
1227+ if ( selectedDate ) {
1228+ if ( badgeText ) badgeText . textContent = selectedDate ;
1229+ if ( badge ) badge . style . display = "inline-flex" ;
1230+ if ( container ) container . style . display = "flex" ;
1231+ } else {
1232+ if ( badge ) badge . style . display = "none" ;
1233+ // Hide container if no filters are active
1234+ if ( container && ! hasActiveFilters ( ) ) {
1235+ container . style . display = "none" ;
1236+ }
1237+ }
1238+ }
1239+
1240+ function hasActiveFilters ( ) {
1241+ return (
1242+ selectedDate !== null ||
1243+ selectedModels . size > 0 ||
1244+ ( document . getElementById ( "game-filter" ) ?. value || "" ) !== ""
1245+ ) ;
1246+ }
1247+
1248+ function clearDateFilter ( event ) {
1249+ if ( event ) {
1250+ event . preventDefault ( ) ;
1251+ event . stopPropagation ( ) ;
1252+ }
1253+ selectedDate = null ;
1254+ updateDateFilterDisplay ( ) ;
1255+ saveFilters ( ) ;
1256+ applyFilters ( ) ;
1257+ }
1258+
1259+ // Filter persistence
1260+ const FILTERS_KEY = "picker_filters" ;
1261+
1262+ function saveFilters ( ) {
1263+ const filters = {
1264+ game : document . getElementById ( "game-filter" ) ?. value || "" ,
1265+ models : Array . from ( selectedModels ) ,
1266+ date : selectedDate ,
1267+ } ;
1268+ try {
1269+ localStorage . setItem ( FILTERS_KEY , JSON . stringify ( filters ) ) ;
1270+ } catch ( e ) {
1271+ console . error ( "Failed to save filters:" , e ) ;
1272+ }
1273+ }
1274+
1275+ function loadFilters ( ) {
1276+ try {
1277+ const stored = localStorage . getItem ( FILTERS_KEY ) ;
1278+ if ( stored ) {
1279+ const filters = JSON . parse ( stored ) ;
1280+
1281+ // Restore game filter
1282+ const gameFilter = document . getElementById ( "game-filter" ) ;
1283+ if ( gameFilter && filters . game ) {
1284+ gameFilter . value = filters . game ;
1285+ }
1286+
1287+ // Restore model filter
1288+ if ( filters . models && Array . isArray ( filters . models ) ) {
1289+ filters . models . forEach ( ( model ) => selectedModels . add ( model ) ) ;
1290+ updateModelFilterDisplay ( ) ;
1291+ }
1292+
1293+ // Restore date filter
1294+ if ( filters . date ) {
1295+ selectedDate = filters . date ;
1296+ updateDateFilterDisplay ( ) ;
1297+ }
1298+
1299+ return true ;
1300+ }
1301+ } catch ( e ) {
1302+ console . error ( "Failed to load filters:" , e ) ;
1303+ }
1304+ return false ;
1305+ }
1306+
11571307// Sorting functionality
11581308let currentSort = { column : null , ascending : true } ;
11591309
0 commit comments