fix svg errors on display and add flagged

This commit is contained in:
grimhilt 2023-04-26 17:40:07 +02:00
parent dd8f9210a9
commit 6e8e3bf1f4
4 changed files with 91 additions and 41 deletions

View File

@ -225,7 +225,11 @@ function sendMessage() {
:class="[{ 'is-active': editor.isActive('bold') }, 'editorOption']" :class="[{ 'is-active': editor.isActive('bold') }, 'editorOption']"
/> --> /> -->
</div> </div>
<bubble-menu v-if="!showOptions" class="bubble-menu" :tippy-options="{ duration: 100 }" :editor="editor"> <bubble-menu
:class="[showOptions ? 'hide' : '', 'bubble-menu']"
:tippy-options="{ duration: 100 }"
:editor="editor"
>
<SvgLoader <SvgLoader
svg="bold" svg="bold"
@click="editor.chain().focus().toggleBold().run()" @click="editor.chain().focus().toggleBold().run()"
@ -235,7 +239,6 @@ function sendMessage() {
svg="italic" svg="italic"
@click="editor.chain().focus().toggleItalic().run()" @click="editor.chain().focus().toggleItalic().run()"
:class="[{ 'is-active': editor.isActive('italic') }, 'editorOption']" :class="[{ 'is-active': editor.isActive('italic') }, 'editorOption']"
v-tooltip="'Italic'"
/> />
<SvgLoader <SvgLoader
svg="strikethrough" svg="strikethrough"
@ -282,6 +285,10 @@ function sendMessage() {
overflow: auto; overflow: auto;
} }
.hide {
display: none !important;
}
.editor { .editor {
background-color: var(--secondary-background); background-color: var(--secondary-background);
flex: 1; flex: 1;

View File

@ -1,9 +1,9 @@
<script setup lang="ts"> <script setup lang="ts">
import { defineProps, inject, PropType, ref } from "vue"; import { defineProps, inject, PropType, Ref, ref } from "vue";
import { Message } from "@/store/models/model"; import { Message } from "@/store/models/model";
import API from "@/services/imapAPI"; import API from "@/services/imapAPI";
import store from "@/store/store"; import store from "@/store/store";
import { isSeenFc } from "@/utils/flagsUtils"; import { isSeenFc, hasFlag } from "@/utils/flagsUtils";
import SvgLoader from "@/components/utils/SvgLoader.vue"; import SvgLoader from "@/components/utils/SvgLoader.vue";
const props = defineProps({ const props = defineProps({
@ -11,65 +11,88 @@ const props = defineProps({
}); });
const room: any = inject("room"); const room: any = inject("room");
const readLoading = ref(false);
const setFlag = (flag: string) => { const seenLoading = ref(false);
if (readLoading.value) return; const flaggedLoading = ref(false);
readLoading.value = true;
const setReadFlag = () => setFlag("\\Seen", seenLoading);
const setFlaggedFlag = () => setFlag("\\Flagged", flaggedLoading);
const setFlag = (flag: string, loadingState: Ref<boolean>) => {
if (loadingState.value) return;
if (!room?.value || !props.msg) return; if (!room?.value || !props.msg) return;
let apiCall = isSeenFc(props.msg?.flags) ? API.removeFlag : API.addFlag; loadingState.value = true;
let apiCall = hasFlag(props.msg?.flags, flag) ? API.removeFlag : API.addFlag;
apiCall({ apiCall({
mailboxId: room.value?.mailboxId, mailboxId: room.value?.mailboxId,
messageId: props.msg?.id, messageId: props.msg?.id,
flag: flag, flag: flag,
}) })
.then((res) => { .then(() => {
if (isSeenFc(props.msg?.flags)) { if (hasFlag(props.msg?.flags, flag)) {
store.commit("removeFlag", { roomId: room.value?.id, messageId: props.msg?.id, flag: flag }); store.commit("removeFlag", { roomId: room.value?.id, messageId: props.msg?.id, flag: flag });
} else { } else {
store.commit("addFlag", { roomId: room.value?.id, messageId: props.msg?.id, flag: flag }); store.commit("addFlag", { roomId: room.value?.id, messageId: props.msg?.id, flag: flag });
} }
readLoading.value = false; loadingState.value = false;
}) })
.catch((err) => { .catch((err) => {
console.log(err); console.log(err);
readLoading.value = false; loadingState.value = false;
}); });
}; };
</script> </script>
<template> <template>
<div id="main"> <div id="main">
<span @click="setFlag('\\Seen')">
<SvgLoader
v-if="isSeenFc(props.msg?.flags)"
svg="mail-check-line"
class="option"
v-tooltip="'Mark unread'"
:loading="readLoading"
/>
<SvgLoader
v-if="!isSeenFc(props.msg?.flags)"
svg="mail-unread-line"
class="option"
v-tooltip="'Mark as read'"
:loading="readLoading"
/>
</span>
<div>flag favorite</div>
<div>reply</div>
<div>delete from all</div>
<div>delete from remote</div>
<div>transfer</div>
<div>see source</div>
<div>{{ props.msg?.flags }}</div>
<div class="icons"> <div class="icons">
<SvgLoader svg="flag-line" class="option" /> <span @click="setReadFlag()">
<SvgLoader
v-if="isSeenFc(props.msg?.flags)"
svg="mail-check-line"
class="option"
v-tooltip="'Mark unread'"
:loading="seenLoading"
/>
<SvgLoader
v-if="!isSeenFc(props.msg?.flags)"
svg="mail-unread-line"
class="option"
v-tooltip="'Mark as read'"
:loading="seenLoading"
/>
</span>
<span @click="setFlaggedFlag()">
<SvgLoader svg="flag-line" class="option" :loading="flaggedLoading" />
<!--
<SvgLoader
v-if="isSeenFc(props.msg?.flags)"
svg="mail-check-line"
class="option"
v-tooltip="'Mark unread'"
:loading="seenLoading"
/>
<SvgLoader
v-if="!isSeenFc(props.msg?.flags)"
svg="mail-unread-line"
class="option"
v-tooltip="'Mark as read'"
:loading="seenLoading"
/> -->
</span>
<SvgLoader svg="reply-line" class="option" /> <SvgLoader svg="reply-line" class="option" />
<SvgLoader svg="delete-bin-4-line" class="option" classes="danger" v-tooltip="'Delete from server'" /> <SvgLoader svg="delete-bin-4-line" class="option" classes="danger" v-tooltip="'Delete from server'" />
<SvgLoader svg="delete-bin-6-line" class="option" classes="danger" v-tooltip="'Delete everywhere'" /> <SvgLoader svg="delete-bin-6-line" class="option" classes="danger" v-tooltip="'Delete everywhere'" />
<SvgLoader svg="share-forward-line" class="option" /> <SvgLoader svg="share-forward-line" class="option" />
<SvgLoader svg="reply-all-line" class="option" /> <SvgLoader svg="reply-all-line" class="option" />
</div> </div>
<div>reply</div>
<div>delete from all</div>
<div>delete from remote</div>
<div>transfer</div>
<div>see source</div>
<div>{{ props.msg?.flags }}</div>
</div> </div>
</template> </template>

View File

@ -6,6 +6,11 @@ const props = defineProps({
isDisabled: Boolean, isDisabled: Boolean,
classes: String, classes: String,
loading: { type: Boolean, default: false }, loading: { type: Boolean, default: false },
color: {
type: String,
default: `brightness(0) saturate(100%) invert(100%) sepia(4%) saturate(1934%) hue-rotate(130deg)
brightness(114%) contrast(100%)`,
},
}); });
console.log(props.loading); console.log(props.loading);
@ -15,22 +20,27 @@ const pathSvg = () => require(`@/assets/svg/${props.svg}.svg`);
<template> <template>
<div class="mainSvg"> <div class="mainSvg">
<div class="lds-dual-ring" v-if="loading"></div> <div class="lds-dual-ring" v-if="loading"></div>
<img v-if="!loading" :disabled="props.isDisabled" :src="pathSvg()" :class="props.classes" /> <img
v-if="!loading"
:disabled="props.isDisabled"
:src="pathSvg()"
:class="props.classes"
:style="{ filter: color }"
/>
</div> </div>
</template> </template>
<style scoped> <style scoped>
.mainSvg { .mainSvg {
max-height: 26px; display: inherit;
} }
img { img {
filter: var(--svg-primary-text);
padding: 1px; padding: 1px;
} }
img.danger { img.danger {
filter: var(--svg-danger); filter: var(--svg-danger) !important;
} }
.lds-dual-ring { .lds-dual-ring {

View File

@ -1,3 +1,13 @@
export function isSeenFc(flags: string[] | undefined): boolean { export function isSeenFc(flags: string[] | undefined): boolean {
return flags?.includes("\\Seen") ?? false; return flags?.includes("\\Seen") ?? false;
} }
export function hasFlag(flags: string[] | undefined, flag: string): boolean {
if (!flags) return false;
for (let i = 0; i < flags.length; i++) {
if (flags[i] == flag) {
return true;
}
}
return false;
}