This repository has been archived on 2024-07-22. You can view files and clone it, but cannot push or open issues or pull requests.
Zaimki/components/Source.vue

147 lines
5.8 KiB
Vue
Raw Normal View History

2020-07-22 13:19:23 -07:00
<template>
2020-12-05 11:37:10 -08:00
<div class="my-2" v-if="!deleted">
<h3 class="h6">
<Icon :v="source.icon()"/>
<strong><template v-if="source.author">{{source.author.replace('^', '')}}</template><span v-if="source.author"> </span><em><a v-if="source.link" :href="source.link" target="_blank" rel="noopener">{{source.title}}</a><span v-else>{{source.title}}</span></em></strong><template v-if="source.extra"> ({{source.extra}})</template>, {{source.year}}<template v-if="source.comment">; {{source.comment}}</template>
</h3>
2020-12-30 15:03:30 -08:00
<ul class="list-inline" v-if="manage && $isGranted('sources')">
2020-12-05 11:37:10 -08:00
<li v-if="!source.approved" class="list-inline-item">
<span class="badge badge-danger">
<Icon v="map-marker-question"/>
<T>nouns.pending</T>
</span>
</li>
<!--
<li v-if="source.submitter" class="list-inline-item">
<nuxt-link :to="`/@${source.submitter}`" class="badge badge-light border btn-sm m-1">
<Icon v="user"/>
<span class="btn-label">
<T>crud.author</T>:
@{{source.submitter}}
</span>
</nuxt-link>
</li>
-->
<li v-if="!source.approved" class="list-inline-item">
<a href="#" class="badge badge-success btn-sm m-1" @click.prevent="approve()">
<Icon v="check"/>
<span class="btn-label"><T>crud.approve</T></span>
</a>
</li>
<li v-else class="list-inline-item">
<a href="#" class="badge badge-light border border-secondary btn-sm m-1" @click.prevent="hide()">
<Icon v="times"/>
<span class="btn-label"><T>crud.hide</T></span>
</a>
</li>
<li class="list-inline-item">
<a href="#" class="badge badge-light border border-danger btn-sm m-1" @click.prevent="remove()">
<Icon v="trash"/>
<span class="btn-label"><T>crud.remove</T></span>
</a>
</li>
<li class="list-inline-item">
<a href="#" class="badge badge-light border border-primary btn-sm m-1" @click.prevent="$emit('edit-source', source)">
<Icon v="pen"/>
<span class="btn-label">
<T>crud.edit</T>
</span>
</a>
</li>
<li class="list-inline-item">
<span v-for="p in source.pronouns" :class="['badge', pronounLibrary.isCanonical(p) ? 'badge-success' : 'badge-danger']">
{{p}}
</span>
</li>
2021-01-04 13:46:57 -08:00
<li class="list-inline-item" v-if="source.key">
<span class="badge badge-primary">
<T>sources.submit.key</T>: {{source.key}}
</span>
</li>
2020-12-05 11:37:10 -08:00
</ul>
2021-01-07 13:18:52 -08:00
<div v-if="source.images.length" class="source-images">
2021-01-06 10:31:47 -08:00
<ImageThumb v-for="image in source.images" :key="image" :id="image" class="m-2"/>
</div>
2020-07-22 13:19:23 -07:00
<ul v-if="source.fragments.length">
<li v-for="fragment in source.fragments">
2020-12-03 07:39:40 -08:00
<T>quotation.start</T><span v-html="fragment.replace(/\n/g, '<br/>')"></span><T>quotation.end</T>
2020-07-22 13:19:23 -07:00
</li>
</ul>
<div v-if="source.versions.length" class="my-3">
<p>
<button :class="['btn', versionsShown ? 'btn-primary' : 'btn-outline-primary', 'btn-sm']" @click="versionsShown = !versionsShown">
<Icon v="language"/>
<T>sources.otherVersions</T>
<Icon :v="versionsShown ? 'caret-up' : 'caret-down'"/>
</button>
</p>
<ul v-if="versionsShown">
<li v-for="version in source.versions">
<h4 class="h6 mb-2">
<strong>
<a :href="`${locales[version.locale].url}/${version.pronouns[0]}`" target="_blank" rel="noopener">{{locales[version.locale].name}}</a>:
</strong>
</h4>
<Source :source="version"/>
</li>
</ul>
</div>
2020-07-22 13:19:23 -07:00
</div>
</template>
<script>
2020-12-05 11:37:10 -08:00
import {pronounLibrary} from "../src/data";
2020-07-22 13:19:23 -07:00
export default {
name: 'Source',
2020-07-22 13:19:23 -07:00
props: {
2020-11-09 11:11:47 -08:00
source: { required: true },
2020-12-05 11:37:10 -08:00
manage: { type: Boolean },
},
data() {
return {
pronounLibrary,
deleted: false,
versionsShown: false,
2020-12-05 11:37:10 -08:00
}
},
methods: {
async approve() {
await this.$axios.$post(`/sources/approve/${this.source.id}`);
this.source.approved = true;
this.source.base = null;
this.$forceUpdate();
},
async hide() {
await this.$axios.$post(`/sources/hide/${this.source.id}`);
this.source.approved = false;
this.$forceUpdate();
},
async remove() {
await this.$confirm(this.$t('crud.removeConfirm'), 'danger');
await this.$axios.$post(`/sources/remove/${this.source.id}`);
this.deleted = true;
this.$forceUpdate();
},
2020-07-22 13:19:23 -07:00
},
}
</script>
2021-01-07 13:18:52 -08:00
<style lang="scss" scoped>
@import "assets/variables";
@include media-breakpoint-down('sm', $grid-breakpoints) {
.source-images {
text-align: center;
}
}
@include media-breakpoint-up('md', $grid-breakpoints) {
.source-images {
float: right;
max-width: 18rem;
}
}
</style>