☙◦ The Tablet ❀ GamerGirlandCo ◦❧
83c1379ba6
if author is null for some reason, show a static "..." instead of breaking everything
240 lines
6.3 KiB
Vue
240 lines
6.3 KiB
Vue
<script lang="ts" setup>
|
|
import type { IStory } from "@models/stories";
|
|
import { format } from "date-fns";
|
|
import icon from "../icon.vue";
|
|
import { theme } from "ant-design-vue";
|
|
import metaItem from "./metaItem.vue";
|
|
|
|
const { useToken } = theme;
|
|
const { token } = useToken();
|
|
const dark = inject<Ref<boolean>>("dark");
|
|
const { data } = useAuth();
|
|
let prop = defineProps<{ story: IStory; last?: boolean }>();
|
|
const idxo = (prop.last || false ? prop.story.chapters.length : 1) - 1;
|
|
// console.log("idx0->", idxo)
|
|
// log.debug("posti->", prop.story.chapters[ prop.story.chapters.length - 1 ]);
|
|
const shortDate = format(Date.parse(prop.story.chapters[prop.story.chapters.length - 1]?.posted!.toString()), "yyyy/MM/dd");
|
|
const longDate = format(Date.parse(prop.story.chapters[prop.story.chapters.length - 1]?.posted!.toString()), "iiii',' yyyy-MM-dd");
|
|
</script>
|
|
<template>
|
|
<a-card>
|
|
<template #title>
|
|
<div style="padding-top: 1em; padding-bottom: 0.8em">
|
|
<div style="display: flex; justify-content: space-between">
|
|
<nuxt-link :to="`/story/${story._id}/${idxo + 1}`">
|
|
{{ story.title }}
|
|
</nuxt-link>
|
|
<a-tooltip placement="topLeft">
|
|
<template #title> You'll need to log in to read this story. Register if you don't already have an account -- it's free! </template>
|
|
<icon v-if="!data?.user" istyle="solid" name="lock" />
|
|
</a-tooltip>
|
|
</div>
|
|
|
|
<div style="display: flex; font-size: 0.9em; align-items: baseline" class="headerthing">
|
|
<span> a </span>
|
|
<div style="" v-for="(band, idx) in story.chapters[idxo].bands.filter((a) => !!a)">
|
|
<span>
|
|
<NuxtLink :to="`/band/${band._id}`"> {{ band.name }} </NuxtLink>{{ idx < story.chapters[idxo].bands.length - 1 ? ", " : "" }}
|
|
</span>
|
|
</div>
|
|
<span> fic by </span>
|
|
<span v-if="story.author">
|
|
<NuxtLink :to="`/user/${story.author._id}`">
|
|
{{ story.author.username }}
|
|
</NuxtLink>
|
|
</span>
|
|
<span v-else>...</span>
|
|
<span v-if="story.coAuthor">
|
|
and
|
|
<NuxtLink :to="`/user/${story.coAuthor._id}`">
|
|
{{ story.coAuthor.username }}
|
|
</NuxtLink>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
<div v-html="story.chapters[idxo].summary" />
|
|
<a-card v-if="story.ficmas != null" class="ficmasBlurb lessPadding">
|
|
Written as a gift for
|
|
<NuxtLink :to="`/user/${story.ficmas.wisher?._id || 1}`">
|
|
{{ story.ficmas.wisher?.username || "<...>" }}
|
|
</NuxtLink>
|
|
as part of {{ story.ficmas.year }}’s
|
|
<span v-if="story.ficmas.anniversary"> Anniversary Ficmas Fest </span>
|
|
<span v-else> A Very Kinky Rockfic Ficmas Fest. </span>
|
|
</a-card>
|
|
<a-card
|
|
v-if="story.challenge != null"
|
|
:style="{
|
|
background: story.challenge.color,
|
|
}"
|
|
class="lessPadding"
|
|
>
|
|
Entry for the
|
|
<NuxtLink :to="`/challenge/${story.challenge._id}`">
|
|
{{ story.challenge.name }}
|
|
</NuxtLink>
|
|
challenge.
|
|
</a-card>
|
|
<a-divider :style="{ borderColor: token['pink-5'], marginBottom: '1em' }" />
|
|
<div class="storyMeta">
|
|
<div class="inner">
|
|
<span v-if="story.chapters.length > 1">
|
|
<NuxtLink :to="`/story/${story._id}/chapters`"> {{ story.chapters.length }} chapters </NuxtLink>
|
|
</span>
|
|
<span v-else> {{ story.chapters.length }} chapter </span>
|
|
<span>
|
|
{{ story.chapters[idxo].nsfw ? "Adult" : "Not so adult" }}
|
|
</span>
|
|
<span>
|
|
{{ story.completed ? "Completed" : "WIP" }}
|
|
</span>
|
|
</div>
|
|
|
|
<div class="outer">
|
|
<meta-item :span="1" label="Genre(s)">
|
|
{{ story.chapters[idxo].genre.join(", ") }}
|
|
</meta-item>
|
|
<meta-item label="Characters">
|
|
{{ story.chapters[idxo].characters.join(", ") }}
|
|
</meta-item>
|
|
<meta-item label="Relationship(s)">
|
|
<div style="display: inline-block" v-for="(rel, idx) in story.chapters[idxo].relationships">
|
|
<span>
|
|
{{ Array.isArray(rel) ? rel.join("/") : rel }}
|
|
{{ idx < story.chapters[idxo].relationships.length - 1 ? "," : "" }}
|
|
</span>
|
|
</div>
|
|
<span v-if="story.chapters[idxo].relationships.length < 1">
|
|
<i>N/A</i>
|
|
</span>
|
|
</meta-item>
|
|
<meta-item label="Last updated">
|
|
<a-tooltip>
|
|
<template #title>
|
|
{{ longDate }}
|
|
</template>
|
|
{{ shortDate }}
|
|
</a-tooltip>
|
|
</meta-item>
|
|
</div>
|
|
</div>
|
|
<div class="stats">
|
|
<span>
|
|
<span class="staticon">
|
|
<icon :istyle="!dark ? 'solid' : 'regular'" icolor="#ff2883" :size="12" name="heart" />
|
|
</span>
|
|
<span>
|
|
{{ story.favs }}
|
|
</span>
|
|
</span>
|
|
<span>
|
|
<span class="staticon">
|
|
<icon :istyle="!dark ? 'solid' : 'regular'" icolor="#1787d7" :size="12" name="book-open" />
|
|
</span>
|
|
<span>
|
|
{{ story.views }}
|
|
</span>
|
|
</span>
|
|
<span>
|
|
<span class="staticon">
|
|
<icon :istyle="!dark ? 'solid' : 'regular'" icolor="#51e07c" :size="12" name="thumbs-up" />
|
|
</span>
|
|
<span>
|
|
{{ story.recs }}
|
|
</span>
|
|
</span>
|
|
<span>
|
|
<span class="staticon">
|
|
<icon :istyle="!dark ? 'solid' : 'regular'" icolor="#c2d420" :size="12" name="download" />
|
|
</span>
|
|
<span>
|
|
{{ story.downloads }}
|
|
</span>
|
|
</span>
|
|
<span>
|
|
<span class="staticon">
|
|
<icon istyle="solid" icolor="#0083aa" :size="12" name="comment" />
|
|
</span>
|
|
<span>
|
|
{{ story.reviews }}
|
|
</span>
|
|
</span>
|
|
</div>
|
|
</a-card>
|
|
</template>
|
|
<style>
|
|
.lessPadding > .ant-card-body {
|
|
padding: 0.8em !important;
|
|
}
|
|
|
|
.ant-descriptions-view tr {
|
|
border: none;
|
|
}
|
|
|
|
.ant-descriptions-item {
|
|
padding-bottom: 0 !important;
|
|
}
|
|
|
|
.storyMeta .ant-descriptions-item-container,
|
|
.storyMeta .ant-descriptions-item-container > * {
|
|
font-size: 1em !important;
|
|
}
|
|
</style>
|
|
<style scoped>
|
|
.stats {
|
|
padding-top: 0.25em;
|
|
}
|
|
|
|
.stats > * + * {
|
|
margin-left: 0.5em;
|
|
}
|
|
|
|
.stats > * > * + * {
|
|
margin-left: 0.5em;
|
|
}
|
|
|
|
.headerthing > * + * {
|
|
margin-left: 0.3em;
|
|
font-size: 0.9em !important;
|
|
}
|
|
|
|
hr {
|
|
background-color: #aaa !important;
|
|
border: none !important;
|
|
}
|
|
|
|
.ficmasBlurb {
|
|
background-color: #13b658;
|
|
color: white;
|
|
/* border-radius: */
|
|
}
|
|
|
|
.ficmasBlurb a {
|
|
color: #000;
|
|
font-weight: bold;
|
|
}
|
|
|
|
.ficmasBlurb a:hover {
|
|
text-decoration: underline;
|
|
}
|
|
|
|
.storyMeta {
|
|
display: flex;
|
|
flex-direction: column;
|
|
font-size: 0.857em !important;
|
|
}
|
|
|
|
.storyMeta .outer {
|
|
display: flex;
|
|
flex-direction: column;
|
|
margin-top: 0.5em;
|
|
}
|
|
|
|
.storyMeta .inner > * + *::before {
|
|
content: "♪";
|
|
color: #ff2883;
|
|
margin: 0 0.7em;
|
|
}
|
|
</style>
|