"My Space" Unified Achievements, Reels and Journal

This commit is contained in:
Crimekillz 2024-05-18 21:57:45 +02:00
parent 41f539ad93
commit aeef0feb99
10 changed files with 264 additions and 69 deletions

View File

@ -351,7 +351,7 @@ today: "Heute"
dayX: "{day}"
monthX: "{month}"
yearX: "{year}"
pages: "Nutzer-Seiten"
pages: "Journal"
integration: "Integration"
connectService: "Verbinden"
disconnectService: "Trennen"
@ -372,9 +372,9 @@ basicInfo: "Grundlegende Informationen"
pinnedUsers: "Angeheftete Nutzer"
pinnedUsersDescription: "Gib durch Leerzeichen getrennte Nutzer an, die an die \"\
Erkunden\"-Seite angeheftet werden sollen."
pinnedPages: "Angeheftete Nutzer-Seiten"
pinnedPages: "Angeheftete Journal-Einträge"
pinnedPagesDescription: "Geben Sie die Dateipfade, getrennt durch Zeilenumbrüche,
derjenigen Seiten ein, die Sie an die obere Seitenbegrenzung des Servers anpinnen
derjenigen Journal-Einträge ein, die Sie an die obere Seitenbegrenzung des Servers anpinnen
möchten."
pinnedClipId: "ID des anzuheftenden Clips"
pinnedNotes: "Angeheftete Beiträge"
@ -582,7 +582,7 @@ scratchpadDescription: "Die Testumgebung bietet einen Bereich für AiScript-Expe
überprüfen."
output: "Ausgabe"
script: "Skript"
disablePagesScript: "AiScript auf Seiten deaktivieren"
disablePagesScript: "AiScript in Journal-Einträgen deaktivieren"
updateRemoteUser: "Nutzerinformationen aktualisieren"
deleteAllFiles: "Alle Dateien löschen"
deleteAllFilesConfirm: "Möchtest du wirklich alle Dateien löschen?"
@ -686,21 +686,21 @@ setMultipleBySeparatingWithSpace: "Trenne Elemente durch ein Leerzeichen um mehr
fileIdOrUrl: "Datei-ID oder URL"
behavior: "Verhalten"
sample: "Beispiel"
abuseReports: "Meldungen"
reportAbuse: "Melden"
reportAbuseOf: "{name} melden"
fillAbuseReportDescription: "Bitte gib zusätzliche Informationen zu dieser Meldung
abuseReports: "Anzeigen"
reportAbuse: "Anzeigen!"
reportAbuseOf: "{name} anzeigen"
fillAbuseReportDescription: "Bitte gib zusätzliche Informationen zu dieser Anzeige
an. Falls es sich um einen ungewöhnlichen Beitrag handelt, gib bitte dessen URL
an."
abuseReported: "Deine Meldung wurde versendet. Vielen Dank."
reporter: "Melder"
reporteeOrigin: "Herkunft des Gemeldeten"
reporterOrigin: "Herkunft des Meldenden"
forwardReport: "Meldung auch an den mit-beteiligten Server weiterleiten"
reporter: "Anzeiger"
reporteeOrigin: "Herkunft des Angezeigten"
reporterOrigin: "Herkunft des Anzeigers"
forwardReport: "Anzeige auch an den mit-beteiligten Server weiterleiten"
forwardReportIsAnonymous: "Anstelle deines Nutzerkontos wird ein anonymes Systemkonto
als Hinweisgeber auf dem mit-beteiligten Server angezeigt."
send: "Senden"
abuseMarkAsResolved: "Meldung als gelöst markieren"
abuseMarkAsResolved: "Anzeige als gelöst markieren"
openInNewTab: "In neuem Tab öffnen"
openInSideView: "In Seitenansicht öffnen"
defaultNavigationBehaviour: "Standardnavigationsverhalten"
@ -851,8 +851,8 @@ switch: "Wechseln"
noMaintainerInformationWarning: "Betreiberinformationen sind nicht konfiguriert."
noBotProtectionWarning: "Schutz vor Bots ist nicht konfiguriert."
configure: "Konfigurieren"
postToGallery: "Erstelle einen neuen Beitrag zur Bilder-Galerie"
gallery: "Bilder-Galerie"
postToGallery: "Poste einen neuen Reel"
gallery: "Reels"
recentPosts: "Neue Beiträge"
popularPosts: "Beliebte Beiträge"
shareWithNote: "Mit Beitrag teilen"
@ -947,7 +947,7 @@ file: "Datei"
recentNHours: "Die letzten {n} Stunden"
recentNDays: "Die letzten {n} Tage"
noEmailServerWarning: "Es ist kein Email-Server konfiguriert."
thereIsUnresolvedAbuseReportWarning: "Es liegen ungelöste Meldungen vor."
thereIsUnresolvedAbuseReportWarning: "Es liegen ungelöste Anzeigen vor."
recommended: "Favoriten"
check: "Kontrolle"
driveCapOverrideLabel: "Die Cloud-Drive-Kapazität dieses Nutzers verändern"
@ -1052,8 +1052,8 @@ _forgotPassword:
contactAdmin: "Dieser Server unterstützt keine Verwendung von Email-Adressen. Kontaktiere
bitte den Server-Administrator, um dein Passwort zurücksetzen zu lassen."
_gallery:
my: "Meine Bilder-Galerie"
liked: "Mit \"Gefällt mir\" markierte Beiträge"
my: "Meine Reels"
liked: "Mit \"Gefällt mir\" markierte Reels"
like: "Gefällt mir"
unlike: "\"Gefällt mir\" entfernen"
_email:
@ -1614,33 +1614,33 @@ _timelines:
global: "Global-TL"
recommended: Admin-Favoriten
_pages:
newPage: "Neue Seite erstellen"
editPage: "Seite bearbeiten"
newPage: "Journal-Eintrag erstellen"
editPage: "Journal bearbeiten"
readPage: "Quelltextansicht"
created: "Seite erfolgreich erstellt"
updated: "Seite erfolgreich aktualisiert"
deleted: "Seite erfolgreich gelöscht"
pageSetting: "Seiteneinstellungen"
nameAlreadyExists: "Die angegebene Seiten-URL existiert bereits"
invalidNameTitle: "Die angegebene Seiten-URL ist ungültig"
invalidNameText: "Überprüfe, ob der Seitentitel nicht leer ist"
editThisPage: "Diese Seite bearbeiten"
created: "Journal-Eintrag erfolgreich erstellt"
updated: "Journal-Eintrag erfolgreich aktualisiert"
deleted: "Journal-Eintrag erfolgreich gelöscht"
pageSetting: "Journal-Einstellungen"
nameAlreadyExists: "Die angegebene Journal-URL existiert bereits"
invalidNameTitle: "Die angegebene Journal-URL ist ungültig"
invalidNameText: "Überprüfe, ob der Journaltitel nicht leer ist"
editThisPage: "Dieses Journal bearbeiten"
viewSource: "Quelltext anzeigen"
viewPage: "Seite anschauen"
viewPage: "Journal anschauen"
like: "Gefällt mir"
unlike: "\"Gefällt mir\" entfernen"
my: "Meine Nutzer-Seiten"
liked: "Nutzer-Seiten, die mir gefallen"
my: "Mein Journal"
liked: "Journals, die mir gefallen"
featured: "Beliebt"
inspector: "Inspektor"
contents: "Inhalte"
content: "Seitenblock"
content: "Journalblock"
variables: "Variablen"
title: "Titel"
url: "Nutzer-Seiten-URL"
url: "Nutzer-Journal-URL"
summary: "Zusammenfassung"
alignCenter: "Zentrieren"
hideTitleWhenPinned: "Nutzer-Seitentitel wenn angeheftet ausblenden"
hideTitleWhenPinned: "Journaltitel wenn angeheftet ausblenden"
font: "Schriftart"
fontSerif: "Serif"
fontSansSerif: "sans-serif"
@ -1902,7 +1902,7 @@ _pages:
stringArray: "Textliste"
emptySlot: "Leerer Slot"
enviromentVariables: "Umgebungsvariable"
pageVariables: "Seitenelemente"
pageVariables: "Journalelemente"
argVariables: "Eingabeslots"
_relayStatus:
requesting: "Ausstehend"
@ -2205,6 +2205,7 @@ youHaveUnreadAnnouncements: Du hast ungelesene Bekanntmachungen
donationLink: Link zur Spendenseite
neverShow: Nicht mehr anzeigen
remindMeLater: Vielleicht später
space: "Space"
removeQuote: Zitat entfernen
removeRecipient: Empfänger entfernen
removeMember: Mitglied entfernen

View File

@ -375,7 +375,7 @@ today: "Today"
dayX: "{day}"
monthX: "{month}"
yearX: "{year}"
pages: "Pages"
pages: "Journal"
integration: "Integrations"
connectService: "Connect"
disconnectService: "Disconnect"
@ -397,8 +397,8 @@ basicInfo: "Basic info"
pinnedUsers: "Pinned users"
pinnedUsersDescription: "List usernames separated by line breaks to be pinned in the
\"Explore\" tab."
pinnedPages: "Pinned Pages"
pinnedPagesDescription: "Enter the paths of the Pages you want to pin to the top page
pinnedPages: "Pinned Journal entries"
pinnedPagesDescription: "Enter the paths of the Journal entries you want to pin to the top page
of this server, separated by line breaks."
pinnedClipId: "ID of the clip to pin"
pinnedNotes: "Pinned posts"
@ -608,7 +608,7 @@ scratchpadDescription: "The scratchpad provides an environment for AiScript expe
it."
output: "Output"
script: "Script"
disablePagesScript: "Disable AiScript on Pages"
disablePagesScript: "Disable AiScript in Journal entries"
expandOnNoteClick: "Open post on click"
expandOnNoteClickDesc: "If disabled, you can still open posts in the right-click menu
or by clicking the timestamp."
@ -881,8 +881,8 @@ switch: "Switch"
noMaintainerInformationWarning: "Maintainer information is not configured."
noBotProtectionWarning: "Bot protection is not configured."
configure: "Configure"
postToGallery: "Create new gallery post"
gallery: "Gallery"
postToGallery: "Create new reel"
gallery: "Reel"
recentPosts: "Recent pages"
popularPosts: "Popular pages"
shareWithNote: "Share with post"
@ -1142,6 +1142,7 @@ biteBack: "Chomp back"
bittenBack: "Chomped back"
bitYou: "chomped you"
bitYouBack: "chomped you back"
space: "Space"
achievements: "Achievements"
_achievements:
earnedAt: "Earn date and time"
@ -1407,8 +1408,8 @@ _forgotPassword:
contactAdmin: "This server does not support using email addresses, please contact
the server administrator to reset your password instead."
_gallery:
my: "My Gallery"
liked: "Liked Posts"
my: "My Reels"
liked: "Liked Reels"
like: "Like"
unlike: "Remove like"
_email:
@ -2007,33 +2008,33 @@ _timelines:
social: "Social"
global: "Global"
_pages:
newPage: "Create a new Page"
editPage: "Edit this Page"
readPage: "Viewing this Page's source"
created: "Page successfully created"
updated: "Page successfully edited"
deleted: "Page successfully deleted"
pageSetting: "Page settings"
nameAlreadyExists: "The specified Page URL already exists"
invalidNameTitle: "The specified Page URL is invalid"
invalidNameText: "Make sure the Page title is not empty"
editThisPage: "Edit this Page"
newPage: "Create a Journal entry"
editPage: "Edit this Journal entry"
readPage: "Viewing this Journal's source"
created: "Journal entry successfully created"
updated: "Journal entry successfully edited"
deleted: "Journal entry successfully deleted"
pageSetting: "Journal settings"
nameAlreadyExists: "The specified Journal URL already exists"
invalidNameTitle: "The specified Journal URL is invalid"
invalidNameText: "Make sure the Journal title is not empty"
editThisPage: "Edit this Journal entry"
viewSource: "View source"
viewPage: "View your Pages"
viewPage: "View your Journal"
like: "Like"
unlike: "Remove like"
my: "My Pages"
liked: "Liked Pages"
my: "My Journal"
liked: "Liked Journals"
featured: "Popular"
inspector: "Inspector"
contents: "Content"
content: "Page block"
content: "Journal block"
variables: "Variables"
title: "Title"
url: "Page URL"
summary: "Page summary"
url: "Journal URL"
summary: "Journal summary"
alignCenter: "Center elements"
hideTitleWhenPinned: "Hide Page title when pinned to profile"
hideTitleWhenPinned: "Hide Journal title when pinned to profile"
font: "Font"
fontSerif: "Serif"
fontSansSerif: "Sans Serif"
@ -2294,7 +2295,7 @@ _pages:
stringArray: "Text list"
emptySlot: "Empty slot"
enviromentVariables: "Environment variables"
pageVariables: "Page variables"
pageVariables: "Journal variables"
argVariables: "Input slots"
_relayStatus:
requesting: "Pending"

View File

@ -793,8 +793,8 @@ switch: "切り替え"
noMaintainerInformationWarning: "管理者情報が設定されていません。"
noBotProtectionWarning: "Botプロテクションが設定されていません。"
configure: "設定する"
postToGallery: "ギャラリーへ投稿"
gallery: "ギャラリー"
postToGallery: "新しい Reel を作成する"
gallery: "Reel"
recentPosts: "最近の投稿"
popularPosts: "人気の投稿"
shareWithNote: "投稿で共有"
@ -988,6 +988,7 @@ showWithSparkles: "タイトルをキラキラさせる"
youHaveUnreadAnnouncements: "未読のお知らせがあります"
neverShow: "今後表示しない"
remindMeLater: "また後で"
space: "スペース"
achievements: "実績"
_achievements:
@ -1242,8 +1243,8 @@ _forgotPassword:
ifNoEmail: "メールアドレスを登録していない場合は、管理者までお問い合わせください。"
contactAdmin: "このインスタンスではメールアドレスの登録がサポートされていないため、パスワードリセットを行う場合は管理者までお問い合わせください。"
_gallery:
my: "自分の投稿"
liked: "いいねした投稿"
my: "私の Reels"
liked: "好きな Reel"
like: "いいね!"
unlike: "いいね解除"
_email:

View File

@ -37,7 +37,7 @@
import { userName } from "@/filters/user";
import { ui } from "@/config";
defineProps<{
const props = defineProps<{
page: any;
}>();
</script>

View File

@ -71,6 +71,12 @@ export const navbarItemDef = reactive({
show: computed(() => $i != null),
to: "/my/achievements",
},
space: {
title: "space",
icon: "ph-rocket-launch ph-bold ph-lg",
show: computed(() => $i != null),
to: "/my/space",
},
ui: {
title: "switchUi",
icon: "ph-layout ph-bold ph-lg",

View File

@ -127,7 +127,7 @@ async function del() {
await os.apiWithDialog("gallery/posts/delete", {
postId: props.postId,
});
router.push("/gallery");
router.push("/my/space");
}
watch(

View File

@ -0,0 +1,180 @@
<template>
<MkStickyContainer>
<template #header>
<MkPageHeader
v-model:tab="tab"
:actions="headerActions"
:tabs="headerTabs" />
</template>
<div>
<MkSpacer :content-max="1200">
<swiper
:round-lengths="true"
:touch-angle="25"
:threshold="10"
:centeredSlides="true"
:modules="[Virtual]"
:space-between="20"
:virtual="true"
:allow-touch-move="
defaultStore.state.swipeOnMobile &&
(deviceKind !== 'desktop' ||
defaultStore.state.swipeOnDesktop)
"
@swiper="setSwiperRef"
@slide-change="onSlideChange"
>
<swiper-slide>
<div class="_content yweeujhr achievements">
<XAchievements v-if="tab === 'achievements'" :user="$i"/>
</div>
</swiper-slide>
<swiper-slide>
<div class="_content yweeujhr reels">
<div class="buttoncontainer">
<MkButton class="new primary" @click="createReel()"
><i class="ph-plus ph-bold ph-lg"></i>
{{ i18n.ts.postToGallery }}</MkButton
>
</div>
<XGallery v-if="tab === 'reels'" :user="$i" />
</div>
</swiper-slide>
<swiper-slide>
<div class="_content yweeujhr journal">
<div class="buttoncontainer">
<MkButton class="new primary" @click="createJournal()"
><i class="ph-plus ph-bold ph-lg"></i>
{{ i18n.ts._pages.newPage }}</MkButton
>
</div>
<XPages v-if="tab === 'journal'" :user="$i" />
</div>
</swiper-slide>
</swiper>
</MkSpacer>
</div>
</MkStickyContainer>
</template>
<script lang="ts" setup>
import { defineAsyncComponent, ref, onMounted, onActivated, watch } from 'vue';
import { Virtual } from "swiper/modules";
import { Swiper, SwiperSlide } from "swiper/vue";
import MkButton from "@/components/MkButton.vue";
import { useRouter } from "@/router";
import { i18n } from '@/i18n';
import { definePageMetadata } from '@/scripts/page-metadata';
import { $i } from "@/account";
import { deviceKind } from "@/scripts/device-kind";
import { defaultStore } from "@/store";
import "swiper/scss";
import "swiper/scss/virtual";
definePageMetadata({
title: i18n.ts.space,
icon: 'ph-rocket-launch ph-bold ph-lg',
});
const router = useRouter();
const XAchievements = defineAsyncComponent(() => import('../user/achievements.vue'));
const XPages = defineAsyncComponent(() => import("../user/pages.vue"));
const XGallery = defineAsyncComponent(() => import("../user/gallery.vue"));
const tabs = ["achievements", "reels", "journal"];
let tab = $ref(tabs[0]);
watch($$(tab), () => syncSlide(tabs.indexOf(tab)));
const MOBILE_THRESHOLD = 500;
const isMobile = ref(
deviceKind === "smartphone" || window.innerWidth <= MOBILE_THRESHOLD,
);
window.addEventListener("resize", () => {
isMobile.value =
deviceKind === "smartphone" || window.innerWidth <= MOBILE_THRESHOLD;
});
const headerActions = $computed(() => []);
const headerTabs = $computed(() => [
{
key: "achievements",
title: i18n.ts.achievements,
icon: "ph-medal-military ph-bold ph-lg",
},
{
key: "reels",
title: i18n.ts._gallery.my,
icon: "ph-film-strip ph-bold ph-lg",
},
{
key: "journal",
title: i18n.ts._pages.my,
icon: "ph-file-text ph-bold ph-lg",
},
]);
let swiperRef = null;
function setSwiperRef(swiper) {
swiperRef = swiper;
syncSlide(tabs.indexOf(tab));
}
function onSlideChange() {
tab = tabs[swiperRef.activeIndex];
}
function syncSlide(index) {
swiperRef.slideTo(index);
}
onMounted(() => {
syncSlide(tabs.indexOf(swiperRef.activeIndex));
});
onActivated(() => {
syncSlide(tabs.indexOf(tab));
});
function createJournal() {
router.push("/pages/new");
}
function createReel() {
router.push("/gallery/new");
}
</script>
<style lang="scss" scoped>
.yweeujhr {
> .buttoncontainer {
display: grid;
justify-content: center;
margin-bottom: 1rem;
}
&.my .ckltabjg:first-child {
margin-top: 16px;
}
.ckltabjg:not(:last-child) {
margin-bottom: 8px;
}
@media (min-width: 500px) {
.ckltabjg:not(:last-child) {
margin-bottom: 16px;
}
}
.vfpdbgtk {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
grid-gap: 12px;
margin: 0 var(--margin);
}
}
</style>

View File

@ -5,6 +5,7 @@
v-model:tab="tab"
:actions="headerActions"
:tabs="headerTabs"
:display-back-button="true"
/></template>
<MkSpacer :content-max="700">
<div class="jqqmcavi">

View File

@ -655,6 +655,11 @@ export const routes = [
component: page(() => import("./pages/my-antennas/edit.vue")),
loginRequired: true,
},
{
path: "/my/space",
component: page(() => import("./pages/my-space/index.vue")),
loginRequired: true,
},
{
path: "/news",
component: page(() => import("./pages/news.vue")),

View File

@ -17,7 +17,7 @@ const menuOptions = [
"news",
"discover",
"-",
"achievements",
"space",
"drive"
];