From 96ed5e6583a7f03d4ea7fa0512e66fffb656cc6e Mon Sep 17 00:00:00 2001
From: Zero~Informatique
Date: Sat, 12 Sep 2020 06:34:58 +0200
Subject: viewer: make default sort order configurable
github: resolves #239
---
viewer/src/services/itemComparators.ts | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
create mode 100644 viewer/src/services/itemComparators.ts
(limited to 'viewer/src/services/itemComparators.ts')
diff --git a/viewer/src/services/itemComparators.ts b/viewer/src/services/itemComparators.ts
new file mode 100644
index 0000000..c8fedbe
--- /dev/null
+++ b/viewer/src/services/itemComparators.ts
@@ -0,0 +1,30 @@
+/* ldgallery - A static generator which turns a collection of tagged
+-- pictures into a searchable web gallery.
+--
+-- Copyright (C) 2019-2020 Guillaume FOUET
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU Affero General Public License as
+-- published by the Free Software Foundation, either version 3 of the
+-- License, or (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-- GNU Affero General Public License for more details.
+--
+-- You should have received a copy of the GNU Affero General Public License
+-- along with this program. If not, see .
+*/
+
+export type ItemComparator = (left: Gallery.Item, right: Gallery.Item) => number;
+
+export default class ItemComparators {
+ static sortByNameAsc(left: Gallery.Item, right: Gallery.Item): number {
+ return left.title.localeCompare(right.title);
+ }
+
+ static sortByDateDesc(left: Gallery.Item, right: Gallery.Item): number {
+ return -left.datetime.localeCompare(right.datetime); // TODO: handle timezones
+ }
+}
--
cgit v1.2.3
From b909ec093591b50950c0de54b2005d471ca28116 Mon Sep 17 00:00:00 2001
From: Zero~Informatique
Date: Sat, 12 Sep 2020 22:33:37 +0200
Subject: viewer: make default sort order configurable. code review
improvements
github: resolves #239
---
viewer/src/services/itemComparators.ts | 10 ++++++++++
1 file changed, 10 insertions(+)
(limited to 'viewer/src/services/itemComparators.ts')
diff --git a/viewer/src/services/itemComparators.ts b/viewer/src/services/itemComparators.ts
index c8fedbe..380c66a 100644
--- a/viewer/src/services/itemComparators.ts
+++ b/viewer/src/services/itemComparators.ts
@@ -16,10 +16,20 @@
-- You should have received a copy of the GNU Affero General Public License
-- along with this program. If not, see .
*/
+import { TranslateResult } from "vue-i18n";
+import i18n from "@/plugins/i18n";
export type ItemComparator = (left: Gallery.Item, right: Gallery.Item) => number;
+export type ItemSort = { name: Gallery.ItemSortStr; text: TranslateResult; fn: ItemComparator };
export default class ItemComparators {
+ static readonly DEFAULT = ItemComparators.sortByNameAsc;
+
+ static readonly ITEM_SORTS: ItemSort[] = [
+ { name: "name_asc", text: i18n.t("command.sort.byNameAsc"), fn: ItemComparators.sortByNameAsc },
+ { name: "date_desc", text: i18n.t("command.sort.byDateDesc"), fn: ItemComparators.sortByDateDesc },
+ ];
+
static sortByNameAsc(left: Gallery.Item, right: Gallery.Item): number {
return left.title.localeCompare(right.title);
}
--
cgit v1.2.3
From 254858f632bbfd4eb45d0315ed39e0a631e64104 Mon Sep 17 00:00:00 2001
From: Zero~Informatique
Date: Sun, 13 Sep 2020 10:23:05 +0200
Subject: viewer: natural sort
github: resolves #243
---
viewer/src/services/itemComparators.ts | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
(limited to 'viewer/src/services/itemComparators.ts')
diff --git a/viewer/src/services/itemComparators.ts b/viewer/src/services/itemComparators.ts
index 380c66a..6a7c81c 100644
--- a/viewer/src/services/itemComparators.ts
+++ b/viewer/src/services/itemComparators.ts
@@ -31,7 +31,11 @@ export default class ItemComparators {
];
static sortByNameAsc(left: Gallery.Item, right: Gallery.Item): number {
- return left.title.localeCompare(right.title);
+ return left.title.localeCompare(right.title, undefined, {
+ sensitivity: "base",
+ ignorePunctuation: true,
+ numeric: true,
+ });
}
static sortByDateDesc(left: Gallery.Item, right: Gallery.Item): number {
--
cgit v1.2.3
From ab97f64575f1b51bacced6ce1bc6bf22e0354615 Mon Sep 17 00:00:00 2001
From: zeroinformatique
Date: Thu, 17 Sep 2020 15:51:42 +0200
Subject: viewer: sort by date ascending (#249)
* viewer: sort by date ascending
* viewer: sort by date ascending---
viewer/src/services/itemComparators.ts | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
(limited to 'viewer/src/services/itemComparators.ts')
diff --git a/viewer/src/services/itemComparators.ts b/viewer/src/services/itemComparators.ts
index 6a7c81c..64ce288 100644
--- a/viewer/src/services/itemComparators.ts
+++ b/viewer/src/services/itemComparators.ts
@@ -27,7 +27,12 @@ export default class ItemComparators {
static readonly ITEM_SORTS: ItemSort[] = [
{ name: "name_asc", text: i18n.t("command.sort.byNameAsc"), fn: ItemComparators.sortByNameAsc },
- { name: "date_desc", text: i18n.t("command.sort.byDateDesc"), fn: ItemComparators.sortByDateDesc },
+ { name: "date_asc", text: i18n.t("command.sort.byDateAsc"), fn: ItemComparators.sortByDateAsc },
+ {
+ name: "date_desc",
+ text: i18n.t("command.sort.byDateDesc"),
+ fn: ItemComparators.reverse(ItemComparators.sortByDateAsc),
+ },
];
static sortByNameAsc(left: Gallery.Item, right: Gallery.Item): number {
@@ -38,7 +43,11 @@ export default class ItemComparators {
});
}
- static sortByDateDesc(left: Gallery.Item, right: Gallery.Item): number {
- return -left.datetime.localeCompare(right.datetime); // TODO: handle timezones
+ static sortByDateAsc(left: Gallery.Item, right: Gallery.Item): number {
+ return left.datetime.localeCompare(right.datetime); // TODO: handle timezones
+ }
+
+ static reverse(fn: ItemComparator): ItemComparator {
+ return (l, r) => -fn(l, r);
}
}
--
cgit v1.2.3
From d9e51ff55ef494d37c5e23ef8fb79500fa5585c5 Mon Sep 17 00:00:00 2001
From: pacien
Date: Sat, 19 Sep 2020 22:25:54 +0200
Subject: viewer: rename title sort order
To avoid confusion with filenames.
---
viewer/src/services/itemComparators.ts | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
(limited to 'viewer/src/services/itemComparators.ts')
diff --git a/viewer/src/services/itemComparators.ts b/viewer/src/services/itemComparators.ts
index 64ce288..e131b8b 100644
--- a/viewer/src/services/itemComparators.ts
+++ b/viewer/src/services/itemComparators.ts
@@ -23,10 +23,10 @@ export type ItemComparator = (left: Gallery.Item, right: Gallery.Item) => number
export type ItemSort = { name: Gallery.ItemSortStr; text: TranslateResult; fn: ItemComparator };
export default class ItemComparators {
- static readonly DEFAULT = ItemComparators.sortByNameAsc;
+ static readonly DEFAULT = ItemComparators.sortByTitleAsc;
static readonly ITEM_SORTS: ItemSort[] = [
- { name: "name_asc", text: i18n.t("command.sort.byNameAsc"), fn: ItemComparators.sortByNameAsc },
+ { name: "title_asc", text: i18n.t("command.sort.byTitleAsc"), fn: ItemComparators.sortByTitleAsc },
{ name: "date_asc", text: i18n.t("command.sort.byDateAsc"), fn: ItemComparators.sortByDateAsc },
{
name: "date_desc",
@@ -35,7 +35,7 @@ export default class ItemComparators {
},
];
- static sortByNameAsc(left: Gallery.Item, right: Gallery.Item): number {
+ static sortByTitleAsc(left: Gallery.Item, right: Gallery.Item): number {
return left.title.localeCompare(right.title, undefined, {
sensitivity: "base",
ignorePunctuation: true,
--
cgit v1.2.3
From c108a99e128c02d20930775222f6118a460f80b1 Mon Sep 17 00:00:00 2001
From: pacien
Date: Thu, 24 Sep 2020 22:18:44 +0200
Subject: viewer/services/itemComparators: make the orders linear
By using the item path as a tie-breaker.
GitHub: closes #255
---
viewer/src/services/itemComparators.ts | 33 ++++++++++++++++++++++++++++-----
1 file changed, 28 insertions(+), 5 deletions(-)
(limited to 'viewer/src/services/itemComparators.ts')
diff --git a/viewer/src/services/itemComparators.ts b/viewer/src/services/itemComparators.ts
index e131b8b..ab1036d 100644
--- a/viewer/src/services/itemComparators.ts
+++ b/viewer/src/services/itemComparators.ts
@@ -23,18 +23,34 @@ export type ItemComparator = (left: Gallery.Item, right: Gallery.Item) => number
export type ItemSort = { name: Gallery.ItemSortStr; text: TranslateResult; fn: ItemComparator };
export default class ItemComparators {
- static readonly DEFAULT = ItemComparators.sortByTitleAsc;
-
static readonly ITEM_SORTS: ItemSort[] = [
- { name: "title_asc", text: i18n.t("command.sort.byTitleAsc"), fn: ItemComparators.sortByTitleAsc },
- { name: "date_asc", text: i18n.t("command.sort.byDateAsc"), fn: ItemComparators.sortByDateAsc },
+ {
+ name: "title_asc",
+ text: i18n.t("command.sort.byTitleAsc"),
+ fn: ItemComparators.chain(ItemComparators.sortByTitleAsc, ItemComparators.sortByPathAsc),
+ },
+ {
+ name: "date_asc",
+ text: i18n.t("command.sort.byDateAsc"),
+ fn: ItemComparators.chain(ItemComparators.sortByDateAsc, ItemComparators.sortByPathAsc),
+ },
{
name: "date_desc",
text: i18n.t("command.sort.byDateDesc"),
- fn: ItemComparators.reverse(ItemComparators.sortByDateAsc),
+ fn: ItemComparators.reverse(ItemComparators.chain(ItemComparators.sortByDateAsc, ItemComparators.sortByPathAsc)),
},
];
+ static readonly DEFAULT = ItemComparators.ITEM_SORTS[0].fn;
+
+ static sortByPathAsc(left: Gallery.Item, right: Gallery.Item): number {
+ return left.path.localeCompare(right.path, undefined, {
+ sensitivity: "base",
+ ignorePunctuation: true,
+ numeric: true,
+ });
+ }
+
static sortByTitleAsc(left: Gallery.Item, right: Gallery.Item): number {
return left.title.localeCompare(right.title, undefined, {
sensitivity: "base",
@@ -50,4 +66,11 @@ export default class ItemComparators {
static reverse(fn: ItemComparator): ItemComparator {
return (l, r) => -fn(l, r);
}
+
+ static chain(primary: ItemComparator, tieBreaker: ItemComparator): ItemComparator {
+ return (l, r) => {
+ const primaryComparison = primary(l, r);
+ return primaryComparison !== 0 ? primaryComparison : tieBreaker(l, r);
+ };
+ }
}
--
cgit v1.2.3
From 25a9af7212d757a53258990668620157c8ebe2e5 Mon Sep 17 00:00:00 2001
From: pacien
Date: Fri, 25 Sep 2020 09:22:44 +0200
Subject: viewer/services/itemComparators: set default item sort order to
date_asc
It's the most reasonable default that doesn't break the order of sequence of photos.
---
viewer/src/services/itemComparators.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'viewer/src/services/itemComparators.ts')
diff --git a/viewer/src/services/itemComparators.ts b/viewer/src/services/itemComparators.ts
index ab1036d..82757ca 100644
--- a/viewer/src/services/itemComparators.ts
+++ b/viewer/src/services/itemComparators.ts
@@ -41,7 +41,7 @@ export default class ItemComparators {
},
];
- static readonly DEFAULT = ItemComparators.ITEM_SORTS[0].fn;
+ static readonly DEFAULT = ItemComparators.ITEM_SORTS[1].fn;
static sortByPathAsc(left: Gallery.Item, right: Gallery.Item): number {
return left.path.localeCompare(right.path, undefined, {
--
cgit v1.2.3
From 26210d495aed813baac1095b5c7a7c7879d2d206 Mon Sep 17 00:00:00 2001
From: Zero~Informatique
Date: Fri, 25 Sep 2020 10:42:33 +0200
Subject: viewer: refactor how the available sorts are stored
github: resolves #259
---
viewer/src/services/itemComparators.ts | 17 +++++++----------
1 file changed, 7 insertions(+), 10 deletions(-)
(limited to 'viewer/src/services/itemComparators.ts')
diff --git a/viewer/src/services/itemComparators.ts b/viewer/src/services/itemComparators.ts
index 82757ca..bd9accb 100644
--- a/viewer/src/services/itemComparators.ts
+++ b/viewer/src/services/itemComparators.ts
@@ -20,28 +20,25 @@ import { TranslateResult } from "vue-i18n";
import i18n from "@/plugins/i18n";
export type ItemComparator = (left: Gallery.Item, right: Gallery.Item) => number;
-export type ItemSort = { name: Gallery.ItemSortStr; text: TranslateResult; fn: ItemComparator };
+export type ItemSort = { text: TranslateResult; fn: ItemComparator };
export default class ItemComparators {
- static readonly ITEM_SORTS: ItemSort[] = [
- {
- name: "title_asc",
+ static readonly ITEM_SORTS: Record = {
+ title_asc: {
text: i18n.t("command.sort.byTitleAsc"),
fn: ItemComparators.chain(ItemComparators.sortByTitleAsc, ItemComparators.sortByPathAsc),
},
- {
- name: "date_asc",
+ date_asc: {
text: i18n.t("command.sort.byDateAsc"),
fn: ItemComparators.chain(ItemComparators.sortByDateAsc, ItemComparators.sortByPathAsc),
},
- {
- name: "date_desc",
+ date_desc: {
text: i18n.t("command.sort.byDateDesc"),
fn: ItemComparators.reverse(ItemComparators.chain(ItemComparators.sortByDateAsc, ItemComparators.sortByPathAsc)),
},
- ];
+ };
- static readonly DEFAULT = ItemComparators.ITEM_SORTS[1].fn;
+ static readonly DEFAULT = ItemComparators.ITEM_SORTS.date_asc;
static sortByPathAsc(left: Gallery.Item, right: Gallery.Item): number {
return left.path.localeCompare(right.path, undefined, {
--
cgit v1.2.3