Add category and recipe sorting with multiple modes and order inversion

Categories on the main page can be sorted by Recently Used, Alphabetical,
or Manual (drag-to-reorder). The sort menu appears inline next to the
Categories header. All Recipes is included in the sort order and manual
reorder sheet. Recipes within category and all-recipes lists can be sorted
by Recently Added or Alphabetical, with the sort button in the toolbar.
All non-manual sort modes support order inversion via a Reverse/Default
Order toggle. Date parsing handles both formatted strings and Unix
timestamps, with recipe_id as fallback when dates are unavailable.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-15 07:46:23 +01:00
parent fb6b16c1fc
commit 5307b502e9
10 changed files with 694 additions and 48 deletions

View File

@@ -692,6 +692,28 @@
}
}
},
"Alphabetical" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alphabetisch"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alfabético"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Alphabétique"
}
}
}
},
"An HTML parsing and web scraping library for Swift. Used for importing schema.org recipes from websites." : {
"extractionState" : "stale",
"localizations" : {
@@ -1403,6 +1425,28 @@
}
}
},
"Default Order" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Standardreihenfolge"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Orden predeterminado"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ordre par défaut"
}
}
}
},
"Delete" : {
"localizations" : {
"de" : {
@@ -1768,6 +1812,28 @@
}
}
},
"Edit Order" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reihenfolge bearbeiten"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Editar orden"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Modifier l'ordre"
}
}
}
},
"Edit Recipe" : {
"localizations" : {
"de" : {
@@ -2779,6 +2845,28 @@
}
}
},
"Manual" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Manuell"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Manual"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Manuel"
}
}
}
},
"Marked ingredients could not be adjusted!" : {
"localizations" : {
"de" : {
@@ -3712,6 +3800,50 @@
}
}
},
"Recently Added" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zuletzt hinzugefügt"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Añadidos recientemente"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Récemment ajoutés"
}
}
}
},
"Recently Used" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Zuletzt verwendet"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Usados recientemente"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Récemment utilisés"
}
}
}
},
"Recently Viewed" : {
"localizations" : {
"de" : {
@@ -3978,6 +4110,50 @@
}
}
},
"Reorder Categories" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Kategorien sortieren"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Reordenar categorías"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Réorganiser les catégories"
}
}
}
},
"Reverse Order" : {
"localizations" : {
"de" : {
"stringUnit" : {
"state" : "translated",
"value" : "Umgekehrte Reihenfolge"
}
},
"es" : {
"stringUnit" : {
"state" : "translated",
"value" : "Orden inverso"
}
},
"fr" : {
"stringUnit" : {
"state" : "translated",
"value" : "Ordre inversé"
}
}
}
},
"Same as Device" : {
"localizations" : {
"de" : {