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