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/views/layout/top/LayoutCommandSort.vue | 117 ++++++++++++++++++++++
 1 file changed, 117 insertions(+)
 create mode 100644 viewer/src/views/layout/top/LayoutCommandSort.vue

(limited to 'viewer/src/views/layout/top/LayoutCommandSort.vue')

diff --git a/viewer/src/views/layout/top/LayoutCommandSort.vue b/viewer/src/views/layout/top/LayoutCommandSort.vue
new file mode 100644
index 0000000..bb9744e
--- /dev/null
+++ b/viewer/src/views/layout/top/LayoutCommandSort.vue
@@ -0,0 +1,117 @@
+<!-- ldgallery - A static generator which turns a collection of tagged
+--             pictures into a searchable web gallery.
+--
+-- Copyright (C) 2019-2022  Guillaume FOUET
+--               2020       Pacien TRAN-GIRARD
+--
+-- 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 <https://www.gnu.org/licenses/>.
+-->
+
+<template>
+  <LdLink
+    :title="t('command.sort.title')"
+    :tabindex="props.tabindex"
+    @click="openDropdown"
+  >
+    <fa-icon
+      :icon="faSortAmountDown"
+      size="lg"
+    />
+    <teleport to="body">
+      <Transition name="fade">
+        <div
+          v-if="showDropdown"
+          ref="dropdown"
+          :class="$style.dropdown"
+        >
+          <div
+            v-for="(sort,idx) in itemComparator.ITEM_SORTS"
+            :key="sort.name"
+            :tabindex="props.tabindex + idx + 1"
+            @click="selectedSort=sort"
+            @keypress.enter.space="selectedSort=sort"
+          >
+            <fa-icon :icon="sort.name == selectedSort.name ? faDotCircle : faCircle" />
+            <span v-text="sort.text" />
+          </div>
+        </div>
+      </Transition>
+    </teleport>
+  </LdLink>
+</template>
+
+<script setup lang="ts">
+import LdLink from '@/components/LdLink.vue';
+import { ItemSort, useItemComparator } from '@/services/itemComparator';
+import { useUiStore } from '@/store/uiStore';
+import { faCircle, faDotCircle, faSortAmountDown } from '@fortawesome/free-solid-svg-icons';
+import { onClickOutside, onKeyStroke } from '@vueuse/core';
+import { computed, ref } from 'vue';
+import { useI18n } from 'vue-i18n';
+
+const props = defineProps({
+  tabindex: { type: Number, required: true },
+});
+
+const { t } = useI18n();
+const uiStore = useUiStore();
+const itemComparator = useItemComparator();
+
+const selectedSort = computed({
+  get: () => uiStore.sort,
+  set: (newValue: ItemSort) => (uiStore.sort = newValue),
+});
+
+const showDropdown = ref(false);
+
+const dropdown = ref();
+onClickOutside(dropdown, closeDropdown);
+onKeyStroke('Escape', closeDropdown);
+
+function openDropdown() {
+  showDropdown.value = true;
+}
+function closeDropdown() {
+  setTimeout(() => (showDropdown.value = false));
+}
+</script>
+
+<style lang="scss" module>
+@import "~@/assets/scss/theme";
+
+.dropdown {
+  position: absolute;
+  top: $layout-top;
+  left: 0;
+  z-index: 10;
+  width: $layout-left;
+  color: $input-color;
+  background-color: $dropdown-item-color;
+  padding: 8px 0px;
+  cursor: pointer;
+  > div {
+    padding: 8px 14px;
+    margin: 2px; // For the focus border
+    > span {
+      padding-left: 12px;
+    }
+    &:hover {
+      background-color: $dropdown-item-hover-color;
+    }
+    &:focus {
+      outline: solid 1px $button-active-color;
+    }
+  }
+}
+</style>
-- 
cgit v1.2.3


From e704198437fb589ec8c954d12700d2a1f911522c Mon Sep 17 00:00:00 2001
From: Zéro~Informatique
Date: Sat, 3 Sep 2022 04:41:03 +0200
Subject: viewer: refactoring for tag and sort dropdowns

---
 viewer/src/views/layout/top/LayoutCommandSort.vue | 60 ++++++-----------------
 1 file changed, 14 insertions(+), 46 deletions(-)

(limited to 'viewer/src/views/layout/top/LayoutCommandSort.vue')

diff --git a/viewer/src/views/layout/top/LayoutCommandSort.vue b/viewer/src/views/layout/top/LayoutCommandSort.vue
index bb9744e..8336621 100644
--- a/viewer/src/views/layout/top/LayoutCommandSort.vue
+++ b/viewer/src/views/layout/top/LayoutCommandSort.vue
@@ -22,41 +22,35 @@
   <LdLink
     :title="t('command.sort.title')"
     :tabindex="props.tabindex"
-    @click="openDropdown"
+    @click="showDropdown=!showDropdown"
   >
     <fa-icon
       :icon="faSortAmountDown"
       size="lg"
     />
     <teleport to="body">
-      <Transition name="fade">
-        <div
-          v-if="showDropdown"
-          ref="dropdown"
-          :class="$style.dropdown"
-        >
-          <div
-            v-for="(sort,idx) in itemComparator.ITEM_SORTS"
-            :key="sort.name"
-            :tabindex="props.tabindex + idx + 1"
-            @click="selectedSort=sort"
-            @keypress.enter.space="selectedSort=sort"
-          >
-            <fa-icon :icon="sort.name == selectedSort.name ? faDotCircle : faCircle" />
-            <span v-text="sort.text" />
-          </div>
-        </div>
-      </Transition>
+      <LdDropdown
+        v-model="showDropdown"
+        :list="itemComparator.ITEM_SORTS"
+        :tabindex-root="props.tabindex + 1"
+        :class="$style.dropdown"
+        @select="(sort: ItemSort) => selectedSort=sort"
+      >
+        <template #option="{option}:{option:ItemSort}">
+          <fa-icon :icon="option.name == selectedSort.name ? faDotCircle : faCircle" />
+          <span v-text="option.text" />
+        </template>
+      </LdDropdown>
     </teleport>
   </LdLink>
 </template>
 
 <script setup lang="ts">
+import LdDropdown from '@/components/LdDropdown.vue';
 import LdLink from '@/components/LdLink.vue';
 import { ItemSort, useItemComparator } from '@/services/itemComparator';
 import { useUiStore } from '@/store/uiStore';
 import { faCircle, faDotCircle, faSortAmountDown } from '@fortawesome/free-solid-svg-icons';
-import { onClickOutside, onKeyStroke } from '@vueuse/core';
 import { computed, ref } from 'vue';
 import { useI18n } from 'vue-i18n';
 
@@ -74,44 +68,18 @@ const selectedSort = computed({
 });
 
 const showDropdown = ref(false);
-
-const dropdown = ref();
-onClickOutside(dropdown, closeDropdown);
-onKeyStroke('Escape', closeDropdown);
-
-function openDropdown() {
-  showDropdown.value = true;
-}
-function closeDropdown() {
-  setTimeout(() => (showDropdown.value = false));
-}
 </script>
 
 <style lang="scss" module>
 @import "~@/assets/scss/theme";
 
 .dropdown {
-  position: absolute;
   top: $layout-top;
-  left: 0;
-  z-index: 10;
-  width: $layout-left;
-  color: $input-color;
-  background-color: $dropdown-item-color;
-  padding: 8px 0px;
-  cursor: pointer;
   > div {
     padding: 8px 14px;
-    margin: 2px; // For the focus border
     > span {
       padding-left: 12px;
     }
-    &:hover {
-      background-color: $dropdown-item-hover-color;
-    }
-    &:focus {
-      outline: solid 1px $button-active-color;
-    }
   }
 }
 </style>
-- 
cgit v1.2.3

