Merge branch 'develop' into fix-dev-enviroment
This commit is contained in:
commit
d1efcd1247
34 changed files with 501 additions and 876 deletions
|
@ -1 +1 @@
|
|||
v16.15.0
|
||||
v18.16.0
|
||||
|
|
|
@ -76,10 +76,10 @@ If you have access to a server that supports one of the sources below, I recomme
|
|||
|
||||
## 🧑💻 Dependencies
|
||||
|
||||
- 🐢 At least [NodeJS](https://nodejs.org/en/) v18.12.1 (v19 recommended)
|
||||
- 🐢 At least [NodeJS](https://nodejs.org/en/) v18.16.0 (v20 recommended)
|
||||
- Install with [nvm](https://github.com/nvm-sh/nvm)
|
||||
- 🐘 At least [PostgreSQL](https://www.postgresql.org/) v12
|
||||
- 🍱 At least [Redis](https://redis.io/) v6 (v7 recommend)
|
||||
- 🐘 At least [PostgreSQL](https://www.postgresql.org/) v12 (v14 recommended)
|
||||
- 🍱 At least [Redis](https://redis.io/) v6 (v7 recommended)
|
||||
- Web Proxy (one of the following)
|
||||
- 🍀 Nginx (recommended)
|
||||
- 🦦 Caddy
|
||||
|
@ -104,7 +104,7 @@ If you have access to a server that supports one of the sources below, I recomme
|
|||
## 👀 Get folder ready
|
||||
|
||||
```sh
|
||||
git clone --depth 1 https://codeberg.org/calckey/calckey.git
|
||||
git clone https://codeberg.org/calckey/calckey.git
|
||||
cd calckey/
|
||||
```
|
||||
|
||||
|
|
|
@ -1802,8 +1802,8 @@ pushNotificationNotSupported: El vostre navegador o servidor no admet notificaci
|
|||
push
|
||||
license: Llicència
|
||||
indexPosts: Índex de notes
|
||||
indexFrom: Índex a partir de l'ID de Publicacions (deixeu en blanc per indexar cada
|
||||
publicació)
|
||||
indexFrom: Índex a partir de l'ID de Publicacions
|
||||
indexFromDescription: Deixeu en blanc per indexar cada publicació
|
||||
indexNotice: Ara indexant. Això probablement trigarà una estona, si us plau, no reinicieu
|
||||
el servidor durant almenys una hora.
|
||||
_instanceTicker:
|
||||
|
|
|
@ -83,6 +83,7 @@ exportRequested: "You've requested an export. This may take a while. It will be
|
|||
\ to your Drive once completed."
|
||||
importRequested: "You've requested an import. This may take a while."
|
||||
lists: "Lists"
|
||||
listsDesc: "Lists let you create timelines with specified users. They can be accessed from the timelines page."
|
||||
noLists: "You don't have any lists"
|
||||
note: "Post"
|
||||
notes: "Posts"
|
||||
|
@ -405,6 +406,7 @@ avoidMultiCaptchaConfirm: "Using multiple Captcha systems may cause interference
|
|||
\ them. Would you like to disable the other Captcha systems currently active? If\
|
||||
\ you would like them to stay enabled, press cancel."
|
||||
antennas: "Antennas"
|
||||
antennasDesc: "Antennas display new posts matching the criteria you set!\n They can be accessed from the timelines page."
|
||||
manageAntennas: "Manage Antennas"
|
||||
name: "Name"
|
||||
antennaSource: "Antenna source"
|
||||
|
@ -686,6 +688,7 @@ logs: "Logs"
|
|||
delayed: "Delayed"
|
||||
database: "Database"
|
||||
channel: "Channels"
|
||||
channelFederationWarn: "Channels do not yet federate to other servers"
|
||||
create: "Create"
|
||||
notificationSetting: "Notification settings"
|
||||
notificationSettingDesc: "Select the types of notification to display."
|
||||
|
@ -771,6 +774,7 @@ pageLikedCount: "Number of received Page likes"
|
|||
contact: "Contact"
|
||||
useSystemFont: "Use the system's default font"
|
||||
clips: "Clips"
|
||||
clipsDesc: "Clips are like share-able categorized bookmarks. You can create clips from the menu of individual posts."
|
||||
experimentalFeatures: "Experimental features"
|
||||
developer: "Developer"
|
||||
makeExplorable: "Make account visible in \"Explore\""
|
||||
|
@ -1065,7 +1069,8 @@ migrationConfirm: "Are you absolutely sure you want to migrate your account to {
|
|||
defaultReaction: "Default emoji reaction for outgoing and incoming posts"
|
||||
license: "License"
|
||||
indexPosts: "Index Posts"
|
||||
indexFrom: "Index from Post ID onwards (leave blank to index every post)"
|
||||
indexFrom: "Index from Post ID onwards"
|
||||
indexFromDescription: "Leave blank to index every post"
|
||||
indexNotice: "Now indexing. This will probably take a while, please don't restart\
|
||||
\ your server for at least an hour."
|
||||
customKaTeXMacro: "Custom KaTeX macros"
|
||||
|
@ -1446,7 +1451,7 @@ _tutorial:
|
|||
\ you follow."
|
||||
step5_4: "The Local {icon} timeline is where you can see posts from everyone else on this server."
|
||||
step5_5: "The Social {icon} timeline is a combination of the Home and Local timelines."
|
||||
step5_6: "The Recommended {icon} timeline is where you can see posts from server\
|
||||
step5_6: "The Recommended {icon} timeline is where you can see posts from servers\
|
||||
\ the admins recommend."
|
||||
step5_7: "The Global {icon} timeline is where you can see posts from every other\
|
||||
\ connected server."
|
||||
|
|
|
@ -966,7 +966,8 @@ migrationConfirm: "本当にこのアカウントを {account} に引っ越し
|
|||
defaultReaction: "リモートとローカルの投稿に対するデフォルトの絵文字リアクション"
|
||||
license: "ライセンス"
|
||||
indexPosts: "投稿をインデックス"
|
||||
indexFrom: "この投稿ID以降をインデックスする(空白で全ての投稿を指定します)"
|
||||
indexFrom: "この投稿ID以降をインデックスする"
|
||||
indexFromDescription: "空白で全ての投稿を指定します"
|
||||
indexNotice: "インデックスを開始しました。完了まで時間がかかる場合があるため、少なくとも1時間はサーバーを再起動しないでください。"
|
||||
customKaTeXMacro: "カスタムKaTeXマクロ"
|
||||
customKaTeXMacroDescription: "数式入力を楽にするためのマクロを設定しましょう!記法はLaTeXにおけるコマンドの定義と同様に \\newcommand{\\\
|
||||
|
|
|
@ -1898,7 +1898,8 @@ sendPushNotificationReadMessageCaption: Powiadomienie zawierające tekst "{empty
|
|||
defaultReaction: Domyślna reakcja emoji dla wychodzących i przychodzących wpisów
|
||||
license: Licencja
|
||||
indexPosts: Indeksuj wpisy
|
||||
indexFrom: Indeksuj wpisy od ID (zostaw puste dla indeksowania wszystkich wpisów)
|
||||
indexFrom: Indeksuj wpisy od ID
|
||||
indexFromDescription: Zostaw puste dla indeksowania wszystkich wpisów
|
||||
indexNotice: Indeksuję. Zapewne zajmie to chwilę, nie restartuj serwera przez co najmniej
|
||||
godzinę.
|
||||
customKaTeXMacro: Niestandardowe makra KaTeX
|
||||
|
|
|
@ -1909,8 +1909,8 @@ recommendedInstances: Рекомендованные инстансы
|
|||
defaultReaction: Эмодзи реакция по умолчанию для выходящих и исходящих постов
|
||||
license: Лицензия
|
||||
indexPosts: Индексировать посты
|
||||
indexFrom: Индексировать начиная с идентификатора поста и далее (оставьте пустым для
|
||||
индексации каждого поста)
|
||||
indexFrom: Индексировать начиная с идентификатора поста и далее
|
||||
indexFromDescription: оставьте пустым для индексации каждого поста
|
||||
indexNotice: Теперь индексирование. Вероятно, это займет некоторое время, пожалуйста,
|
||||
не перезагружайте свой сервер по крайней мере в течение часа.
|
||||
customKaTeXMacro: Кастомные KaTex макросы
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "calckey",
|
||||
"version": "14.0.0-dev32",
|
||||
"version": "14.0.0-dev35",
|
||||
"codename": "aqua",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
@ -36,8 +36,8 @@
|
|||
"chokidar": "^3.3.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@bull-board/api": "^4.10.2",
|
||||
"@bull-board/ui": "^4.10.2",
|
||||
"@bull-board/api": "5.2.0",
|
||||
"@bull-board/ui": "5.2.0",
|
||||
"@napi-rs/cli": "^2.15.0",
|
||||
"@tensorflow/tfjs": "^3.21.0",
|
||||
"focus-trap": "^7.2.0",
|
||||
|
|
|
@ -23,9 +23,9 @@
|
|||
"@tensorflow/tfjs-node": "3.21.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"@bull-board/api": "^4.6.4",
|
||||
"@bull-board/koa": "^4.6.4",
|
||||
"@bull-board/ui": "^4.6.4",
|
||||
"@bull-board/api": "5.2.0",
|
||||
"@bull-board/koa": "5.2.0",
|
||||
"@bull-board/ui": "5.2.0",
|
||||
"@calckey/megalodon": "5.2.0",
|
||||
"@discordapp/twemoji": "14.0.2",
|
||||
"@elastic/elasticsearch": "7.17.0",
|
||||
|
@ -68,7 +68,7 @@
|
|||
"fluent-ffmpeg": "2.1.2",
|
||||
"got": "12.5.3",
|
||||
"hpagent": "0.1.2",
|
||||
"ioredis": "5.2.4",
|
||||
"ioredis": "5.3.2",
|
||||
"ip-cidr": "3.0.11",
|
||||
"is-svg": "4.3.2",
|
||||
"js-yaml": "4.1.0",
|
||||
|
|
|
@ -1,21 +1,48 @@
|
|||
<template>
|
||||
<div class="fpezltsf" :class="{ warn }">
|
||||
<div v-if="visible" class="info" :class="{ warn, card }">
|
||||
<i v-if="warn" class="ph-warning ph-bold ph-lg"></i>
|
||||
<i v-else class="ph-info ph-bold ph-lg"></i>
|
||||
<i
|
||||
v-else
|
||||
class="ph-bold ph-lg"
|
||||
:class="icon ? `ph-${icon}` : 'ph-info'"
|
||||
></i>
|
||||
<slot></slot>
|
||||
<button
|
||||
v-if="closeable"
|
||||
v-tooltip="i18n.ts.close"
|
||||
class="_button close"
|
||||
@click.stop="close"
|
||||
>
|
||||
<i class="ph-x ph-bold ph-lg"></i>
|
||||
</button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import {} from "vue";
|
||||
import { ref } from "vue";
|
||||
import { i18n } from "@/i18n";
|
||||
|
||||
const visible = ref(true);
|
||||
|
||||
defineProps<{
|
||||
icon?: string;
|
||||
warn?: boolean;
|
||||
card?: boolean;
|
||||
closeable?: boolean;
|
||||
}>();
|
||||
|
||||
const emit = defineEmits<{
|
||||
(ev: "close"): void;
|
||||
}>();
|
||||
|
||||
function close() {
|
||||
visible.value = false;
|
||||
emit("close");
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.fpezltsf {
|
||||
.info {
|
||||
padding: 16px;
|
||||
font-size: 90%;
|
||||
background: var(--infoBg);
|
||||
|
@ -27,8 +54,34 @@ defineProps<{
|
|||
color: var(--infoWarnFg);
|
||||
}
|
||||
|
||||
&.card {
|
||||
background: var(--panel);
|
||||
color: var(--fg);
|
||||
padding: 48px;
|
||||
font-size: 1em;
|
||||
text-align: center;
|
||||
> i {
|
||||
display: block;
|
||||
font-size: 4em;
|
||||
margin: 0;
|
||||
}
|
||||
> :deep(*) {
|
||||
margin-inline: auto;
|
||||
}
|
||||
> :deep(:not(:last-child)) {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
> :deep(p) {
|
||||
max-width: 30em;
|
||||
}
|
||||
}
|
||||
|
||||
> i {
|
||||
margin-right: 4px;
|
||||
}
|
||||
> .close {
|
||||
margin-left: auto;
|
||||
float: right;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
</slot>
|
||||
</div>
|
||||
|
||||
<div v-else ref="rootEl">
|
||||
<div v-else ref="rootEl" class="list">
|
||||
<div
|
||||
v-show="pagination.reversed && more"
|
||||
key="_more_"
|
||||
|
@ -487,4 +487,11 @@ defineExpose({
|
|||
margin-right: auto;
|
||||
}
|
||||
}
|
||||
.list > :deep(._button) {
|
||||
margin-inline: auto;
|
||||
margin-bottom: 16px;
|
||||
&:last-of-type:not(:first-child) {
|
||||
margin-top: 16px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -1030,6 +1030,8 @@ onMounted(() => {
|
|||
}
|
||||
|
||||
> header {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
z-index: 1000;
|
||||
height: 66px;
|
||||
|
||||
|
|
|
@ -1,4 +1,14 @@
|
|||
<template>
|
||||
<MkInfo
|
||||
v-if="tlHint && !tlHintClosed"
|
||||
:closeable="true"
|
||||
class="_gap"
|
||||
@close="closeHint"
|
||||
>
|
||||
<I18n :src="tlHint">
|
||||
<template #icon></template>
|
||||
</I18n>
|
||||
</MkInfo>
|
||||
<XNotes
|
||||
ref="tlComponent"
|
||||
:no-gap="!$store.state.showGapBetweenNotesInTimeline"
|
||||
|
@ -10,10 +20,13 @@
|
|||
<script lang="ts" setup>
|
||||
import { ref, computed, provide, onUnmounted } from "vue";
|
||||
import XNotes from "@/components/MkNotes.vue";
|
||||
import MkInfo from "@/components/MkInfo.vue";
|
||||
import * as os from "@/os";
|
||||
import { stream } from "@/stream";
|
||||
import * as sound from "@/scripts/sound";
|
||||
import { $i } from "@/account";
|
||||
import { i18n } from "@/i18n";
|
||||
import { defaultStore } from "@/store";
|
||||
|
||||
const props = defineProps<{
|
||||
src: string;
|
||||
|
@ -64,6 +77,9 @@ let query;
|
|||
let connection;
|
||||
let connection2;
|
||||
|
||||
let tlHint;
|
||||
let tlHintClosed;
|
||||
|
||||
if (props.src === "antenna") {
|
||||
endpoint = "antennas/notes";
|
||||
query = {
|
||||
|
@ -81,22 +97,37 @@ if (props.src === "antenna") {
|
|||
connection2 = stream.useChannel("main");
|
||||
connection2.on("follow", onChangeFollowing);
|
||||
connection2.on("unfollow", onChangeFollowing);
|
||||
|
||||
tlHint = i18n.ts._tutorial.step5_3;
|
||||
tlHintClosed = defaultStore.state.tlHomeHintClosed;
|
||||
} else if (props.src === "local") {
|
||||
endpoint = "notes/local-timeline";
|
||||
connection = stream.useChannel("localTimeline");
|
||||
connection.on("note", prepend);
|
||||
|
||||
tlHint = i18n.ts._tutorial.step5_4;
|
||||
tlHintClosed = defaultStore.state.tlLocalHintClosed;
|
||||
} else if (props.src === "recommended") {
|
||||
endpoint = "notes/recommended-timeline";
|
||||
connection = stream.useChannel("recommendedTimeline");
|
||||
connection.on("note", prepend);
|
||||
|
||||
tlHint = i18n.ts._tutorial.step5_6;
|
||||
tlHintClosed = defaultStore.state.tlRecommendedHintClosed;
|
||||
} else if (props.src === "social") {
|
||||
endpoint = "notes/hybrid-timeline";
|
||||
connection = stream.useChannel("hybridTimeline");
|
||||
connection.on("note", prepend);
|
||||
|
||||
tlHint = i18n.ts._tutorial.step5_5;
|
||||
tlHintClosed = defaultStore.state.tlSocialHintClosed;
|
||||
} else if (props.src === "global") {
|
||||
endpoint = "notes/global-timeline";
|
||||
connection = stream.useChannel("globalTimeline");
|
||||
connection.on("note", prepend);
|
||||
|
||||
tlHint = i18n.ts._tutorial.step5_7;
|
||||
tlHintClosed = defaultStore.state.tlGlobalHintClosed;
|
||||
} else if (props.src === "mentions") {
|
||||
endpoint = "notes/mentions";
|
||||
connection = stream.useChannel("main");
|
||||
|
@ -135,6 +166,26 @@ if (props.src === "antenna") {
|
|||
connection.on("note", prepend);
|
||||
}
|
||||
|
||||
function closeHint() {
|
||||
switch (props.src) {
|
||||
case "home":
|
||||
defaultStore.set("tlHomeHintClosed", true);
|
||||
break;
|
||||
case "local":
|
||||
defaultStore.set("tlLocalHintClosed", true);
|
||||
break;
|
||||
case "recommended":
|
||||
defaultStore.set("tlRecommendedHintClosed", true);
|
||||
break;
|
||||
case "social":
|
||||
defaultStore.set("tlSocialHintClosed", true);
|
||||
break;
|
||||
case "global":
|
||||
defaultStore.set("tlGlobalHintClosed", true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const pagination = {
|
||||
endpoint: endpoint,
|
||||
limit: 10,
|
||||
|
|
|
@ -227,7 +227,7 @@ onUnmounted(() => {
|
|||
|
||||
.mk-url-preview {
|
||||
> .expand-tweet {
|
||||
margin-top: 1rem;
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
|
||||
&.max-width_400px {
|
||||
|
|
|
@ -1,554 +0,0 @@
|
|||
<template>
|
||||
<div class="_debobigegoItem">
|
||||
<div class="_debobigegoLabel">
|
||||
<i class="ph-microchip ph-bold ph-lg"></i>
|
||||
{{ i18n.ts.cpuAndMemory }}
|
||||
</div>
|
||||
<div class="_debobigegoPanel xhexznfu">
|
||||
<div>
|
||||
<canvas :ref="cpumem"></canvas>
|
||||
</div>
|
||||
<div v-if="serverInfo">
|
||||
<div class="_table">
|
||||
<div class="_row">
|
||||
<div class="_cell">
|
||||
<div class="_label">MEM total</div>
|
||||
{{ bytes(serverInfo.mem.total) }}
|
||||
</div>
|
||||
<div class="_cell">
|
||||
<div class="_label">MEM used</div>
|
||||
{{ bytes(memUsage) }} ({{
|
||||
(
|
||||
(memUsage / serverInfo.mem.total) *
|
||||
100
|
||||
).toFixed(0)
|
||||
}}%)
|
||||
</div>
|
||||
<div class="_cell">
|
||||
<div class="_label">MEM free</div>
|
||||
{{ bytes(serverInfo.mem.total - memUsage) }} ({{
|
||||
(
|
||||
((serverInfo.mem.total - memUsage) /
|
||||
serverInfo.mem.total) *
|
||||
100
|
||||
).toFixed(0)
|
||||
}}%)
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="_debobigegoItem">
|
||||
<div class="_debobigegoLabel">
|
||||
<i class="ph-hard-drives ph-bold ph-lg"></i> {{ i18n.ts.disk }}
|
||||
</div>
|
||||
<div class="_debobigegoPanel xhexznfu">
|
||||
<div>
|
||||
<canvas :ref="disk"></canvas>
|
||||
</div>
|
||||
<div v-if="serverInfo">
|
||||
<div class="_table">
|
||||
<div class="_row">
|
||||
<div class="_cell">
|
||||
<div class="_label">Disk total</div>
|
||||
{{ bytes(serverInfo.fs.total) }}
|
||||
</div>
|
||||
<div class="_cell">
|
||||
<div class="_label">Disk used</div>
|
||||
{{ bytes(serverInfo.fs.used) }} ({{
|
||||
(
|
||||
(serverInfo.fs.used / serverInfo.fs.total) *
|
||||
100
|
||||
).toFixed(0)
|
||||
}}%)
|
||||
</div>
|
||||
<div class="_cell">
|
||||
<div class="_label">Disk free</div>
|
||||
{{
|
||||
bytes(serverInfo.fs.total - serverInfo.fs.used)
|
||||
}}
|
||||
({{
|
||||
(
|
||||
((serverInfo.fs.total -
|
||||
serverInfo.fs.used) /
|
||||
serverInfo.fs.total) *
|
||||
100
|
||||
).toFixed(0)
|
||||
}}%)
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="_debobigegoItem">
|
||||
<div class="_debobigegoLabel">
|
||||
<i class="ph-swap ph-bold ph-lg"></i> {{ i18n.ts.network }}
|
||||
</div>
|
||||
<div class="_debobigegoPanel xhexznfu">
|
||||
<div>
|
||||
<canvas :ref="net"></canvas>
|
||||
</div>
|
||||
<div v-if="serverInfo">
|
||||
<div class="_table">
|
||||
<div class="_row">
|
||||
<div class="_cell">
|
||||
<div class="_label">Interface</div>
|
||||
{{ serverInfo.net.interface }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, markRaw } from "vue";
|
||||
import {
|
||||
Chart,
|
||||
ArcElement,
|
||||
LineElement,
|
||||
BarElement,
|
||||
PointElement,
|
||||
BarController,
|
||||
LineController,
|
||||
CategoryScale,
|
||||
LinearScale,
|
||||
Legend,
|
||||
Title,
|
||||
Tooltip,
|
||||
SubTitle,
|
||||
} from "chart.js";
|
||||
import MkwFederation from "../../widgets/federation.vue";
|
||||
import MkButton from "@/components/MkButton.vue";
|
||||
import MkSelect from "@/components/form/select.vue";
|
||||
import MkInput from "@/components/form/input.vue";
|
||||
import MkContainer from "@/components/MkContainer.vue";
|
||||
import MkFolder from "@/components/MkFolder.vue";
|
||||
import { version, url } from "@/config";
|
||||
import bytes from "@/filters/bytes";
|
||||
import number from "@/filters/number";
|
||||
import { i18n } from "@/i18n";
|
||||
|
||||
Chart.register(
|
||||
ArcElement,
|
||||
LineElement,
|
||||
BarElement,
|
||||
PointElement,
|
||||
BarController,
|
||||
LineController,
|
||||
CategoryScale,
|
||||
LinearScale,
|
||||
Legend,
|
||||
Title,
|
||||
Tooltip,
|
||||
SubTitle
|
||||
);
|
||||
|
||||
const alpha = (hex, a) => {
|
||||
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)!;
|
||||
const r = parseInt(result[1], 16);
|
||||
const g = parseInt(result[2], 16);
|
||||
const b = parseInt(result[3], 16);
|
||||
return `rgba(${r}, ${g}, ${b}, ${a})`;
|
||||
};
|
||||
import * as os from "@/os";
|
||||
import { stream } from "@/stream";
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
MkButton,
|
||||
MkSelect,
|
||||
MkInput,
|
||||
MkContainer,
|
||||
MkFolder,
|
||||
MkwFederation,
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
version,
|
||||
url,
|
||||
stats: null,
|
||||
serverInfo: null,
|
||||
connection: null,
|
||||
queueConnection: markRaw(stream.useChannel("queueStats")),
|
||||
memUsage: 0,
|
||||
chartCpuMem: null,
|
||||
chartNet: null,
|
||||
jobs: [],
|
||||
logs: [],
|
||||
logLevel: "all",
|
||||
logDomain: "",
|
||||
modLogs: [],
|
||||
dbInfo: null,
|
||||
overviewHeight: "1fr",
|
||||
queueHeight: "1fr",
|
||||
paused: false,
|
||||
i18n,
|
||||
};
|
||||
},
|
||||
|
||||
computed: {
|
||||
gridColor() {
|
||||
// TODO: var(--panel)の色が暗いか明るいかで判定する
|
||||
return this.$store.state.darkMode
|
||||
? "rgba(255, 255, 255, 0.1)"
|
||||
: "rgba(0, 0, 0, 0.1)";
|
||||
},
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.fetchJobs();
|
||||
|
||||
Chart.defaults.color = getComputedStyle(
|
||||
document.documentElement
|
||||
).getPropertyValue("--fg");
|
||||
|
||||
os.api("admin/server-info", {}).then((res) => {
|
||||
this.serverInfo = res;
|
||||
|
||||
this.connection = markRaw(stream.useChannel("serverStats"));
|
||||
this.connection.on("stats", this.onStats);
|
||||
this.connection.on("statsLog", this.onStatsLog);
|
||||
this.connection.send("requestLog", {
|
||||
id: Math.random().toString().substr(2, 8),
|
||||
length: 150,
|
||||
});
|
||||
|
||||
this.$nextTick(() => {
|
||||
this.queueConnection.send("requestLog", {
|
||||
id: Math.random().toString().substr(2, 8),
|
||||
length: 200,
|
||||
});
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
beforeUnmount() {
|
||||
if (this.connection) {
|
||||
this.connection.off("stats", this.onStats);
|
||||
this.connection.off("statsLog", this.onStatsLog);
|
||||
this.connection.dispose();
|
||||
}
|
||||
this.queueConnection.dispose();
|
||||
},
|
||||
|
||||
methods: {
|
||||
cpumem(el) {
|
||||
if (this.chartCpuMem != null) return;
|
||||
this.chartCpuMem = markRaw(
|
||||
new Chart(el, {
|
||||
type: "line",
|
||||
data: {
|
||||
labels: [],
|
||||
datasets: [
|
||||
{
|
||||
label: "CPU",
|
||||
pointRadius: 0,
|
||||
tension: 0,
|
||||
borderWidth: 2,
|
||||
borderColor: "#31748f",
|
||||
backgroundColor: alpha("#31748f", 0.1),
|
||||
data: [],
|
||||
},
|
||||
{
|
||||
label: "MEM (active)",
|
||||
pointRadius: 0,
|
||||
tension: 0,
|
||||
borderWidth: 2,
|
||||
borderColor: "#c4a7e7",
|
||||
backgroundColor: alpha("#c4a7e7", 0.02),
|
||||
data: [],
|
||||
},
|
||||
{
|
||||
label: "MEM (used)",
|
||||
pointRadius: 0,
|
||||
tension: 0,
|
||||
borderWidth: 2,
|
||||
borderColor: "#ebbcba",
|
||||
borderDash: [5, 5],
|
||||
fill: false,
|
||||
data: [],
|
||||
},
|
||||
],
|
||||
},
|
||||
options: {
|
||||
aspectRatio: 3,
|
||||
layout: {
|
||||
padding: {
|
||||
left: 16,
|
||||
right: 16,
|
||||
top: 16,
|
||||
bottom: 0,
|
||||
},
|
||||
},
|
||||
legend: {
|
||||
position: "bottom",
|
||||
labels: {
|
||||
boxWidth: 16,
|
||||
},
|
||||
},
|
||||
scales: {
|
||||
x: {
|
||||
gridLines: {
|
||||
display: false,
|
||||
color: this.gridColor,
|
||||
zeroLineColor: this.gridColor,
|
||||
},
|
||||
ticks: {
|
||||
display: false,
|
||||
},
|
||||
},
|
||||
y: {
|
||||
position: "right",
|
||||
gridLines: {
|
||||
display: true,
|
||||
color: this.gridColor,
|
||||
zeroLineColor: this.gridColor,
|
||||
},
|
||||
ticks: {
|
||||
display: false,
|
||||
max: 100,
|
||||
},
|
||||
},
|
||||
},
|
||||
tooltips: {
|
||||
intersect: false,
|
||||
mode: "index",
|
||||
},
|
||||
},
|
||||
})
|
||||
);
|
||||
},
|
||||
|
||||
net(el) {
|
||||
if (this.chartNet != null) return;
|
||||
this.chartNet = markRaw(
|
||||
new Chart(el, {
|
||||
type: "line",
|
||||
data: {
|
||||
labels: [],
|
||||
datasets: [
|
||||
{
|
||||
label: "In",
|
||||
pointRadius: 0,
|
||||
tension: 0,
|
||||
borderWidth: 2,
|
||||
borderColor: "#94a029",
|
||||
backgroundColor: alpha("#94a029", 0.1),
|
||||
data: [],
|
||||
},
|
||||
{
|
||||
label: "Out",
|
||||
pointRadius: 0,
|
||||
tension: 0,
|
||||
borderWidth: 2,
|
||||
borderColor: "#ff9156",
|
||||
backgroundColor: alpha("#ff9156", 0.1),
|
||||
data: [],
|
||||
},
|
||||
],
|
||||
},
|
||||
options: {
|
||||
aspectRatio: 3,
|
||||
layout: {
|
||||
padding: {
|
||||
left: 16,
|
||||
right: 16,
|
||||
top: 16,
|
||||
bottom: 0,
|
||||
},
|
||||
},
|
||||
legend: {
|
||||
position: "bottom",
|
||||
labels: {
|
||||
boxWidth: 16,
|
||||
},
|
||||
},
|
||||
scales: {
|
||||
x: {
|
||||
gridLines: {
|
||||
display: false,
|
||||
color: this.gridColor,
|
||||
zeroLineColor: this.gridColor,
|
||||
},
|
||||
ticks: {
|
||||
display: false,
|
||||
},
|
||||
},
|
||||
y: {
|
||||
position: "right",
|
||||
gridLines: {
|
||||
display: true,
|
||||
color: this.gridColor,
|
||||
zeroLineColor: this.gridColor,
|
||||
},
|
||||
ticks: {
|
||||
display: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
tooltips: {
|
||||
intersect: false,
|
||||
mode: "index",
|
||||
},
|
||||
},
|
||||
})
|
||||
);
|
||||
},
|
||||
|
||||
disk(el) {
|
||||
if (this.chartDisk != null) return;
|
||||
this.chartDisk = markRaw(
|
||||
new Chart(el, {
|
||||
type: "line",
|
||||
data: {
|
||||
labels: [],
|
||||
datasets: [
|
||||
{
|
||||
label: "Read",
|
||||
pointRadius: 0,
|
||||
tension: 0,
|
||||
borderWidth: 2,
|
||||
borderColor: "#94a029",
|
||||
backgroundColor: alpha("#94a029", 0.1),
|
||||
data: [],
|
||||
},
|
||||
{
|
||||
label: "Write",
|
||||
pointRadius: 0,
|
||||
tension: 0,
|
||||
borderWidth: 2,
|
||||
borderColor: "#ff9156",
|
||||
backgroundColor: alpha("#ff9156", 0.1),
|
||||
data: [],
|
||||
},
|
||||
],
|
||||
},
|
||||
options: {
|
||||
aspectRatio: 3,
|
||||
layout: {
|
||||
padding: {
|
||||
left: 16,
|
||||
right: 16,
|
||||
top: 16,
|
||||
bottom: 0,
|
||||
},
|
||||
},
|
||||
legend: {
|
||||
position: "bottom",
|
||||
labels: {
|
||||
boxWidth: 16,
|
||||
},
|
||||
},
|
||||
scales: {
|
||||
x: {
|
||||
gridLines: {
|
||||
display: false,
|
||||
color: this.gridColor,
|
||||
zeroLineColor: this.gridColor,
|
||||
},
|
||||
ticks: {
|
||||
display: false,
|
||||
},
|
||||
},
|
||||
y: {
|
||||
position: "right",
|
||||
gridLines: {
|
||||
display: true,
|
||||
color: this.gridColor,
|
||||
zeroLineColor: this.gridColor,
|
||||
},
|
||||
ticks: {
|
||||
display: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
tooltips: {
|
||||
intersect: false,
|
||||
mode: "index",
|
||||
},
|
||||
},
|
||||
})
|
||||
);
|
||||
},
|
||||
|
||||
fetchJobs() {
|
||||
os.api("admin/queue/deliver-delayed", {}).then((jobs) => {
|
||||
this.jobs = jobs;
|
||||
});
|
||||
},
|
||||
|
||||
onStats(stats) {
|
||||
if (this.paused) return;
|
||||
|
||||
const cpu = (stats.cpu * 100).toFixed(0);
|
||||
const memActive = (
|
||||
(stats.mem.active / this.serverInfo.mem.total) *
|
||||
100
|
||||
).toFixed(0);
|
||||
const memUsed = (
|
||||
(stats.mem.used / this.serverInfo.mem.total) *
|
||||
100
|
||||
).toFixed(0);
|
||||
this.memUsage = stats.mem.active;
|
||||
|
||||
this.chartCpuMem.data.labels.push("");
|
||||
this.chartCpuMem.data.datasets[0].data.push(cpu);
|
||||
this.chartCpuMem.data.datasets[1].data.push(memActive);
|
||||
this.chartCpuMem.data.datasets[2].data.push(memUsed);
|
||||
this.chartNet.data.labels.push("");
|
||||
this.chartNet.data.datasets[0].data.push(stats.net.rx);
|
||||
this.chartNet.data.datasets[1].data.push(stats.net.tx);
|
||||
this.chartDisk.data.labels.push("");
|
||||
this.chartDisk.data.datasets[0].data.push(stats.fs.r);
|
||||
this.chartDisk.data.datasets[1].data.push(stats.fs.w);
|
||||
if (this.chartCpuMem.data.datasets[0].data.length > 150) {
|
||||
this.chartCpuMem.data.labels.shift();
|
||||
this.chartCpuMem.data.datasets[0].data.shift();
|
||||
this.chartCpuMem.data.datasets[1].data.shift();
|
||||
this.chartCpuMem.data.datasets[2].data.shift();
|
||||
this.chartNet.data.labels.shift();
|
||||
this.chartNet.data.datasets[0].data.shift();
|
||||
this.chartNet.data.datasets[1].data.shift();
|
||||
this.chartDisk.data.labels.shift();
|
||||
this.chartDisk.data.datasets[0].data.shift();
|
||||
this.chartDisk.data.datasets[1].data.shift();
|
||||
}
|
||||
this.chartCpuMem.update();
|
||||
this.chartNet.update();
|
||||
this.chartDisk.update();
|
||||
},
|
||||
|
||||
onStatsLog(statsLog) {
|
||||
for (const stats of [...statsLog].reverse()) {
|
||||
this.onStats(stats);
|
||||
}
|
||||
},
|
||||
|
||||
bytes,
|
||||
|
||||
number,
|
||||
|
||||
pause() {
|
||||
this.paused = true;
|
||||
},
|
||||
|
||||
resume() {
|
||||
this.paused = false;
|
||||
},
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.xhexznfu {
|
||||
> div:nth-child(2) {
|
||||
padding: 16px;
|
||||
border-top: solid 0.5px var(--divider);
|
||||
}
|
||||
}
|
||||
</style>
|
145
packages/client/src/pages/admin/overview.metrics.vue
Normal file
145
packages/client/src/pages/admin/overview.metrics.vue
Normal file
|
@ -0,0 +1,145 @@
|
|||
<template>
|
||||
<div class="_panel" :class="$style.root">
|
||||
<div class="ntjkdlsfk">
|
||||
<div class="_panel">
|
||||
<XPie class="pie" :value="cpuUsage" />
|
||||
<div>
|
||||
<p><i class="ph-cpu ph-bold ph-lg"></i>CPU</p>
|
||||
<p>{{ meta.cpu.cores }} Logical cores</p>
|
||||
<p>{{ meta.cpu.model }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="_panel">
|
||||
<XPie class="pie" :value="memUsage" />
|
||||
<div>
|
||||
<p><i class="ph-microchip ph-bold ph-lg"></i>RAM</p>
|
||||
<p>Total: {{ bytes(memTotal, 1) }}</p>
|
||||
<p>Used: {{ bytes(memUsed, 1) }}</p>
|
||||
<p>Free: {{ bytes(memFree, 1) }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="_panel">
|
||||
<XPie class="pie" :value="diskUsage" />
|
||||
<div>
|
||||
<p><i class="ph-hard-drives ph-bold ph-lg"></i>Disk</p>
|
||||
<p>Total: {{ bytes(diskTotal, 1) }}</p>
|
||||
<p>Free: {{ bytes(diskAvailable, 1) }}</p>
|
||||
<p>Used: {{ bytes(diskUsed, 1) }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="_panel">
|
||||
<XPie class="pie" :value="meiliProgress" />
|
||||
<div>
|
||||
<p>
|
||||
<i class="ph-file-search ph-bold ph-lg"></i>MeiliSearch
|
||||
</p>
|
||||
<p>
|
||||
{{ i18n.ts._widgets.meiliStatus }}: {{ meiliAvailable }}
|
||||
</p>
|
||||
<p>
|
||||
{{ i18n.ts._widgets.meiliSize }}:
|
||||
{{ bytes(meiliTotalSize, 1) }}
|
||||
</p>
|
||||
<p>
|
||||
{{ i18n.ts._widgets.meiliIndexCount }}:
|
||||
{{ meiliIndexCount }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { onMounted, onUnmounted } from "vue";
|
||||
import XPie from "../../widgets/server-metric/pie.vue";
|
||||
import bytes from "@/filters/bytes";
|
||||
import { stream } from "@/stream";
|
||||
import * as os from "@/os";
|
||||
import { i18n } from "@/i18n";
|
||||
|
||||
const meta = await os.api("server-info", {});
|
||||
const serverStats = await os.api("stats");
|
||||
|
||||
let cpuUsage: number = $ref(0);
|
||||
|
||||
let memUsage: number = $ref(0);
|
||||
let memTotal: number = $ref(0);
|
||||
let memUsed: number = $ref(0);
|
||||
let memFree: number = $ref(0);
|
||||
|
||||
let meiliProgress: number = $ref(0);
|
||||
let meiliTotalSize: number = $ref(0);
|
||||
let meiliIndexCount: number = $ref(0);
|
||||
let meiliAvailable: string = $ref("unavailable");
|
||||
|
||||
const diskUsage = $computed(() => meta.fs.used / meta.fs.total);
|
||||
const diskTotal = $computed(() => meta.fs.total);
|
||||
const diskUsed = $computed(() => meta.fs.used);
|
||||
const diskAvailable = $computed(() => meta.fs.total - meta.fs.used);
|
||||
|
||||
function onStats(stats) {
|
||||
cpuUsage = stats.cpu;
|
||||
|
||||
memUsage = stats.mem.active / meta.mem.total;
|
||||
memTotal = meta.mem.total;
|
||||
memUsed = stats.mem.active;
|
||||
memFree = memTotal - memUsed;
|
||||
|
||||
meiliTotalSize = stats.meilisearch.size;
|
||||
meiliIndexCount = stats.meilisearch.indexed_count;
|
||||
meiliAvailable = stats.meilisearch.health;
|
||||
meiliProgress = meiliIndexCount / serverStats.notesCount;
|
||||
}
|
||||
|
||||
const connection = stream.useChannel("serverStats");
|
||||
onMounted(() => {
|
||||
connection.on("stats", onStats);
|
||||
connection.dispose();
|
||||
});
|
||||
|
||||
onUnmounted(() => {
|
||||
connection.off("stats", onStats);
|
||||
connection.dispose();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" module>
|
||||
.root {
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.ntjkdlsfk {
|
||||
display: flex;
|
||||
padding: 16px;
|
||||
|
||||
> ._panel {
|
||||
> .pie {
|
||||
height: 82px;
|
||||
flex-shrink: 0;
|
||||
margin-right: 16px;
|
||||
}
|
||||
|
||||
> div {
|
||||
flex: 1;
|
||||
|
||||
> p {
|
||||
margin: 0;
|
||||
font-size: 0.8em;
|
||||
|
||||
&:first-child {
|
||||
font-weight: bold;
|
||||
margin-bottom: 4px;
|
||||
|
||||
> i {
|
||||
margin-right: 4px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
|
@ -50,6 +50,11 @@
|
|||
<template #header>Inbox queue</template>
|
||||
<XQueue domain="inbox" />
|
||||
</MkFolder>
|
||||
|
||||
<MkFolder class="item">
|
||||
<template #header>Server metrics</template>
|
||||
<XMetrics domain="inbox" />
|
||||
</MkFolder>
|
||||
</div>
|
||||
</MkSpacer>
|
||||
</template>
|
||||
|
@ -71,6 +76,7 @@ import XActiveUsers from "./overview.active-users.vue";
|
|||
import XStats from "./overview.stats.vue";
|
||||
import XModerators from "./overview.moderators.vue";
|
||||
import XHeatmap from "./overview.heatmap.vue";
|
||||
import XMetrics from "./overview.metrics.vue";
|
||||
import MkTagCloud from "@/components/MkTagCloud.vue";
|
||||
import { version, url } from "@/config";
|
||||
import * as os from "@/os";
|
||||
|
|
|
@ -7,6 +7,9 @@
|
|||
:tabs="headerTabs"
|
||||
/></template>
|
||||
<MkSpacer :content-max="700">
|
||||
<MkInfo class="_gap" :warn="true">{{
|
||||
i18n.ts.channelFederationWarn
|
||||
}}</MkInfo>
|
||||
<swiper
|
||||
:round-lengths="true"
|
||||
:touch-angle="25"
|
||||
|
@ -119,6 +122,7 @@ import MkInput from "@/components/form/input.vue";
|
|||
import MkRadios from "@/components/form/radios.vue";
|
||||
import MkButton from "@/components/MkButton.vue";
|
||||
import MkFolder from "@/components/MkFolder.vue";
|
||||
import MkInfo from "@/components/MkInfo.vue";
|
||||
import { useRouter } from "@/router";
|
||||
import { definePageMetadata } from "@/scripts/page-metadata";
|
||||
import { deviceKind } from "@/scripts/device-kind";
|
||||
|
|
|
@ -1,7 +1,9 @@
|
|||
<template>
|
||||
<MkSpacer :content-max="700">
|
||||
<div class="geegznzt">
|
||||
<XAntenna :antenna="draft" @created="onAntennaCreated" />
|
||||
</div>
|
||||
</MkSpacer>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
|
|
|
@ -8,6 +8,8 @@
|
|||
/></template>
|
||||
<MkSpacer :content-max="700">
|
||||
<div class="ieepwinx">
|
||||
<MkInfo class="_gap" :icon="'flying-saucer'" :card="true">
|
||||
<p>{{ i18n.ts.antennasDesc }}</p>
|
||||
<MkButton
|
||||
:link="true"
|
||||
to="/my/antennas/create"
|
||||
|
@ -16,20 +18,19 @@
|
|||
><i class="ph-plus ph-bold ph-lg"></i>
|
||||
{{ i18n.ts.add }}</MkButton
|
||||
>
|
||||
|
||||
</MkInfo>
|
||||
<div class="">
|
||||
<MkPagination
|
||||
v-slot="{ items }"
|
||||
ref="list"
|
||||
:pagination="pagination"
|
||||
>
|
||||
<MkPagination ref="list" :pagination="pagination">
|
||||
<template #default="{ items }">
|
||||
<div v-for="antenna in items" :key="antenna.id">
|
||||
<MkA
|
||||
class="uopelskx"
|
||||
:link="true"
|
||||
:to="`/timeline/antenna/${antenna.id}`"
|
||||
>
|
||||
<i class="ph-flying-saucer ph-bold ph-lg"></i
|
||||
<i
|
||||
class="ph-flying-saucer ph-bold ph-lg"
|
||||
></i
|
||||
><i
|
||||
:class="`${
|
||||
antenna.hasUnreadNote
|
||||
|
@ -45,6 +46,7 @@
|
|||
<div class="name">{{ antenna.name }}</div>
|
||||
</MkA>
|
||||
</div>
|
||||
</template>
|
||||
</MkPagination>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -56,6 +58,7 @@
|
|||
import { onActivated, onDeactivated, ref } from "vue";
|
||||
import MkPagination from "@/components/MkPagination.vue";
|
||||
import MkButton from "@/components/MkButton.vue";
|
||||
import MkInfo from "@/components/MkInfo.vue";
|
||||
import { i18n } from "@/i18n";
|
||||
import { definePageMetadata } from "@/scripts/page-metadata";
|
||||
|
||||
|
@ -101,10 +104,6 @@ definePageMetadata({
|
|||
|
||||
<style lang="scss" scoped>
|
||||
.ieepwinx {
|
||||
> .add {
|
||||
margin: 0 auto 16px auto;
|
||||
}
|
||||
|
||||
.uopelskx {
|
||||
float: left;
|
||||
min-width: 25px;
|
||||
|
|
|
@ -8,17 +8,17 @@
|
|||
/></template>
|
||||
<MkSpacer :content-max="700">
|
||||
<div class="qtcaoidl">
|
||||
<MkButton primary class="add" @click="create"
|
||||
><i class="ph-plus ph-bold ph-lg"></i>
|
||||
{{ i18n.ts.add }}</MkButton
|
||||
>
|
||||
|
||||
<MkPagination
|
||||
v-slot="{ items }"
|
||||
ref="pagingComponent"
|
||||
:pagination="pagination"
|
||||
class="list"
|
||||
>
|
||||
<template #empty>
|
||||
<MkInfo :icon="'paperclip'" :card="true">
|
||||
<p>{{ i18n.ts.clipsDesc }}</p>
|
||||
</MkInfo>
|
||||
</template>
|
||||
<template #default="{ items }">
|
||||
<MkA
|
||||
v-for="item in items"
|
||||
:key="item.id"
|
||||
|
@ -30,6 +30,7 @@
|
|||
{{ item.description }}
|
||||
</div>
|
||||
</MkA>
|
||||
</template>
|
||||
</MkPagination>
|
||||
</div>
|
||||
</MkSpacer>
|
||||
|
@ -40,6 +41,7 @@
|
|||
import {} from "vue";
|
||||
import MkPagination from "@/components/MkPagination.vue";
|
||||
import MkButton from "@/components/MkButton.vue";
|
||||
import MkInfo from "@/components/MkInfo.vue";
|
||||
import * as os from "@/os";
|
||||
import { i18n } from "@/i18n";
|
||||
import { definePageMetadata } from "@/scripts/page-metadata";
|
||||
|
@ -100,10 +102,6 @@ definePageMetadata({
|
|||
|
||||
<style lang="scss" scoped>
|
||||
.qtcaoidl {
|
||||
> .add {
|
||||
margin: 0 auto 16px auto;
|
||||
}
|
||||
|
||||
> .list {
|
||||
> .item {
|
||||
display: block;
|
||||
|
|
|
@ -111,6 +111,10 @@ async function leave(group) {
|
|||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
._fullinfo {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
._card {
|
||||
margin-bottom: 1rem;
|
||||
._title {
|
||||
|
|
|
@ -8,16 +8,13 @@
|
|||
/></template>
|
||||
<MkSpacer :content-max="700">
|
||||
<div class="qkcjvfiv">
|
||||
<div class="buttonWrapper">
|
||||
<MkInfo class="_gap" :icon="'list-bullets'" :card="true">
|
||||
<p>{{ i18n.ts.listsDesc }}</p>
|
||||
<MkButton primary class="add" @click="create"
|
||||
><i class="ph-plus ph-bold ph-lg"></i>
|
||||
{{ i18n.ts.createList }}</MkButton
|
||||
>
|
||||
<MkButton @click="deleteAll"
|
||||
><i class="ph-trash ph-bold ph-lg"></i>
|
||||
{{ i18n.ts.deleteAll }}</MkButton
|
||||
>
|
||||
</div>
|
||||
</MkInfo>
|
||||
|
||||
<MkPagination
|
||||
v-slot="{ items }"
|
||||
|
@ -34,6 +31,10 @@
|
|||
<div class="name">{{ list.name }}</div>
|
||||
<MkAvatars :user-ids="list.userIds" />
|
||||
</MkA>
|
||||
<MkButton @click="deleteAll"
|
||||
><i class="ph-trash ph-bold ph-lg"></i>
|
||||
{{ i18n.ts.deleteAll }}</MkButton
|
||||
>
|
||||
</MkPagination>
|
||||
</div>
|
||||
</MkSpacer>
|
||||
|
@ -45,6 +46,7 @@ import {} from "vue";
|
|||
import MkPagination from "@/components/MkPagination.vue";
|
||||
import MkButton from "@/components/MkButton.vue";
|
||||
import MkAvatars from "@/components/MkAvatars.vue";
|
||||
import MkInfo from "@/components/MkInfo.vue";
|
||||
import * as os from "@/os";
|
||||
import { i18n } from "@/i18n";
|
||||
import { definePageMetadata } from "@/scripts/page-metadata";
|
||||
|
@ -92,15 +94,6 @@ definePageMetadata({
|
|||
|
||||
<style lang="scss" scoped>
|
||||
.qkcjvfiv {
|
||||
> .buttonWrapper {
|
||||
display: grid;
|
||||
justify-content: center;
|
||||
|
||||
> .add {
|
||||
margin: 0 auto var(--margin) auto;
|
||||
}
|
||||
}
|
||||
|
||||
> .lists {
|
||||
> .list {
|
||||
display: block;
|
||||
|
|
|
@ -4,6 +4,7 @@ import * as os from "@/os";
|
|||
export async function indexPosts() {
|
||||
const { canceled, result: index } = await os.inputText({
|
||||
title: i18n.ts.indexFrom,
|
||||
text: i18n.ts.indexFromDescription,
|
||||
});
|
||||
if (canceled) return;
|
||||
|
||||
|
|
|
@ -3,30 +3,21 @@ import { i18n } from "@/i18n";
|
|||
import { mainRouter } from "@/router";
|
||||
|
||||
export async function search() {
|
||||
let searchOptions = "";
|
||||
// const searchOptions =
|
||||
// "Advanced search operators\n" +
|
||||
// "from:user => filter by user\n" +
|
||||
// "has:image/video/audio/text/file => filter by attachment types\n" +
|
||||
// "domain:domain.com => filter by domain\n" +
|
||||
// "before:Date => show posts made before Date\n" +
|
||||
// "after:Date => show posts made after Date\n" +
|
||||
// '"text" => get posts with exact text between quotes\n' +
|
||||
// "filter:following => show results only from users you follow\n" +
|
||||
// "filter:followers => show results only from followers\n";
|
||||
|
||||
let meta = null;
|
||||
|
||||
os.api("server-info", {}).then((res) => {
|
||||
meta = res;
|
||||
});
|
||||
|
||||
if (meta.meilisearch.health === "available") {
|
||||
searchOptions =
|
||||
"Advanced search operators\n" +
|
||||
"from:user => filter by user\n" +
|
||||
"has:image/video/audio/text/file => filter by attachment types\n" +
|
||||
"domain:domain.com => filter by domain\n" +
|
||||
"before:Date => show posts made before Date\n" +
|
||||
"after:Date => show posts made after Date\n" +
|
||||
'"text" => get posts with exact text between quotes\n' +
|
||||
"filter:following => show results only from users you follow\n" +
|
||||
"filter:followers => show results only from followers\n";
|
||||
}
|
||||
const { canceled, result: query } = await os.inputText({
|
||||
title: i18n.ts.search,
|
||||
placeholder: i18n.ts.searchPlaceholder,
|
||||
text: searchOptions,
|
||||
// text: searchOptions,
|
||||
});
|
||||
if (canceled || query == null || query === "") return;
|
||||
|
||||
|
|
|
@ -26,6 +26,26 @@ export const defaultStore = markRaw(
|
|||
where: "account",
|
||||
default: 0,
|
||||
},
|
||||
tlHomeHintClosed: {
|
||||
where: "device",
|
||||
default: false,
|
||||
},
|
||||
tlLocalHintClosed: {
|
||||
where: "device",
|
||||
default: false,
|
||||
},
|
||||
tlRecommendedHintClosed: {
|
||||
where: "device",
|
||||
default: false,
|
||||
},
|
||||
tlSocialHintClosed: {
|
||||
where: "device",
|
||||
default: false,
|
||||
},
|
||||
tlGlobalHintClosed: {
|
||||
where: "device",
|
||||
default: false,
|
||||
},
|
||||
keepCw: {
|
||||
where: "account",
|
||||
default: true,
|
||||
|
|
|
@ -114,7 +114,7 @@ html, body {
|
|||
}
|
||||
|
||||
.swiper-slide {
|
||||
height: unset !important;
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
a {
|
||||
|
@ -303,6 +303,9 @@ hr {
|
|||
|
||||
._gap {
|
||||
margin: var(--margin) 0;
|
||||
&:first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: 廃止
|
||||
|
|
|
@ -252,6 +252,9 @@ function more(ev: MouseEvent) {
|
|||
#calckey_app > :not(.wallpaper) & {
|
||||
background: var(--navBg);
|
||||
}
|
||||
#calckey_app > .wallpaper:not(.centered) & {
|
||||
border-right: 1px solid var(--divider);
|
||||
}
|
||||
contain: strict;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
|
|
@ -3,19 +3,17 @@
|
|||
<div
|
||||
:class="$style.container"
|
||||
:style="{
|
||||
backgroundImage: $instance.bannerUrl
|
||||
? `url(${$instance.bannerUrl})`
|
||||
: null,
|
||||
backgroundImage: `url(${$instance.bannerUrl})`,
|
||||
}"
|
||||
>
|
||||
<div :class="$style.iconContainer">
|
||||
<img
|
||||
:src="
|
||||
$instance.iconUrl ??
|
||||
$instance.faviconUrl ??
|
||||
$instance.iconUrl ||
|
||||
$instance.faviconUrl ||
|
||||
'/favicon.ico'
|
||||
"
|
||||
alt=""
|
||||
alt="Instance logo"
|
||||
:class="$style.icon"
|
||||
/>
|
||||
</div>
|
||||
|
@ -107,7 +105,7 @@ defineExpose<WidgetComponentExpose>({
|
|||
-1px 1px 0 var(--bg), 1px 1px 0 var(--bg);
|
||||
}
|
||||
|
||||
.host {
|
||||
.name {
|
||||
font-weight: bold;
|
||||
}
|
||||
</style>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<div class="vrvdvrys">
|
||||
<XPie class="pie" :value="usage" />
|
||||
<div>
|
||||
<p><i class="ph-microchip ph-bold ph-lg"></i>CPU</p>
|
||||
<p><i class="ph-cpu ph-bold ph-lg"></i>CPU</p>
|
||||
<p>{{ meta.cpu.cores }} Logical cores</p>
|
||||
<p>{{ meta.cpu.model }}</p>
|
||||
</div>
|
||||
|
|
|
@ -1,11 +1,15 @@
|
|||
<template>
|
||||
<div class="verusivbr">
|
||||
<XPie class="pie" :value="progress" />
|
||||
<XPie
|
||||
v-tooltip="i18n.ts.meiliIndexCount"
|
||||
class="pie"
|
||||
:value="progress"
|
||||
/>
|
||||
<div>
|
||||
<p><i class="ph-file-search ph-bold ph-lg"></i>MeiliSearch</p>
|
||||
<p>{{ i18n.ts._widgets.meiliStatus }}: {{ available }}</p>
|
||||
<p>{{ i18n.ts._widgets.meiliSize }}: {{ bytes(total_size, 2) }}</p>
|
||||
<p>{{ i18n.ts._widgets.meiliIndexCount }}: {{ index_count }}</p>
|
||||
<p>{{ i18n.ts._widgets.meiliSize }}: {{ bytes(totalSize, 1) }}</p>
|
||||
<p>{{ i18n.ts._widgets.meiliIndexCount }}: {{ indexCount }}</p>
|
||||
</div>
|
||||
</div>
|
||||
<br />
|
||||
|
@ -25,15 +29,15 @@ const props = defineProps<{
|
|||
|
||||
let progress: number = $ref(0);
|
||||
let serverStats = $ref(null);
|
||||
let total_size: number = $ref(0);
|
||||
let index_count: number = $ref(0);
|
||||
let totalSize: number = $ref(0);
|
||||
let indexCount: number = $ref(0);
|
||||
let available: string = $ref("unavailable");
|
||||
|
||||
function onStats(stats) {
|
||||
total_size = stats.meilisearch.size;
|
||||
index_count = stats.meilisearch.indexed_count;
|
||||
totalSize = stats.meilisearch.size;
|
||||
indexCount = stats.meilisearch.indexed_count;
|
||||
available = stats.meilisearch.health;
|
||||
progress = index_count / serverStats.notesCount;
|
||||
progress = indexCount / serverStats.notesCount;
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<div class="zlxnikvl">
|
||||
<XPie class="pie" :value="usage" />
|
||||
<div>
|
||||
<p><i class="ph-cpu ph-bold ph-lg"></i>RAM</p>
|
||||
<p><i class="ph-microchip ph-bold ph-lg"></i>RAM</p>
|
||||
<p>Total: {{ bytes(total, 1) }}</p>
|
||||
<p>Used: {{ bytes(used, 1) }}</p>
|
||||
<p>Free: {{ bytes(free, 1) }}</p>
|
||||
|
|
218
pnpm-lock.yaml
218
pnpm-lock.yaml
|
@ -12,11 +12,11 @@ importers:
|
|||
.:
|
||||
dependencies:
|
||||
'@bull-board/api':
|
||||
specifier: ^4.10.2
|
||||
version: 4.10.2
|
||||
specifier: 5.2.0
|
||||
version: 5.2.0(@bull-board/ui@5.2.0)
|
||||
'@bull-board/ui':
|
||||
specifier: ^4.10.2
|
||||
version: 4.10.2
|
||||
specifier: 5.2.0
|
||||
version: 5.2.0
|
||||
'@napi-rs/cli':
|
||||
specifier: ^2.15.0
|
||||
version: 2.15.0
|
||||
|
@ -28,7 +28,7 @@ importers:
|
|||
version: 7.2.0
|
||||
focus-trap-vue:
|
||||
specifier: ^4.0.1
|
||||
version: 4.0.1(focus-trap@7.2.0)(vue@3.3.4)
|
||||
version: 4.0.1(focus-trap@7.2.0)(vue@3.2.45)
|
||||
js-yaml:
|
||||
specifier: 4.1.0
|
||||
version: 4.1.0
|
||||
|
@ -82,14 +82,14 @@ importers:
|
|||
packages/backend:
|
||||
dependencies:
|
||||
'@bull-board/api':
|
||||
specifier: ^4.6.4
|
||||
version: 4.10.2
|
||||
specifier: 5.2.0
|
||||
version: 5.2.0(@bull-board/ui@5.2.0)
|
||||
'@bull-board/koa':
|
||||
specifier: ^4.6.4
|
||||
version: 4.10.2(@types/koa@2.13.5)(pug@3.0.2)
|
||||
specifier: 5.2.0
|
||||
version: 5.2.0(@types/koa@2.13.5)(pug@3.0.2)
|
||||
'@bull-board/ui':
|
||||
specifier: ^4.6.4
|
||||
version: 4.10.2
|
||||
specifier: 5.2.0
|
||||
version: 5.2.0
|
||||
'@calckey/megalodon':
|
||||
specifier: 5.2.0
|
||||
version: 5.2.0
|
||||
|
@ -217,8 +217,8 @@ importers:
|
|||
specifier: 0.1.2
|
||||
version: 0.1.2
|
||||
ioredis:
|
||||
specifier: 5.2.4
|
||||
version: 5.2.4
|
||||
specifier: 5.3.2
|
||||
version: 5.3.2
|
||||
ip-cidr:
|
||||
specifier: 3.0.11
|
||||
version: 3.0.11
|
||||
|
@ -398,7 +398,7 @@ importers:
|
|||
version: 14.0.0
|
||||
typeorm:
|
||||
specifier: 0.3.11
|
||||
version: 0.3.11(ioredis@5.2.4)(pg@8.8.0)(ts-node@10.9.1)
|
||||
version: 0.3.11(ioredis@5.3.2)(pg@8.8.0)(ts-node@10.9.1)
|
||||
ulid:
|
||||
specifier: 2.3.0
|
||||
version: 2.3.0
|
||||
|
@ -1087,11 +1087,6 @@ packages:
|
|||
resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
|
||||
/@babel/helper-string-parser@7.21.5:
|
||||
resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
dev: false
|
||||
|
||||
/@babel/helper-validator-identifier@7.19.1:
|
||||
resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
|
@ -1135,14 +1130,6 @@ packages:
|
|||
'@babel/types': 7.21.4
|
||||
dev: true
|
||||
|
||||
/@babel/parser@7.22.3:
|
||||
resolution: {integrity: sha512-vrukxyW/ep8UD1UDzOYpTKQ6abgjFoeG6L+4ar9+c5TN9QnlqiOi6QK7LSR5ewm/ERyGkT/Ai6VboNrxhbr9Uw==}
|
||||
engines: {node: '>=6.0.0'}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
'@babel/types': 7.22.3
|
||||
dev: false
|
||||
|
||||
/@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.21.4):
|
||||
resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
|
||||
peerDependencies:
|
||||
|
@ -1329,30 +1316,24 @@ packages:
|
|||
to-fast-properties: 2.0.0
|
||||
dev: true
|
||||
|
||||
/@babel/types@7.22.3:
|
||||
resolution: {integrity: sha512-P3na3xIQHTKY4L0YOG7pM8M8uoUIB910WQaSiiMCZUC2Cy8XFEQONGABFnHWBa2gpGKODTAJcNhi5Zk0sLRrzg==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
dependencies:
|
||||
'@babel/helper-string-parser': 7.21.5
|
||||
'@babel/helper-validator-identifier': 7.19.1
|
||||
to-fast-properties: 2.0.0
|
||||
dev: false
|
||||
|
||||
/@bcoe/v8-coverage@0.2.3:
|
||||
resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
|
||||
dev: true
|
||||
|
||||
/@bull-board/api@4.10.2:
|
||||
resolution: {integrity: sha512-lRHo0A7hsz71aOx1ZN0SmLLWfSuvKdL6EZ4imlgo5SuXGozybvlRc5KPIJU2/E1w5meoUGi+nFezBwp1gT/SMw==}
|
||||
/@bull-board/api@5.2.0(@bull-board/ui@5.2.0):
|
||||
resolution: {integrity: sha512-1HGF2EF/4zI3+Cj414nQzwFprLXOJTlVdqXUf5UEBS4HtYafWv93mGIwkrD8S4Bpz4VSvM87adF6tQPJ7Ewt+w==}
|
||||
peerDependencies:
|
||||
'@bull-board/ui': 5.2.0
|
||||
dependencies:
|
||||
'@bull-board/ui': 5.2.0
|
||||
redis-info: 3.1.0
|
||||
dev: false
|
||||
|
||||
/@bull-board/koa@4.10.2(@types/koa@2.13.5)(pug@3.0.2):
|
||||
resolution: {integrity: sha512-gabPtsMOt2SQHkS5VcY1q/FCpbBRFiFrbWbcouZ7zWKg413J8nG+yErz3pc0rbmp23kbKX6wTG/diWKhE7EWbA==}
|
||||
/@bull-board/koa@5.2.0(@types/koa@2.13.5)(pug@3.0.2):
|
||||
resolution: {integrity: sha512-jntDAl/POouD0PS/iiKXBNl26SuUf7Y5uL3EgpDN7isvwFcpKhvdk0VdBypjrkRHN6rPaEJJPkEtK30qv01XYw==}
|
||||
dependencies:
|
||||
'@bull-board/api': 4.10.2
|
||||
'@bull-board/ui': 4.10.2
|
||||
'@bull-board/api': 5.2.0(@bull-board/ui@5.2.0)
|
||||
'@bull-board/ui': 5.2.0
|
||||
ejs: 3.1.8
|
||||
koa: 2.13.4
|
||||
koa-mount: 4.0.0
|
||||
|
@ -1416,10 +1397,10 @@ packages:
|
|||
- whiskers
|
||||
dev: false
|
||||
|
||||
/@bull-board/ui@4.10.2:
|
||||
resolution: {integrity: sha512-vaHGojG5D3xjnaed3nwOaLy4Y06RgDJdYRaFR5E06SjZ0vOvjVYGD6s4cykK512Aw/ElFhKDPwzhf8BvpwAtDQ==}
|
||||
/@bull-board/ui@5.2.0:
|
||||
resolution: {integrity: sha512-f2sgs7AjOVch7tFhbmlVCkhZjJWboxwNxWEfAsIUd1WidUC+Ef5J02tpQvu7apzRtu5zcn8IiJtI5HFO6oKaCA==}
|
||||
dependencies:
|
||||
'@bull-board/api': 4.10.2
|
||||
'@bull-board/api': 5.2.0(@bull-board/ui@5.2.0)
|
||||
dev: false
|
||||
|
||||
/@calckey/megalodon@5.2.0:
|
||||
|
@ -2120,10 +2101,6 @@ packages:
|
|||
/@jridgewell/sourcemap-codec@1.4.14:
|
||||
resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
|
||||
|
||||
/@jridgewell/sourcemap-codec@1.4.15:
|
||||
resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
|
||||
dev: false
|
||||
|
||||
/@jridgewell/trace-mapping@0.3.17:
|
||||
resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==}
|
||||
dependencies:
|
||||
|
@ -3240,7 +3217,7 @@ packages:
|
|||
resolution: {integrity: sha512-zJbJ3FVE17CNl5KXzdeSPtdltc4tMT3TzC6fxQS0sQngkbFZ6h+0uTafsRqu+eSLIugf6Yb0Ea0SUuRr42Nk9g==}
|
||||
deprecated: This is a stub types definition. ioredis provides its own type definitions, so you do not need this installed.
|
||||
dependencies:
|
||||
ioredis: 5.2.4
|
||||
ioredis: 5.3.2
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: true
|
||||
|
@ -3852,30 +3829,12 @@ packages:
|
|||
'@vue/shared': 3.2.45
|
||||
estree-walker: 2.0.2
|
||||
source-map: 0.6.1
|
||||
dev: true
|
||||
|
||||
/@vue/compiler-core@3.3.4:
|
||||
resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==}
|
||||
dependencies:
|
||||
'@babel/parser': 7.22.3
|
||||
'@vue/shared': 3.3.4
|
||||
estree-walker: 2.0.2
|
||||
source-map-js: 1.0.2
|
||||
dev: false
|
||||
|
||||
/@vue/compiler-dom@3.2.45:
|
||||
resolution: {integrity: sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==}
|
||||
dependencies:
|
||||
'@vue/compiler-core': 3.2.45
|
||||
'@vue/shared': 3.2.45
|
||||
dev: true
|
||||
|
||||
/@vue/compiler-dom@3.3.4:
|
||||
resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==}
|
||||
dependencies:
|
||||
'@vue/compiler-core': 3.3.4
|
||||
'@vue/shared': 3.3.4
|
||||
dev: false
|
||||
|
||||
/@vue/compiler-sfc@2.7.14:
|
||||
resolution: {integrity: sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==}
|
||||
|
@ -3898,36 +3857,12 @@ packages:
|
|||
magic-string: 0.25.9
|
||||
postcss: 8.4.21
|
||||
source-map: 0.6.1
|
||||
dev: true
|
||||
|
||||
/@vue/compiler-sfc@3.3.4:
|
||||
resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==}
|
||||
dependencies:
|
||||
'@babel/parser': 7.22.3
|
||||
'@vue/compiler-core': 3.3.4
|
||||
'@vue/compiler-dom': 3.3.4
|
||||
'@vue/compiler-ssr': 3.3.4
|
||||
'@vue/reactivity-transform': 3.3.4
|
||||
'@vue/shared': 3.3.4
|
||||
estree-walker: 2.0.2
|
||||
magic-string: 0.30.0
|
||||
postcss: 8.4.24
|
||||
source-map-js: 1.0.2
|
||||
dev: false
|
||||
|
||||
/@vue/compiler-ssr@3.2.45:
|
||||
resolution: {integrity: sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==}
|
||||
dependencies:
|
||||
'@vue/compiler-dom': 3.2.45
|
||||
'@vue/shared': 3.2.45
|
||||
dev: true
|
||||
|
||||
/@vue/compiler-ssr@3.3.4:
|
||||
resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==}
|
||||
dependencies:
|
||||
'@vue/compiler-dom': 3.3.4
|
||||
'@vue/shared': 3.3.4
|
||||
dev: false
|
||||
|
||||
/@vue/reactivity-transform@3.2.45:
|
||||
resolution: {integrity: sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==}
|
||||
|
@ -3937,43 +3872,17 @@ packages:
|
|||
'@vue/shared': 3.2.45
|
||||
estree-walker: 2.0.2
|
||||
magic-string: 0.25.9
|
||||
dev: true
|
||||
|
||||
/@vue/reactivity-transform@3.3.4:
|
||||
resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==}
|
||||
dependencies:
|
||||
'@babel/parser': 7.22.3
|
||||
'@vue/compiler-core': 3.3.4
|
||||
'@vue/shared': 3.3.4
|
||||
estree-walker: 2.0.2
|
||||
magic-string: 0.30.0
|
||||
dev: false
|
||||
|
||||
/@vue/reactivity@3.2.45:
|
||||
resolution: {integrity: sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==}
|
||||
dependencies:
|
||||
'@vue/shared': 3.2.45
|
||||
dev: true
|
||||
|
||||
/@vue/reactivity@3.3.4:
|
||||
resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==}
|
||||
dependencies:
|
||||
'@vue/shared': 3.3.4
|
||||
dev: false
|
||||
|
||||
/@vue/runtime-core@3.2.45:
|
||||
resolution: {integrity: sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==}
|
||||
dependencies:
|
||||
'@vue/reactivity': 3.2.45
|
||||
'@vue/shared': 3.2.45
|
||||
dev: true
|
||||
|
||||
/@vue/runtime-core@3.3.4:
|
||||
resolution: {integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==}
|
||||
dependencies:
|
||||
'@vue/reactivity': 3.3.4
|
||||
'@vue/shared': 3.3.4
|
||||
dev: false
|
||||
|
||||
/@vue/runtime-dom@3.2.45:
|
||||
resolution: {integrity: sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==}
|
||||
|
@ -3981,15 +3890,6 @@ packages:
|
|||
'@vue/runtime-core': 3.2.45
|
||||
'@vue/shared': 3.2.45
|
||||
csstype: 2.6.21
|
||||
dev: true
|
||||
|
||||
/@vue/runtime-dom@3.3.4:
|
||||
resolution: {integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==}
|
||||
dependencies:
|
||||
'@vue/runtime-core': 3.3.4
|
||||
'@vue/shared': 3.3.4
|
||||
csstype: 3.1.2
|
||||
dev: false
|
||||
|
||||
/@vue/server-renderer@3.2.45(vue@3.2.45):
|
||||
resolution: {integrity: sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==}
|
||||
|
@ -3999,25 +3899,9 @@ packages:
|
|||
'@vue/compiler-ssr': 3.2.45
|
||||
'@vue/shared': 3.2.45
|
||||
vue: 3.2.45
|
||||
dev: true
|
||||
|
||||
/@vue/server-renderer@3.3.4(vue@3.3.4):
|
||||
resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==}
|
||||
peerDependencies:
|
||||
vue: 3.3.4
|
||||
dependencies:
|
||||
'@vue/compiler-ssr': 3.3.4
|
||||
'@vue/shared': 3.3.4
|
||||
vue: 3.3.4
|
||||
dev: false
|
||||
|
||||
/@vue/shared@3.2.45:
|
||||
resolution: {integrity: sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==}
|
||||
dev: true
|
||||
|
||||
/@vue/shared@3.3.4:
|
||||
resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==}
|
||||
dev: false
|
||||
|
||||
/@webassemblyjs/ast@1.11.1:
|
||||
resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==}
|
||||
|
@ -5106,7 +4990,7 @@ packages:
|
|||
cron-parser: 4.7.1
|
||||
debuglog: 1.0.1
|
||||
get-port: 5.1.1
|
||||
ioredis: 5.2.4
|
||||
ioredis: 5.3.2
|
||||
lodash: 4.17.21
|
||||
msgpackr: 1.8.1
|
||||
p-timeout: 3.2.0
|
||||
|
@ -6187,16 +6071,11 @@ packages:
|
|||
|
||||
/csstype@2.6.21:
|
||||
resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==}
|
||||
dev: true
|
||||
|
||||
/csstype@3.1.1:
|
||||
resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==}
|
||||
dev: true
|
||||
|
||||
/csstype@3.1.2:
|
||||
resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==}
|
||||
dev: false
|
||||
|
||||
/custom-event-polyfill@1.0.7:
|
||||
resolution: {integrity: sha512-TDDkd5DkaZxZFM8p+1I3yAlvM3rSr1wbrOliG4yJiwinMZN8z/iGL7BTlDkrJcYTmgUSb4ywVCc3ZaUtOtC76w==}
|
||||
dev: true
|
||||
|
@ -7549,14 +7428,14 @@ packages:
|
|||
readable-stream: 2.3.7
|
||||
dev: true
|
||||
|
||||
/focus-trap-vue@4.0.1(focus-trap@7.2.0)(vue@3.3.4):
|
||||
/focus-trap-vue@4.0.1(focus-trap@7.2.0)(vue@3.2.45):
|
||||
resolution: {integrity: sha512-2iqOeoSvgq7Um6aL+255a/wXPskj6waLq2oKCa4gOnMORPo15JX7wN6J5bl1SMhMlTlkHXGSrQ9uJPJLPZDl5w==}
|
||||
peerDependencies:
|
||||
focus-trap: ^7.0.0
|
||||
vue: ^3.0.0
|
||||
dependencies:
|
||||
focus-trap: 7.2.0
|
||||
vue: 3.3.4
|
||||
vue: 3.2.45
|
||||
dev: false
|
||||
|
||||
/focus-trap@7.2.0:
|
||||
|
@ -7716,7 +7595,7 @@ packages:
|
|||
resolution: {integrity: sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ==}
|
||||
engines: {node: '>= 0.10'}
|
||||
dependencies:
|
||||
graceful-fs: 4.2.10
|
||||
graceful-fs: 4.2.11
|
||||
through2: 2.0.5
|
||||
dev: true
|
||||
|
||||
|
@ -8621,8 +8500,8 @@ packages:
|
|||
engines: {node: '>=0.10.0'}
|
||||
dev: true
|
||||
|
||||
/ioredis@5.2.4:
|
||||
resolution: {integrity: sha512-qIpuAEt32lZJQ0XyrloCRdlEdUUNGG9i0UOk6zgzK6igyudNWqEBxfH6OlbnOOoBBvr1WB02mm8fR55CnikRng==}
|
||||
/ioredis@5.3.2:
|
||||
resolution: {integrity: sha512-1DKMMzlIHM02eBBVOFQ1+AolGjs6+xEcM4PDL7NqOS6szq7H9jSaEkIUH6/a5Hl241LzW6JLSiAbNvTQjUupUA==}
|
||||
engines: {node: '>=12.22.0'}
|
||||
dependencies:
|
||||
'@ioredis/commands': 1.2.0
|
||||
|
@ -9795,7 +9674,7 @@ packages:
|
|||
/jsonfile@4.0.0:
|
||||
resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
|
||||
optionalDependencies:
|
||||
graceful-fs: 4.2.10
|
||||
graceful-fs: 4.2.11
|
||||
|
||||
/jsonfile@5.0.0:
|
||||
resolution: {integrity: sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w==}
|
||||
|
@ -9809,7 +9688,7 @@ packages:
|
|||
dependencies:
|
||||
universalify: 2.0.0
|
||||
optionalDependencies:
|
||||
graceful-fs: 4.2.10
|
||||
graceful-fs: 4.2.11
|
||||
dev: true
|
||||
|
||||
/jsonld@6.0.0:
|
||||
|
@ -10435,14 +10314,6 @@ packages:
|
|||
resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
|
||||
dependencies:
|
||||
sourcemap-codec: 1.4.8
|
||||
dev: true
|
||||
|
||||
/magic-string@0.30.0:
|
||||
resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==}
|
||||
engines: {node: '>=12'}
|
||||
dependencies:
|
||||
'@jridgewell/sourcemap-codec': 1.4.15
|
||||
dev: false
|
||||
|
||||
/mailcheck@1.1.1:
|
||||
resolution: {integrity: sha512-3WjL8+ZDouZwKlyJBMp/4LeziLFXgleOdsYu87piGcMLqhBzCsy2QFdbtAwv757TFC/rtqd738fgJw1tFQCSgA==}
|
||||
|
@ -12056,6 +11927,7 @@ packages:
|
|||
nanoid: 3.3.6
|
||||
picocolors: 1.0.0
|
||||
source-map-js: 1.0.2
|
||||
dev: true
|
||||
|
||||
/postgres-array@2.0.0:
|
||||
resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==}
|
||||
|
@ -13381,7 +13253,6 @@ packages:
|
|||
/sourcemap-codec@1.4.8:
|
||||
resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
|
||||
deprecated: Please use @jridgewell/sourcemap-codec instead
|
||||
dev: true
|
||||
|
||||
/sparkles@1.0.1:
|
||||
resolution: {integrity: sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==}
|
||||
|
@ -14375,7 +14246,7 @@ packages:
|
|||
/typedarray@0.0.6:
|
||||
resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
|
||||
|
||||
/typeorm@0.3.11(ioredis@5.2.4)(pg@8.8.0)(ts-node@10.9.1):
|
||||
/typeorm@0.3.11(ioredis@5.3.2)(pg@8.8.0)(ts-node@10.9.1):
|
||||
resolution: {integrity: sha512-pzdOyWbVuz/z8Ww6gqvBW4nylsM0KLdUCDExr2gR20/x1khGSVxQkjNV/3YqliG90jrWzrknYbYscpk8yxFJVg==}
|
||||
engines: {node: '>= 12.9.0'}
|
||||
hasBin: true
|
||||
|
@ -14442,7 +14313,7 @@ packages:
|
|||
debug: 4.3.4(supports-color@8.1.1)
|
||||
dotenv: 16.0.3
|
||||
glob: 7.2.3
|
||||
ioredis: 5.2.4
|
||||
ioredis: 5.3.2
|
||||
js-yaml: 4.1.0
|
||||
mkdirp: 1.0.4
|
||||
pg: 8.8.0
|
||||
|
@ -14760,7 +14631,7 @@ packages:
|
|||
dependencies:
|
||||
append-buffer: 1.0.2
|
||||
convert-source-map: 1.9.0
|
||||
graceful-fs: 4.2.10
|
||||
graceful-fs: 4.2.11
|
||||
normalize-path: 2.1.1
|
||||
now-and-later: 2.0.1
|
||||
remove-bom-buffer: 3.0.0
|
||||
|
@ -14872,17 +14743,6 @@ packages:
|
|||
'@vue/runtime-dom': 3.2.45
|
||||
'@vue/server-renderer': 3.2.45(vue@3.2.45)
|
||||
'@vue/shared': 3.2.45
|
||||
dev: true
|
||||
|
||||
/vue@3.3.4:
|
||||
resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==}
|
||||
dependencies:
|
||||
'@vue/compiler-dom': 3.3.4
|
||||
'@vue/compiler-sfc': 3.3.4
|
||||
'@vue/runtime-dom': 3.3.4
|
||||
'@vue/server-renderer': 3.3.4(vue@3.3.4)
|
||||
'@vue/shared': 3.3.4
|
||||
dev: false
|
||||
|
||||
/vuedraggable@4.1.0(vue@3.2.45):
|
||||
resolution: {integrity: sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==}
|
||||
|
|
28
pull_request_template.yml
Normal file
28
pull_request_template.yml
Normal file
|
@ -0,0 +1,28 @@
|
|||
name: Pull Request
|
||||
about: Create a pull request
|
||||
title: "[PR]: "
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for taking the time to make Calckey better!
|
||||
- type: textarea
|
||||
id: about
|
||||
attributes:
|
||||
label: What does this PR do?
|
||||
description: Please give us a brief description of what this PR does.
|
||||
placeholder: Makes Calckey so amazing by...
|
||||
validations:
|
||||
required: true
|
||||
- type: checkboxes
|
||||
id: terms
|
||||
attributes:
|
||||
label: Contribution Guidelines
|
||||
description: By submitting this issue, you agree to follow our [Contribution Guidelines](https://codeberg.org/calckey/calckey/src/branch/develop/CONTRIBUTING.md)
|
||||
options:
|
||||
- label: I agree to follow this project's Contribution Guidelines
|
||||
required: true
|
||||
- label: I have made sure to test this pull request
|
||||
required: true
|
||||
- label: I have made sure to run `pnpm run format` before submitting this pull request
|
||||
required: true
|
Loading…
Reference in a new issue