From 9165cc1efcf7791f78b61b2c51a9de651b1b09aa Mon Sep 17 00:00:00 2001
From: Zero~Informatique
Date: Fri, 2 Jul 2021 22:53:16 +0200
Subject: viewer: types normalization - gallery.d.ts
GitHub: closes #301
---
viewer/src/services/indexfactory.ts | 13 +++++++------
viewer/src/services/indexsearch.ts | 17 +++++++++--------
viewer/src/services/itemComparators.ts | 13 +++++++------
viewer/src/services/ldzoom.ts | 7 ++++---
viewer/src/services/navigation.ts | 15 ++++++++-------
5 files changed, 35 insertions(+), 30 deletions(-)
(limited to 'viewer/src/services')
diff --git a/viewer/src/services/indexfactory.ts b/viewer/src/services/indexfactory.ts
index 4b28a60..0c5fdc5 100644
--- a/viewer/src/services/indexfactory.ts
+++ b/viewer/src/services/indexfactory.ts
@@ -17,19 +17,20 @@
-- along with this program. If not, see .
*/
-import { Operation } from "@/@types/Operation";
+import { Item, RawTag } from "@/@types/gallery";
import { ItemType } from "@/@types/ItemType";
+import { Operation } from "@/@types/Operation";
import Navigation from "@/services/navigation";
export default class IndexFactory {
- public static generateTags(root: Gallery.Item | null): Tag.Index {
+ public static generateTags(root: Item | null): Tag.Index {
const tagsIndex: Tag.Index = {};
if (root) IndexFactory.pushTagsForItem(tagsIndex, root);
return tagsIndex;
}
// Pushes all tags for a root item (and its children) to the index
- private static pushTagsForItem(tagsIndex: Tag.Index, item: Gallery.Item): void {
+ private static pushTagsForItem(tagsIndex: Tag.Index, item: Item): void {
if (item.properties.type === ItemType.DIRECTORY) {
item.properties.items.forEach(item => this.pushTagsForItem(tagsIndex, item));
return; // Directories are not indexed
@@ -49,7 +50,7 @@ export default class IndexFactory {
}
}
- private static pushPartToIndex(index: Tag.Node, part: string, item: Gallery.Item, rootPart: boolean): Tag.Node {
+ private static pushPartToIndex(index: Tag.Node, part: string, item: Item, rootPart: boolean): Tag.Node {
if (!index)
index = {
tag: part,
@@ -131,7 +132,7 @@ export default class IndexFactory {
// ---
- public static generateCategories(tagsIndex: Tag.Index, categoryTags?: Gallery.RawTag[]): Tag.Category[] {
+ public static generateCategories(tagsIndex: Tag.Index, categoryTags?: RawTag[]): Tag.Category[] {
if (!categoryTags?.length) return [{ tag: "", index: tagsIndex }];
const tagsCategories: Tag.Category[] = [];
@@ -149,7 +150,7 @@ export default class IndexFactory {
return tagsCategories;
}
- private static isDiscriminantTagOnly(tags: Gallery.RawTag[], node: Tag.Node): boolean {
+ private static isDiscriminantTagOnly(tags: RawTag[], node: Tag.Node): boolean {
return !tags.includes(node.tag) || !node.childPart;
}
}
diff --git a/viewer/src/services/indexsearch.ts b/viewer/src/services/indexsearch.ts
index 00f8cfc..eda1b27 100644
--- a/viewer/src/services/indexsearch.ts
+++ b/viewer/src/services/indexsearch.ts
@@ -17,11 +17,12 @@
-- along with this program. If not, see .
*/
+import { Item } from "@/@types/gallery";
import { Operation } from "@/@types/Operation";
export default class IndexSearch {
// Results of the search (by tags)
- public static search(searchTags: Tag.Search[]): Gallery.Item[] {
+ public static search(searchTags: Tag.Search[]): Item[] {
const byOperation = this.extractTagsByOperation(searchTags);
const intersection = this.extractIntersection(byOperation);
const substraction = this.extractSubstraction(byOperation);
@@ -36,8 +37,8 @@ export default class IndexSearch {
return byOperation;
}
- private static extractIntersection(byOperation: Tag.SearchByOperation): Set {
- const intersection = new Set();
+ private static extractIntersection(byOperation: Tag.SearchByOperation): Set- {
+ const intersection = new Set
- ();
if (byOperation[Operation.INTERSECTION].length > 0) {
byOperation[Operation.INTERSECTION]
.map(tag => tag.items)
@@ -48,8 +49,8 @@ export default class IndexSearch {
return intersection;
}
- private static extractSubstraction(byOperation: Tag.SearchByOperation): Set {
- const substraction = new Set();
+ private static extractSubstraction(byOperation: Tag.SearchByOperation): Set
- {
+ const substraction = new Set
- ();
if (byOperation[Operation.SUBSTRACTION].length > 0) {
byOperation[Operation.SUBSTRACTION].flatMap(tag => tag.items).forEach(item => substraction.add(item));
}
@@ -58,9 +59,9 @@ export default class IndexSearch {
private static aggregateAll(
byOperation: Tag.SearchByOperation,
- intersection: Set,
- substraction: Set
- ): Gallery.Item[] {
+ intersection: Set
- ,
+ substraction: Set
-
+ ): Item[] {
byOperation[Operation.ADDITION].flatMap(tag => tag.items).forEach(item => intersection.add(item));
substraction.forEach(item => intersection.delete(item));
return [...intersection];
diff --git a/viewer/src/services/itemComparators.ts b/viewer/src/services/itemComparators.ts
index bd9accb..aceff79 100644
--- a/viewer/src/services/itemComparators.ts
+++ b/viewer/src/services/itemComparators.ts
@@ -16,14 +16,15 @@
-- 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 { Item, ItemSortStr } from "@/@types/gallery";
import i18n from "@/plugins/i18n";
+import { TranslateResult } from "vue-i18n";
-export type ItemComparator = (left: Gallery.Item, right: Gallery.Item) => number;
+export type ItemComparator = (left: Item, right: Item) => number;
export type ItemSort = { text: TranslateResult; fn: ItemComparator };
export default class ItemComparators {
- static readonly ITEM_SORTS: Record = {
+ static readonly ITEM_SORTS: Record = {
title_asc: {
text: i18n.t("command.sort.byTitleAsc"),
fn: ItemComparators.chain(ItemComparators.sortByTitleAsc, ItemComparators.sortByPathAsc),
@@ -40,7 +41,7 @@ export default class ItemComparators {
static readonly DEFAULT = ItemComparators.ITEM_SORTS.date_asc;
- static sortByPathAsc(left: Gallery.Item, right: Gallery.Item): number {
+ static sortByPathAsc(left: Item, right: Item): number {
return left.path.localeCompare(right.path, undefined, {
sensitivity: "base",
ignorePunctuation: true,
@@ -48,7 +49,7 @@ export default class ItemComparators {
});
}
- static sortByTitleAsc(left: Gallery.Item, right: Gallery.Item): number {
+ static sortByTitleAsc(left: Item, right: Item): number {
return left.title.localeCompare(right.title, undefined, {
sensitivity: "base",
ignorePunctuation: true,
@@ -56,7 +57,7 @@ export default class ItemComparators {
});
}
- static sortByDateAsc(left: Gallery.Item, right: Gallery.Item): number {
+ static sortByDateAsc(left: Item, right: Item): number {
return left.datetime.localeCompare(right.datetime); // TODO: handle timezones
}
diff --git a/viewer/src/services/ldzoom.ts b/viewer/src/services/ldzoom.ts
index 0fb0848..33a64c8 100644
--- a/viewer/src/services/ldzoom.ts
+++ b/viewer/src/services/ldzoom.ts
@@ -17,6 +17,7 @@
-- along with this program. If not, see .
*/
+import { PictureProperties, Resolution } from "@/@types/gallery";
import "hammerjs";
/**
@@ -25,7 +26,7 @@ import "hammerjs";
export default class LdZoom {
readonly containerElement: HTMLDivElement;
readonly imageElement: HTMLImageElement;
- readonly pictureProperties: Gallery.PictureProperties;
+ readonly pictureProperties: PictureProperties;
readonly maxScaleFactor: number;
readonly scrollZoomSpeed: number;
scaleFactor: number = 0.0;
@@ -33,7 +34,7 @@ export default class LdZoom {
constructor(
containerElement: HTMLDivElement,
imageElement: HTMLImageElement,
- pictureProperties: Gallery.PictureProperties,
+ pictureProperties: PictureProperties,
maxScaleFactor: number,
scrollZoomSpeed: number
) {
@@ -83,7 +84,7 @@ export default class LdZoom {
/**
* Returns the picture resolution as it should be displayed.
*/
- private getDisplayResolution(): Gallery.Resolution {
+ private getDisplayResolution(): Resolution {
return {
width: this.pictureProperties.resolution.width * this.scaleFactor,
height: this.pictureProperties.resolution.height * this.scaleFactor,
diff --git a/viewer/src/services/navigation.ts b/viewer/src/services/navigation.ts
index 5b0716d..9bbd90c 100644
--- a/viewer/src/services/navigation.ts
+++ b/viewer/src/services/navigation.ts
@@ -17,6 +17,7 @@
-- along with this program. If not, see .
*/
+import { DirectoryItem, Item } from "@/@types/gallery";
import { ItemType } from "@/@types/ItemType";
export default class Navigation {
@@ -31,7 +32,7 @@ export default class Navigation {
};
// Searches for an item by path from a root item (navigation)
- public static searchCurrentItemPath(root: Gallery.Item, path: string): Gallery.Item[] {
+ public static searchCurrentItemPath(root: Item, path: string): Item[] {
if (path === root.path) return [root];
if (root.properties.type === ItemType.DIRECTORY && path.startsWith(root.path)) {
const itemChain = root.properties.items
@@ -51,20 +52,20 @@ export default class Navigation {
}
// Checks if the type of an item matches
- public static checkType(item: Gallery.Item | null, type: ItemType | null): boolean {
+ public static checkType(item: Item | null, type: ItemType | null): boolean {
return (item?.properties.type ?? null) === type;
}
- public static getLastDirectory(itemPath: Gallery.Item[]): Gallery.Directory {
+ public static getLastDirectory(itemPath: Item[]): DirectoryItem {
for (let idx = itemPath.length - 1; idx >= 0; idx--) {
const item = itemPath[idx];
- if (Navigation.checkType(item, ItemType.DIRECTORY)) return item as Gallery.Directory;
+ if (Navigation.checkType(item, ItemType.DIRECTORY)) return item as DirectoryItem;
}
throw new Error("No directory found");
}
// Sort a list of items, moving the directories to the beginning of the list
- public static directoriesFirst(items: Gallery.Item[]) {
+ public static directoriesFirst(items: Item[]) {
return [
...items
.filter(child => Navigation.checkType(child, ItemType.DIRECTORY))
@@ -75,13 +76,13 @@ export default class Navigation {
}
// Get the icon for an item
- public static getIcon(item: Gallery.Item): string {
+ public static getIcon(item: Item): string {
if (item.path.length <= 1) return "home";
return Navigation.ICON_BY_TYPE[item.properties.type];
}
// Get the file name of an item, without its cache timestamp
- public static getFileName(item: Gallery.Item): string {
+ public static getFileName(item: Item): string {
if (item.properties.type === ItemType.DIRECTORY) return item.title;
const timeStamped = item.properties.resource.split("/").pop() ?? "";
return timeStamped.split("?")[0];
--
cgit v1.2.3
From 92cb34b719b481faf417760f307241e8f6d777a9 Mon Sep 17 00:00:00 2001
From: Zero~Informatique
Date: Fri, 2 Jul 2021 22:59:56 +0200
Subject: viewer: types normalization - tag.d.ts
GitHub: closes #301
---
viewer/src/services/indexfactory.ts | 29 +++++++++++++++--------------
viewer/src/services/indexsearch.ts | 13 +++++++------
2 files changed, 22 insertions(+), 20 deletions(-)
(limited to 'viewer/src/services')
diff --git a/viewer/src/services/indexfactory.ts b/viewer/src/services/indexfactory.ts
index 0c5fdc5..691a765 100644
--- a/viewer/src/services/indexfactory.ts
+++ b/viewer/src/services/indexfactory.ts
@@ -20,17 +20,18 @@
import { Item, RawTag } from "@/@types/gallery";
import { ItemType } from "@/@types/ItemType";
import { Operation } from "@/@types/Operation";
+import { TagCategory, TagIndex, TagNode, TagSearch } from "@/@types/tag";
import Navigation from "@/services/navigation";
export default class IndexFactory {
- public static generateTags(root: Item | null): Tag.Index {
- const tagsIndex: Tag.Index = {};
+ public static generateTags(root: Item | null): TagIndex {
+ const tagsIndex: TagIndex = {};
if (root) IndexFactory.pushTagsForItem(tagsIndex, root);
return tagsIndex;
}
// Pushes all tags for a root item (and its children) to the index
- private static pushTagsForItem(tagsIndex: Tag.Index, item: Item): void {
+ private static pushTagsForItem(tagsIndex: TagIndex, item: Item): void {
if (item.properties.type === ItemType.DIRECTORY) {
item.properties.items.forEach(item => this.pushTagsForItem(tagsIndex, item));
return; // Directories are not indexed
@@ -50,7 +51,7 @@ export default class IndexFactory {
}
}
- private static pushPartToIndex(index: Tag.Node, part: string, item: Item, rootPart: boolean): Tag.Node {
+ private static pushPartToIndex(index: TagNode, part: string, item: Item, rootPart: boolean): TagNode {
if (!index)
index = {
tag: part,
@@ -69,8 +70,8 @@ export default class IndexFactory {
// ---
- public static searchTags(tagsIndex: Tag.Index, filter: string, strict: boolean): Tag.Search[] {
- let search: Tag.Search[] = [];
+ public static searchTags(tagsIndex: TagIndex, filter: string, strict: boolean): TagSearch[] {
+ let search: TagSearch[] = [];
if (tagsIndex && filter) {
const operation = IndexFactory.extractOperation(filter);
if (operation !== Operation.INTERSECTION) filter = filter.slice(1);
@@ -96,12 +97,12 @@ export default class IndexFactory {
}
private static searchTagsFromFilterWithCategory(
- tagsIndex: Tag.Index,
+ tagsIndex: TagIndex,
operation: Operation,
category: string,
disambiguation: string,
strict: boolean
- ): Tag.Search[] {
+ ): TagSearch[] {
category = Navigation.normalize(category);
disambiguation = Navigation.normalize(disambiguation);
return Object.values(tagsIndex)
@@ -114,28 +115,28 @@ export default class IndexFactory {
}
private static searchTagsFromFilter(
- tagsIndex: Tag.Index,
+ tagsIndex: TagIndex,
operation: Operation,
filter: string,
strict: boolean
- ): Tag.Search[] {
+ ): TagSearch[] {
filter = Navigation.normalize(filter);
return Object.values(tagsIndex)
.filter(node => IndexFactory.matches(node, filter, strict))
.map(node => ({ ...node, operation, display: `${operation}${node.tag}` }));
}
- private static matches(node: Tag.Node, filter: string, strict: boolean): boolean {
+ private static matches(node: TagNode, filter: string, strict: boolean): boolean {
if (strict) return node.tagfiltered === filter;
return node.tagfiltered.includes(filter);
}
// ---
- public static generateCategories(tagsIndex: Tag.Index, categoryTags?: RawTag[]): Tag.Category[] {
+ public static generateCategories(tagsIndex: TagIndex, categoryTags?: RawTag[]): TagCategory[] {
if (!categoryTags?.length) return [{ tag: "", index: tagsIndex }];
- const tagsCategories: Tag.Category[] = [];
+ const tagsCategories: TagCategory[] = [];
const tagsRemaining = new Map(Object.entries(tagsIndex));
categoryTags
.map(tag => ({ tag, index: tagsIndex[tag]?.children }))
@@ -150,7 +151,7 @@ export default class IndexFactory {
return tagsCategories;
}
- private static isDiscriminantTagOnly(tags: RawTag[], node: Tag.Node): boolean {
+ private static isDiscriminantTagOnly(tags: RawTag[], node: TagNode): boolean {
return !tags.includes(node.tag) || !node.childPart;
}
}
diff --git a/viewer/src/services/indexsearch.ts b/viewer/src/services/indexsearch.ts
index eda1b27..57bd03c 100644
--- a/viewer/src/services/indexsearch.ts
+++ b/viewer/src/services/indexsearch.ts
@@ -19,25 +19,26 @@
import { Item } from "@/@types/gallery";
import { Operation } from "@/@types/Operation";
+import { TagSearch, TagSearchByOperation } from "@/@types/tag";
export default class IndexSearch {
// Results of the search (by tags)
- public static search(searchTags: Tag.Search[]): Item[] {
+ public static search(searchTags: TagSearch[]): Item[] {
const byOperation = this.extractTagsByOperation(searchTags);
const intersection = this.extractIntersection(byOperation);
const substraction = this.extractSubstraction(byOperation);
return this.aggregateAll(byOperation, intersection, substraction);
}
- private static extractTagsByOperation(searchTags: Tag.Search[]): Tag.SearchByOperation {
- const byOperation: Tag.SearchByOperation = {};
+ private static extractTagsByOperation(searchTags: TagSearch[]): TagSearchByOperation {
+ const byOperation: TagSearchByOperation = {};
Object.values(Operation).forEach(
operation => (byOperation[operation] = searchTags.filter(tag => tag.operation === operation))
);
return byOperation;
}
- private static extractIntersection(byOperation: Tag.SearchByOperation): Set
- {
+ private static extractIntersection(byOperation: TagSearchByOperation): Set
- {
const intersection = new Set
- ();
if (byOperation[Operation.INTERSECTION].length > 0) {
byOperation[Operation.INTERSECTION]
@@ -49,7 +50,7 @@ export default class IndexSearch {
return intersection;
}
- private static extractSubstraction(byOperation: Tag.SearchByOperation): Set
- {
+ private static extractSubstraction(byOperation: TagSearchByOperation): Set
- {
const substraction = new Set
- ();
if (byOperation[Operation.SUBSTRACTION].length > 0) {
byOperation[Operation.SUBSTRACTION].flatMap(tag => tag.items).forEach(item => substraction.add(item));
@@ -58,7 +59,7 @@ export default class IndexSearch {
}
private static aggregateAll(
- byOperation: Tag.SearchByOperation,
+ byOperation: TagSearchByOperation,
intersection: Set
- ,
substraction: Set
-
): Item[] {
--
cgit v1.2.3