fix svg errors on display and add flagged
This commit is contained in:
parent
dd8f9210a9
commit
6e8e3bf1f4
@ -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;
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user