From 00510820a2794efcadbc83f7f8b54318fe198ecb Mon Sep 17 00:00:00 2001 From: Zéro~Informatique Date: Tue, 26 Jul 2022 08:44:34 +0200 Subject: viewer: migrate to vue 3, general refactoring and cleanup Non-exhaustive list of fixes and improvements done at the same time: - html default background to grey (avoids white flash during init) - unified links behavior - added more theme variables - removed the flex-expand transition (it wasn't working) and replaced it with a slide - fixed LdLoading not centered on the content - title on removable tags - fixed an issue with encoded URI from vue-router - unified Item resource URLs - removed the iframe for PlainTextViewer (it wasn't working properly) and replaced it with a pre - fixed clear and search buttons tabindex - fixed the information panel bumping up during the fade animation of tag's dropdown - fixed some focus outlines not appearing correctly - moved CSS variables to the :root context - Code cleaning GitHub: closes #217 GitHub: closes #300 GitHub: closes #297 GitHub: closes #105 GitHub: closes #267 GitHub: closes #275 GitHub: closes #228 GitHub: closes #215 GitHub: closes #112 --- viewer/src/services/itemComparator.ts | 93 +++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 viewer/src/services/itemComparator.ts (limited to 'viewer/src/services/itemComparator.ts') diff --git a/viewer/src/services/itemComparator.ts b/viewer/src/services/itemComparator.ts new file mode 100644 index 0000000..25010b8 --- /dev/null +++ b/viewer/src/services/itemComparator.ts @@ -0,0 +1,93 @@ +/* ldgallery - A static generator which turns a collection of tagged +-- pictures into a searchable web gallery. +-- +-- Copyright (C) 2019-2022 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 . +*/ + +import { Item, ItemSortStr } from '@/@types/gallery'; +import i18n from '@/plugins/i18n'; +import { isDirectory } from './itemGuards'; + +const { t } = i18n.global; + +export type ItemComparator = (left: Item, right: Item) => number; +export type ItemSort = { name: ItemSortStr, text: string; fn: ItemComparator }; + +function _sortByPathAsc(left: Item, right: Item): number { + return left.path.localeCompare(right.path, undefined, { + sensitivity: 'base', + ignorePunctuation: true, + numeric: true, + }); +} + +function _sortByTitleAsc(left: Item, right: Item): number { + return left.title.localeCompare(right.title, undefined, { + sensitivity: 'base', + ignorePunctuation: true, + numeric: true, + }); +} + +function _sortByDateAsc(left: Item, right: Item): number { + return left.datetime.localeCompare(right.datetime); // TODO: handle timezones +} + +function _sortDirectoryFirst(left: Item, right: Item): number { + const dLeft = isDirectory(left) ? 1 : 0; + const dRight = isDirectory(right) ? 1 : 0; + return dRight - dLeft; +} + +function _reverse(fn: ItemComparator): ItemComparator { + return (l, r) => -fn(l, r); +} + +function _chain(comparators: ItemComparator[]): ItemComparator { + return comparators.reduce((primary, tieBreaker) => (l, r) => { + const primaryComparison = primary(l, r); + return primaryComparison !== 0 ? primaryComparison : tieBreaker(l, r); + }); +} + +// --- + +export const useItemComparator = () => { + const ITEM_SORTS: ItemSort[] = [ + { + name: 'title_asc', + text: t('command.sort.byTitleAsc'), + fn: _chain([_sortDirectoryFirst, _sortByTitleAsc, _sortByPathAsc]), + }, + { + name: 'date_asc', + text: t('command.sort.byDateAsc'), + fn: _chain([_sortDirectoryFirst, _sortByDateAsc, _sortByPathAsc]), + }, + { + name: 'date_desc', + text: t('command.sort.byDateDesc'), + fn: _chain([_sortDirectoryFirst, _reverse(_sortByDateAsc), _sortByPathAsc]), + }, + ]; + + const DEFAULT = ITEM_SORTS[2]; // date_desc + + return { + ITEM_SORTS, + DEFAULT, + }; +}; -- cgit v1.2.3