aboutsummaryrefslogtreecommitdiff
path: root/viewer/src/services
diff options
context:
space:
mode:
Diffstat (limited to 'viewer/src/services')
-rw-r--r--viewer/src/services/indexfactory.ts13
-rw-r--r--viewer/src/services/indexsearch.ts17
-rw-r--r--viewer/src/services/itemComparators.ts13
-rw-r--r--viewer/src/services/ldzoom.ts7
-rw-r--r--viewer/src/services/navigation.ts15
5 files changed, 35 insertions, 30 deletions
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 @@
17-- along with this program. If not, see <https://www.gnu.org/licenses/>. 17-- along with this program. If not, see <https://www.gnu.org/licenses/>.
18*/ 18*/
19 19
20import { Operation } from "@/@types/Operation"; 20import { Item, RawTag } from "@/@types/gallery";
21import { ItemType } from "@/@types/ItemType"; 21import { ItemType } from "@/@types/ItemType";
22import { Operation } from "@/@types/Operation";
22import Navigation from "@/services/navigation"; 23import Navigation from "@/services/navigation";
23 24
24export default class IndexFactory { 25export default class IndexFactory {
25 public static generateTags(root: Gallery.Item | null): Tag.Index { 26 public static generateTags(root: Item | null): Tag.Index {
26 const tagsIndex: Tag.Index = {}; 27 const tagsIndex: Tag.Index = {};
27 if (root) IndexFactory.pushTagsForItem(tagsIndex, root); 28 if (root) IndexFactory.pushTagsForItem(tagsIndex, root);
28 return tagsIndex; 29 return tagsIndex;
29 } 30 }
30 31
31 // Pushes all tags for a root item (and its children) to the index 32 // Pushes all tags for a root item (and its children) to the index
32 private static pushTagsForItem(tagsIndex: Tag.Index, item: Gallery.Item): void { 33 private static pushTagsForItem(tagsIndex: Tag.Index, item: Item): void {
33 if (item.properties.type === ItemType.DIRECTORY) { 34 if (item.properties.type === ItemType.DIRECTORY) {
34 item.properties.items.forEach(item => this.pushTagsForItem(tagsIndex, item)); 35 item.properties.items.forEach(item => this.pushTagsForItem(tagsIndex, item));
35 return; // Directories are not indexed 36 return; // Directories are not indexed
@@ -49,7 +50,7 @@ export default class IndexFactory {
49 } 50 }
50 } 51 }
51 52
52 private static pushPartToIndex(index: Tag.Node, part: string, item: Gallery.Item, rootPart: boolean): Tag.Node { 53 private static pushPartToIndex(index: Tag.Node, part: string, item: Item, rootPart: boolean): Tag.Node {
53 if (!index) 54 if (!index)
54 index = { 55 index = {
55 tag: part, 56 tag: part,
@@ -131,7 +132,7 @@ export default class IndexFactory {
131 132
132 // --- 133 // ---
133 134
134 public static generateCategories(tagsIndex: Tag.Index, categoryTags?: Gallery.RawTag[]): Tag.Category[] { 135 public static generateCategories(tagsIndex: Tag.Index, categoryTags?: RawTag[]): Tag.Category[] {
135 if (!categoryTags?.length) return [{ tag: "", index: tagsIndex }]; 136 if (!categoryTags?.length) return [{ tag: "", index: tagsIndex }];
136 137
137 const tagsCategories: Tag.Category[] = []; 138 const tagsCategories: Tag.Category[] = [];
@@ -149,7 +150,7 @@ export default class IndexFactory {
149 return tagsCategories; 150 return tagsCategories;
150 } 151 }
151 152
152 private static isDiscriminantTagOnly(tags: Gallery.RawTag[], node: Tag.Node): boolean { 153 private static isDiscriminantTagOnly(tags: RawTag[], node: Tag.Node): boolean {
153 return !tags.includes(node.tag) || !node.childPart; 154 return !tags.includes(node.tag) || !node.childPart;
154 } 155 }
155} 156}
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 @@
17-- along with this program. If not, see <https://www.gnu.org/licenses/>. 17-- along with this program. If not, see <https://www.gnu.org/licenses/>.
18*/ 18*/
19 19
20import { Item } from "@/@types/gallery";
20import { Operation } from "@/@types/Operation"; 21import { Operation } from "@/@types/Operation";
21 22
22export default class IndexSearch { 23export default class IndexSearch {
23 // Results of the search (by tags) 24 // Results of the search (by tags)
24 public static search(searchTags: Tag.Search[]): Gallery.Item[] { 25 public static search(searchTags: Tag.Search[]): Item[] {
25 const byOperation = this.extractTagsByOperation(searchTags); 26 const byOperation = this.extractTagsByOperation(searchTags);
26 const intersection = this.extractIntersection(byOperation); 27 const intersection = this.extractIntersection(byOperation);
27 const substraction = this.extractSubstraction(byOperation); 28 const substraction = this.extractSubstraction(byOperation);
@@ -36,8 +37,8 @@ export default class IndexSearch {
36 return byOperation; 37 return byOperation;
37 } 38 }
38 39
39 private static extractIntersection(byOperation: Tag.SearchByOperation): Set<Gallery.Item> { 40 private static extractIntersection(byOperation: Tag.SearchByOperation): Set<Item> {
40 const intersection = new Set<Gallery.Item>(); 41 const intersection = new Set<Item>();
41 if (byOperation[Operation.INTERSECTION].length > 0) { 42 if (byOperation[Operation.INTERSECTION].length > 0) {
42 byOperation[Operation.INTERSECTION] 43 byOperation[Operation.INTERSECTION]
43 .map(tag => tag.items) 44 .map(tag => tag.items)
@@ -48,8 +49,8 @@ export default class IndexSearch {
48 return intersection; 49 return intersection;
49 } 50 }
50 51
51 private static extractSubstraction(byOperation: Tag.SearchByOperation): Set<Gallery.Item> { 52 private static extractSubstraction(byOperation: Tag.SearchByOperation): Set<Item> {
52 const substraction = new Set<Gallery.Item>(); 53 const substraction = new Set<Item>();
53 if (byOperation[Operation.SUBSTRACTION].length > 0) { 54 if (byOperation[Operation.SUBSTRACTION].length > 0) {
54 byOperation[Operation.SUBSTRACTION].flatMap(tag => tag.items).forEach(item => substraction.add(item)); 55 byOperation[Operation.SUBSTRACTION].flatMap(tag => tag.items).forEach(item => substraction.add(item));
55 } 56 }
@@ -58,9 +59,9 @@ export default class IndexSearch {
58 59
59 private static aggregateAll( 60 private static aggregateAll(
60 byOperation: Tag.SearchByOperation, 61 byOperation: Tag.SearchByOperation,
61 intersection: Set<Gallery.Item>, 62 intersection: Set<Item>,
62 substraction: Set<Gallery.Item> 63 substraction: Set<Item>
63 ): Gallery.Item[] { 64 ): Item[] {
64 byOperation[Operation.ADDITION].flatMap(tag => tag.items).forEach(item => intersection.add(item)); 65 byOperation[Operation.ADDITION].flatMap(tag => tag.items).forEach(item => intersection.add(item));
65 substraction.forEach(item => intersection.delete(item)); 66 substraction.forEach(item => intersection.delete(item));
66 return [...intersection]; 67 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 @@
16-- You should have received a copy of the GNU Affero General Public License 16-- You should have received a copy of the GNU Affero General Public License
17-- along with this program. If not, see <https://www.gnu.org/licenses/>. 17-- along with this program. If not, see <https://www.gnu.org/licenses/>.
18*/ 18*/
19import { TranslateResult } from "vue-i18n"; 19import { Item, ItemSortStr } from "@/@types/gallery";
20import i18n from "@/plugins/i18n"; 20import i18n from "@/plugins/i18n";
21import { TranslateResult } from "vue-i18n";
21 22
22export type ItemComparator = (left: Gallery.Item, right: Gallery.Item) => number; 23export type ItemComparator = (left: Item, right: Item) => number;
23export type ItemSort = { text: TranslateResult; fn: ItemComparator }; 24export type ItemSort = { text: TranslateResult; fn: ItemComparator };
24 25
25export default class ItemComparators { 26export default class ItemComparators {
26 static readonly ITEM_SORTS: Record<Gallery.ItemSortStr, ItemSort> = { 27 static readonly ITEM_SORTS: Record<ItemSortStr, ItemSort> = {
27 title_asc: { 28 title_asc: {
28 text: i18n.t("command.sort.byTitleAsc"), 29 text: i18n.t("command.sort.byTitleAsc"),
29 fn: ItemComparators.chain(ItemComparators.sortByTitleAsc, ItemComparators.sortByPathAsc), 30 fn: ItemComparators.chain(ItemComparators.sortByTitleAsc, ItemComparators.sortByPathAsc),
@@ -40,7 +41,7 @@ export default class ItemComparators {
40 41
41 static readonly DEFAULT = ItemComparators.ITEM_SORTS.date_asc; 42 static readonly DEFAULT = ItemComparators.ITEM_SORTS.date_asc;
42 43
43 static sortByPathAsc(left: Gallery.Item, right: Gallery.Item): number { 44 static sortByPathAsc(left: Item, right: Item): number {
44 return left.path.localeCompare(right.path, undefined, { 45 return left.path.localeCompare(right.path, undefined, {
45 sensitivity: "base", 46 sensitivity: "base",
46 ignorePunctuation: true, 47 ignorePunctuation: true,
@@ -48,7 +49,7 @@ export default class ItemComparators {
48 }); 49 });
49 } 50 }
50 51
51 static sortByTitleAsc(left: Gallery.Item, right: Gallery.Item): number { 52 static sortByTitleAsc(left: Item, right: Item): number {
52 return left.title.localeCompare(right.title, undefined, { 53 return left.title.localeCompare(right.title, undefined, {
53 sensitivity: "base", 54 sensitivity: "base",
54 ignorePunctuation: true, 55 ignorePunctuation: true,
@@ -56,7 +57,7 @@ export default class ItemComparators {
56 }); 57 });
57 } 58 }
58 59
59 static sortByDateAsc(left: Gallery.Item, right: Gallery.Item): number { 60 static sortByDateAsc(left: Item, right: Item): number {
60 return left.datetime.localeCompare(right.datetime); // TODO: handle timezones 61 return left.datetime.localeCompare(right.datetime); // TODO: handle timezones
61 } 62 }
62 63
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 @@
17-- along with this program. If not, see <https://www.gnu.org/licenses/>. 17-- along with this program. If not, see <https://www.gnu.org/licenses/>.
18*/ 18*/
19 19
20import { PictureProperties, Resolution } from "@/@types/gallery";
20import "hammerjs"; 21import "hammerjs";
21 22
22/** 23/**
@@ -25,7 +26,7 @@ import "hammerjs";
25export default class LdZoom { 26export default class LdZoom {
26 readonly containerElement: HTMLDivElement; 27 readonly containerElement: HTMLDivElement;
27 readonly imageElement: HTMLImageElement; 28 readonly imageElement: HTMLImageElement;
28 readonly pictureProperties: Gallery.PictureProperties; 29 readonly pictureProperties: PictureProperties;
29 readonly maxScaleFactor: number; 30 readonly maxScaleFactor: number;
30 readonly scrollZoomSpeed: number; 31 readonly scrollZoomSpeed: number;
31 scaleFactor: number = 0.0; 32 scaleFactor: number = 0.0;
@@ -33,7 +34,7 @@ export default class LdZoom {
33 constructor( 34 constructor(
34 containerElement: HTMLDivElement, 35 containerElement: HTMLDivElement,
35 imageElement: HTMLImageElement, 36 imageElement: HTMLImageElement,
36 pictureProperties: Gallery.PictureProperties, 37 pictureProperties: PictureProperties,
37 maxScaleFactor: num